@flatjs/evolve 1.8.1-next.72 → 1.8.1-next.73

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/constants.js +1 -17
  3. package/dist/create-webpack/create-externals.js +1 -6
  4. package/dist/create-webpack/create-optimization.js +1 -29
  5. package/dist/create-webpack/create-output.js +1 -35
  6. package/dist/create-webpack/create-performance.js +1 -7
  7. package/dist/create-webpack/create-plugins.js +1 -78
  8. package/dist/create-webpack/create-resolve.js +1 -31
  9. package/dist/create-webpack/create-rule-sets.js +1 -16
  10. package/dist/create-webpack/load-webpack-config.js +1 -55
  11. package/dist/create-webpack/rule-sets/constants.js +1 -3
  12. package/dist/create-webpack/rule-sets/rule-assets.js +1 -44
  13. package/dist/create-webpack/rule-sets/rule-css.js +1 -84
  14. package/dist/create-webpack/rule-sets/rule-less.js +1 -45
  15. package/dist/create-webpack/rule-sets/rule-scripts.js +1 -27
  16. package/dist/create-webpack/rule-sets/rule-svg-icon.js +1 -25
  17. package/dist/create-webpack/rule-sets/rule-utils.js +1 -10
  18. package/dist/create-webpack/types.js +1 -1
  19. package/dist/default-options.js +1 -80
  20. package/dist/define-config/define-config.js +1 -4
  21. package/dist/define-config/index.js +1 -1
  22. package/dist/dev-server/add-compiler-to-dev-server.js +1 -47
  23. package/dist/dev-server/create-app-page-route.js +1 -11
  24. package/dist/dev-server/create-dev-server-compiler-tasks.js +1 -51
  25. package/dist/dev-server/create-dev-server-entries.js +1 -27
  26. package/dist/dev-server/create-dev-server.js +1 -23
  27. package/dist/dev-server/index.js +1 -6
  28. package/dist/dev-server/middlewares/create-page-middleware.js +1 -164
  29. package/dist/dev-server/middlewares/create-public-assets-middleware.js +1 -25
  30. package/dist/dev-server/middlewares/index.js +1 -2
  31. package/dist/errors/evolve-build-error.js +1 -10
  32. package/dist/helpers/allow-px2rem-for-module.js +1 -6
  33. package/dist/helpers/assert-only-single-entry-item.js +1 -23
  34. package/dist/helpers/chunk-entry-map.js +1 -21
  35. package/dist/helpers/enable-bundle-hashname-for-module.js +1 -6
  36. package/dist/helpers/filter-actived-entries.js +1 -41
  37. package/dist/helpers/get-bundle-file-name.js +1 -23
  38. package/dist/helpers/get-git-root.js +1 -4
  39. package/dist/helpers/get-html-plugin-config.js +1 -47
  40. package/dist/helpers/get-max-process-tasks.js +1 -7
  41. package/dist/helpers/get-pacakge-dir.js +1 -13
  42. package/dist/helpers/index.d.ts +1 -0
  43. package/dist/helpers/index.js +1 -15
  44. package/dist/helpers/json-serializer.d.ts +7 -0
  45. package/dist/helpers/json-serializer.js +1 -0
  46. package/dist/helpers/merge-babel-options.js +1 -45
  47. package/dist/helpers/normalize-entry-map.js +1 -38
  48. package/dist/helpers/open-page.js +1 -15
  49. package/dist/helpers/print-log.js +1 -49
  50. package/dist/helpers/refresh-evolve-mock-options.js +1 -29
  51. package/dist/helpers/resolve-entry-map-input-files.js +1 -20
  52. package/dist/helpers/script-injects.js +1 -39
  53. package/dist/helpers/should-enable-react-fast-refresh.js +1 -8
  54. package/dist/helpers/split-to-multi-compiler.js +1 -22
  55. package/dist/index.js +1 -5
  56. package/dist/load-config/index.js +1 -1
  57. package/dist/load-config/load-evolve-config.js +1 -35
  58. package/dist/main/env-verify.js +1 -21
  59. package/dist/main/index.js +1 -4
  60. package/dist/main/prepare-build.js +1 -38
  61. package/dist/main/prepare-serve.js +1 -36
  62. package/dist/main/prepare-static.js +1 -28
  63. package/dist/main/start-build-dynamic.js +1 -144
  64. package/dist/main/start-build-worker.d.ts +2 -4
  65. package/dist/main/start-build-worker.js +1 -41
  66. package/dist/main/start-build.js +1 -49
  67. package/dist/main/start-one-entry-build.js +1 -35
  68. package/dist/main/start-serve.js +1 -32
  69. package/dist/main/start-static.js +1 -16
  70. package/dist/minimizer/create-minimizers.js +1 -25
  71. package/dist/minimizer/default-options.js +1 -14
  72. package/dist/minimizer/image-minimizer.js +1 -56
  73. package/dist/minimizer/index.js +1 -1
  74. package/dist/minimizer/terser-minimizer.js +3 -15
  75. package/dist/minimizer/types.js +1 -1
  76. package/dist/plugins/clean-webpack/clean-webpack-plugin.js +1 -173
  77. package/dist/plugins/clean-webpack/index.js +1 -22
  78. package/dist/plugins/define-variable/define-variable-plugin.js +1 -21
  79. package/dist/plugins/define-variable/index.js +1 -1
  80. package/dist/plugins/html-inject-scripts/plugin-html-inject-script.js +1 -27
  81. package/dist/plugins/module-federation/external-template-remotes.js +1 -92
  82. package/dist/plugins/module-federation/index.js +1 -1
  83. package/dist/plugins/module-federation/module-federation.js +1 -98
  84. package/dist/plugins/multi-html/index.js +1 -15
  85. package/dist/plugins/multi-html/multi-html-cdn-plugin.js +1 -84
  86. package/dist/plugins/multi-html/multi-html-plugin.js +1 -70
  87. package/dist/types/index.js +1 -8
  88. package/dist/types/types-ci.js +1 -1
  89. package/dist/types/types-dev-server.js +1 -1
  90. package/dist/types/types-entry-map.js +1 -1
  91. package/dist/types/types-federation.js +1 -1
  92. package/dist/types/types-loader-options.js +1 -1
  93. package/dist/types/types-modular-import.js +1 -1
  94. package/dist/types/types-multi-html.js +1 -1
  95. package/dist/types/types-options.js +1 -1
  96. package/dist/types/types-plugin-options.js +1 -1
  97. package/dist/types/types-webpack.js +1 -1
  98. package/package.json +2 -2
@@ -1,144 +1 @@
1
- import { isAbsolute, join } from 'node:path';
2
- import { pathToFileURL } from 'node:url';
3
- import { getDirname } from '@armit/file-utility';
4
- import { getDiffFiles, getCommitIdOfBranch } from '@armit/git';
5
- import { createThreadPool } from '@armit/worker-threads';
6
- import { arraysIntersect, chalk, logger } from '@flatjs/common';
7
- import { traverseGraph } from '@flatjs/graph';
8
- import Listr from 'listr';
9
- import { filterActivedEntriesByEntryInputs, filterActivedEntriesByModule, } from '../helpers/filter-actived-entries.js';
10
- import { getGitRoot } from '../helpers/get-git-root.js';
11
- import { getMaxProcessTasks } from '../helpers/get-max-process-tasks.js';
12
- import { resolveEntryMapInputFiles } from '../helpers/resolve-entry-map-input-files.js';
13
- import { loadEvolveConfig, } from '../load-config/load-evolve-config.js';
14
- import { envVerify } from './env-verify.js';
15
- export async function getBuildEntryFiles(projectCwd, diffFiles, allEntryInputs) {
16
- const toBuildEntryFiles = [];
17
- const entryInputsPendingToCheck = [];
18
- for (const entryInput of allEntryInputs) {
19
- // If entry have been existed in diff files, need to rebuild.
20
- if (diffFiles.includes(entryInput)) {
21
- toBuildEntryFiles.push(entryInput);
22
- }
23
- else {
24
- entryInputsPendingToCheck.push(entryInput);
25
- }
26
- }
27
- // If there has pedding entry inputs to check.
28
- if (entryInputsPendingToCheck.length) {
29
- const graphDeps = await traverseGraph({
30
- input: entryInputsPendingToCheck,
31
- projectCwd,
32
- treeNodeFilter: () => true,
33
- });
34
- if (!graphDeps) {
35
- return toBuildEntryFiles;
36
- }
37
- logger.debug(`DependencyGraph:\n${JSON.stringify(graphDeps, null, 2)}`);
38
- for (const entryInputToCheck of entryInputsPendingToCheck) {
39
- const dependsFiles = graphDeps[entryInputToCheck] || [];
40
- if (arraysIntersect(dependsFiles, diffFiles)) {
41
- toBuildEntryFiles.push(entryInputToCheck);
42
- }
43
- }
44
- }
45
- return toBuildEntryFiles;
46
- }
47
- /**
48
- * Dynamic check which entry modules need to build.
49
- * @returns
50
- */
51
- export async function dynamicCheckBuildEntryMap(projectCwd, earlyCommit, lastCommit, overrideEvolveOptions, configLoaderOptions) {
52
- const command = {
53
- command: 'build',
54
- };
55
- // 1. Try to load evolve configuration from `flatjs-evolve.config.ts`
56
- const newEvolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
57
- // 2. Check if we have fixed build modules.
58
- if (newEvolveOptions.ci?.fixedBuildModules &&
59
- newEvolveOptions.ci?.fixedBuildModules.length) {
60
- logger.info('Use `fixedBuildModules` configuration to build...');
61
- const buildEntries = filterActivedEntriesByModule(newEvolveOptions.entryMap, newEvolveOptions.ci?.fixedBuildModules);
62
- return { buildEntries, newEvolveOptions };
63
- }
64
- logger.info('Dynamicly checking code changed modules ...');
65
- // 3. Resolve diff files based on specificed branch.
66
- // Check if we have fixed `early commit` if no resolve based on `Branch` from evolve config file.
67
- if (!earlyCommit) {
68
- const basedBranch = newEvolveOptions.ci?.basedBranch || 'master';
69
- // Try resolve based branch commit hash.
70
- logger.info(`Resolving base branch "${basedBranch}" commit hash ...`);
71
- earlyCommit = await getCommitIdOfBranch(basedBranch);
72
- }
73
- // `packages/evolve/tests/main/fixtures/src/home/index.ts` without repo cwd.
74
- let diffFiles = earlyCommit
75
- ? await getDiffFiles(earlyCommit, lastCommit)
76
- : [];
77
- const gitRoot = getGitRoot(projectCwd);
78
- if (!gitRoot) {
79
- throw new Error(`No .git root (${projectCwd}) found`);
80
- }
81
- // Hack diff files with git repo root dir.
82
- diffFiles = diffFiles.map((diffFile) => {
83
- return isAbsolute(diffFile) ? diffFile : join(gitRoot, diffFile);
84
- });
85
- logger.debug(`Diff files: \n${JSON.stringify(diffFiles, null, 2)}`);
86
- // No code changed here.
87
- if (!diffFiles.length) {
88
- logger.warn('It seems that there are no code files changed.');
89
- return {
90
- buildEntries: {},
91
- newEvolveOptions,
92
- };
93
- }
94
- // 4. Resolve entry input files.
95
- const allEntryInputs = await resolveEntryMapInputFiles(projectCwd, newEvolveOptions.entryMap);
96
- // 5. Flag changed entries (with absolute filepath)
97
- const toBuildEntryFiles = await getBuildEntryFiles(projectCwd, diffFiles, allEntryInputs);
98
- logger.debug(`To build entry files: \n${JSON.stringify(toBuildEntryFiles, null, 2)}`);
99
- // 6. Filter entry map items which need to build.
100
- const buildEntries = await filterActivedEntriesByEntryInputs(projectCwd, newEvolveOptions.entryMap, toBuildEntryFiles);
101
- return { buildEntries, newEvolveOptions };
102
- }
103
- /**
104
- * The main entry to start an evolve `build` with automatically detect modules which have been changed between two commits.
105
- * @param projectCwd The Root directory (workspace) of this project.
106
- * @param earlyCommit The diff based earlier commit hash
107
- * @param lastCommit If is omitted, it will have the same effect as using HEAD instead.
108
- */
109
- export const startDynamicBuild = async (projectCwd, earlyCommit, lastCommit, overrideEvolveOptions = {}, configLoaderOptions) => {
110
- // 1. Fetch all changed files betwwen two `commit`
111
- const { buildEntries, newEvolveOptions } = await dynamicCheckBuildEntryMap(projectCwd, earlyCommit, lastCommit, overrideEvolveOptions, configLoaderOptions);
112
- await envVerify(projectCwd, newEvolveOptions);
113
- const buildEntryKeys = Object.keys(buildEntries);
114
- // Make sure that we have at least one build entry module.
115
- if (!buildEntryKeys.length) {
116
- logger.warn(`No build entries providered!`);
117
- return [];
118
- }
119
- const workerSize = getMaxProcessTasks(buildEntryKeys.length, newEvolveOptions.maxProcesses);
120
- logger.info(`Start dynamic build with (${chalk(['magenta'])(String(workerSize))}) workers:\n${JSON.stringify({ buildEntries: buildEntryKeys }, null, 2)}`);
121
- const workerPath = pathToFileURL(getDirname(import.meta.url, './start-build-worker.js')).toString();
122
- const worker = await createThreadPool(workerPath, {
123
- size: workerSize,
124
- });
125
- const buildTasks = new Listr([], {
126
- concurrent: workerSize,
127
- exitOnError: true,
128
- });
129
- const buildResults = [];
130
- for (const [entryKey] of Object.entries(buildEntries)) {
131
- buildTasks.add({
132
- title: `Build module ${chalk(['magenta'])(entryKey)} ...`,
133
- task: async () => {
134
- const buildResult = await worker.startBuildWorker(projectCwd, entryKey, overrideEvolveOptions, configLoaderOptions);
135
- buildResults.push(buildResult);
136
- },
137
- });
138
- }
139
- if (buildTasks.tasks.length) {
140
- await buildTasks.run();
141
- }
142
- worker.pool.terminate();
143
- return buildResults;
144
- };
1
+ import{isAbsolute,join}from"node:path";import{pathToFileURL}from"node:url";import{getDirname}from"@armit/file-utility";import{getDiffFiles,getCommitIdOfBranch}from"@armit/git";import{createThreadPool}from"@armit/worker-threads";import{arraysIntersect,chalk,logger}from"@flatjs/common";import{traverseGraph}from"@flatjs/graph";import Listr from"listr";import{filterActivedEntriesByEntryInputs,filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{getGitRoot}from"../helpers/get-git-root.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{resolveEntryMapInputFiles}from"../helpers/resolve-entry-map-input-files.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{envVerify}from"./env-verify.js";export async function getBuildEntryFiles(e,t,r){const i=[],o=[];for(const e of r)t.includes(e)?i.push(e):o.push(e);if(o.length){const r=await traverseGraph({input:o,projectCwd:e,treeNodeFilter:()=>!0});if(!r)return i;logger.debug(`DependencyGraph:\n${JSON.stringify(r,null,2)}`);for(const e of o){const o=r[e]||[];arraysIntersect(o,t)&&i.push(e)}}return i}export async function dynamicCheckBuildEntryMap(e,t,r,i,o){const n=await loadEvolveConfig({command:"build"},e,i,o);if(n.ci?.fixedBuildModules&&n.ci?.fixedBuildModules.length){logger.info("Use `fixedBuildModules` configuration to build...");return{buildEntries:filterActivedEntriesByModule(n.entryMap,n.ci?.fixedBuildModules),newEvolveOptions:n}}if(logger.info("Dynamicly checking code changed modules ..."),!t){const e=n.ci?.basedBranch||"master";logger.info(`Resolving base branch "${e}" commit hash ...`),t=await getCommitIdOfBranch(e)}let s=t?await getDiffFiles(t,r):[];const a=getGitRoot(e);if(!a)throw new Error(`No .git root (${e}) found`);if(s=s.map((e=>isAbsolute(e)?e:join(a,e))),logger.debug(`Diff files: \n${JSON.stringify(s,null,2)}`),!s.length)return logger.warn("It seems that there are no code files changed."),{buildEntries:{},newEvolveOptions:n};const l=await resolveEntryMapInputFiles(e,n.entryMap),c=await getBuildEntryFiles(e,s,l);logger.debug(`To build entry files: \n${JSON.stringify(c,null,2)}`);return{buildEntries:await filterActivedEntriesByEntryInputs(e,n.entryMap,c),newEvolveOptions:n}}export const startDynamicBuild=async(e,t,r,i={},o)=>{const{buildEntries:n,newEvolveOptions:s}=await dynamicCheckBuildEntryMap(e,t,r,i,o);await envVerify(e,s);const a=Object.keys(n);if(!a.length)return logger.warn("No build entries providered!"),[];const l=getMaxProcessTasks(a.length,s.maxProcesses);logger.info(`Start dynamic build with (${chalk(["magenta"])(String(l))}) workers:\n${JSON.stringify({buildEntries:a},null,2)}`);const c=pathToFileURL(getDirname(import.meta.url,"./start-build-worker.js")).toString(),f=await createThreadPool(c,{size:l}),d=new Listr([],{concurrent:l,exitOnError:!0}),u=[];for(const[t]of Object.entries(n))d.add({title:`Build module ${chalk(["magenta"])(t)} ...`,task:async()=>{const r=await f.startBuildWorker(e,t,jsonSerializer.stringify(i),o);u.push(r)}});return d.tasks.length&&await d.run(),f.pool.terminate(),u};
@@ -1,6 +1,4 @@
1
- import { type PartialDeep } from 'type-fest';
2
1
  import { type ConfigLoaderOptions } from '../load-config/load-evolve-config.js';
3
- import { type FlatEvolveOptions } from '../types/types-options.js';
4
2
  import { type EvolveBuildResult } from './start-one-entry-build.js';
5
3
  /**
6
4
  * FIXME: The main entry to start an evolve `build`, NOTE: avoid pass configuration with `function` here.
@@ -8,7 +6,7 @@ import { type EvolveBuildResult } from './start-one-entry-build.js';
8
6
  * @internal
9
7
  * @param projectCwd The Root directory (workspace) of this project.
10
8
  * @param entryKey The `entryKey` for one entry build task
11
- * @param overrideEvolveOptions The overrided evolve options, NOTE: avoid pass configuration with `function` here.
9
+ * @param serializedEvolveOptions The overrided evolve options, NOTE: we will serialize `function` property here first
12
10
  * @param configLoaderOptions Evolve config loader options, NOTE: avoid pass configuration with `function` here.
13
11
  */
14
- export declare const startBuildWorker: (projectCwd: string, entryKey: string, overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions) => Promise<EvolveBuildResult>;
12
+ export declare const startBuildWorker: (projectCwd: string, entryKey: string, serializedEvolveOptions: string, configLoaderOptions?: ConfigLoaderOptions) => Promise<EvolveBuildResult>;
@@ -1,41 +1 @@
1
- import { filterActivedEntriesByModule } from '../helpers/filter-actived-entries.js';
2
- import { normalizeEvolveEntryMap } from '../helpers/normalize-entry-map.js';
3
- import { loadEvolveConfig, } from '../load-config/load-evolve-config.js';
4
- import { prepareBuild } from './prepare-build.js';
5
- /**
6
- * FIXME: The main entry to start an evolve `build`, NOTE: avoid pass configuration with `function` here.
7
- * If you need to call build api avoid `worker` you can directly call `prepareBuild`
8
- * @internal
9
- * @param projectCwd The Root directory (workspace) of this project.
10
- * @param entryKey The `entryKey` for one entry build task
11
- * @param overrideEvolveOptions The overrided evolve options, NOTE: avoid pass configuration with `function` here.
12
- * @param configLoaderOptions Evolve config loader options, NOTE: avoid pass configuration with `function` here.
13
- */
14
- export const startBuildWorker = async (projectCwd, entryKey, overrideEvolveOptions = {}, configLoaderOptions) => {
15
- const command = {
16
- command: 'build',
17
- };
18
- // Try to load evolve configuration from `flatjs-evolve.config.ts`
19
- // FIXME: Cause of `worker-theads` do not support pass configuration with `function` reference.
20
- const newEvolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
21
- // FIXME: Cause of `worker threads` we need avoid pass entryItem config directly
22
- // because we have some config node item with `function`
23
- // It will break `worker threads` comunication, e.g below shown.
24
- // DataCloneError: function (url) {
25
- // if (url.indexOf('dev.flatjs.com') > 0) return 'me';
26
- // if (url.indexOf('.qa.') > 0) retur...<omitted>... } could not be cloned.
27
- // at new DOMException (node:internal/per_context/domexception:53:5)
28
- // So we need to re cacalculate the build entry via `entryKey`
29
- const buildOneEntry = filterActivedEntriesByModule(newEvolveOptions.entryMap, [
30
- // Make sure that the entryKey is correct match.
31
- new RegExp(`^${entryKey}$`),
32
- ]);
33
- const buildEntryKeys = Object.keys(buildOneEntry);
34
- // Make sure that we have at least one build entry module.
35
- if (!buildEntryKeys.length) {
36
- throw new Error(`No build entry resolved via "${entryKey}" on "startBuildWorker"!`);
37
- }
38
- const normalizedBuildOneEntry = normalizeEvolveEntryMap(buildOneEntry, newEvolveOptions.entryMap);
39
- const buildEntryConfig = normalizedBuildOneEntry[entryKey];
40
- return prepareBuild([entryKey, buildEntryConfig], newEvolveOptions);
41
- };
1
+ import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareBuild}from"./prepare-build.js";export const startBuildWorker=async(e,r,o,i)=>{const t=jsonSerializer.parse(o)||{},l=await loadEvolveConfig({command:"build"},e,t,i),n=filterActivedEntriesByModule(l.entryMap,[new RegExp(`^${r}$`)]);if(!Object.keys(n).length)throw new Error(`No build entry resolved via "${r}" on "startBuildWorker"!`);const a=normalizeEvolveEntryMap(n,l.entryMap)[r];return prepareBuild([r,a],l)};
@@ -1,49 +1 @@
1
- import { pathToFileURL } from 'node:url';
2
- import { getDirname } from '@armit/file-utility';
3
- import { createThreadPool } from '@armit/worker-threads';
4
- import { chalk, logger } from '@flatjs/common';
5
- import Listr from 'listr';
6
- import { filterActivedEntriesByModule } from '../helpers/filter-actived-entries.js';
7
- import { getMaxProcessTasks } from '../helpers/get-max-process-tasks.js';
8
- import { loadEvolveConfig, } from '../load-config/load-evolve-config.js';
9
- import { envVerify } from './env-verify.js';
10
- export const startBuild = async (projectCwd, buildModules, overrideEvolveOptions = {}, configLoaderOptions) => {
11
- const command = {
12
- command: 'build',
13
- };
14
- // Try to load evolve configuration from `flatjs-evolve.config.ts`
15
- const newEvolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
16
- await envVerify(projectCwd, newEvolveOptions);
17
- const buildEntries = filterActivedEntriesByModule(newEvolveOptions.entryMap, buildModules);
18
- const buildEntryKeys = Object.keys(buildEntries);
19
- // Make sure that we have at least one build entry module.
20
- if (!buildEntryKeys.length) {
21
- logger.warn(`No build entries providered!`);
22
- return [];
23
- }
24
- const workerSize = getMaxProcessTasks(buildEntryKeys.length, newEvolveOptions.maxProcesses);
25
- logger.info(`Start standard build with (${chalk(['magenta'])(String(workerSize))}) workers:\n${JSON.stringify({ buildEntries: buildEntryKeys }, null, 2)}`);
26
- const workerPath = pathToFileURL(getDirname(import.meta.url, './start-build-worker.js')).toString();
27
- const worker = await createThreadPool(workerPath, {
28
- size: workerSize,
29
- });
30
- const buildTasks = new Listr([], {
31
- concurrent: workerSize,
32
- exitOnError: true,
33
- });
34
- const buildResults = [];
35
- for (const [entryKey] of Object.entries(buildEntries)) {
36
- buildTasks.add({
37
- title: `Build module ${chalk(['magenta'])(entryKey)} ...`,
38
- task: async () => {
39
- const buildResult = await worker.startBuildWorker(projectCwd, entryKey, overrideEvolveOptions, configLoaderOptions);
40
- buildResults.push(buildResult);
41
- },
42
- });
43
- }
44
- if (buildTasks.tasks.length) {
45
- await buildTasks.run();
46
- }
47
- worker.pool.terminate();
48
- return buildResults;
49
- };
1
+ import{pathToFileURL}from"node:url";import{getDirname}from"@armit/file-utility";import{createThreadPool}from"@armit/worker-threads";import{chalk,logger}from"@flatjs/common";import Listr from"listr";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{envVerify}from"./env-verify.js";export const startBuild=async(r,e,t={},o)=>{const i=await loadEvolveConfig({command:"build"},r,t,o);await envVerify(r,i);const s=filterActivedEntriesByModule(i.entryMap,e),a=Object.keys(s);if(!a.length)return logger.warn("No build entries providered!"),[];const n=getMaxProcessTasks(a.length,i.maxProcesses);logger.info(`Start standard build with (${chalk(["magenta"])(String(n))}) workers:\n${JSON.stringify({buildEntries:a},null,2)}`);const l=pathToFileURL(getDirname(import.meta.url,"./start-build-worker.js")).toString(),m=await createThreadPool(l,{size:n}),c=new Listr([],{concurrent:n,exitOnError:!0}),d=[];for(const[e]of Object.entries(s))c.add({title:`Build module ${chalk(["magenta"])(e)} ...`,task:async()=>{const i=await m.startBuildWorker(r,e,jsonSerializer.stringify(t),o);d.push(i)}});return c.tasks.length&&await c.run(),m.pool.terminate(),d};
@@ -1,35 +1 @@
1
- import webpack from 'webpack';
2
- import { loadWebpackConfig } from '../create-webpack/load-webpack-config.js';
3
- import { splitToMultiCompilerConfigs } from '../helpers/split-to-multi-compiler.js';
4
- /**
5
- * The helpers to build one entry at a time
6
- * @param singleBuildEntry The single entry
7
- * @param buildPublicPath
8
- * @param evolveOptions
9
- */
10
- export const startOneEntryBuild = async (singleBuildEntry, evolveOptions) => {
11
- // Try to load webpack configuration
12
- const webpackConfig = await loadWebpackConfig('production', singleBuildEntry, evolveOptions);
13
- const compilerConfigs = splitToMultiCompilerConfigs(singleBuildEntry, webpackConfig, evolveOptions);
14
- if (compilerConfigs.length > 1) {
15
- throw new Error('startOneEntryBuild() only support `compiler` at a time');
16
- }
17
- const currCompiler = compilerConfigs[0];
18
- // Run the single build.
19
- return new Promise((resolve, reject) => {
20
- webpack(currCompiler, (err, stats) => {
21
- if (err) {
22
- // Handle errors here
23
- return reject(err);
24
- }
25
- const statsJson = stats?.toJson();
26
- if (statsJson?.errors?.length) {
27
- return reject(statsJson.errors);
28
- }
29
- if (evolveOptions.rejectWarnings && statsJson?.warnings?.length) {
30
- return reject(statsJson.warnings);
31
- }
32
- resolve({ name: currCompiler.name, warningStats: statsJson?.warnings });
33
- });
34
- });
35
- };
1
+ import webpack from"webpack";import{loadWebpackConfig}from"../create-webpack/load-webpack-config.js";import{splitToMultiCompilerConfigs}from"../helpers/split-to-multi-compiler.js";export const startOneEntryBuild=async(r,o)=>{const t=await loadWebpackConfig("production",r,o),n=splitToMultiCompilerConfigs(r,t,o);if(n.length>1)throw new Error("startOneEntryBuild() only support `compiler` at a time");const e=n[0];return new Promise(((r,t)=>{webpack(e,((n,i)=>{if(n)return t(n);const a=i?.toJson();return a?.errors?.length?t(a.errors):o.rejectWarnings&&a?.warnings?.length?t(a.warnings):void r({name:e.name,warningStats:a?.warnings})}))}))};
@@ -1,32 +1 @@
1
- import { logger } from '@flatjs/common';
2
- import { filterActivedEntriesByModule } from '../helpers/filter-actived-entries.js';
3
- import { normalizeEvolveEntryMap } from '../helpers/normalize-entry-map.js';
4
- import { loadEvolveConfig, } from '../load-config/load-evolve-config.js';
5
- import { prepareServe } from './prepare-serve.js';
6
- /**
7
- * The main entry to start evolve serve
8
- * @param projectCwd The Root directory (workspace) of this project.
9
- * @param serveModules The filter pattern to detect modules we want to serve.
10
- * @param overrideEvolveOptions The overrided evolve options
11
- * @param configLoaderOptions Evolve config loader options
12
- */
13
- export const startServe = async (projectCwd, serveModules, overrideEvolveOptions = {}, configLoaderOptions) => {
14
- const command = {
15
- command: 'serve',
16
- };
17
- // Try to load evolve configuration from `flatjs-evolve.config.ts`
18
- const evolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
19
- const servedEntries = filterActivedEntriesByModule(evolveOptions.entryMap, serveModules);
20
- const servedEntryKeys = Object.keys(servedEntries);
21
- // Make sure that we have at least one serve entry module.
22
- if (!servedEntryKeys.length) {
23
- logger.warn(`No served entries providered!`);
24
- return [];
25
- }
26
- logger.info({
27
- servedEntries: servedEntryKeys,
28
- });
29
- // Normalized served entries to make sure we have latested entry options.
30
- const normalizedServedEntries = normalizeEvolveEntryMap(servedEntries, evolveOptions.entryMap);
31
- return prepareServe(projectCwd, normalizedServedEntries, evolveOptions);
32
- };
1
+ import{logger}from"@flatjs/common";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareServe}from"./prepare-serve.js";export const startServe=async(e,r,o={},t)=>{const n=await loadEvolveConfig({command:"serve"},e,o,t),i=filterActivedEntriesByModule(n.entryMap,r),l=Object.keys(i);if(!l.length)return logger.warn("No served entries providered!"),[];logger.info({servedEntries:l});const a=normalizeEvolveEntryMap(i,n.entryMap);return prepareServe(e,a,n)};
@@ -1,16 +1 @@
1
- import { loadEvolveConfig, } from '../load-config/load-evolve-config.js';
2
- import { prepareStatic } from './prepare-static.js';
3
- /**
4
- * The main entry to start evolve static server to proxy all modules of `production` build
5
- * @param projectCwd The Root directory (workspace) of this project.
6
- * @param overrideEvolveOptions The overrided evolve options
7
- * @param configLoaderOptions Evolve config loader options
8
- */
9
- export const startStatic = async (projectCwd, overrideEvolveOptions = {}, configLoaderOptions) => {
10
- const command = {
11
- command: 'static',
12
- };
13
- // Try to load evolve configuration from `flatjs-evolve.config.ts`
14
- const evolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
15
- return prepareStatic(projectCwd, evolveOptions);
16
- };
1
+ import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareStatic}from"./prepare-static.js";export const startStatic=async(o,t={},a)=>{const r=await loadEvolveConfig({command:"static"},o,t,a);return prepareStatic(o,r)};
@@ -1,25 +1 @@
1
- import { logger } from '@flatjs/common';
2
- import { moduleName } from '../constants.js';
3
- import { printInfo } from '../helpers/print-log.js';
4
- import { imageMinimizer } from './image-minimizer.js';
5
- import { terserMinimizer } from './terser-minimizer.js';
6
- export const createMinimizers = (serveMode, webpackOptions) => {
7
- const minimizers = [];
8
- if (serveMode) {
9
- logger.debug('Ignore minimizer plugin for `serve` mode', moduleName);
10
- return minimizers;
11
- }
12
- if (webpackOptions?.minimizer === false) {
13
- printInfo('Note `minimizer` has been disabled for now');
14
- return minimizers;
15
- }
16
- if (webpackOptions?.minimizer?.imageMin) {
17
- const imageMinPlugin = imageMinimizer();
18
- if (imageMinPlugin) {
19
- minimizers.push(imageMinPlugin);
20
- }
21
- }
22
- const terserPlugin = terserMinimizer(webpackOptions?.minimizer?.terserOptions || {});
23
- minimizers.push(terserPlugin);
24
- return minimizers;
25
- };
1
+ import{logger}from"@flatjs/common";import{moduleName}from"../constants.js";import{printInfo}from"../helpers/print-log.js";import{imageMinimizer}from"./image-minimizer.js";import{terserMinimizer}from"./terser-minimizer.js";export const createMinimizers=(i,r)=>{const e=[];if(i)return logger.debug("Ignore minimizer plugin for `serve` mode",moduleName),e;if(!1===r?.minimizer)return printInfo("Note `minimizer` has been disabled for now"),e;if(r?.minimizer?.imageMin){const i=imageMinimizer();i&&e.push(i)}const m=terserMinimizer(r?.minimizer?.terserOptions||{});return e.push(m),e};
@@ -1,14 +1 @@
1
- export const defaultTerserOptions = {
2
- ecma: undefined,
3
- parse: {},
4
- compress: {},
5
- // Note `mangle.properties` is `false` by default.
6
- mangle: true,
7
- module: false,
8
- output: undefined,
9
- toplevel: false,
10
- ie8: false,
11
- keep_classnames: undefined,
12
- keep_fnames: false,
13
- safari10: false,
14
- };
1
+ export const defaultTerserOptions={ecma:void 0,parse:{},compress:{},mangle:!0,module:!1,output:void 0,toplevel:!1,ie8:!1,keep_classnames:void 0,keep_fnames:!1,safari10:!1};
@@ -1,56 +1 @@
1
- import { projectHasYarn } from '@armit/package';
2
- import { chalk, logger, requireResolve } from '@flatjs/common';
3
- import ImageMinimizerPlugin from 'image-minimizer-webpack-plugin';
4
- import { moduleName } from '../constants.js';
5
- const logs = new Map();
6
- /**
7
- * brew install libpng
8
- * brew install gifsicle
9
- * @returns
10
- */
11
- export const imageMinimizer = () => {
12
- const suggestedPlugins = [
13
- // Svgo configuration here https://github.com/svg/svgo#configuration
14
- ['svgo', {}],
15
- ['gifsicle', {}],
16
- ['jpegtran', {}],
17
- ['pngquant', {}],
18
- ];
19
- const logMessage = [];
20
- const availabledPlugins = suggestedPlugins
21
- .map((item) => {
22
- const moduleId = item[0];
23
- try {
24
- requireResolve(`imagemin-${moduleId}`);
25
- return item;
26
- }
27
- catch (err) {
28
- if (!logs.get(moduleId)) {
29
- logs.set(moduleId, true);
30
- const command = chalk(['magenta'])(`"${projectHasYarn() ? 'yarn add' : 'npm install'} imagemin-${moduleId} -D"`);
31
- logMessage.push(`Execute ${command} for assets optimization`);
32
- }
33
- return null;
34
- }
35
- })
36
- .filter(Boolean);
37
- if (logMessage.length) {
38
- for (const msg of logMessage) {
39
- logger.warn(msg, moduleName);
40
- }
41
- }
42
- if (availabledPlugins.length) {
43
- return new ImageMinimizerPlugin({
44
- minimizer: {
45
- // Recommended squoosh options for lossless optimization
46
- implementation: ImageMinimizerPlugin.imageminMinify,
47
- options: {
48
- // Lossless optimization with custom option
49
- // Feel free to experiment with options for better result for you
50
- plugins: availabledPlugins,
51
- },
52
- },
53
- });
54
- }
55
- return null;
56
- };
1
+ import{projectHasYarn}from"@armit/package";import{chalk,logger,requireResolve}from"@flatjs/common";import ImageMinimizerPlugin from"image-minimizer-webpack-plugin";import{moduleName}from"../constants.js";const logs=new Map;export const imageMinimizer=()=>{const e=[],i=[["svgo",{}],["gifsicle",{}],["jpegtran",{}],["pngquant",{}]].map((i=>{const n=i[0];try{return requireResolve(`imagemin-${n}`),i}catch(i){if(!logs.get(n)){logs.set(n,!0);const i=chalk(["magenta"])(`"${projectHasYarn()?"yarn add":"npm install"} imagemin-${n} -D"`);e.push(`Execute ${i} for assets optimization`)}return null}})).filter(Boolean);if(e.length)for(const i of e)logger.warn(i,moduleName);return i.length?new ImageMinimizerPlugin({minimizer:{implementation:ImageMinimizerPlugin.imageminMinify,options:{plugins:i}}}):null};
@@ -1 +1 @@
1
- export * from './create-minimizers.js';
1
+ export*from"./create-minimizers.js";
@@ -1,15 +1,3 @@
1
- import { mergeOptions } from '@flatjs/common';
2
- import TerserPlugin from 'terser-webpack-plugin';
3
- import { defaultTerserOptions } from './default-options.js';
4
- /**
5
- * https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions
6
- */
7
- export const terserMinimizer = (terserOptions) => {
8
- return new TerserPlugin({
9
- parallel: true,
10
- // Disable Extract all or some (use /^\**!|@preserve|@license|@cc_on/i RegExp) comments.
11
- extractComments: false,
12
- // Terser minify options.
13
- terserOptions: mergeOptions(defaultTerserOptions, terserOptions),
14
- });
15
- };
1
+ import{mergeOptions}from"@flatjs/common";import TerserPlugin from"terser-webpack-plugin";import{defaultTerserOptions}from"./default-options.js";export const terserMinimizer=e=>new TerserPlugin({parallel:!0,
2
+ // Disable Extract all or some (use /^\**!|@preserve|@license|@cc_on/i RegExp) comments.
3
+ extractComments:!1,terserOptions:mergeOptions(defaultTerserOptions,e)});
@@ -1 +1 @@
1
- export {};
1
+ export{};