diff --git a/packages/compat/src/default-pipeline.ts b/packages/compat/src/default-pipeline.ts index 0d901d3d2..eb78aad81 100644 --- a/packages/compat/src/default-pipeline.ts +++ b/packages/compat/src/default-pipeline.ts @@ -5,6 +5,7 @@ import type { Variant, EmberAppInstance } from '@embroider/core'; import type { Node } from 'broccoli-node-api'; import writeFile from 'broccoli-file-creator'; import mergeTrees from 'broccoli-merge-trees'; +import Plugin from 'broccoli-plugin'; export interface PipelineOptions extends Options { packagerOptions?: PackagerOptions; @@ -35,3 +36,21 @@ export function prebuild(emberApp: EmberAppInstance, options?: Options): Node { return mergeTrees([embroiderApp.asStage(addons).tree, writeFile('.stage2-output', () => outputPath)]); } + +export function compatBuild( + emberApp: EmberAppInstance, + buildOnce: (outputPath: string, emberEnv: 'development' | 'test' | 'production') => Promise, + options?: Options +): Node { + if (process.env.EMBROIDER_PREBUILD) { + return prebuild(emberApp, options); + } + + class Builder extends Plugin { + build(): Promise { + return buildOnce(this.outputPath, emberApp.env); + } + } + + return new Builder([], {}); +} diff --git a/packages/compat/src/index.ts b/packages/compat/src/index.ts index de84f3eb4..fd05a8e41 100644 --- a/packages/compat/src/index.ts +++ b/packages/compat/src/index.ts @@ -2,6 +2,6 @@ export { default as App } from './compat-app'; export { default as Addons } from './compat-addons'; export { default as Options, recommendedOptions } from './options'; export { default as V1Addon } from './v1-addon'; -export { prebuild, PipelineOptions } from './default-pipeline'; +export { prebuild, compatBuild, PipelineOptions } from './default-pipeline'; export { PackageRules, ModuleRules } from './dependency-rules'; export type { Options as ResolverTransformOptions } from './resolver-transform'; diff --git a/packages/vite/index.ts b/packages/vite/index.ts index 7025b6548..623e7af7f 100644 --- a/packages/vite/index.ts +++ b/packages/vite/index.ts @@ -9,3 +9,4 @@ export * from './src/assets.js'; export * from './src/content-for.js'; export * from './src/classic-ember-support.js'; export * from './src/ember.js'; +export * from './src/build-once.js'; diff --git a/packages/vite/src/build-once.ts b/packages/vite/src/build-once.ts new file mode 100644 index 000000000..fa8cf00f4 --- /dev/null +++ b/packages/vite/src/build-once.ts @@ -0,0 +1,16 @@ +import { spawn } from 'child_process'; + +export function buildOnce(outputPath: string, emberEnv: 'development' | 'test' | 'production'): Promise { + return new Promise((resolve, reject) => { + const child = spawn( + `npx vite build --outDir ${outputPath} --mode ${emberEnv === 'production' ? 'production' : 'development'}`, + { + cwd: process.cwd(), + shell: true, + stdio: 'inherit', + env: { ...process.env }, + } + ); + child.on('exit', code => (code === 0 ? resolve() : reject(new Error('vite build failed')))); + }); +} diff --git a/tests/app-template/ember-cli-build.js b/tests/app-template/ember-cli-build.js index ebb76e53a..d955a205a 100644 --- a/tests/app-template/ember-cli-build.js +++ b/tests/app-template/ember-cli-build.js @@ -1,10 +1,11 @@ 'use strict'; const EmberApp = require('ember-cli/lib/broccoli/ember-app'); -const { maybeEmbroider } = require('@embroider/test-setup'); +const { compatBuild } = require('@embroider/compat'); -module.exports = function (defaults) { +module.exports = async function (defaults) { + const { buildOnce } = await import('@embroider/vite'); let app = new EmberApp(defaults, {}); - return maybeEmbroider(app); + return compatBuild(app, buildOnce); };