@bleedingdev/modern-js-create 3.2.0-ultramodern.120 → 3.2.0-ultramodern.121

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 (118) hide show
  1. package/README.md +35 -12
  2. package/dist/cjs/create-package-root.cjs +7 -9
  3. package/dist/cjs/index.cjs +74 -44
  4. package/dist/cjs/locale/en.cjs +6 -7
  5. package/dist/cjs/locale/zh.cjs +6 -7
  6. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +337 -0
  7. package/dist/cjs/ultramodern-workspace/app-files.cjs +223 -0
  8. package/dist/cjs/ultramodern-workspace/contracts.cjs +836 -0
  9. package/dist/cjs/ultramodern-workspace/demo-components.cjs +422 -0
  10. package/dist/cjs/ultramodern-workspace/descriptors.cjs +222 -0
  11. package/dist/cjs/ultramodern-workspace/effect-api.cjs +952 -0
  12. package/dist/cjs/ultramodern-workspace/fs-io.cjs +191 -0
  13. package/dist/cjs/ultramodern-workspace/index.cjs +48 -0
  14. package/dist/cjs/ultramodern-workspace/locales.cjs +173 -0
  15. package/dist/cjs/ultramodern-workspace/module-federation.cjs +487 -0
  16. package/dist/cjs/ultramodern-workspace/naming.cjs +161 -0
  17. package/dist/cjs/ultramodern-workspace/package-json.cjs +406 -0
  18. package/dist/cjs/ultramodern-workspace/package-source.cjs +59 -0
  19. package/dist/cjs/ultramodern-workspace/policy.cjs +248 -0
  20. package/dist/cjs/ultramodern-workspace/public-surface.cjs +268 -0
  21. package/dist/cjs/ultramodern-workspace/routes.cjs +375 -0
  22. package/dist/cjs/ultramodern-workspace/types.cjs +61 -0
  23. package/dist/cjs/ultramodern-workspace/versions.cjs +153 -0
  24. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +153 -0
  25. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +175 -0
  26. package/dist/esm/create-package-root.js +7 -9
  27. package/dist/esm/index.js +72 -42
  28. package/dist/esm/locale/en.js +6 -7
  29. package/dist/esm/locale/zh.js +6 -7
  30. package/dist/esm/ultramodern-workspace/add-vertical.js +252 -0
  31. package/dist/esm/ultramodern-workspace/app-files.js +149 -0
  32. package/dist/esm/ultramodern-workspace/contracts.js +741 -0
  33. package/dist/esm/ultramodern-workspace/demo-components.js +363 -0
  34. package/dist/esm/ultramodern-workspace/descriptors.js +133 -0
  35. package/dist/esm/ultramodern-workspace/effect-api.js +854 -0
  36. package/dist/esm/ultramodern-workspace/fs-io.js +90 -0
  37. package/dist/esm/ultramodern-workspace/index.js +3 -0
  38. package/dist/esm/ultramodern-workspace/locales.js +122 -0
  39. package/dist/esm/ultramodern-workspace/module-federation.js +415 -0
  40. package/dist/esm/ultramodern-workspace/naming.js +71 -0
  41. package/dist/esm/ultramodern-workspace/package-json.js +338 -0
  42. package/dist/esm/ultramodern-workspace/package-source.js +21 -0
  43. package/dist/esm/ultramodern-workspace/policy.js +183 -0
  44. package/dist/esm/ultramodern-workspace/public-surface.js +183 -0
  45. package/dist/esm/ultramodern-workspace/routes.js +280 -0
  46. package/dist/esm/ultramodern-workspace/types.js +16 -0
  47. package/dist/esm/ultramodern-workspace/versions.js +34 -0
  48. package/dist/esm/ultramodern-workspace/workspace-scripts.js +91 -0
  49. package/dist/esm/ultramodern-workspace/write-workspace.js +121 -0
  50. package/dist/esm-node/create-package-root.js +7 -9
  51. package/dist/esm-node/index.js +72 -42
  52. package/dist/esm-node/locale/en.js +6 -7
  53. package/dist/esm-node/locale/zh.js +6 -7
  54. package/dist/esm-node/ultramodern-workspace/add-vertical.js +253 -0
  55. package/dist/esm-node/ultramodern-workspace/app-files.js +150 -0
  56. package/dist/esm-node/ultramodern-workspace/contracts.js +742 -0
  57. package/dist/esm-node/ultramodern-workspace/demo-components.js +364 -0
  58. package/dist/esm-node/ultramodern-workspace/descriptors.js +134 -0
  59. package/dist/esm-node/ultramodern-workspace/effect-api.js +855 -0
  60. package/dist/esm-node/ultramodern-workspace/fs-io.js +91 -0
  61. package/dist/esm-node/ultramodern-workspace/index.js +4 -0
  62. package/dist/esm-node/ultramodern-workspace/locales.js +123 -0
  63. package/dist/esm-node/ultramodern-workspace/module-federation.js +416 -0
  64. package/dist/esm-node/ultramodern-workspace/naming.js +72 -0
  65. package/dist/esm-node/ultramodern-workspace/package-json.js +339 -0
  66. package/dist/esm-node/ultramodern-workspace/package-source.js +22 -0
  67. package/dist/esm-node/ultramodern-workspace/policy.js +184 -0
  68. package/dist/esm-node/ultramodern-workspace/public-surface.js +184 -0
  69. package/dist/esm-node/ultramodern-workspace/routes.js +281 -0
  70. package/dist/esm-node/ultramodern-workspace/types.js +17 -0
  71. package/dist/esm-node/ultramodern-workspace/versions.js +35 -0
  72. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +92 -0
  73. package/dist/esm-node/ultramodern-workspace/write-workspace.js +122 -0
  74. package/dist/types/locale/en.d.ts +4 -5
  75. package/dist/types/locale/index.d.ts +8 -10
  76. package/dist/types/locale/zh.d.ts +4 -5
  77. package/dist/types/ultramodern-workspace/add-vertical.d.ts +19 -0
  78. package/dist/types/ultramodern-workspace/app-files.d.ts +14 -0
  79. package/dist/types/ultramodern-workspace/contracts.d.ts +21 -0
  80. package/dist/types/ultramodern-workspace/demo-components.d.ts +9 -0
  81. package/dist/types/ultramodern-workspace/descriptors.d.ts +39 -0
  82. package/dist/types/ultramodern-workspace/effect-api.d.ts +73 -0
  83. package/dist/types/ultramodern-workspace/fs-io.d.ts +18 -0
  84. package/dist/types/ultramodern-workspace/index.d.ts +4 -0
  85. package/dist/types/ultramodern-workspace/locales.d.ts +183 -0
  86. package/dist/types/ultramodern-workspace/module-federation.d.ts +16 -0
  87. package/dist/types/ultramodern-workspace/naming.d.ts +16 -0
  88. package/dist/types/ultramodern-workspace/package-json.d.ts +12 -0
  89. package/dist/types/ultramodern-workspace/package-source.d.ts +2 -0
  90. package/dist/types/ultramodern-workspace/policy.d.ts +60 -0
  91. package/dist/types/ultramodern-workspace/public-surface.d.ts +37 -0
  92. package/dist/types/ultramodern-workspace/routes.d.ts +25 -0
  93. package/dist/types/ultramodern-workspace/types.d.ts +95 -0
  94. package/dist/types/ultramodern-workspace/versions.d.ts +38 -0
  95. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +10 -0
  96. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -0
  97. package/package.json +4 -3
  98. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +1 -4
  99. package/template-workspace/.mise.toml.handlebars +1 -0
  100. package/template-workspace/{AGENTS.md → AGENTS.md.handlebars} +12 -7
  101. package/template-workspace/README.md.handlebars +40 -24
  102. package/template-workspace/{pnpm-workspace.yaml → pnpm-workspace.yaml.handlebars} +2 -2
  103. package/template-workspace/scripts/bootstrap-agent-skills.mjs +31 -51
  104. package/templates/app/shell-frame.tsx +49 -0
  105. package/templates/app/ultramodern-route-head.tsx.handlebars +142 -0
  106. package/templates/packages/shared-contracts-index.ts +466 -0
  107. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +69 -0
  108. package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mjs +9 -0
  109. package/templates/workspace-scripts/generate-public-surface-assets.mjs +529 -0
  110. package/templates/workspace-scripts/proof-cloudflare-version.mjs +125 -0
  111. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +851 -0
  112. package/templates/workspace-scripts/ultramodern-performance-readiness.config.mjs +7 -0
  113. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +223 -0
  114. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +593 -0
  115. package/dist/cjs/ultramodern-workspace.cjs +0 -6797
  116. package/dist/esm/ultramodern-workspace.js +0 -6738
  117. package/dist/esm-node/ultramodern-workspace.js +0 -6739
  118. package/dist/types/ultramodern-workspace.d.ts +0 -29
@@ -0,0 +1,487 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ createAppModernConfig: ()=>createAppModernConfig,
41
+ createBuildMarker: ()=>createBuildMarker,
42
+ createModuleFederationRemoteUrlHelpers: ()=>createModuleFederationRemoteUrlHelpers,
43
+ createModuleFederationRemotesConfig: ()=>createModuleFederationRemotesConfig,
44
+ createRemoteModuleFederationConfig: ()=>createRemoteModuleFederationConfig,
45
+ createSharedModuleFederationConfig: ()=>createSharedModuleFederationConfig,
46
+ createShellModuleFederationConfig: ()=>createShellModuleFederationConfig,
47
+ createUltramodernBuildModule: ()=>createUltramodernBuildModule,
48
+ formatTsObjectLiteral: ()=>formatTsObjectLiteral
49
+ });
50
+ const external_node_crypto_namespaceObject = require("node:crypto");
51
+ var external_node_crypto_default = /*#__PURE__*/ __webpack_require__.n(external_node_crypto_namespaceObject);
52
+ const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
53
+ const external_naming_cjs_namespaceObject = require("./naming.cjs");
54
+ const external_policy_cjs_namespaceObject = require("./policy.cjs");
55
+ const external_types_cjs_namespaceObject = require("./types.cjs");
56
+ const external_versions_cjs_namespaceObject = require("./versions.cjs");
57
+ function createAppModernConfig(scope, app) {
58
+ const bffImport = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? "import { bffPlugin } from '@modern-js/plugin-bff';\n" : '';
59
+ const bffConfig = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? ` bff: {
60
+ effect: {
61
+ entry: './api/effect/index',
62
+ openapi: {
63
+ path: '/openapi.json',
64
+ },
65
+ },
66
+ prefix: '${(0, external_descriptors_cjs_namespaceObject.effectApiPrefix)(app)}',
67
+ runtimeFramework: 'effect',
68
+ },
69
+ ` : '';
70
+ const bffPluginEntry = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? ' bffPlugin(),\n' : '';
71
+ return `// @effect-diagnostics processEnv:off
72
+ import {
73
+ appTools,
74
+ defineConfig,
75
+ presetUltramodern,
76
+ } from '@modern-js/app-tools';
77
+ ${bffImport}import { i18nPlugin } from '@modern-js/plugin-i18n';
78
+ import { tanstackRouterPlugin } from '@modern-js/plugin-tanstack';
79
+ import { moduleFederationPlugin } from '@module-federation/modern-js-v3';
80
+ import { withZephyr as withZephyrRspack } from 'zephyr-rspack-plugin';
81
+ import { ultramodernLocalisedUrls } from './src/routes/ultramodern-route-metadata';
82
+
83
+ type ZephyrRspackConfig = Parameters<ReturnType<typeof withZephyrRspack>>[0];
84
+
85
+ const zephyrEnabled = process.env['ULTRAMODERN_ZEPHYR'] !== 'false';
86
+ const cloudflareDeployEnabled =
87
+ process.env['MODERNJS_DEPLOY'] === 'cloudflare';
88
+
89
+ const zephyrRspackPlugin = () => ({
90
+ name: 'ultramodern-zephyr-rspack-plugin',
91
+ pre: ['@modern-js/plugin-module-federation-config'],
92
+ setup(api: {
93
+ modifyRspackConfig: (
94
+ handler: (
95
+ config: ZephyrRspackConfig,
96
+ ) => ZephyrRspackConfig | Promise<ZephyrRspackConfig>,
97
+ ) => void;
98
+ }) {
99
+ if (!zephyrEnabled) {
100
+ return;
101
+ }
102
+ api.modifyRspackConfig(config => withZephyrRspack()(config));
103
+ },
104
+ });
105
+
106
+ const appId = '${app.id}';
107
+ const cloudflareWorkerName = '${(0, external_descriptors_cjs_namespaceObject.createCloudflareWorkerName)(scope, app)}';
108
+ const port = Number(process.env['${app.portEnv}'] ?? ${app.port});
109
+ const envValue = (name: string) => {
110
+ const value = process.env[name]?.trim();
111
+ return value !== undefined && value.length > 0 ? value : undefined;
112
+ };
113
+ const configuredSiteUrl = envValue('MODERN_PUBLIC_SITE_URL');
114
+ const configuredCloudflareUrl = envValue('${(0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app)}');
115
+ const configuredUltramodernAssetPrefix = envValue('ULTRAMODERN_ASSET_PREFIX');
116
+ const configuredModernAssetPrefix = envValue('MODERN_ASSET_PREFIX');
117
+ const cloudflareWorkersDevSubdomain = envValue(
118
+ 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN',
119
+ );
120
+ const inferredCloudflareUrl =
121
+ cloudflareDeployEnabled && cloudflareWorkersDevSubdomain !== undefined
122
+ ? \`https://\${cloudflareWorkerName}.\${cloudflareWorkersDevSubdomain}.workers.dev\`
123
+ : undefined;
124
+ // Site origin (SEO: canonical/hreflang URLs) prefers the site-wide public URL;
125
+ // the per-app deployment URL only fills in when no site origin is configured.
126
+ const siteUrl =
127
+ configuredSiteUrl ||
128
+ configuredCloudflareUrl ||
129
+ inferredCloudflareUrl ||
130
+ \`http://localhost:\${port}\`;
131
+ // Asset loading is intentionally independent from the canonical site URL and
132
+ // deployment public URL. Without an explicit asset prefix, assets stay
133
+ // origin-relative so self-hosted apps, tunnels, and reverse proxies never leak
134
+ // localhost URLs into production HTML.
135
+ const assetPrefix =
136
+ configuredModernAssetPrefix || configuredUltramodernAssetPrefix || '/';
137
+
138
+ if (
139
+ cloudflareDeployEnabled &&
140
+ process.env['ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS'] === 'true' &&
141
+ configuredCloudflareUrl === undefined &&
142
+ configuredSiteUrl === undefined &&
143
+ inferredCloudflareUrl === undefined
144
+ ) {
145
+ throw new Error(
146
+ \`Cloudflare deploy for \${appId} needs ${(0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app)}, MODERN_PUBLIC_SITE_URL, or ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN.\`,
147
+ );
148
+ }
149
+
150
+ export default defineConfig(
151
+ presetUltramodern(
152
+ {
153
+ ${bffConfig} ...(cloudflareDeployEnabled
154
+ ? {
155
+ deploy: {
156
+ worker: {
157
+ compatibilityDate: '${external_versions_cjs_namespaceObject.CLOUDFLARE_COMPATIBILITY_DATE}',
158
+ name: cloudflareWorkerName,
159
+ security: ${(0, external_policy_cjs_namespaceObject.formatTsJsonValue)((0, external_types_cjs_namespaceObject.sortJsonValue)((0, external_policy_cjs_namespaceObject.createCloudflareSecurityContract)()), 16)},
160
+ ssr: true,
161
+ },
162
+ },
163
+ }
164
+ : {}),
165
+ dev: {
166
+ // Keep dev assets origin-relative too; the default absolute
167
+ // http://localhost:<port> prefix breaks pages served through tunnels.
168
+ assetPrefix: '/',
169
+ },
170
+ html: {
171
+ outputStructure: 'flat',
172
+ },
173
+ output: {
174
+ assetPrefix,
175
+ disableTsChecker: true,
176
+ distPath: {
177
+ html: './',
178
+ },
179
+ polyfill: 'off',
180
+ splitRouteChunks: true,
181
+ },
182
+ performance: {
183
+ rsdoctor: {
184
+ disableClientServer: true,
185
+ enabled: process.env['ULTRAMODERN_RSDOCTOR'] === 'true',
186
+ },
187
+ },
188
+ plugins: [
189
+ appTools(),
190
+ tanstackRouterPlugin(),
191
+ i18nPlugin({
192
+ backend: {
193
+ enabled: true,
194
+ loadPath: '/locales/{{lng}}/{{ns}}.json',
195
+ },
196
+ localeDetection: {
197
+ fallbackLanguage: 'en',
198
+ ignoreRedirectRoutes: [
199
+ '/@mf-types',
200
+ '/assets',
201
+ '/bundles',
202
+ '${(0, external_descriptors_cjs_namespaceObject.effectApiPrefix)(app)}',
203
+ '/locales',
204
+ '/mf-manifest.json',
205
+ '/mf-stats.json',
206
+ '/remoteEntry.js',
207
+ '/robots.txt',
208
+ '/site.webmanifest',
209
+ '/sitemap.xml',
210
+ '/static',
211
+ '/zephyr-manifest.json',
212
+ ],
213
+ languages: ['en', 'cs'],
214
+ localePathRedirect: true,
215
+ localisedUrls: ultramodernLocalisedUrls as Record<string, Record<string, string>>,
216
+ },
217
+ reactI18next: false,
218
+ }),
219
+ ${bffPluginEntry} moduleFederationPlugin(),
220
+ zephyrRspackPlugin(),
221
+ ],
222
+ server: {
223
+ port,
224
+ publicDir: ['./locales', './assets'],
225
+ ssr: {
226
+ mode: 'string',
227
+ moduleFederationAppSSR: true,
228
+ },
229
+ },
230
+ source: {
231
+ globalVars: {
232
+ ULTRAMODERN_SITE_URL: siteUrl,
233
+ },
234
+ mainEntryName: 'index',
235
+ },
236
+ tools: {
237
+ autoprefixer: {
238
+ overrideBrowserslist: ['defaults'],
239
+ },
240
+ bundlerChain: chain => {
241
+ chain.output
242
+ .uniqueName('${(0, external_naming_cjs_namespaceObject.createRspackUniqueName)(app)}')
243
+ .chunkLoadingGlobal('${(0, external_naming_cjs_namespaceObject.createRspackChunkLoadingGlobal)(app)}');
244
+ chain.ignoreWarnings([
245
+ {
246
+ message: /the request of a dependency is an expression/u,
247
+ module: /modern-js-plugin-i18n/u,
248
+ },
249
+ ]);
250
+ },
251
+ },
252
+ },
253
+ {
254
+ appId,
255
+ enableBffRequestId: true,
256
+ enableModuleFederationSSR: true,
257
+ enableTelemetryExporters: true,
258
+ telemetryFailLoudStartup: false,
259
+ },
260
+ ),
261
+ );
262
+ `;
263
+ }
264
+ function createSharedModuleFederationConfig() {
265
+ return ` shared: {
266
+ '@modern-js/plugin-i18n/runtime': {
267
+ requiredVersion: pluginI18nVersion,
268
+ singleton: true,
269
+ treeShaking: false,
270
+ },
271
+ '@modern-js/plugin-tanstack/runtime': {
272
+ requiredVersion: pluginTanstackVersion,
273
+ singleton: true,
274
+ treeShaking: false,
275
+ },
276
+ '@modern-js/runtime': {
277
+ requiredVersion: runtimeVersion,
278
+ singleton: true,
279
+ treeShaking: false,
280
+ },
281
+ '@tanstack/react-router': {
282
+ requiredVersion: dependencies['@tanstack/react-router'],
283
+ singleton: true,
284
+ treeShaking: false,
285
+ },
286
+ react: {
287
+ requiredVersion: reactVersion,
288
+ singleton: true,
289
+ treeShaking: false,
290
+ },
291
+ 'react-dom': {
292
+ requiredVersion: reactDomVersion,
293
+ singleton: true,
294
+ treeShaking: false,
295
+ },
296
+ 'react-dom/client': {
297
+ requiredVersion: reactDomVersion,
298
+ singleton: true,
299
+ treeShaking: false,
300
+ },
301
+ }`;
302
+ }
303
+ function formatTsObjectLiteral(value) {
304
+ const entries = Object.entries(value).sort(([left], [right])=>left.localeCompare(right));
305
+ if (0 === entries.length) return '{}';
306
+ return `{
307
+ ${entries.map(([key, entryValue])=>` '${key}': '${entryValue}',`).join('\n')}
308
+ }`;
309
+ }
310
+ function createModuleFederationRemoteUrlHelpers(app, remotes = []) {
311
+ if (0 === (0, external_descriptors_cjs_namespaceObject.resolveRemoteRefs)(app, remotes).length) return '';
312
+ return `const cloudflareDeployEnabled =
313
+ process.env['MODERNJS_DEPLOY'] === 'cloudflare';
314
+ const cloudflareWorkersDevSubdomain =
315
+ process.env['ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN']?.trim();
316
+ const requireCloudflarePublicUrls =
317
+ process.env['ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS'] === 'true';
318
+
319
+ const createRemoteManifestUrl = (options: {
320
+ manifestEnv: string;
321
+ mfName: string;
322
+ port: number;
323
+ publicUrlEnv: string;
324
+ workerName: string;
325
+ }) => {
326
+ const configuredManifest = process.env[options.manifestEnv]?.trim();
327
+ if (configuredManifest !== undefined && configuredManifest.length > 0) {
328
+ return configuredManifest;
329
+ }
330
+
331
+ const configuredPublicUrl = process.env[options.publicUrlEnv]?.trim();
332
+ if (configuredPublicUrl !== undefined && configuredPublicUrl.length > 0) {
333
+ return \`\${options.mfName}@\${configuredPublicUrl.replace(/\\/+$/u, '')}/mf-manifest.json\`;
334
+ }
335
+
336
+ if (cloudflareDeployEnabled && cloudflareWorkersDevSubdomain !== undefined) {
337
+ return \`\${options.mfName}@https://\${options.workerName}.\${cloudflareWorkersDevSubdomain}.workers.dev/mf-manifest.json\`;
338
+ }
339
+
340
+ if (cloudflareDeployEnabled && requireCloudflarePublicUrls) {
341
+ throw new Error(
342
+ \`Cloudflare deploy needs \${options.publicUrlEnv}, \${options.manifestEnv}, or ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN for remote \${options.mfName}.\`,
343
+ );
344
+ }
345
+
346
+ return \`\${options.mfName}@http://localhost:\${options.port}/mf-manifest.json\`;
347
+ };
348
+
349
+ `;
350
+ }
351
+ function createModuleFederationRemotesConfig(scope, app, remotes = []) {
352
+ const remoteEntries = (0, external_descriptors_cjs_namespaceObject.resolveRemoteRefs)(app, remotes).toSorted((left, right)=>(0, external_descriptors_cjs_namespaceObject.remoteDependencyAlias)(left).localeCompare((0, external_descriptors_cjs_namespaceObject.remoteDependencyAlias)(right))).map((remote)=>{
353
+ const key = (0, external_descriptors_cjs_namespaceObject.remoteDependencyAlias)(remote);
354
+ return ` ${key}: createRemoteManifestUrl({
355
+ manifestEnv: '${(0, external_descriptors_cjs_namespaceObject.createRemoteManifestEnv)(remote)}',
356
+ mfName: '${remote.mfName}',
357
+ port: ${remote.port},
358
+ publicUrlEnv: '${(0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(remote)}',
359
+ workerName: '${(0, external_descriptors_cjs_namespaceObject.createCloudflareWorkerName)(scope, remote)}',
360
+ }),`;
361
+ }).join('\n');
362
+ if (!remoteEntries) return '';
363
+ return ` remotes: {
364
+ ${remoteEntries}
365
+ },
366
+ `;
367
+ }
368
+ function createShellModuleFederationConfig(scope, remotes = []) {
369
+ const shellHost = {
370
+ ...external_descriptors_cjs_namespaceObject.shellApp,
371
+ verticalRefs: remotes.map((remote)=>remote.id)
372
+ };
373
+ return `// @effect-diagnostics nodeBuiltinImport:off processEnv:off
374
+ import { createRequire } from 'node:module';
375
+ import { createModuleFederationConfig } from '@module-federation/modern-js-v3';
376
+ import { dependencies } from './package.json';
377
+
378
+ const require = createRequire(import.meta.url);
379
+ const pluginI18nVersion = (require('@modern-js/plugin-i18n/package.json') as { version: string }).version;
380
+ const pluginTanstackVersion = (require('@modern-js/plugin-tanstack/package.json') as { version: string }).version;
381
+ const runtimeVersion = (require('@modern-js/runtime/package.json') as { version: string }).version;
382
+ const reactVersion = (require('react/package.json') as { version: string }).version;
383
+ const reactDomVersion = (require('react-dom/package.json') as { version: string }).version;
384
+
385
+ ${createModuleFederationRemoteUrlHelpers(shellHost, remotes)}
386
+ export default createModuleFederationConfig({
387
+ bridge: {
388
+ enableBridgeRouter: false,
389
+ },
390
+ dev: {
391
+ disableDynamicRemoteTypeHints: true,
392
+ },
393
+ dts: {
394
+ displayErrorInTerminal: true,
395
+ generateTypes: {
396
+ compilerInstance: 'tsgo',
397
+ },
398
+ },
399
+ filename: 'remoteEntry.js',
400
+ name: '${external_descriptors_cjs_namespaceObject.shellApp.mfName}',
401
+ ${createModuleFederationRemotesConfig(scope, shellHost, remotes)}${createSharedModuleFederationConfig()},
402
+ treeShakingSharedExcludePlugins: ['RspackModuleFederationPlugin'],
403
+ });
404
+ `;
405
+ }
406
+ function createBuildMarker(scope, app) {
407
+ return external_node_crypto_default().createHash('sha256').update(`${scope}:${app.packageSuffix}:${app.id}:0.1.0`).digest('hex').slice(0, 16);
408
+ }
409
+ function createUltramodernBuildModule(scope, app) {
410
+ return `export const ultramodernVerticalIdentity = {
411
+ appId: '${app.id}',
412
+ build: '${createBuildMarker(scope, app)}',
413
+ deployProfile: 'cloudflare-ssr-mf-effect-v1',
414
+ packageName: '${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}',
415
+ version: '0.1.0',
416
+ } as const;
417
+
418
+ export const ultramodernUiMarker = {
419
+ ...ultramodernVerticalIdentity,
420
+ surface: 'ui',
421
+ } as const;
422
+
423
+ export const ultramodernApiMarker = {
424
+ ...ultramodernVerticalIdentity,
425
+ surface: 'effect-bff',
426
+ } as const;
427
+ `;
428
+ }
429
+ function createRemoteModuleFederationConfig(scope, app, remotes = []) {
430
+ const exposes = formatTsObjectLiteral(app.exposes ?? {});
431
+ return `// @effect-diagnostics nodeBuiltinImport:off
432
+ import { createRequire } from 'node:module';
433
+ import { createModuleFederationConfig } from '@module-federation/modern-js-v3';
434
+ import { dependencies } from './package.json';
435
+
436
+ const require = createRequire(import.meta.url);
437
+ const pluginI18nVersion = (require('@modern-js/plugin-i18n/package.json') as { version: string }).version;
438
+ const pluginTanstackVersion = (require('@modern-js/plugin-tanstack/package.json') as { version: string }).version;
439
+ const runtimeVersion = (require('@modern-js/runtime/package.json') as { version: string }).version;
440
+ const reactVersion = (require('react/package.json') as { version: string }).version;
441
+ const reactDomVersion = (require('react-dom/package.json') as { version: string }).version;
442
+
443
+ ${createModuleFederationRemoteUrlHelpers(app, remotes)}
444
+ export default createModuleFederationConfig({
445
+ bridge: {
446
+ enableBridgeRouter: false,
447
+ },
448
+ dev: {
449
+ disableDynamicRemoteTypeHints: true,
450
+ },
451
+ dts: {
452
+ displayErrorInTerminal: true,
453
+ generateTypes: {
454
+ compilerInstance: 'tsgo',
455
+ },
456
+ },
457
+ exposes: ${exposes},
458
+ filename: 'remoteEntry.js',
459
+ name: '${app.mfName}',
460
+ ${createModuleFederationRemotesConfig(scope, app, remotes)}${createSharedModuleFederationConfig()},
461
+ treeShakingSharedExcludePlugins: ['RspackModuleFederationPlugin'],
462
+ });
463
+ `;
464
+ }
465
+ exports.createAppModernConfig = __webpack_exports__.createAppModernConfig;
466
+ exports.createBuildMarker = __webpack_exports__.createBuildMarker;
467
+ exports.createModuleFederationRemoteUrlHelpers = __webpack_exports__.createModuleFederationRemoteUrlHelpers;
468
+ exports.createModuleFederationRemotesConfig = __webpack_exports__.createModuleFederationRemotesConfig;
469
+ exports.createRemoteModuleFederationConfig = __webpack_exports__.createRemoteModuleFederationConfig;
470
+ exports.createSharedModuleFederationConfig = __webpack_exports__.createSharedModuleFederationConfig;
471
+ exports.createShellModuleFederationConfig = __webpack_exports__.createShellModuleFederationConfig;
472
+ exports.createUltramodernBuildModule = __webpack_exports__.createUltramodernBuildModule;
473
+ exports.formatTsObjectLiteral = __webpack_exports__.formatTsObjectLiteral;
474
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
475
+ "createAppModernConfig",
476
+ "createBuildMarker",
477
+ "createModuleFederationRemoteUrlHelpers",
478
+ "createModuleFederationRemotesConfig",
479
+ "createRemoteModuleFederationConfig",
480
+ "createSharedModuleFederationConfig",
481
+ "createShellModuleFederationConfig",
482
+ "createUltramodernBuildModule",
483
+ "formatTsObjectLiteral"
484
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
485
+ Object.defineProperty(exports, '__esModule', {
486
+ value: true
487
+ });
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ TAILWIND_PREFIX_DIGIT_WORDS: ()=>TAILWIND_PREFIX_DIGIT_WORDS,
41
+ assertUniqueTailwindPrefixes: ()=>assertUniqueTailwindPrefixes,
42
+ createRspackChunkLoadingGlobal: ()=>createRspackChunkLoadingGlobal,
43
+ createRspackUniqueName: ()=>createRspackUniqueName,
44
+ createTailwindPrefix: ()=>createTailwindPrefix,
45
+ createTw: ()=>createTw,
46
+ normalizePath: ()=>normalizePath,
47
+ packageName: ()=>naming_packageName,
48
+ relativeRootFor: ()=>relativeRootFor,
49
+ tailwindPrefixForApp: ()=>tailwindPrefixForApp,
50
+ toCamelCase: ()=>toCamelCase,
51
+ toEnvSegment: ()=>toEnvSegment,
52
+ toKebabCase: ()=>toKebabCase,
53
+ toPackageScope: ()=>toPackageScope,
54
+ toPascalCase: ()=>toPascalCase
55
+ });
56
+ const external_node_path_namespaceObject = require("node:path");
57
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
58
+ const TAILWIND_PREFIX_DIGIT_WORDS = [
59
+ 'zero',
60
+ 'one',
61
+ 'two',
62
+ 'three',
63
+ 'four',
64
+ 'five',
65
+ 'six',
66
+ 'seven',
67
+ 'eight',
68
+ 'nine'
69
+ ];
70
+ function normalizePath(filePath) {
71
+ return filePath.split(external_node_path_default().sep).join('/');
72
+ }
73
+ function toPackageScope(packageName) {
74
+ const normalized = packageName.replace(/^@/, '').replace(/[\\/]+/g, '-').toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^[._-]+|[._-]+$/g, '').replace(/-{2,}/g, '-');
75
+ return normalized || 'ultramodern-superapp';
76
+ }
77
+ function toKebabCase(value) {
78
+ const normalized = value.trim().replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/[._]+/g, '-').toLowerCase().replace(/-+/g, '-').replace(/^-+|-+$/g, '');
79
+ return normalized;
80
+ }
81
+ function toCamelCase(value) {
82
+ const pascal = toPascalCase(value);
83
+ return `${pascal.charAt(0).toLowerCase()}${pascal.slice(1)}`;
84
+ }
85
+ function toEnvSegment(value) {
86
+ return toKebabCase(value).replace(/-/g, '_').toUpperCase();
87
+ }
88
+ function createRspackUniqueName(app) {
89
+ return app.mfName;
90
+ }
91
+ function createRspackChunkLoadingGlobal(app) {
92
+ return `__ULTRAMODERN_${toEnvSegment(app.mfName)}_LOADED_CHUNKS__`;
93
+ }
94
+ function naming_packageName(scope, suffix) {
95
+ return `@${scope}/${suffix}`;
96
+ }
97
+ function relativeRootFor(packageDir) {
98
+ return normalizePath(external_node_path_default().relative(packageDir, '.') || '.');
99
+ }
100
+ function createTailwindPrefix(raw) {
101
+ const normalized = raw.toLowerCase().replace(/[^a-z0-9]/gu, '');
102
+ if (!normalized) throw new Error(`Cannot derive a Tailwind prefix from ${raw}`);
103
+ return normalized.replace(/[0-9]/gu, (digit)=>TAILWIND_PREFIX_DIGIT_WORDS[Number(digit)]);
104
+ }
105
+ function tailwindPrefixForApp(app) {
106
+ if ('shell' === app.kind) return 'shell';
107
+ return createTailwindPrefix(app.domain ?? app.id);
108
+ }
109
+ function assertUniqueTailwindPrefixes(apps) {
110
+ const seen = new Map();
111
+ const entries = apps.map((app)=>[
112
+ app.id,
113
+ tailwindPrefixForApp(app)
114
+ ]);
115
+ for (const [id, prefix] of entries){
116
+ const previous = seen.get(prefix);
117
+ if (previous) throw new Error(`Tailwind prefix ${prefix} for ${id} collides with ${previous}`);
118
+ seen.set(prefix, id);
119
+ }
120
+ }
121
+ function createTw(prefix) {
122
+ return (classList)=>classList.split(/\s+/u).filter(Boolean).map((candidate)=>`${prefix}:${candidate.replace(/\[&&\]:/gu, '')}`).join(' ');
123
+ }
124
+ function toPascalCase(value) {
125
+ return value.split(/[-_]+/).filter(Boolean).map((part)=>`${part.charAt(0).toUpperCase()}${part.slice(1)}`).join('');
126
+ }
127
+ exports.TAILWIND_PREFIX_DIGIT_WORDS = __webpack_exports__.TAILWIND_PREFIX_DIGIT_WORDS;
128
+ exports.assertUniqueTailwindPrefixes = __webpack_exports__.assertUniqueTailwindPrefixes;
129
+ exports.createRspackChunkLoadingGlobal = __webpack_exports__.createRspackChunkLoadingGlobal;
130
+ exports.createRspackUniqueName = __webpack_exports__.createRspackUniqueName;
131
+ exports.createTailwindPrefix = __webpack_exports__.createTailwindPrefix;
132
+ exports.createTw = __webpack_exports__.createTw;
133
+ exports.normalizePath = __webpack_exports__.normalizePath;
134
+ exports.packageName = __webpack_exports__.packageName;
135
+ exports.relativeRootFor = __webpack_exports__.relativeRootFor;
136
+ exports.tailwindPrefixForApp = __webpack_exports__.tailwindPrefixForApp;
137
+ exports.toCamelCase = __webpack_exports__.toCamelCase;
138
+ exports.toEnvSegment = __webpack_exports__.toEnvSegment;
139
+ exports.toKebabCase = __webpack_exports__.toKebabCase;
140
+ exports.toPackageScope = __webpack_exports__.toPackageScope;
141
+ exports.toPascalCase = __webpack_exports__.toPascalCase;
142
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
143
+ "TAILWIND_PREFIX_DIGIT_WORDS",
144
+ "assertUniqueTailwindPrefixes",
145
+ "createRspackChunkLoadingGlobal",
146
+ "createRspackUniqueName",
147
+ "createTailwindPrefix",
148
+ "createTw",
149
+ "normalizePath",
150
+ "packageName",
151
+ "relativeRootFor",
152
+ "tailwindPrefixForApp",
153
+ "toCamelCase",
154
+ "toEnvSegment",
155
+ "toKebabCase",
156
+ "toPackageScope",
157
+ "toPascalCase"
158
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
159
+ Object.defineProperty(exports, '__esModule', {
160
+ value: true
161
+ });