@flatjs/evolve 2.1.0-next.12 → 2.1.0-next.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/compiler/create-global-compiler.d.ts +2 -0
  2. package/dist/compiler/create-global-compiler.js +1 -0
  3. package/dist/constants.js +1 -36
  4. package/dist/create-webpack/create-externals.js +1 -6
  5. package/dist/create-webpack/create-optimization.js +1 -43
  6. package/dist/create-webpack/create-output.js +1 -35
  7. package/dist/create-webpack/create-performance.js +1 -7
  8. package/dist/create-webpack/create-plugins.js +1 -78
  9. package/dist/create-webpack/create-resolve.js +1 -37
  10. package/dist/create-webpack/create-rule-sets.js +1 -20
  11. package/dist/create-webpack/load-watch-options.d.ts +12 -0
  12. package/dist/create-webpack/load-watch-options.js +1 -0
  13. package/dist/create-webpack/load-webpack-config.js +1 -57
  14. package/dist/create-webpack/resolve-public-path.js +1 -15
  15. package/dist/create-webpack/rule-sets/constants.js +1 -3
  16. package/dist/create-webpack/rule-sets/rule-assets.js +1 -52
  17. package/dist/create-webpack/rule-sets/rule-css.js +1 -111
  18. package/dist/create-webpack/rule-sets/rule-less.js +1 -44
  19. package/dist/create-webpack/rule-sets/rule-scripts.d.ts +2 -0
  20. package/dist/create-webpack/rule-sets/rule-scripts.js +1 -34
  21. package/dist/create-webpack/rule-sets/rule-svg-icon.js +1 -25
  22. package/dist/create-webpack/rule-sets/rule-utils.js +1 -10
  23. package/dist/create-webpack/types.d.ts +1 -1
  24. package/dist/create-webpack/types.js +1 -1
  25. package/dist/default-options.js +1 -83
  26. package/dist/define-config/define-config.d.ts +2 -2
  27. package/dist/define-config/define-config.js +1 -4
  28. package/dist/define-config/index.js +1 -1
  29. package/dist/dev-server/add-compiler-to-dev-server.js +1 -58
  30. package/dist/dev-server/create-app-page-route.js +1 -13
  31. package/dist/dev-server/create-dev-server-compiler-task.js +1 -55
  32. package/dist/dev-server/create-dev-server-entries.js +1 -25
  33. package/dist/dev-server/create-dev-server.js +1 -24
  34. package/dist/dev-server/index.d.ts +3 -3
  35. package/dist/dev-server/index.js +1 -6
  36. package/dist/dev-server/middlewares/create-page-middleware.js +1 -33
  37. package/dist/dev-server/middlewares/create-public-assets-middleware.js +1 -25
  38. package/dist/dev-server/middlewares/get-all-sorted-modules.js +1 -24
  39. package/dist/dev-server/middlewares/get-bundle-asset.js +1 -7
  40. package/dist/dev-server/middlewares/get-dev-server-host-uri.js +1 -5
  41. package/dist/dev-server/middlewares/get-hmr-runtime-chunks.js +1 -14
  42. package/dist/dev-server/middlewares/get-normalized-entry-name.js +1 -14
  43. package/dist/dev-server/middlewares/get-page-main-html.js +1 -49
  44. package/dist/dev-server/middlewares/get-page-module-html.js +1 -123
  45. package/dist/dev-server/middlewares/get-project-virtual-path.js +1 -3
  46. package/dist/dev-server/middlewares/get-runtime-manifest.js +1 -25
  47. package/dist/dev-server/middlewares/index.js +1 -2
  48. package/dist/dev-server/middlewares/types.js +1 -1
  49. package/dist/errors/evolve-build-error.js +1 -10
  50. package/dist/helpers/allow-px2rem-for-module.js +1 -6
  51. package/dist/helpers/assert-group-entry-item.js +1 -19
  52. package/dist/helpers/assert-single-compiler.js +1 -45
  53. package/dist/helpers/chunk-entry-map.js +1 -21
  54. package/dist/helpers/delete-object-keys.js +1 -20
  55. package/dist/helpers/enable-bundle-hashname-for-module.js +1 -6
  56. package/dist/helpers/filter-actived-entries.js +1 -42
  57. package/dist/helpers/flat-entry-map.js +1 -11
  58. package/dist/helpers/get-bundle-file-name.js +1 -23
  59. package/dist/helpers/get-git-root.js +1 -4
  60. package/dist/helpers/get-html-plugin-config.js +1 -47
  61. package/dist/helpers/get-max-process-tasks.js +1 -7
  62. package/dist/helpers/get-pacakge-dir.js +1 -13
  63. package/dist/helpers/get-runtime-cdn-base.d.ts +1 -1
  64. package/dist/helpers/get-runtime-cdn-base.js +1 -21
  65. package/dist/helpers/index.d.ts +11 -11
  66. package/dist/helpers/index.js +1 -27
  67. package/dist/helpers/is-deep-equal.js +1 -67
  68. package/dist/helpers/json-serializer.js +1 -52
  69. package/dist/helpers/merge-babel-options.js +1 -45
  70. package/dist/helpers/normalize-check-entry-options.js +1 -28
  71. package/dist/helpers/normalize-entry-map.js +1 -59
  72. package/dist/helpers/normalize-group-name.js +1 -16
  73. package/dist/helpers/normalize-page-proxy.js +1 -9
  74. package/dist/helpers/normalize-resolve-alias.js +1 -7
  75. package/dist/helpers/normalize-template-inject-tokens.js +1 -22
  76. package/dist/helpers/open-page.js +1 -15
  77. package/dist/helpers/print-log.js +1 -49
  78. package/dist/helpers/refresh-evolve-mock-options.js +1 -34
  79. package/dist/helpers/resolve-entry-map-input-files.js +1 -20
  80. package/dist/helpers/script-injects.d.ts +1 -1
  81. package/dist/helpers/script-injects.js +1 -39
  82. package/dist/helpers/should-enable-react-fast-refresh.js +1 -14
  83. package/dist/helpers/split-to-entry-group.d.ts +1 -1
  84. package/dist/helpers/split-to-entry-group.js +1 -139
  85. package/dist/helpers/verify-group-entry-options.js +1 -21
  86. package/dist/index.d.ts +1 -1
  87. package/dist/index.js +1 -5
  88. package/dist/load-config/index.js +1 -1
  89. package/dist/load-config/load-evolve-config.js +1 -41
  90. package/dist/load-config/types.js +1 -1
  91. package/dist/loaders/loader-icon.cjs +2 -1
  92. package/dist/main/create-thread-worker.js +1 -51
  93. package/dist/main/env-verify.js +1 -21
  94. package/dist/main/get-worker-path.js +1 -5
  95. package/dist/main/index.d.ts +1 -1
  96. package/dist/main/index.js +1 -4
  97. package/dist/main/prepare-build.js +1 -39
  98. package/dist/main/prepare-serve.js +1 -69
  99. package/dist/main/prepare-static.js +1 -30
  100. package/dist/main/start-build-dynamic.js +1 -171
  101. package/dist/main/start-build-worker.js +1 -44
  102. package/dist/main/start-build.js +1 -69
  103. package/dist/main/start-group-entry-build.d.ts +1 -1
  104. package/dist/main/start-group-entry-build.js +1 -32
  105. package/dist/main/start-serve.js +1 -34
  106. package/dist/main/start-static.js +1 -19
  107. package/dist/minimizer/create-minimizers.js +1 -25
  108. package/dist/minimizer/default-options.js +1 -14
  109. package/dist/minimizer/image-minimizer.js +1 -65
  110. package/dist/minimizer/index.js +1 -1
  111. package/dist/minimizer/terser-minimizer.js +3 -15
  112. package/dist/minimizer/types.js +1 -1
  113. package/dist/plugins/circular-dependency/circular-dependency-plugin.js +1 -119
  114. package/dist/plugins/circular-dependency/index.js +1 -15
  115. package/dist/plugins/clean-webpack/clean-webpack-plugin.js +1 -173
  116. package/dist/plugins/clean-webpack/index.js +1 -22
  117. package/dist/plugins/define-variable/define-variable-plugin.js +1 -28
  118. package/dist/plugins/define-variable/index.js +1 -1
  119. package/dist/plugins/html-inject-scripts/plugin-html-inject-script.js +1 -27
  120. package/dist/plugins/module-federation/external-template-remotes.js +1 -92
  121. package/dist/plugins/module-federation/index.js +1 -1
  122. package/dist/plugins/module-federation/module-federation.js +1 -100
  123. package/dist/plugins/multi-html/index.js +1 -16
  124. package/dist/plugins/multi-html/multi-html-cdn-plugin.js +1 -83
  125. package/dist/plugins/multi-html/multi-html-plugin.js +1 -65
  126. package/dist/plugins/ts-checker/ts-checker-guard-plugin.d.ts +13 -0
  127. package/dist/plugins/ts-checker/ts-checker-guard-plugin.js +1 -0
  128. package/dist/plugins/ts-checker/ts-checker-plugin.d.ts +1 -2
  129. package/dist/plugins/ts-checker/ts-checker-plugin.js +1 -24
  130. package/dist/types/index.d.ts +2 -1
  131. package/dist/types/index.js +1 -8
  132. package/dist/types/types-ci.js +1 -1
  133. package/dist/types/types-dev-server.d.ts +5 -6
  134. package/dist/types/types-dev-server.js +1 -1
  135. package/dist/types/types-entry-map.js +1 -1
  136. package/dist/types/types-federation.js +1 -1
  137. package/dist/types/types-global-compiler-options.d.ts +7 -0
  138. package/dist/types/types-global-compiler-options.js +1 -0
  139. package/dist/types/types-loader-options.d.ts +2 -7
  140. package/dist/types/types-loader-options.js +1 -1
  141. package/dist/types/types-modular-import.js +1 -1
  142. package/dist/types/types-multi-html.js +1 -1
  143. package/dist/types/types-options.d.ts +6 -1
  144. package/dist/types/types-options.js +1 -1
  145. package/dist/types/types-plugin-options.js +1 -1
  146. package/dist/types/types-threads-options.js +1 -1
  147. package/dist/types/types-webpack.d.ts +1 -1
  148. package/dist/types/types-webpack.js +1 -1
  149. package/package.json +30 -32
  150. package/dist/plugins/ts-checker/index.d.ts +0 -1
  151. package/dist/plugins/ts-checker/index.js +0 -1
@@ -1,171 +1 @@
1
- import { isAbsolute, join } from 'node:path';
2
- import { getDiffFiles, getCommitIdOfBranch } from '@armit/git';
3
- import { arraysIntersect, chalk, logger, requireResolve } from '@flatjs/common';
4
- import { traverseGraph } from '@flatjs/graph';
5
- import Listr from 'listr';
6
- import { ignoreEntryOptionKeys, moduleName } from '../constants.js';
7
- import { filterActivedEntriesByEntryInputs, filterActivedEntriesByModule, } from '../helpers/filter-actived-entries.js';
8
- import { getGitRoot } from '../helpers/get-git-root.js';
9
- import { getMaxProcessTasks } from '../helpers/get-max-process-tasks.js';
10
- import { jsonSerializer } from '../helpers/json-serializer.js';
11
- import { normalizeEvolveEntryMap } from '../helpers/normalize-entry-map.js';
12
- import { resolveEntryMapInputFiles } from '../helpers/resolve-entry-map-input-files.js';
13
- import { splitToEntryGroup } from '../helpers/split-to-entry-group.js';
14
- import { loadEvolveConfig } from '../load-config/load-evolve-config.js';
15
- import { createThreadWorker } from './create-thread-worker.js';
16
- import { envVerify } from './env-verify.js';
17
- export async function getBuildEntryFiles(projectCwd, diffFiles, allEntryInputs, resolveAlias, graphTreeNodeFilter) {
18
- const toBuildEntryFiles = [];
19
- const entryInputsPendingToCheck = [];
20
- for (const entryInput of allEntryInputs) {
21
- // If entry have been existed in diff files, need to rebuild.
22
- if (diffFiles.includes(entryInput)) {
23
- toBuildEntryFiles.push(entryInput);
24
- }
25
- else {
26
- entryInputsPendingToCheck.push(entryInput);
27
- }
28
- }
29
- if (graphTreeNodeFilter) {
30
- logger.info(`Use custom graph traverse filter`, moduleName);
31
- }
32
- // If there has pedding entry inputs to check.
33
- if (entryInputsPendingToCheck.length) {
34
- const graphDeps = await traverseGraph({
35
- input: entryInputsPendingToCheck,
36
- projectCwd,
37
- treeNodeFilter: graphTreeNodeFilter || (() => true),
38
- lessImportOptions: {
39
- projectCwd,
40
- aliases: resolveAlias,
41
- },
42
- });
43
- if (!graphDeps) {
44
- return toBuildEntryFiles;
45
- }
46
- logger.debug(`DependencyGraph:\n${JSON.stringify(graphDeps, null, 2)}`);
47
- for (const entryInputToCheck of entryInputsPendingToCheck) {
48
- const dependsFiles = graphDeps[entryInputToCheck] || [];
49
- if (arraysIntersect(dependsFiles, diffFiles)) {
50
- toBuildEntryFiles.push(entryInputToCheck);
51
- }
52
- }
53
- }
54
- return toBuildEntryFiles;
55
- }
56
- /**
57
- * Dynamic check which entry modules need to build.
58
- * @returns
59
- */
60
- export async function dynamicCheckBuildEntryMap(projectCwd, earlyCommit, lastCommit, overrideEvolveOptions, configLoaderOptions) {
61
- const command = {
62
- projectCwd,
63
- command: 'build',
64
- resolve: requireResolve,
65
- };
66
- // 1. Try to load evolve configuration from `flatjs-evolve.config.ts`
67
- const newEvolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
68
- // 2. Check if we have fixed build modules.
69
- if (newEvolveOptions.ci?.fixedBuildModules &&
70
- newEvolveOptions.ci?.fixedBuildModules.length) {
71
- logger.info('Use `fixedBuildModules` configuration to build...');
72
- const buildEntries = filterActivedEntriesByModule(newEvolveOptions.entryMap, newEvolveOptions.ci?.fixedBuildModules);
73
- return { buildEntries, newEvolveOptions };
74
- }
75
- logger.info('Dynamicly checking code changed modules ...');
76
- // 3. Resolve diff files based on specificed branch.
77
- // Check if we have fixed `early commit` if no resolve based on `Branch` from evolve config file.
78
- if (!earlyCommit) {
79
- const basedBranch = newEvolveOptions.ci?.basedBranch || 'origin/master';
80
- earlyCommit = await getCommitIdOfBranch(basedBranch);
81
- // Try resolve based branch commit hash.
82
- logger.info(`Resolving base branch "${basedBranch}" commit hash "${earlyCommit}" ...`);
83
- }
84
- // `packages/evolve/tests/main/fixtures/src/home/index.ts` without repo cwd.
85
- let diffFiles = earlyCommit
86
- ? await getDiffFiles(earlyCommit, lastCommit)
87
- : [];
88
- const gitRoot = getGitRoot(projectCwd);
89
- if (!gitRoot) {
90
- throw new Error(`No .git root (${projectCwd}) found`);
91
- }
92
- // Hack diff files with git repo root dir.
93
- diffFiles = diffFiles.map((diffFile) => {
94
- return isAbsolute(diffFile) ? diffFile : join(gitRoot, diffFile);
95
- });
96
- logger.debug(`Diff files: \n${JSON.stringify(diffFiles, null, 2)}`);
97
- // No code changed here.
98
- if (!diffFiles.length) {
99
- logger.warn('It seems that there are no code files changed.');
100
- return {
101
- buildEntries: {},
102
- newEvolveOptions,
103
- };
104
- }
105
- // 4. Resolve entry input files.
106
- const allEntryInputs = await resolveEntryMapInputFiles(projectCwd, newEvolveOptions.entryMap);
107
- // 5. Flag changed entries (with absolute filepath)
108
- const toBuildEntryFiles = await getBuildEntryFiles(projectCwd, diffFiles, allEntryInputs, newEvolveOptions.webpack?.resolve?.alias, newEvolveOptions.ci?.graphTreeNodeFilter);
109
- logger.debug(`To build entry files: \n${JSON.stringify(toBuildEntryFiles, null, 2)}`);
110
- // 6. Filter entry map items which need to build.
111
- const buildEntries = await filterActivedEntriesByEntryInputs(projectCwd, newEvolveOptions.entryMap, toBuildEntryFiles);
112
- return { buildEntries, newEvolveOptions };
113
- }
114
- /**
115
- * The main entry to start an evolve `build` with automatically detect modules which have been changed between two commits.
116
- * @param projectCwd The Root directory (workspace) of this project.
117
- * @param earlyCommit The diff based earlier commit hash
118
- * @param lastCommit If is omitted, it will have the same effect as using HEAD instead.
119
- */
120
- export const startDynamicBuild = async (projectCwd, earlyCommit, lastCommit, overrideEvolveOptions = {}, configLoaderOptions) => {
121
- // 1. Fetch all changed files between two `commit`
122
- const { buildEntries, newEvolveOptions } = await dynamicCheckBuildEntryMap(projectCwd, earlyCommit, lastCommit, overrideEvolveOptions, configLoaderOptions);
123
- await envVerify(projectCwd, newEvolveOptions);
124
- // Make sure that each entry option includes the groupName
125
- const normalizedBuildOneEntry = normalizeEvolveEntryMap(buildEntries, newEvolveOptions.entryMap);
126
- const entryMapGroupList = splitToEntryGroup(normalizedBuildOneEntry, newEvolveOptions, ignoreEntryOptionKeys, false);
127
- if (!entryMapGroupList.length) {
128
- logger.warn(`No build entries provided!`);
129
- return [];
130
- }
131
- const buildEntryGroupNames = entryMapGroupList.map((group) => {
132
- return Object.values(group)?.[0]?.groupName;
133
- });
134
- const { threads = {} } = newEvolveOptions;
135
- const maxThreads = getMaxProcessTasks(entryMapGroupList.length, threads?.maxThreads);
136
- logger.info(`Start dynamic build with (${chalk(['magenta'])(String(maxThreads))}) workers:\n${JSON.stringify({ buildEntriesGroup: buildEntryGroupNames }, null, 2)}`);
137
- const worker = createThreadWorker({ ...threads, maxThreads });
138
- const buildTasks = new Listr([], {
139
- concurrent: maxThreads,
140
- exitOnError: true,
141
- });
142
- const buildResults = [];
143
- for (const entryMapGroupItem of entryMapGroupList) {
144
- const groupName = Object.values(entryMapGroupItem)?.[0]?.groupName || '';
145
- const entryKeys = Object.keys(entryMapGroupItem);
146
- buildTasks.add({
147
- title: `Build group ${groupName}: ${chalk(['magenta'])(`${JSON.stringify(entryKeys, null, 2)}`)} ...`,
148
- task: async () => {
149
- const buildResult = await worker.startBuildWorker({
150
- projectCwd: projectCwd,
151
- entryKeys: entryKeys,
152
- serializedEvolveOptions: jsonSerializer.stringify(overrideEvolveOptions),
153
- configLoaderOptions: configLoaderOptions,
154
- });
155
- buildResults.push(buildResult);
156
- },
157
- });
158
- }
159
- if (buildTasks.tasks.length) {
160
- try {
161
- await buildTasks.run();
162
- }
163
- catch (err) {
164
- worker.terminate();
165
- // we need to catch the error here, make sure the `worker` can be terminated.
166
- throw err;
167
- }
168
- }
169
- worker.terminate();
170
- return buildResults;
171
- };
1
+ import Listr from"listr";import{isAbsolute,join}from"node:path";import{getCommitIdOfBranch,getDiffFiles}from"@armit/git";import{arraysIntersect,chalk,logger,requireResolve}from"@flatjs/common";import{traverseGraph}from"@flatjs/graph";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";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{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{resolveEntryMapInputFiles}from"../helpers/resolve-entry-map-input-files.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{createThreadWorker}from"./create-thread-worker.js";import{envVerify}from"./env-verify.js";export async function getBuildEntryFiles(e,r,t,o,i){const n=[],s=[];for(const e of t)r.includes(e)?n.push(e):s.push(e);if(i&&logger.info("Use custom graph traverse filter",moduleName),s.length){const t=await traverseGraph({input:s,projectCwd:e,treeNodeFilter:i||(()=>!0),lessImportOptions:{projectCwd:e,aliases:o}});if(!t)return n;logger.debug(`DependencyGraph:\n${JSON.stringify(t,null,2)}`);for(const e of s){const o=t[e]||[];arraysIntersect(o,r)&&n.push(e)}}return n}export async function dynamicCheckBuildEntryMap(e,r,t,o,i){const n={projectCwd:e,command:"build",resolve:requireResolve},s=await loadEvolveConfig(n,e,o,i);if(s.ci?.fixedBuildModules&&s.ci?.fixedBuildModules.length){logger.info("Use `fixedBuildModules` configuration to build...");return{buildEntries:filterActivedEntriesByModule(s.entryMap,s.ci?.fixedBuildModules),newEvolveOptions:s}}if(logger.info("Dynamicly checking code changed modules ..."),!r){const e=s.ci?.basedBranch||"origin/master";r=await getCommitIdOfBranch(e),logger.info(`Resolving base branch "${e}" commit hash "${r}" ...`)}let a=r?await getDiffFiles(r,t):[];const l=getGitRoot(e);if(!l)throw new Error(`No .git root (${e}) found`);if(a=a.map((e=>isAbsolute(e)?e:join(l,e))),logger.debug(`Diff files: \n${JSON.stringify(a,null,2)}`),!a.length)return logger.warn("It seems that there are no code files changed."),{buildEntries:{},newEvolveOptions:s};const c=await resolveEntryMapInputFiles(e,s.entryMap),p=await getBuildEntryFiles(e,a,c,s.webpack?.resolve?.alias,s.ci?.graphTreeNodeFilter);logger.debug(`To build entry files: \n${JSON.stringify(p,null,2)}`);return{buildEntries:await filterActivedEntriesByEntryInputs(e,s.entryMap,p),newEvolveOptions:s}}export const startDynamicBuild=async(e,r,t,o={},i)=>{const{buildEntries:n,newEvolveOptions:s}=await dynamicCheckBuildEntryMap(e,r,t,o,i);await envVerify(e,s);const a=normalizeEvolveEntryMap(n,s.entryMap),l=splitToEntryGroup(a,s,ignoreEntryOptionKeys,!1);if(!l.length)return logger.warn("No build entries provided!"),[];const c=l.map((e=>Object.values(e)?.[0]?.groupName));await createGlobalCompiler(!1,s);const{threads:p={}}=s,d=getMaxProcessTasks(l.length,p?.maxThreads);logger.info(`Start dynamic build with (${chalk(["magenta"])(String(d))}) workers:\n${JSON.stringify({buildEntriesGroup:c},null,2)}`);const m=createThreadWorker({...p,maxThreads:d}),f=new Listr([],{concurrent:d,exitOnError:!0}),g=[];for(const r of l){const t=Object.values(r)?.[0]?.groupName||"",n=Object.keys(r);f.add({title:`Build group ${t}: ${chalk(["magenta"])(`${JSON.stringify(n,null,2)}`)} ...`,task:async()=>{const r=await m.startBuildWorker({projectCwd:e,entryKeys:n,serializedEvolveOptions:jsonSerializer.stringify(o),configLoaderOptions:i});g.push(r)}})}if(f.tasks.length)try{await f.run()}catch(e){throw m.terminate(),e}return m.terminate(),g};
@@ -1,44 +1 @@
1
- import { requireResolve } from '@flatjs/common';
2
- import { ignoreEntryOptionKeys } from '../constants.js';
3
- import { filterActivedEntriesByModule } from '../helpers/filter-actived-entries.js';
4
- import { jsonSerializer } from '../helpers/json-serializer.js';
5
- import { normalizeEvolveEntryMap } from '../helpers/normalize-entry-map.js';
6
- import { splitToEntryGroup } from '../helpers/split-to-entry-group.js';
7
- import { loadEvolveConfig } from '../load-config/load-evolve-config.js';
8
- import { prepareBuild } from './prepare-build.js';
9
- /**
10
- * FIXME: The main entry to start an evolve `build`, NOTE: avoid pass configuration with `function` here.
11
- * If you need to call build api avoid `worker` you can directly call `prepareBuild`
12
- * @internal
13
- * @param options.projectCwd The Root directory (workspace) of this project.
14
- * @param options.entryKey The `entryKey` for one entry build task
15
- * @param options.serializedEvolveOptions The overrided evolve options, NOTE: we will serialize `function` property here first
16
- * @param options.configLoaderOptions Evolve config loader options, NOTE: avoid pass configuration with `function` here.
17
- */
18
- export default async (options) => {
19
- const { projectCwd, entryKeys, serializedEvolveOptions, configLoaderOptions, } = options;
20
- const command = {
21
- projectCwd,
22
- command: 'build',
23
- resolve: requireResolve,
24
- };
25
- const overrideEvolveOptions = jsonSerializer.parse(serializedEvolveOptions) || {};
26
- // Try to load evolve configuration from `flatjs-evolve.config.ts`
27
- // FIXME: Cause of `worker-theads` do not support pass configuration with `function` reference.
28
- const newEvolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
29
- // FIXME: Cause of `worker threads` we need avoid pass entryItem config directly
30
- // because we have some config node item with `function`
31
- // It will break `worker threads` comunication, e.g below shown.
32
- // DataCloneError: function (url) {
33
- // if (url.indexOf('dev.flatjs.com') > 0) return 'me';
34
- // if (url.indexOf('.qa.') > 0) retur...<omitted>... } could not be cloned.
35
- // at new DOMException (node:internal/per_context/domexception:53:5)
36
- // So we need to re cacalculate the build entry via `entryKey`
37
- const modulesRegList = entryKeys.map((key) => new RegExp(`^${key}$`));
38
- const buildGroupEntry = filterActivedEntriesByModule(newEvolveOptions.entryMap,
39
- // Make sure that the entryKey is correct match.
40
- modulesRegList);
41
- const normalizedBuildGroupEntry = normalizeEvolveEntryMap(buildGroupEntry, newEvolveOptions.entryMap);
42
- const entryMapGroupList = splitToEntryGroup(normalizedBuildGroupEntry, newEvolveOptions, ignoreEntryOptionKeys, false);
43
- return prepareBuild(entryMapGroupList[0], newEvolveOptions);
44
- };
1
+ import{requireResolve}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareBuild}from"./prepare-build.js";export default async e=>{const{projectCwd:r,entryKeys:o,serializedEvolveOptions:i,configLoaderOptions:t}=e,n={projectCwd:r,command:"build",resolve:requireResolve},p=jsonSerializer.parse(i)||{},l=await loadEvolveConfig(n,r,p,t),s=o.map((e=>new RegExp(`^${e}$`))),a=filterActivedEntriesByModule(l.entryMap,s),m=normalizeEvolveEntryMap(a,l.entryMap),d=splitToEntryGroup(m,l,ignoreEntryOptionKeys,!1);return prepareBuild(d[0],l)};
@@ -1,69 +1 @@
1
- import { chalk, logger, requireResolve } from '@flatjs/common';
2
- import Listr from 'listr';
3
- import { ignoreEntryOptionKeys } from '../constants.js';
4
- import { filterActivedEntriesByModule } from '../helpers/filter-actived-entries.js';
5
- import { getMaxProcessTasks } from '../helpers/get-max-process-tasks.js';
6
- import { jsonSerializer } from '../helpers/json-serializer.js';
7
- import { normalizeEvolveEntryMap } from '../helpers/normalize-entry-map.js';
8
- import { splitToEntryGroup } from '../helpers/split-to-entry-group.js';
9
- import { loadEvolveConfig } from '../load-config/load-evolve-config.js';
10
- import { createThreadWorker } from './create-thread-worker.js';
11
- import { envVerify } from './env-verify.js';
12
- export const startBuild = async (projectCwd, buildModules, overrideEvolveOptions = {}, configLoaderOptions) => {
13
- const command = {
14
- projectCwd,
15
- command: 'build',
16
- resolve: requireResolve,
17
- };
18
- // Try to load evolve configuration from `flatjs-evolve.config.ts`
19
- const newEvolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
20
- await envVerify(projectCwd, newEvolveOptions);
21
- const buildEntries = filterActivedEntriesByModule(newEvolveOptions.entryMap, buildModules);
22
- // Make sure that each entry option includes the groupName
23
- const normalizedBuildOneEntry = normalizeEvolveEntryMap(buildEntries, newEvolveOptions.entryMap);
24
- const entryMapGroupList = splitToEntryGroup(normalizedBuildOneEntry, newEvolveOptions, ignoreEntryOptionKeys, false);
25
- if (!entryMapGroupList.length) {
26
- logger.warn(`No build entries provided!`);
27
- return [];
28
- }
29
- const buildEntryGroupNames = entryMapGroupList.map((group) => {
30
- return Object.values(group)?.[0]?.groupName;
31
- });
32
- const { threads = {} } = newEvolveOptions;
33
- const maxThreads = getMaxProcessTasks(entryMapGroupList.length, threads?.maxThreads);
34
- logger.info(`Start standard build with (${chalk(['magenta'])(String(maxThreads))}) workers:\n${JSON.stringify({ buildEntriesGroup: buildEntryGroupNames }, null, 2)}`);
35
- const worker = createThreadWorker({ ...threads, maxThreads });
36
- const buildTasks = new Listr([], {
37
- concurrent: maxThreads,
38
- exitOnError: true,
39
- });
40
- const buildResults = [];
41
- for (const entryMapGroupItem of entryMapGroupList) {
42
- const groupName = Object.values(entryMapGroupItem)?.[0]?.groupName || '';
43
- const entryKeys = Object.keys(entryMapGroupItem);
44
- buildTasks.add({
45
- title: `Build group ${groupName}: ${chalk(['magenta'])(`${JSON.stringify(entryKeys, null, 2)}`)} ...`,
46
- task: async () => {
47
- const buildResult = await worker.startBuildWorker({
48
- projectCwd: projectCwd,
49
- entryKeys: entryKeys,
50
- serializedEvolveOptions: jsonSerializer.stringify(overrideEvolveOptions),
51
- configLoaderOptions: configLoaderOptions,
52
- });
53
- buildResults.push(buildResult);
54
- },
55
- });
56
- }
57
- if (buildTasks.tasks.length) {
58
- try {
59
- await buildTasks.run();
60
- }
61
- catch (err) {
62
- worker.terminate();
63
- // we need to catch the error here, make sure the `worker` can be terminated.
64
- throw err;
65
- }
66
- }
67
- worker.terminate();
68
- return buildResults;
69
- };
1
+ import Listr from"listr";import{chalk,logger,requireResolve}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys}from"../constants.js";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{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{createThreadWorker}from"./create-thread-worker.js";import{envVerify}from"./env-verify.js";export const startBuild=async(r,e,t={},o)=>{const i={projectCwd:r,command:"build",resolve:requireResolve},s=await loadEvolveConfig(i,r,t,o);await envVerify(r,s);const a=filterActivedEntriesByModule(s.entryMap,e),n=normalizeEvolveEntryMap(a,s.entryMap),l=splitToEntryGroup(n,s,ignoreEntryOptionKeys,!1);if(!l.length)return logger.warn("No build entries provided!"),[];const p=l.map((r=>Object.values(r)?.[0]?.groupName));await createGlobalCompiler(!1,s);const{threads:m={}}=s,c=getMaxProcessTasks(l.length,m?.maxThreads);logger.info(`Start standard build with (${chalk(["magenta"])(String(c))}) workers:\n${JSON.stringify({buildEntriesGroup:p},null,2)}`);const d=createThreadWorker({...m,maxThreads:c}),f=new Listr([],{concurrent:c,exitOnError:!0}),g=[];for(const e of l){const i=Object.values(e)?.[0]?.groupName||"",s=Object.keys(e);f.add({title:`Build group ${i}: ${chalk(["magenta"])(`${JSON.stringify(s,null,2)}`)} ...`,task:async()=>{const e=await d.startBuildWorker({projectCwd:r,entryKeys:s,serializedEvolveOptions:jsonSerializer.stringify(t),configLoaderOptions:o});g.push(e)}})}if(f.tasks.length)try{await f.run()}catch(r){throw d.terminate(),r}return d.terminate(),g};
@@ -1,7 +1,7 @@
1
1
  import { type EvolveEntryMap } from '../types/types-entry-map.js';
2
2
  import { type FlatEvolveOptions } from '../types/types-options.js';
3
3
  export type EvolveBuildResult = {
4
- name?: string;
4
+ name?: string[];
5
5
  warningStats?: unknown;
6
6
  };
7
7
  /**
@@ -1,32 +1 @@
1
- import webpack from 'webpack';
2
- import { loadWebpackConfig } from '../create-webpack/load-webpack-config.js';
3
- import { assertSingleCompiler } from '../helpers/assert-single-compiler.js';
4
- /**
5
- * Starts the build process for a group of entry files.
6
- *
7
- * @param groupBuildEntry - The map of entry files to be built.
8
- * @param evolveOptions - The options for the build process.
9
- * @returns A promise that resolves to the build result.
10
- */
11
- export const startGroupEntryBuild = async (groupBuildEntry, evolveOptions) => {
12
- // Try to load webpack configuration
13
- const webpackConfig = await loadWebpackConfig('production', groupBuildEntry, evolveOptions);
14
- const currCompiler = assertSingleCompiler(groupBuildEntry, webpackConfig, evolveOptions, false);
15
- // Run the single build.
16
- return new Promise((resolve, reject) => {
17
- webpack(currCompiler, (err, stats) => {
18
- if (err) {
19
- // Handle errors here
20
- return reject(err);
21
- }
22
- const statsJson = stats?.toJson();
23
- if (statsJson?.errors?.length) {
24
- return reject(statsJson.errors);
25
- }
26
- if (evolveOptions.rejectWarnings && statsJson?.warnings?.length) {
27
- return reject(statsJson.warnings);
28
- }
29
- resolve({ name: currCompiler.name, warningStats: statsJson?.warnings });
30
- });
31
- });
32
- };
1
+ import webpack from"webpack";import{loadWebpackConfig}from"../create-webpack/load-webpack-config.js";import{assertSingleCompiler}from"../helpers/assert-single-compiler.js";import{normalizeEvolveEntryName}from"../helpers/normalize-entry-map.js";export const startGroupEntryBuild=async(r,e)=>{const n=await loadWebpackConfig("production",r,e),o=assertSingleCompiler(r,n,e,!1);return new Promise(((n,t)=>{webpack(o,((o,a)=>{if(o)return t(o);const i=a?.toJson();if(i?.errors?.length)return t(i.errors);if(e.rejectWarnings&&i?.warnings?.length)return t(i.warnings);const{projectVirtualPath:s}=e,p=Object.keys(r).map((r=>normalizeEvolveEntryName(r,s)));n({name:p,warningStats:i?.warnings})}))}))};
@@ -1,34 +1 @@
1
- import { logger, requireResolve } 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
- projectCwd,
16
- command: 'serve',
17
- resolve: requireResolve,
18
- };
19
- // Try to load evolve configuration from `flatjs-evolve.config.ts`
20
- const evolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
21
- const servedEntries = filterActivedEntriesByModule(evolveOptions.entryMap, serveModules);
22
- const servedEntryKeys = Object.keys(servedEntries);
23
- // Make sure that we have at least one serve entry module.
24
- if (!servedEntryKeys.length) {
25
- logger.warn(`No served entries providered!`);
26
- return [];
27
- }
28
- logger.info({
29
- servedEntries: servedEntryKeys,
30
- });
31
- // Normalized served entries to make sure we have latested entry options.
32
- const normalizedServedEntries = normalizeEvolveEntryMap(servedEntries, evolveOptions.entryMap);
33
- return prepareServe(projectCwd, normalizedServedEntries, evolveOptions);
34
- };
1
+ import{logger,requireResolve}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";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 l={projectCwd:e,command:"serve",resolve:requireResolve},i=await loadEvolveConfig(l,e,o,t),a=filterActivedEntriesByModule(i.entryMap,r),n=Object.keys(a);if(!n.length)return logger.warn("No served entries providered!"),[];logger.info({servedEntries:n});const p=normalizeEvolveEntryMap(a,i.entryMap);return await createGlobalCompiler(!0,i),prepareServe(e,p,i)};
@@ -1,19 +1 @@
1
- import { requireResolve } from '@flatjs/common';
2
- import { loadEvolveConfig } from '../load-config/load-evolve-config.js';
3
- import { prepareStatic } from './prepare-static.js';
4
- /**
5
- * The main entry to start evolve static server to proxy all modules of `production` build
6
- * @param projectCwd The Root directory (workspace) of this project.
7
- * @param overrideEvolveOptions The overrided evolve options
8
- * @param configLoaderOptions Evolve config loader options
9
- */
10
- export const startStatic = async (projectCwd, overrideEvolveOptions = {}, configLoaderOptions) => {
11
- const command = {
12
- projectCwd,
13
- command: 'static',
14
- resolve: requireResolve,
15
- };
16
- // Try to load evolve configuration from `flatjs-evolve.config.ts`
17
- const evolveOptions = await loadEvolveConfig(command, projectCwd, overrideEvolveOptions, configLoaderOptions);
18
- return prepareStatic(projectCwd, evolveOptions);
19
- };
1
+ import{requireResolve}from"@flatjs/common";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareStatic}from"./prepare-static.js";export const startStatic=async(o,e={},r)=>{const t={projectCwd:o,command:"static",resolve:requireResolve},a=await loadEvolveConfig(t,o,e,r);return prepareStatic(o,a)};
@@ -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,65 +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
- * Install libpng library & gifsicle tool
8
- * macos
9
- * =====================
10
- * brew install libpng
11
- * brew install gifsicle
12
- *
13
- * centos
14
- * =====================
15
- * sudo yum install libpng
16
- * sudo yum install epel-release
17
- * sudo yum install gifsicle
18
- * @returns
19
- */
20
- export const imageMinimizer = () => {
21
- const suggestedPlugins = [
22
- // Svgo configuration here https://github.com/svg/svgo#configuration
23
- ['svgo', {}],
24
- ['gifsicle', {}],
25
- ['jpegtran', {}],
26
- ['pngquant', {}],
27
- ];
28
- const logMessage = [];
29
- const availabledPlugins = suggestedPlugins
30
- .map((item) => {
31
- const moduleId = item[0];
32
- try {
33
- requireResolve(import.meta.url, `imagemin-${moduleId}`);
34
- return item;
35
- }
36
- catch (err) {
37
- if (!logs.get(moduleId)) {
38
- logs.set(moduleId, true);
39
- const command = chalk(['magenta'])(`"${projectHasYarn() ? 'yarn add' : 'npm install'} imagemin-${moduleId} -D"`);
40
- logMessage.push(`Execute ${command} for assets optimization`);
41
- }
42
- return null;
43
- }
44
- })
45
- .filter(Boolean);
46
- if (logMessage.length) {
47
- for (const msg of logMessage) {
48
- logger.warn(msg, moduleName);
49
- }
50
- }
51
- if (availabledPlugins.length) {
52
- return new ImageMinimizerPlugin({
53
- minimizer: {
54
- // Recommended squoosh options for lossless optimization
55
- implementation: ImageMinimizerPlugin.imageminMinify,
56
- options: {
57
- // Lossless optimization with custom option
58
- // Feel free to experiment with options for better result for you
59
- plugins: availabledPlugins,
60
- },
61
- },
62
- });
63
- }
64
- return null;
65
- };
1
+ import ImageMinimizerPlugin from"image-minimizer-webpack-plugin";import{projectHasYarn}from"@armit/package";import{chalk,logger,requireResolve}from"@flatjs/common";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(import.meta.url,`imagemin-${n}`),i}catch{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 TerserPlugin from"terser-webpack-plugin";import{mergeOptions}from"@flatjs/common";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{};