|
|
@@ -0,0 +1,162 @@
|
|
|
+// @ts-check
|
|
|
+
|
|
|
+// Using esbuild for faster dev builds.
|
|
|
+// We are still using Rollup for production builds because it generates
|
|
|
+// smaller files and provides better tree-shaking.
|
|
|
+
|
|
|
+import esbuild from 'esbuild'
|
|
|
+import fs from 'node:fs'
|
|
|
+import { dirname, relative, resolve } from 'node:path'
|
|
|
+import { fileURLToPath } from 'node:url'
|
|
|
+import { createRequire } from 'node:module'
|
|
|
+import { parseArgs } from 'node:util'
|
|
|
+import { polyfillNode } from 'esbuild-plugin-polyfill-node'
|
|
|
+
|
|
|
+const require = createRequire(import.meta.url)
|
|
|
+const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
|
+
|
|
|
+const {
|
|
|
+ values: { format: rawFormat, prod, inline: inlineDeps },
|
|
|
+ positionals,
|
|
|
+} = parseArgs({
|
|
|
+ allowPositionals: true,
|
|
|
+ options: {
|
|
|
+ format: {
|
|
|
+ type: 'string',
|
|
|
+ short: 'f',
|
|
|
+ default: 'global',
|
|
|
+ },
|
|
|
+ prod: {
|
|
|
+ type: 'boolean',
|
|
|
+ short: 'p',
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ inline: {
|
|
|
+ type: 'boolean',
|
|
|
+ short: 'i',
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ },
|
|
|
+})
|
|
|
+
|
|
|
+const format = rawFormat || 'global'
|
|
|
+const targets = positionals.length ? positionals : ['vue']
|
|
|
+
|
|
|
+// resolve output
|
|
|
+const outputFormat = format.startsWith('global')
|
|
|
+ ? 'iife'
|
|
|
+ : format === 'cjs'
|
|
|
+ ? 'cjs'
|
|
|
+ : 'esm'
|
|
|
+
|
|
|
+const postfix = format.endsWith('-runtime')
|
|
|
+ ? `runtime.${format.replace(/-runtime$/, '')}`
|
|
|
+ : format
|
|
|
+
|
|
|
+const privatePackages = fs.readdirSync('packages-private')
|
|
|
+
|
|
|
+for (const target of targets) {
|
|
|
+ const pkgBase = privatePackages.includes(target)
|
|
|
+ ? `packages-private`
|
|
|
+ : `packages`
|
|
|
+ const pkgBasePath = `../${pkgBase}/${target}`
|
|
|
+ const pkg = require(`${pkgBasePath}/package.json`)
|
|
|
+ const outfile = resolve(
|
|
|
+ __dirname,
|
|
|
+ `${pkgBasePath}/dist/${
|
|
|
+ target === 'vue-compat' ? `vue` : target
|
|
|
+ }.${postfix}.${prod ? `prod.` : ``}js`,
|
|
|
+ )
|
|
|
+ const relativeOutfile = relative(process.cwd(), outfile)
|
|
|
+
|
|
|
+ // resolve externals
|
|
|
+ // TODO this logic is largely duplicated from rollup.config.js
|
|
|
+ /** @type {string[]} */
|
|
|
+ let external = []
|
|
|
+ if (!inlineDeps) {
|
|
|
+ // cjs & esm-bundler: external all deps
|
|
|
+ if (format === 'cjs' || format.includes('esm-bundler')) {
|
|
|
+ external = [
|
|
|
+ ...external,
|
|
|
+ ...Object.keys(pkg.dependencies || {}),
|
|
|
+ ...Object.keys(pkg.peerDependencies || {}),
|
|
|
+ // for @vue/compiler-sfc / server-renderer
|
|
|
+ 'path',
|
|
|
+ 'url',
|
|
|
+ 'stream',
|
|
|
+ ]
|
|
|
+ }
|
|
|
+
|
|
|
+ if (target === 'compiler-sfc') {
|
|
|
+ const consolidatePkgPath = require.resolve(
|
|
|
+ '@vue/consolidate/package.json',
|
|
|
+ {
|
|
|
+ paths: [resolve(__dirname, `../packages/${target}/`)],
|
|
|
+ },
|
|
|
+ )
|
|
|
+ const consolidateDeps = Object.keys(
|
|
|
+ require(consolidatePkgPath).devDependencies,
|
|
|
+ )
|
|
|
+ external = [
|
|
|
+ ...external,
|
|
|
+ ...consolidateDeps,
|
|
|
+ 'fs',
|
|
|
+ 'vm',
|
|
|
+ 'crypto',
|
|
|
+ 'react-dom/server',
|
|
|
+ 'teacup/lib/express',
|
|
|
+ 'arc-templates/dist/es5',
|
|
|
+ 'then-pug',
|
|
|
+ 'then-jade',
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /** @type {Array<import('esbuild').Plugin>} */
|
|
|
+ const plugins = [
|
|
|
+ {
|
|
|
+ name: 'log-rebuild',
|
|
|
+ setup(build) {
|
|
|
+ build.onEnd(() => {
|
|
|
+ console.log(`built: ${relativeOutfile}`)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ]
|
|
|
+
|
|
|
+ if (format !== 'cjs' && pkg.buildOptions?.enableNonBrowserBranches) {
|
|
|
+ plugins.push(polyfillNode())
|
|
|
+ }
|
|
|
+
|
|
|
+ esbuild
|
|
|
+ .context({
|
|
|
+ entryPoints: [resolve(__dirname, `${pkgBasePath}/src/index.ts`)],
|
|
|
+ outfile,
|
|
|
+ bundle: true,
|
|
|
+ external,
|
|
|
+ sourcemap: true,
|
|
|
+ format: outputFormat,
|
|
|
+ globalName: pkg.buildOptions?.name,
|
|
|
+ platform: format === 'cjs' ? 'node' : 'browser',
|
|
|
+ plugins,
|
|
|
+ define: {
|
|
|
+ __COMMIT__: `"dev"`,
|
|
|
+ __VERSION__: `"${pkg.version}"`,
|
|
|
+ __DEV__: prod ? `false` : `true`,
|
|
|
+ __TEST__: `false`,
|
|
|
+ __BROWSER__: String(
|
|
|
+ format !== 'cjs' && !pkg.buildOptions?.enableNonBrowserBranches,
|
|
|
+ ),
|
|
|
+ __GLOBAL__: String(format === 'global'),
|
|
|
+ __ESM_BUNDLER__: String(format.includes('esm-bundler')),
|
|
|
+ __ESM_BROWSER__: String(format.includes('esm-browser')),
|
|
|
+ __CJS__: String(format === 'cjs'),
|
|
|
+ __SSR__: String(format !== 'global'),
|
|
|
+ __COMPAT__: String(target === 'vue-compat'),
|
|
|
+ __FEATURE_SUSPENSE__: `true`,
|
|
|
+ __FEATURE_OPTIONS_API__: `true`,
|
|
|
+ __FEATURE_PROD_DEVTOOLS__: `false`,
|
|
|
+ __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__: `true`,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ .then(ctx => ctx.watch())
|
|
|
+}
|