@modern-js/app-tools 2.50.0 → 2.51.0

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 (63) hide show
  1. package/dist/cjs/analyze/getServerRoutes.js +4 -3
  2. package/dist/cjs/commands/deploy.js +1 -0
  3. package/dist/cjs/hooks.js +1 -0
  4. package/dist/cjs/index.js +3 -1
  5. package/dist/cjs/plugins/deploy/dependencies/index.js +217 -0
  6. package/dist/cjs/plugins/deploy/dependencies/utils.js +165 -0
  7. package/dist/cjs/plugins/deploy/index.js +64 -0
  8. package/dist/cjs/plugins/deploy/platforms/netlify.js +136 -0
  9. package/dist/cjs/plugins/deploy/platforms/netlifyEntry.js +60 -0
  10. package/dist/cjs/plugins/deploy/platforms/node.js +90 -0
  11. package/dist/cjs/plugins/deploy/platforms/nodeEntry.js +44 -0
  12. package/dist/cjs/plugins/deploy/platforms/platform.js +16 -0
  13. package/dist/cjs/plugins/deploy/platforms/vercel.js +148 -0
  14. package/dist/cjs/plugins/deploy/platforms/vercelEntry.js +60 -0
  15. package/dist/cjs/plugins/deploy/utils.js +81 -0
  16. package/dist/cjs/utils/routes.js +7 -2
  17. package/dist/esm/analyze/getServerRoutes.js +5 -4
  18. package/dist/esm/commands/deploy.js +7 -1
  19. package/dist/esm/hooks.js +1 -0
  20. package/dist/esm/index.js +3 -1
  21. package/dist/esm/plugins/deploy/dependencies/index.js +580 -0
  22. package/dist/esm/plugins/deploy/dependencies/utils.js +407 -0
  23. package/dist/esm/plugins/deploy/index.js +135 -0
  24. package/dist/esm/plugins/deploy/platforms/netlify.js +291 -0
  25. package/dist/esm/plugins/deploy/platforms/netlifyEntry.js +202 -0
  26. package/dist/esm/plugins/deploy/platforms/node.js +124 -0
  27. package/dist/esm/plugins/deploy/platforms/nodeEntry.js +107 -0
  28. package/dist/esm/plugins/deploy/platforms/platform.js +0 -0
  29. package/dist/esm/plugins/deploy/platforms/vercel.js +225 -0
  30. package/dist/esm/plugins/deploy/platforms/vercelEntry.js +202 -0
  31. package/dist/esm/plugins/deploy/utils.js +47 -0
  32. package/dist/esm/utils/routes.js +6 -2
  33. package/dist/esm-node/analyze/getServerRoutes.js +5 -4
  34. package/dist/esm-node/commands/deploy.js +1 -0
  35. package/dist/esm-node/hooks.js +1 -0
  36. package/dist/esm-node/index.js +3 -1
  37. package/dist/esm-node/plugins/deploy/dependencies/index.js +183 -0
  38. package/dist/esm-node/plugins/deploy/dependencies/utils.js +124 -0
  39. package/dist/esm-node/plugins/deploy/index.js +44 -0
  40. package/dist/esm-node/plugins/deploy/platforms/netlify.js +102 -0
  41. package/dist/esm-node/plugins/deploy/platforms/netlifyEntry.js +68 -0
  42. package/dist/esm-node/plugins/deploy/platforms/node.js +56 -0
  43. package/dist/esm-node/plugins/deploy/platforms/nodeEntry.js +43 -0
  44. package/dist/esm-node/plugins/deploy/platforms/platform.js +0 -0
  45. package/dist/esm-node/plugins/deploy/platforms/vercel.js +114 -0
  46. package/dist/esm-node/plugins/deploy/platforms/vercelEntry.js +68 -0
  47. package/dist/esm-node/plugins/deploy/utils.js +44 -0
  48. package/dist/esm-node/utils/routes.js +6 -2
  49. package/dist/types/defineConfig.d.ts +1 -1
  50. package/dist/types/plugins/deploy/dependencies/index.d.ts +1 -0
  51. package/dist/types/plugins/deploy/dependencies/utils.d.ts +31 -0
  52. package/dist/types/plugins/deploy/index.d.ts +4 -0
  53. package/dist/types/plugins/deploy/platforms/netlify.d.ts +2 -0
  54. package/dist/types/plugins/deploy/platforms/netlifyEntry.d.ts +2 -0
  55. package/dist/types/plugins/deploy/platforms/node.d.ts +2 -0
  56. package/dist/types/plugins/deploy/platforms/nodeEntry.d.ts +1 -0
  57. package/dist/types/plugins/deploy/platforms/platform.d.ts +10 -0
  58. package/dist/types/plugins/deploy/platforms/vercel.d.ts +2 -0
  59. package/dist/types/plugins/deploy/platforms/vercelEntry.d.ts +2 -0
  60. package/dist/types/plugins/deploy/utils.d.ts +20 -0
  61. package/dist/types/types/hooks.d.ts +1 -0
  62. package/dist/types/utils/routes.d.ts +3 -3
  63. package/package.json +26 -22
@@ -34,6 +34,7 @@ module.exports = __toCommonJS(getServerRoutes_exports);
34
34
  var import_path = __toESM(require("path"));
35
35
  var import_fs = __toESM(require("fs"));
36
36
  var import_utils = require("@modern-js/utils");
37
+ var import_routes = require("../utils/routes");
37
38
  var import_utils2 = require("./utils");
38
39
  const applyBaseUrl = (baseUrl, routes) => {
39
40
  if (baseUrl) {
@@ -106,14 +107,14 @@ const collectHtmlRoutes = (entrypoints, appContext, config) => {
106
107
  const { packageName } = appContext;
107
108
  const workerSSR = deploy === null || deploy === void 0 ? void 0 : (_deploy_worker = deploy.worker) === null || _deploy_worker === void 0 ? void 0 : _deploy_worker.ssr;
108
109
  let htmlRoutes = entrypoints.reduce((previous, { entryName }) => {
109
- const isMainEntry = entryName === (mainEntryName || import_utils.MAIN_ENTRY_NAME);
110
- const entryOptions = (0, import_utils.getEntryOptions)(entryName, isMainEntry, ssr, ssrByEntries, packageName);
110
+ const isMain = (0, import_routes.isMainEntry)(entryName, mainEntryName);
111
+ const entryOptions = (0, import_utils.getEntryOptions)(entryName, isMain, ssr, ssrByEntries, packageName);
111
112
  const isSSR = Boolean(entryOptions);
112
113
  const isWorker = Boolean(workerSSR);
113
114
  const isStream = typeof entryOptions === "object" && (entryOptions.mode === "stream" || Boolean(entryOptions.preload));
114
115
  const { resHeaders } = (routes === null || routes === void 0 ? void 0 : routes[entryName]) || {};
115
116
  let route = {
116
- urlPath: `/${isMainEntry ? "" : entryName}`,
117
+ urlPath: `/${isMain ? "" : entryName}`,
117
118
  entryName,
118
119
  entryPath: (0, import_utils.removeLeadingSlash)(import_path.default.posix.normalize(`${htmlPath}/${entryName}${disableHtmlFolder ? ".html" : "/index.html"}`)),
119
120
  isSPA: true,
@@ -26,6 +26,7 @@ const deploy = async (api, options) => {
26
26
  const hookRunners = api.useHookRunners();
27
27
  await (0, import_getServerInternalPlugins.getServerInternalPlugins)(api);
28
28
  await hookRunners.beforeDeploy(options);
29
+ await hookRunners.deploy(options);
29
30
  await hookRunners.afterDeploy(options);
30
31
  };
31
32
  // Annotate the CommonJS export names for ESM import in node:
package/dist/cjs/hooks.js CHANGED
@@ -42,6 +42,7 @@ const hooks = {
42
42
  beforeBuild: (0, import_plugin.createAsyncWorkflow)(),
43
43
  afterBuild: (0, import_plugin.createAsyncWorkflow)(),
44
44
  beforeDeploy: (0, import_plugin.createAsyncWorkflow)(),
45
+ deploy: (0, import_plugin.createAsyncWorkflow)(),
45
46
  afterDeploy: (0, import_plugin.createAsyncWorkflow)(),
46
47
  beforeRestart: (0, import_plugin.createAsyncWorkflow)(),
47
48
  registerDev: (0, import_plugin.createParallelWorkflow)(),
package/dist/cjs/index.js CHANGED
@@ -47,6 +47,7 @@ var import_initialize = __toESM(require("./initialize"));
47
47
  var import_hooks = require("./hooks");
48
48
  var import_locale = require("./locale");
49
49
  var import_serverBuild = __toESM(require("./plugins/serverBuild"));
50
+ var import_deploy = __toESM(require("./plugins/deploy"));
50
51
  var import_restart = require("./utils/restart");
51
52
  var import_generateWatchFiles = require("./utils/generateWatchFiles");
52
53
  var import_core = require("@modern-js/core");
@@ -120,7 +121,8 @@ const appTools = (options = {
120
121
  bundler: (options === null || options === void 0 ? void 0 : options.bundler) === "experimental-rspack" ? "rspack" : "webpack"
121
122
  }),
122
123
  (0, import_serverBuild.default)(),
123
- (0, import_plugin_lint.lintPlugin)()
124
+ (0, import_plugin_lint.lintPlugin)(),
125
+ (0, import_deploy.default)()
124
126
  ],
125
127
  setup: (api) => {
126
128
  const appContext = api.useAppContext();
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var dependencies_exports = {};
30
+ __export(dependencies_exports, {
31
+ handleDependencies: () => handleDependencies
32
+ });
33
+ module.exports = __toCommonJS(dependencies_exports);
34
+ var import_node_path = __toESM(require("node:path"));
35
+ var import_utils = require("@modern-js/utils");
36
+ var import_pkg_types = require("pkg-types");
37
+ var import_mlly = require("mlly");
38
+ var import_utils2 = require("./utils");
39
+ const handleDependencies = async (appDir, serverRootDir, include, entryFilter) => {
40
+ const base = "/";
41
+ const entryFiles = await (0, import_utils2.findEntryFiles)(serverRootDir, entryFilter);
42
+ const includeEntries = include.map((item) => {
43
+ if ((0, import_node_path.isAbsolute)(item)) {
44
+ return item;
45
+ }
46
+ try {
47
+ return require.resolve(item);
48
+ } catch (error) {
49
+ }
50
+ return item;
51
+ });
52
+ const fileTrace = await (0, import_utils2.traceFiles)(entryFiles.concat(includeEntries), serverRootDir, base);
53
+ const currentProjectModules = import_node_path.default.join(appDir, "node_modules");
54
+ const tracedFiles = Object.fromEntries(await Promise.all([
55
+ ...fileTrace.reasons.entries()
56
+ ].map(async ([_path, reasons]) => {
57
+ if (reasons.ignored) {
58
+ return;
59
+ }
60
+ const filePath = await (0, import_utils2.resolveTracedPath)(base, _path);
61
+ if (filePath.startsWith(serverRootDir) || filePath.startsWith(appDir) && !filePath.startsWith(currentProjectModules)) {
62
+ return;
63
+ }
64
+ if (!await (0, import_utils2.isFile)(filePath)) {
65
+ return;
66
+ }
67
+ let baseDir;
68
+ let pkgName;
69
+ let subpath;
70
+ let pkgPath;
71
+ if (filePath.includes("node_modules")) {
72
+ const parsed = (0, import_mlly.parseNodeModulePath)(filePath);
73
+ baseDir = parsed.dir;
74
+ pkgName = parsed.name;
75
+ subpath = parsed.subpath;
76
+ pkgPath = import_node_path.default.join(baseDir, pkgName);
77
+ } else {
78
+ const MODERN_UTILS_PATH = "packages/toolkit/utils";
79
+ const MODERN_UTILS_PATH_REGEX = new RegExp(`(.*${MODERN_UTILS_PATH})`);
80
+ const match = filePath.match(MODERN_UTILS_PATH_REGEX);
81
+ const packageJsonPath = match ? import_node_path.default.join(match[0], "package.json") : await (0, import_utils.pkgUp)({
82
+ cwd: import_node_path.default.dirname(filePath)
83
+ });
84
+ if (packageJsonPath) {
85
+ const packageJson = await import_utils.fs.readJSON(packageJsonPath);
86
+ pkgPath = baseDir = import_node_path.default.dirname(packageJsonPath);
87
+ subpath = import_node_path.default.relative(baseDir, filePath);
88
+ pkgName = packageJson.name;
89
+ }
90
+ }
91
+ if (!baseDir) {
92
+ return;
93
+ }
94
+ const parents = await Promise.all([
95
+ ...reasons.parents
96
+ ].map((p) => (0, import_utils2.resolveTracedPath)(base, p)));
97
+ const tracedFile = {
98
+ path: filePath,
99
+ parents,
100
+ isDirectDep: parents.some((parent) => {
101
+ return parent.startsWith(appDir) && !parent.startsWith(currentProjectModules);
102
+ }),
103
+ subpath,
104
+ pkgName,
105
+ pkgPath
106
+ };
107
+ return [
108
+ filePath,
109
+ tracedFile
110
+ ];
111
+ })).then((r) => r.filter(Boolean)));
112
+ const tracedPackages = {};
113
+ for (const tracedFile of Object.values(tracedFiles)) {
114
+ const { pkgName } = tracedFile;
115
+ let tracedPackage = tracedPackages[pkgName];
116
+ let pkgJSON = await (0, import_pkg_types.readPackageJSON)(tracedFile.pkgPath, {
117
+ cache: true
118
+ }).catch(() => {
119
+ });
120
+ if (!pkgJSON) {
121
+ pkgJSON = {
122
+ name: pkgName,
123
+ version: "0.0.0"
124
+ };
125
+ }
126
+ if (!tracedPackage) {
127
+ tracedPackage = {
128
+ name: pkgName,
129
+ versions: {}
130
+ };
131
+ tracedPackages[pkgName] = tracedPackage;
132
+ }
133
+ let tracedPackageVersion = tracedPackage.versions[pkgJSON.version];
134
+ if (!tracedPackageVersion) {
135
+ tracedPackageVersion = {
136
+ path: tracedFile.pkgPath,
137
+ files: [],
138
+ isDirectDep: false,
139
+ pkgJSON
140
+ };
141
+ if (tracedFile.isDirectDep) {
142
+ tracedPackageVersion.isDirectDep = tracedFile.isDirectDep;
143
+ }
144
+ tracedPackage.versions[pkgJSON.version] = tracedPackageVersion;
145
+ }
146
+ tracedFile.path.startsWith(tracedFile.pkgPath) && tracedPackageVersion.path === tracedFile.pkgPath && tracedPackageVersion.files.push(tracedFile.path);
147
+ tracedFile.pkgName = pkgName;
148
+ tracedFile.pkgVersion = pkgJSON.version;
149
+ }
150
+ const multiVersionPkgs = {};
151
+ const singleVersionPackages = [];
152
+ for (const tracedPackage of Object.values(tracedPackages)) {
153
+ const versions = Object.keys(tracedPackage.versions);
154
+ if (versions.length === 1) {
155
+ singleVersionPackages.push(tracedPackage.name);
156
+ continue;
157
+ }
158
+ multiVersionPkgs[tracedPackage.name] = {};
159
+ for (const version of versions) {
160
+ multiVersionPkgs[tracedPackage.name][version] = (0, import_utils2.findPackageParents)(tracedPackage, version, tracedFiles);
161
+ }
162
+ }
163
+ await Promise.all(singleVersionPackages.map((pkgName) => {
164
+ const pkg = tracedPackages[pkgName];
165
+ const version = Object.keys(pkg.versions)[0];
166
+ return (0, import_utils2.writePackage)(pkg, version, serverRootDir);
167
+ }));
168
+ const projectPkgJson = await (0, import_pkg_types.readPackageJSON)(serverRootDir).catch(() => ({}));
169
+ for (const [pkgName, pkgVersions] of Object.entries(multiVersionPkgs)) {
170
+ const versionEntires = Object.entries(pkgVersions).sort(([v1, p1], [v2, p2]) => {
171
+ var _tracedPackages_pkgName_versions_v1, _tracedPackages_pkgName_versions, _tracedPackages_pkgName, _tracedPackages_pkgName_versions_v2, _tracedPackages_pkgName_versions1, _tracedPackages_pkgName1;
172
+ const shouldHoist1 = (_tracedPackages_pkgName = tracedPackages[pkgName]) === null || _tracedPackages_pkgName === void 0 ? void 0 : (_tracedPackages_pkgName_versions = _tracedPackages_pkgName.versions) === null || _tracedPackages_pkgName_versions === void 0 ? void 0 : (_tracedPackages_pkgName_versions_v1 = _tracedPackages_pkgName_versions[v1]) === null || _tracedPackages_pkgName_versions_v1 === void 0 ? void 0 : _tracedPackages_pkgName_versions_v1.isDirectDep;
173
+ const shouldHoist2 = (_tracedPackages_pkgName1 = tracedPackages[pkgName]) === null || _tracedPackages_pkgName1 === void 0 ? void 0 : (_tracedPackages_pkgName_versions1 = _tracedPackages_pkgName1.versions) === null || _tracedPackages_pkgName_versions1 === void 0 ? void 0 : (_tracedPackages_pkgName_versions_v2 = _tracedPackages_pkgName_versions1[v2]) === null || _tracedPackages_pkgName_versions_v2 === void 0 ? void 0 : _tracedPackages_pkgName_versions_v2.isDirectDep;
174
+ if (shouldHoist1 && !shouldHoist2) {
175
+ return -1;
176
+ }
177
+ if (!shouldHoist1 && shouldHoist2) {
178
+ return 1;
179
+ }
180
+ if (p1.length === 0) {
181
+ return -1;
182
+ }
183
+ if (p2.length === 0) {
184
+ return 1;
185
+ }
186
+ return import_utils.semver.lt(v1, v2, {
187
+ loose: true
188
+ }) ? 1 : -1;
189
+ });
190
+ for (const [version, parentPkgs] of versionEntires) {
191
+ const pkg = tracedPackages[pkgName];
192
+ const pkgDestPath = `.modernjs/${pkgName}@${version}/node_modules/${pkgName}`;
193
+ await (0, import_utils2.writePackage)(pkg, version, serverRootDir, pkgDestPath);
194
+ await (0, import_utils2.linkPackage)(pkgDestPath, `${pkgName}`, serverRootDir);
195
+ for (const parentPkg of parentPkgs) {
196
+ const parentPkgName = parentPkg.replace(/@[^@]+$/, "");
197
+ await (multiVersionPkgs[parentPkgName] ? (0, import_utils2.linkPackage)(pkgDestPath, `.modernjs/${parentPkg}/node_modules/${pkgName}`, serverRootDir) : (0, import_utils2.linkPackage)(pkgDestPath, `${parentPkgName}/node_modules/${pkgName}`, serverRootDir));
198
+ }
199
+ }
200
+ }
201
+ const outputPkgPath = import_node_path.default.join(serverRootDir, "package.json");
202
+ await import_utils.fs.writeJSON(outputPkgPath, {
203
+ name: `${projectPkgJson.name || "modernjs-project"}-prod`,
204
+ version: projectPkgJson.version || "0.0.0",
205
+ private: true,
206
+ dependencies: Object.fromEntries([
207
+ ...Object.values(tracedPackages).map((pkg) => [
208
+ pkg.name,
209
+ Object.keys(pkg.versions)[0]
210
+ ])
211
+ ].sort(([a], [b]) => a.localeCompare(b)))
212
+ });
213
+ };
214
+ // Annotate the CommonJS export names for ESM import in node:
215
+ 0 && (module.exports = {
216
+ handleDependencies
217
+ });
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var utils_exports = {};
30
+ __export(utils_exports, {
31
+ findEntryFiles: () => findEntryFiles,
32
+ findPackageParents: () => findPackageParents,
33
+ isFile: () => isFile,
34
+ linkPackage: () => linkPackage,
35
+ readDirRecursive: () => readDirRecursive,
36
+ resolveTracedPath: () => resolveTracedPath,
37
+ traceFiles: () => traceFiles,
38
+ writePackage: () => writePackage
39
+ });
40
+ module.exports = __toCommonJS(utils_exports);
41
+ var import_path = __toESM(require("path"));
42
+ var import_node_os = __toESM(require("node:os"));
43
+ var import_utils = require("@modern-js/utils");
44
+ var import_mlly = require("mlly");
45
+ var import_nft = require("@vercel/nft");
46
+ function applyPublicCondition(pkg) {
47
+ var _pkg_publishConfig;
48
+ if (pkg === null || pkg === void 0 ? void 0 : (_pkg_publishConfig = pkg.publishConfig) === null || _pkg_publishConfig === void 0 ? void 0 : _pkg_publishConfig.exports) {
49
+ var _pkg_publishConfig1;
50
+ pkg.exports = pkg === null || pkg === void 0 ? void 0 : (_pkg_publishConfig1 = pkg.publishConfig) === null || _pkg_publishConfig1 === void 0 ? void 0 : _pkg_publishConfig1.exports;
51
+ }
52
+ }
53
+ const writePackage = async (pkg, version, projectDir, _pkgPath) => {
54
+ const pkgPath = _pkgPath || pkg.name;
55
+ for (const src of pkg.versions[version].files) {
56
+ if (src.includes("node_modules")) {
57
+ const { subpath } = (0, import_mlly.parseNodeModulePath)(src);
58
+ const dest = import_path.default.join(projectDir, "node_modules", pkgPath, subpath);
59
+ const dirname = import_path.default.dirname(dest);
60
+ await import_utils.fs.ensureDir(dirname);
61
+ await import_utils.fs.copyFile(src, dest);
62
+ } else {
63
+ const subpath = import_path.default.relative(pkg.versions[version].path, src);
64
+ const dest = import_path.default.join(projectDir, "node_modules", pkgPath, subpath);
65
+ const dirname = import_path.default.dirname(dest);
66
+ await import_utils.fs.ensureDir(dirname);
67
+ await import_utils.fs.copyFile(src, dest);
68
+ }
69
+ }
70
+ const { pkgJSON } = pkg.versions[version];
71
+ applyPublicCondition(pkgJSON);
72
+ const packageJsonPath = import_path.default.join(projectDir, "node_modules", pkgPath, "package.json");
73
+ await import_utils.fs.ensureDir(import_path.default.dirname(packageJsonPath));
74
+ await import_utils.fs.writeFile(packageJsonPath, JSON.stringify(pkgJSON, null, 2));
75
+ };
76
+ const isWindows = import_node_os.default.platform() === "win32";
77
+ const linkPackage = async (from, to, projectRootDir) => {
78
+ const src = import_path.default.join(projectRootDir, "node_modules", from);
79
+ const dest = import_path.default.join(projectRootDir, "node_modules", to);
80
+ const dstStat = await import_utils.fs.lstat(dest).catch(() => null);
81
+ const exists = dstStat === null || dstStat === void 0 ? void 0 : dstStat.isSymbolicLink();
82
+ if (exists) {
83
+ return;
84
+ }
85
+ await import_utils.fs.mkdir(import_path.default.dirname(dest), {
86
+ recursive: true
87
+ });
88
+ await import_utils.fs.symlink(import_path.default.relative(import_path.default.dirname(dest), src), dest, isWindows ? "junction" : "dir").catch((error) => {
89
+ console.error("Cannot link", from, "to", to, error);
90
+ });
91
+ };
92
+ const readDirRecursive = async (dir, options = {}) => {
93
+ const { filter } = options;
94
+ const files = await import_utils.fs.readdir(dir, {
95
+ withFileTypes: true
96
+ });
97
+ const filesAndDirs = await Promise.all(files.map(async (file) => {
98
+ const resolvedPath = import_path.default.resolve(dir, file.name);
99
+ if (file.isDirectory()) {
100
+ return readDirRecursive(resolvedPath, options);
101
+ } else {
102
+ return filter && !filter(resolvedPath) ? [] : resolvedPath;
103
+ }
104
+ }));
105
+ return filesAndDirs.flat();
106
+ };
107
+ const isFile = async (file) => {
108
+ try {
109
+ const stat = await import_utils.fs.stat(file);
110
+ return stat.isFile();
111
+ } catch (error) {
112
+ if (error.code === "ENOENT") {
113
+ return false;
114
+ }
115
+ throw error;
116
+ }
117
+ };
118
+ const findEntryFiles = async (rootDir, entryFilter) => {
119
+ const files = await readDirRecursive(rootDir, {
120
+ filter: entryFilter
121
+ });
122
+ return files.filter((file) => file.endsWith(".mjs") || file.endsWith(".cjs") || file.endsWith(".js"));
123
+ };
124
+ const findPackageParents = (pkg, version, tracedFiles) => {
125
+ const versionFiles = pkg.versions[version].files.map((path2) => tracedFiles[path2]);
126
+ const parentPkgs = [
127
+ ...new Set(versionFiles.flatMap((file) => file.parents.map((parentPath) => {
128
+ const parentFile = tracedFiles[parentPath];
129
+ if (!parentFile || parentFile.pkgName === pkg.name) {
130
+ return null;
131
+ }
132
+ return `${parentFile.pkgName}@${parentFile.pkgVersion}`;
133
+ }).filter(Boolean)))
134
+ ];
135
+ return parentPkgs;
136
+ };
137
+ const traceFiles = async (entryFiles, serverRootDir, base = "/") => {
138
+ return await (0, import_nft.nodeFileTrace)(entryFiles, {
139
+ base,
140
+ processCwd: serverRootDir,
141
+ resolve: async (id, parent, job, isCjs) => {
142
+ if (id.startsWith("@modern-js/prod-server")) {
143
+ return require.resolve(id, {
144
+ paths: [
145
+ require.resolve("@modern-js/app-tools")
146
+ ]
147
+ });
148
+ } else {
149
+ return (0, import_nft.resolve)(id, parent, job, isCjs);
150
+ }
151
+ }
152
+ });
153
+ };
154
+ const resolveTracedPath = async (base, p) => import_utils.fs.realpath(import_path.default.resolve(base, p));
155
+ // Annotate the CommonJS export names for ESM import in node:
156
+ 0 && (module.exports = {
157
+ findEntryFiles,
158
+ findPackageParents,
159
+ isFile,
160
+ linkPackage,
161
+ readDirRecursive,
162
+ resolveTracedPath,
163
+ traceFiles,
164
+ writePackage
165
+ });
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var deploy_exports = {};
20
+ __export(deploy_exports, {
21
+ default: () => deploy_default
22
+ });
23
+ module.exports = __toCommonJS(deploy_exports);
24
+ var import_std_env = require("std-env");
25
+ var import_utils = require("./utils");
26
+ var import_node = require("./platforms/node");
27
+ var import_vercel = require("./platforms/vercel");
28
+ var import_netlify = require("./platforms/netlify");
29
+ const deployPresets = {
30
+ node: import_node.createNodePreset,
31
+ vercel: import_vercel.createVercelPreset,
32
+ netlify: import_netlify.createNetlifyPreset
33
+ };
34
+ async function getDeployPreset(appContext, modernConfig, deployTarget) {
35
+ const { appDirectory, distDirectory } = appContext;
36
+ const { useSSR, useAPI, useWebServer } = (0, import_utils.getProjectUsage)(appDirectory, distDirectory);
37
+ const needModernServer = useSSR || useAPI || useWebServer;
38
+ const createPreset = deployPresets[deployTarget];
39
+ if (!createPreset) {
40
+ throw new Error(`Unknown deploy target: '${deployTarget}'. MODERNJS_DEPLOY should be 'node', 'vercel', or 'netlify'.`);
41
+ }
42
+ return createPreset(appContext, modernConfig, needModernServer);
43
+ }
44
+ var deploy_default = () => ({
45
+ name: "@modern-js/plugin-deploy",
46
+ setup: (api) => {
47
+ const deployTarget = process.env.MODERNJS_DEPLOY || import_std_env.provider || "node";
48
+ return {
49
+ async deploy() {
50
+ const appContext = api.useAppContext();
51
+ const { metaName } = appContext;
52
+ if (metaName !== "modern-js" && !process.env.MODERNJS_DEPLOY) {
53
+ return;
54
+ }
55
+ const modernConfig = api.useResolvedConfigContext();
56
+ const deployPreset = await getDeployPreset(appContext, modernConfig, deployTarget);
57
+ (deployPreset === null || deployPreset === void 0 ? void 0 : deployPreset.prepare) && await (deployPreset === null || deployPreset === void 0 ? void 0 : deployPreset.prepare());
58
+ (deployPreset === null || deployPreset === void 0 ? void 0 : deployPreset.writeOutput) && await (deployPreset === null || deployPreset === void 0 ? void 0 : deployPreset.writeOutput());
59
+ (deployPreset === null || deployPreset === void 0 ? void 0 : deployPreset.genEntry) && await (deployPreset === null || deployPreset === void 0 ? void 0 : deployPreset.genEntry());
60
+ (deployPreset === null || deployPreset === void 0 ? void 0 : deployPreset.end) && await (deployPreset === null || deployPreset === void 0 ? void 0 : deployPreset.end());
61
+ }
62
+ };
63
+ }
64
+ });
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var netlify_exports = {};
30
+ __export(netlify_exports, {
31
+ createNetlifyPreset: () => createNetlifyPreset
32
+ });
33
+ module.exports = __toCommonJS(netlify_exports);
34
+ var import_node_path = __toESM(require("node:path"));
35
+ var import_utils = require("@modern-js/utils");
36
+ var import_routes = require("../../../utils/routes");
37
+ var import_utils2 = require("../utils");
38
+ var import_dependencies = require("../dependencies");
39
+ async function cleanDistDirectory(dir) {
40
+ try {
41
+ const items = await import_utils.fs.readdir(dir);
42
+ for (const item of items) {
43
+ const fullPath = import_node_path.default.join(dir, item);
44
+ if (item !== "static" && item !== "_redirects") {
45
+ await import_utils.fs.remove(fullPath);
46
+ }
47
+ }
48
+ } catch (error) {
49
+ console.error("Error cleaning directory:", error);
50
+ }
51
+ }
52
+ const createNetlifyPreset = (appContext, modernConfig, needModernServer) => {
53
+ const { appDirectory, distDirectory, serverInternalPlugins, entrypoints } = appContext;
54
+ const plugins = (0, import_utils.getInternalPlugins)(appDirectory, serverInternalPlugins);
55
+ const netlifyOutput = import_node_path.default.join(appDirectory, ".netlify");
56
+ const funcsDirectory = import_node_path.default.join(netlifyOutput, "functions");
57
+ const entryFilePath = import_node_path.default.join(funcsDirectory, "index.js");
58
+ return {
59
+ async prepare() {
60
+ await import_utils.fs.remove(netlifyOutput);
61
+ },
62
+ async writeOutput() {
63
+ const routes = [];
64
+ const { source: { mainEntryName } } = modernConfig;
65
+ if (!needModernServer) {
66
+ entrypoints.forEach((entry) => {
67
+ const isMain = (0, import_routes.isMainEntry)(entry.entryName, mainEntryName);
68
+ routes.push({
69
+ src: `/${isMain ? "" : `${entry.entryName}/`}*`,
70
+ dest: `/html/${entry.entryName}/index.html`,
71
+ status: 200
72
+ });
73
+ });
74
+ } else {
75
+ routes.push({
76
+ src: "/*",
77
+ dest: `/.netlify/functions/index`,
78
+ status: 200
79
+ });
80
+ }
81
+ const redirectContent = routes.map((route) => {
82
+ return `${route.src} ${route.dest} ${route.status}`;
83
+ }).join("\n");
84
+ if (needModernServer) {
85
+ await import_utils.fs.ensureDir(funcsDirectory);
86
+ await import_utils.fs.copy(distDirectory, funcsDirectory, {
87
+ filter: (src) => {
88
+ const distStaticDirectory = import_node_path.default.join(distDirectory, `static`);
89
+ return !src.includes(distStaticDirectory);
90
+ }
91
+ });
92
+ }
93
+ const redirectFilePath = import_node_path.default.join(distDirectory, "_redirects");
94
+ await import_utils.fs.writeFile(redirectFilePath, redirectContent);
95
+ },
96
+ async genEntry() {
97
+ var _modernConfig_bff;
98
+ if (!needModernServer) {
99
+ return;
100
+ }
101
+ const serverConfig = {
102
+ bff: {
103
+ prefix: modernConfig === null || modernConfig === void 0 ? void 0 : (_modernConfig_bff = modernConfig.bff) === null || _modernConfig_bff === void 0 ? void 0 : _modernConfig_bff.prefix
104
+ },
105
+ output: {
106
+ path: "."
107
+ }
108
+ };
109
+ const pluginImportCode = (0, import_utils2.genPluginImportsCode)(plugins || []);
110
+ const dynamicProdOptions = {
111
+ config: serverConfig,
112
+ serverConfigFile: import_utils.DEFAULT_SERVER_CONFIG,
113
+ plugins
114
+ };
115
+ let entryCode = (await import_utils.fs.readFile(import_node_path.default.join(__dirname, "./netlifyEntry.js"))).toString();
116
+ const serverAppContext = (0, import_utils2.serverAppContenxtTemplate)(appContext);
117
+ entryCode = entryCode.replace("p_genPluginImportsCode", pluginImportCode).replace("p_ROUTE_SPEC_FILE", `"${import_utils.ROUTE_SPEC_FILE}"`).replace("p_dynamicProdOptions", JSON.stringify(dynamicProdOptions)).replace("p_sharedDirectory", serverAppContext.sharedDirectory).replace("p_apiDirectory", serverAppContext.apiDirectory).replace("p_lambdaDirectory", serverAppContext.lambdaDirectory);
118
+ await import_utils.fs.writeFile(entryFilePath, entryCode);
119
+ },
120
+ async end() {
121
+ if (process.env.NODE_ENV !== "test" && process.env.NODE_ENV !== "development") {
122
+ await cleanDistDirectory(distDirectory);
123
+ }
124
+ if (!needModernServer) {
125
+ return;
126
+ }
127
+ await (0, import_dependencies.handleDependencies)(appDirectory, funcsDirectory, [
128
+ "@modern-js/prod-server"
129
+ ]);
130
+ }
131
+ };
132
+ };
133
+ // Annotate the CommonJS export names for ESM import in node:
134
+ 0 && (module.exports = {
135
+ createNetlifyPreset
136
+ });