@bleedingdev/modern-js-ultramodern-create 3.9.3-ultramodern.7 → 3.9.3-ultramodern.9

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 (29) hide show
  1. package/dist/cjs/ultramodern-tooling/config/normalize.cjs +1 -1
  2. package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +7 -7
  3. package/dist/cjs/ultramodern-workspace/package-json.cjs +9 -2
  4. package/dist/cjs/ultramodern-workspace/patch-inventory.cjs +20 -2
  5. package/dist/cjs/ultramodern-workspace/validation/renderer.cjs +3 -3
  6. package/dist/cjs/ultramodern-workspace/validation/workspace.cjs +1 -1
  7. package/dist/cjs/ultramodern-workspace/versions.cjs +21 -21
  8. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +5 -0
  9. package/dist/esm/ultramodern-tooling/config/normalize.js +2 -2
  10. package/dist/esm/ultramodern-workspace/module-federation/config.js +7 -7
  11. package/dist/esm/ultramodern-workspace/package-json.js +9 -2
  12. package/dist/esm/ultramodern-workspace/patch-inventory.js +20 -2
  13. package/dist/esm/ultramodern-workspace/validation/renderer.js +3 -3
  14. package/dist/esm/ultramodern-workspace/validation/workspace.js +1 -1
  15. package/dist/esm/ultramodern-workspace/versions.js +21 -21
  16. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +5 -0
  17. package/dist/esm-node/ultramodern-tooling/config/normalize.js +2 -2
  18. package/dist/esm-node/ultramodern-workspace/module-federation/config.js +7 -7
  19. package/dist/esm-node/ultramodern-workspace/package-json.js +9 -2
  20. package/dist/esm-node/ultramodern-workspace/patch-inventory.js +20 -2
  21. package/dist/esm-node/ultramodern-workspace/validation/renderer.js +3 -3
  22. package/dist/esm-node/ultramodern-workspace/validation/workspace.js +1 -1
  23. package/dist/esm-node/ultramodern-workspace/versions.js +21 -21
  24. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +5 -0
  25. package/dist/types/ultramodern-workspace/policy.d.ts +27 -27
  26. package/dist/types/ultramodern-workspace/versions.d.ts +45 -45
  27. package/package.json +34 -34
  28. package/release-cohort.json +52 -64
  29. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +332 -82
@@ -165,7 +165,7 @@ function normalizeWorkspaceInputs(workspaceRoot, inputs) {
165
165
  rendererProfile: app.rendererProfile,
166
166
  routerBindings: app.routerBindings,
167
167
  rendererCapabilities: app.rendererCapabilities,
168
- ...'api-only' === app.surfaceProfile || void 0 !== app.renderer && !(0, renderer_profile_cjs_namespaceObject.appSupportsFederation)(app) ? {} : {
168
+ ...'api-only' === app.surfaceProfile || void 0 !== app.renderer && ('none' === app.renderer || !(0, renderer_profile_cjs_namespaceObject.getRendererGenerationProfile)(app.renderer).capabilities.federation) ? {} : {
169
169
  moduleFederation: {
170
170
  role: 'shell' === app.kind ? 'host' : 'remote',
171
171
  name: app.mfName,
@@ -44,12 +44,12 @@ function createAppModernConfig(app, enableTailwind = true) {
44
44
  const renderer = (0, external_renderer_profile_cjs_namespaceObject.resolveWorkspaceRenderer)(app);
45
45
  if ((0, external_renderer_generations_cjs_namespaceObject.hasNativeAppGeneration)(renderer)) {
46
46
  const generation = (0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app);
47
- const exposes = Object.keys(app.exposes ?? {}).length > 0;
48
- return `import { defineConfig } from '@modern-js/ultramodern-app-tools';
49
- ${exposes ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
47
+ const authoredAssetPrefix = !generation.capabilities.workers && Object.keys(app.exposes ?? {}).length > 0;
48
+ return `import { defineConfig${generation.capabilities.workers ? ', presetUltramodernWorkspace' : ''} } from '@modern-js/ultramodern-app-tools';
49
+ ${authoredAssetPrefix ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
50
50
  ${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? "import { bffPlugin } from '@modern-js/plugin-bff-build-extensions';\n" : ''}
51
51
  ${enableTailwind ? "import { pluginTailwindcss } from '@rsbuild/plugin-tailwindcss';\n" : ''}
52
- ${exposes ? `// Set ${(0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app)} to this remote's public origin when deploying.
52
+ ${authoredAssetPrefix ? `// Set ${(0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app)} to this remote's public origin when deploying.
53
53
  const remoteAddress = createRemoteManifestUrl({
54
54
  manifestEnv: ${JSON.stringify((0, external_descriptors_cjs_namespaceObject.createRemoteManifestEnv)(app))},
55
55
  publicUrlEnv: ${JSON.stringify((0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app))},
@@ -59,10 +59,10 @@ const remoteAddress = createRemoteManifestUrl({
59
59
  const assetPrefix = new URL('.', remoteAddress.replace(/^[^@]+@(?=https?:\\/\\/)/u, '')).href;
60
60
 
61
61
  ` : ''}
62
- export default defineConfig({
62
+ export default defineConfig(${generation.capabilities.workers ? 'presetUltramodernWorkspace(' : ''}{
63
63
  ${enableTailwind ? ' builderPlugins: [pluginTailwindcss()],\n' : ''} renderer: ${JSON.stringify(renderer)},
64
64
  ${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? ' plugins: [bffPlugin()],\n' : ''}
65
- ${exposes ? ' output: { assetPrefix },\n' : ''}
65
+ ${authoredAssetPrefix ? ' output: { assetPrefix },\n' : ''}
66
66
  server: { port: ${app.port}, ssr: ${generation.capabilities.ssr}${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? `,
67
67
  bff: {
68
68
  effect: {
@@ -73,7 +73,7 @@ ${'rest' === (0, external_descriptors_cjs_namespaceObject.resolveApiProtocol)(ap
73
73
  runtimeFramework: 'effect',
74
74
  }` : ''} },
75
75
  source: { mainEntryName: 'main' },
76
- });
76
+ }${generation.capabilities.workers ? `, { appId: ${JSON.stringify(app.id)}, from: import.meta.url })` : ''});
77
77
  `;
78
78
  }
79
79
  const emitsUi = (0, external_descriptors_cjs_namespaceObject.appEmitsBrowserUi)(app);
@@ -102,7 +102,7 @@ function appDevDependencies(packageSource, enableTailwind, app) {
102
102
  const { '@rsbuild/plugin-tailwindcss': tailwindPluginVersion, tailwindcss: tailwindVersion, ...always } = external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.appDevDependencies;
103
103
  const renderer = (0, external_renderer_profile_cjs_namespaceObject.resolveWorkspaceRenderer)(app);
104
104
  const generationProfile = (0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app);
105
- const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && 'wrangler' !== name));
105
+ const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && ('wrangler' !== name || generationProfile?.capabilities.workers === true)));
106
106
  return {
107
107
  ...(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) || 'shell' === app.kind && 'react' === renderer ? {
108
108
  '@modern-js/plugin-bff-build-extensions': frameworkRequest(packageSource)
@@ -128,8 +128,10 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
128
128
  ...additionalShells,
129
129
  ...remotes
130
130
  ];
131
+ const workerApps = apps.filter((app)=>(0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app)?.capabilities.workers);
132
+ const workerFilters = workerApps.map((app)=>`--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}`).join(' ');
131
133
  if (bridge) throw new Error(`Renderer ${renderer} does not support React bridge configuration.`);
132
- const rootDevDependencies = Object.fromEntries(Object.entries(external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>'wrangler' !== name && 'zephyr-agent' !== name && 'miniflare' !== name));
134
+ const rootDevDependencies = Object.fromEntries(Object.entries(external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>('wrangler' !== name || workerApps.length > 0) && 'zephyr-agent' !== name && 'miniflare' !== name));
133
135
  return {
134
136
  private: true,
135
137
  name: scope,
@@ -144,6 +146,11 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
144
146
  dev: `pnpm --parallel ${apps.map((app)=>`--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}`).join(' ')} dev`,
145
147
  'dev:shell': `pnpm --filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, primaryShell.packageSuffix)} dev`,
146
148
  build: 'pnpm -r --filter "./apps/*" --filter "./verticals/*" run build',
149
+ ...workerApps.length > 0 ? {
150
+ 'cloudflare:build': `pnpm -r ${workerFilters} run cloudflare:build`,
151
+ 'cloudflare:deploy': `pnpm -r ${workerFilters} run cloudflare:deploy`,
152
+ 'cloudflare:preview': `pnpm --parallel ${workerFilters} run cloudflare:preview`
153
+ } : {},
147
154
  typecheck: 'pnpm -r --filter "./packages/*" run typecheck && pnpm -r --filter "./apps/*" --filter "./verticals/*" run typecheck',
148
155
  'contract:check': 'ultramodern-create ultramodern validate',
149
156
  check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm contract:check',
@@ -28,10 +28,28 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  const __rspack_default_export = [
31
+ {
32
+ packageName: '@tanstack/router-core',
33
+ version: '1.171.34',
34
+ path: 'patches/@tanstack__router-core@1.171.34.patch',
35
+ sha256: '0e526bc0a1fd038c459fbf45b2b62da81f7f2516176b585f41fed7098ac4abbb',
36
+ repository: true,
37
+ workspace: null,
38
+ reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, including public types and emitted CJS/ESM source maps. Applies only to the accepted Octane router-core 1.171.34 closure during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
39
+ },
40
+ {
41
+ packageName: '@tanstack/router-core',
42
+ version: '1.171.37',
43
+ path: 'patches/@tanstack__router-core@1.171.37.patch',
44
+ sha256: '6ffa70914ed338f3cb56d3cd1f526e35286e09f287ecf48ee6dbc1aa18305458',
45
+ repository: true,
46
+ workspace: null,
47
+ reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, preserving current location caching and SSR rewrite behavior, public types and emitted CJS/ESM source maps. Applies only to Modern router-core 1.171.37 during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
48
+ },
31
49
  {
32
50
  packageName: 'ultracite',
33
- version: '7.12.2',
34
- path: 'patches/ultracite@7.12.2.patch',
51
+ version: '8.0.1',
52
+ path: 'patches/ultracite@8.0.1.patch',
35
53
  sha256: 'a18b2c7be68a6823a793f0def8ce13d7655c67c56c2200978a2be600cb29ba74',
36
54
  repository: false,
37
55
  workspace: null,
@@ -110,7 +110,7 @@ function parseNpmAlias(value) {
110
110
  };
111
111
  }
112
112
  function isForeignRendererPackage(name, renderer) {
113
- const react = 'react' === name || name.startsWith('react/') || 'react-dom' === name || name.startsWith('react-dom/') || 'react-router' === name || name.startsWith('react-router/') || 'react-router-dom' === name || name.startsWith('react-router-dom/') || '@types/react' === name && 'octane' !== renderer || '@types/react-dom' === name || '@tanstack/react-router' === name || name.startsWith('@tanstack/react-router/') || '@modern-js/renderer-react' === name || name.startsWith('@modern-js/renderer-react/') || 'react-server-dom-webpack' === name || name.startsWith('react-server-dom-webpack/') || 'react-server-dom-rspack' === name || name.startsWith('react-server-dom-rspack/') || 'react-server-dom-turbopack' === name || name.startsWith('react-server-dom-turbopack/') || 'react-refresh' === name || name.startsWith('react-refresh/') || '@rsbuild/plugin-react' === name || name.startsWith('@rsbuild/plugin-react/') || '@rspack/plugin-react-refresh' === name || name.startsWith('@rspack/plugin-react-refresh/') || '@babel/preset-react' === name || name.startsWith('@babel/plugin-transform-react-jsx') || '@modern-js/runtime' === name || name.startsWith('@modern-js/runtime/') || '@modern-js/runtime-renderer-extensions' === name || name.startsWith('@modern-js/runtime-renderer-extensions/') || '@modern-js/plugin-tanstack' === name || name.startsWith('@modern-js/plugin-tanstack/') || '@modern-js/plugin-i18n' === name || name.startsWith('@modern-js/plugin-i18n/') || '@modern-js/i18n-integration' === name || name.startsWith('@modern-js/i18n-integration/') || '@modern-js/i18n-runtime-extensions' === name || name.startsWith('@modern-js/i18n-runtime-extensions/') || '@modern-js/plugin-runtime' === name || name.startsWith('@modern-js/plugin-runtime/');
113
+ const react = 'react' === name || name.startsWith('react/') || 'react-dom' === name || name.startsWith('react-dom/') || 'react-router' === name || name.startsWith('react-router/') || 'react-router-dom' === name || name.startsWith('react-router-dom/') || '@types/react' === name && 'octane' !== renderer || '@types/react-dom' === name || '@tanstack/react-router' === name || name.startsWith('@tanstack/react-router/') || '@modern-js/renderer-react' === name || name.startsWith('@modern-js/renderer-react/') || 'react-server-dom-webpack' === name || name.startsWith('react-server-dom-webpack/') || 'react-server-dom-rspack' === name || name.startsWith('react-server-dom-rspack/') || 'react-server-dom-turbopack' === name || name.startsWith('react-server-dom-turbopack/') || 'react-refresh' === name || name.startsWith('react-refresh/') || '@rsbuild/plugin-react' === name || name.startsWith('@rsbuild/plugin-react/') || '@rspack/plugin-react-refresh' === name || name.startsWith('@rspack/plugin-react-refresh/') || '@babel/preset-react' === name || name.startsWith('@babel/plugin-transform-react-jsx') || '@modern-js/runtime' === name || name.startsWith('@modern-js/runtime/') || '@modern-js/runtime-renderer-extensions' === name || name.startsWith('@modern-js/runtime-renderer-extensions/') || '@modern-js/plugin-tanstack' === name || name.startsWith('@modern-js/plugin-tanstack/') || '@modern-js/plugin-i18n' === name || name.startsWith('@modern-js/plugin-i18n/') || '@modern-js/i18n-integration' === name || name.startsWith('@modern-js/i18n-integration/') || name.startsWith('@modern-js/i18n-runtime-extensions/') || '@modern-js/plugin-runtime' === name || name.startsWith('@modern-js/plugin-runtime/');
114
114
  if (react) return 'react' !== renderer;
115
115
  const owner = (0, ultramodern_app_tools_namespaceObject.specifierRenderer)(name);
116
116
  return void 0 !== owner && 'react' !== owner && owner !== renderer;
@@ -210,7 +210,7 @@ function assertAuthoredRendererDependencyPins(manifest, generation, options = {}
210
210
  for (const [name, version] of Object.entries({
211
211
  ...generation.dependencies,
212
212
  ...generation.devDependencies
213
- }))if (isForeignRendererPackage(name, 'none')) pins[name] = version;
213
+ }))if (name === profile.compiler.name || name === profile.router.coreName || isForeignRendererPackage(name, 'none')) pins[name] = version;
214
214
  for (const group of [
215
215
  'dependencies',
216
216
  'devDependencies',
@@ -299,7 +299,7 @@ function assertNativeRendererSourceSurface(root, app, generation, manifest) {
299
299
  ])(0, external_assertions_cjs_namespaceObject.assert)(!external_node_fs_default().existsSync(external_node_path_default().join(appRoot, relative)), `${app.id} native renderer contains unsupported artifact ${relative}`);
300
300
  const tsconfig = JSON.parse(external_node_fs_default().readFileSync(external_node_path_default().join(appRoot, 'tsconfig.json'), 'utf8'));
301
301
  (0, external_assertions_cjs_namespaceObject.assert)(tsconfig.compilerOptions?.jsxImportSource === generation.jsxImportSource && tsconfig.compilerOptions?.jsx === 'preserve', `${app.id} JSX compiler configuration disagrees with the selected renderer`);
302
- for (const script of Object.values(manifest.scripts ?? {}))(0, external_assertions_cjs_namespaceObject.assert)('string' == typeof script && !/wrangler|i18n/iu.test(script) && (generation.capabilities.federation || !/module-federation/iu.test(script)), `${app.id} native renderer scripts claim an unsupported capability`);
302
+ for (const script of Object.values(manifest.scripts ?? {}))(0, external_assertions_cjs_namespaceObject.assert)('string' == typeof script && !/i18n/iu.test(script) && (generation.capabilities.workers || !/wrangler/iu.test(script)) && (generation.capabilities.federation || !/module-federation/iu.test(script)), `${app.id} native renderer scripts claim an unsupported capability`);
303
303
  }
304
304
  function validateApiOnlySourceSurface(root, app) {
305
305
  (0, external_assertions_cjs_namespaceObject.assert)(!Object.hasOwn(app.backendFederation?.versionBoundary ?? {}, 'ui'), `topology/reference-topology.json verticals.${app.id}.backendFederation must omit the UI boundary for an api-only unit`);
@@ -211,7 +211,7 @@ function validateWorkspace(root, expected) {
211
211
  requiredFile(root, `${app.path}/modern.config.ts`, `${app.id} Modern.js config`);
212
212
  if (input.emitsUi && !nativeRenderer) requiredFile(root, `${app.path}/src/modern.runtime.ts`, `${app.id} runtime`);
213
213
  requiredFile(root, `${app.path}/shared/ultramodern-build.json`, `${app.id} build stamp`);
214
- if (!nativeRenderer) {
214
+ if (!nativeRenderer || generation.capabilities.workers) {
215
215
  const cloudflare = record(app.cloudflare, `${app.id} cloudflare`);
216
216
  for (const field of [
217
217
  'workerName',
@@ -27,40 +27,40 @@ var __webpack_require__ = {};
27
27
  })();
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
- const TANSTACK_ROUTER_VERSION = '1.170.41';
31
- const TANSTACK_ROUTER_CORE_VERSION = '1.171.34';
32
- const TANSTACK_HISTORY_VERSION = '1.162.4';
30
+ const TANSTACK_ROUTER_VERSION = '1.170.44';
31
+ const TANSTACK_ROUTER_CORE_VERSION = '1.171.37';
32
+ const TANSTACK_HISTORY_VERSION = '1.162.5';
33
33
  const MODULE_FEDERATION_VERSION = '2.9.2';
34
34
  const MODULE_FEDERATION_BRIDGE_REACT_FORK_VERSION = '2.9.3';
35
35
  const MODULE_FEDERATION_RUNTIME_FORK_VERSION = '2.9.3';
36
36
  const MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION = '2.9.4';
37
- const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.4.2';
38
- const ZEPHYR_AGENT_VERSION = '1.4.2';
39
- const WRANGLER_VERSION = '4.145.0';
37
+ const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.6.0';
38
+ const ZEPHYR_AGENT_VERSION = '1.6.0';
39
+ const WRANGLER_VERSION = '4.151.0';
40
40
  const CLOUDFLARE_COMPATIBILITY_DATE = '2026-06-02';
41
41
  const TAILWIND_VERSION = '4.3.3';
42
42
  const RSBUILD_PLUGIN_TAILWINDCSS_VERSION = '2.0.3';
43
- const EFFECT_VERSION = '4.0.0';
44
- const EFFECT_TSGO_VERSION = '0.53.0';
43
+ const EFFECT_VERSION = '4.0.5';
44
+ const EFFECT_TSGO_VERSION = '0.53.1';
45
45
  const TYPESCRIPT_STABLE_VERSION = '7.0.2';
46
46
  const TYPESCRIPT_VERSION = TYPESCRIPT_STABLE_VERSION;
47
- const OXLINT_VERSION = '1.86.0';
48
- const OXFMT_VERSION = '0.71.0';
49
- const ULTRACITE_VERSION = '7.12.2';
50
- const LEFTHOOK_VERSION = '2.1.17';
51
- const I18NEXT_VERSION = '26.4.2';
47
+ const OXLINT_VERSION = '1.88.0';
48
+ const OXFMT_VERSION = '0.73.0';
49
+ const ULTRACITE_VERSION = '8.0.1';
50
+ const LEFTHOOK_VERSION = '2.2.2';
51
+ const I18NEXT_VERSION = '26.4.6';
52
52
  const MODULE_FEDERATION_NODE_VERSION = '2.7.52';
53
- const MINIFLARE_VERSION = '5.20260930.0-alpha';
54
- const WORKERD_VERSION = '1.20260930.2';
55
- const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20261001.1';
53
+ const MINIFLARE_VERSION = '5.20261012.0-beta';
54
+ const WORKERD_VERSION = '1.20261015.1';
55
+ const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20261015.1';
56
56
  const NODE_FETCH_VERSION = '3.3.2';
57
- const REACT_VERSION = '19.3.0';
58
- const REACT_DOM_VERSION = '19.3.0';
59
- const TYPES_NODE_VERSION = '26.6.4';
57
+ const REACT_VERSION = '19.3.1';
58
+ const REACT_DOM_VERSION = '19.3.1';
59
+ const TYPES_NODE_VERSION = '26.6.5';
60
60
  const TYPES_REACT_VERSION = '19.3.0';
61
61
  const TYPES_REACT_DOM_VERSION = '19.3.0';
62
- const NODE_VERSION = '26.10.0';
63
- const PNPM_VERSION = '12.8.1';
62
+ const NODE_VERSION = '26.12.0';
63
+ const PNPM_VERSION = '12.11.2';
64
64
  const BRACES_FORK_VERSION = '3.0.4';
65
65
  const SHARP_VERSION = '0.35.5';
66
66
  const ULTRAMODERN_PACKAGE_PINS = {
@@ -126,6 +126,11 @@ function createWorkspaceAppPackageScripts(app) {
126
126
  dev: 'ultramodern dev',
127
127
  build: 'ultramodern build',
128
128
  serve: 'ultramodern serve',
129
+ ...(0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app)?.capabilities.workers ? {
130
+ 'cloudflare:build': 'ultramodern build --deploy-target cloudflare && ultramodern deploy --skip-build --deploy-target cloudflare',
131
+ 'cloudflare:deploy': 'pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json',
132
+ 'cloudflare:preview': `pnpm run cloudflare:build && wrangler dev --port ${app.port} --config .output/wrangler.json`
133
+ } : {},
129
134
  typecheck: (0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app)?.typecheckCommand ?? createStrictTsgoTypecheckCommand(app.directory)
130
135
  };
131
136
  const plan = createWorkspaceAppScriptPlan(app);
@@ -4,7 +4,7 @@ import { verticalsFromTopology } from "../../ultramodern-workspace/add-vertical/
4
4
  import { createNeutralOwnership, shellApp } from "../../ultramodern-workspace/descriptors.js";
5
5
  import { readModuleFederationExposePaths } from "../../ultramodern-workspace/mf-validation.js";
6
6
  import { toEnvSegment } from "../../ultramodern-workspace/naming.js";
7
- import { appSupportsFederation } from "../../ultramodern-workspace/renderer-profile.js";
7
+ import { getRendererGenerationProfile } from "../../ultramodern-workspace/renderer-profile.js";
8
8
  import { readJsonObject } from "./json.js";
9
9
  import { packageScopeFromRoot, readWorkspacePackageSource } from "./metadata.js";
10
10
  function normalizeWorkspaceInputs(workspaceRoot, inputs) {
@@ -118,7 +118,7 @@ function normalizeWorkspaceInputs(workspaceRoot, inputs) {
118
118
  rendererProfile: app.rendererProfile,
119
119
  routerBindings: app.routerBindings,
120
120
  rendererCapabilities: app.rendererCapabilities,
121
- ...'api-only' === app.surfaceProfile || void 0 !== app.renderer && !appSupportsFederation(app) ? {} : {
121
+ ...'api-only' === app.surfaceProfile || void 0 !== app.renderer && ('none' === app.renderer || !getRendererGenerationProfile(app.renderer).capabilities.federation) ? {} : {
122
122
  moduleFederation: {
123
123
  role: 'shell' === app.kind ? 'host' : 'remote',
124
124
  name: app.mfName,
@@ -8,12 +8,12 @@ function createAppModernConfig(app, enableTailwind = true) {
8
8
  const renderer = resolveWorkspaceRenderer(app);
9
9
  if (hasNativeAppGeneration(renderer)) {
10
10
  const generation = resolveAppGenerationProfile(app);
11
- const exposes = Object.keys(app.exposes ?? {}).length > 0;
12
- return `import { defineConfig } from '@modern-js/ultramodern-app-tools';
13
- ${exposes ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
11
+ const authoredAssetPrefix = !generation.capabilities.workers && Object.keys(app.exposes ?? {}).length > 0;
12
+ return `import { defineConfig${generation.capabilities.workers ? ', presetUltramodernWorkspace' : ''} } from '@modern-js/ultramodern-app-tools';
13
+ ${authoredAssetPrefix ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
14
14
  ${appHasApi(app) ? "import { bffPlugin } from '@modern-js/plugin-bff-build-extensions';\n" : ''}
15
15
  ${enableTailwind ? "import { pluginTailwindcss } from '@rsbuild/plugin-tailwindcss';\n" : ''}
16
- ${exposes ? `// Set ${createCloudflarePublicUrlEnv(app)} to this remote's public origin when deploying.
16
+ ${authoredAssetPrefix ? `// Set ${createCloudflarePublicUrlEnv(app)} to this remote's public origin when deploying.
17
17
  const remoteAddress = createRemoteManifestUrl({
18
18
  manifestEnv: ${JSON.stringify(createRemoteManifestEnv(app))},
19
19
  publicUrlEnv: ${JSON.stringify(createCloudflarePublicUrlEnv(app))},
@@ -23,10 +23,10 @@ const remoteAddress = createRemoteManifestUrl({
23
23
  const assetPrefix = new URL('.', remoteAddress.replace(/^[^@]+@(?=https?:\\/\\/)/u, '')).href;
24
24
 
25
25
  ` : ''}
26
- export default defineConfig({
26
+ export default defineConfig(${generation.capabilities.workers ? 'presetUltramodernWorkspace(' : ''}{
27
27
  ${enableTailwind ? ' builderPlugins: [pluginTailwindcss()],\n' : ''} renderer: ${JSON.stringify(renderer)},
28
28
  ${appHasApi(app) ? ' plugins: [bffPlugin()],\n' : ''}
29
- ${exposes ? ' output: { assetPrefix },\n' : ''}
29
+ ${authoredAssetPrefix ? ' output: { assetPrefix },\n' : ''}
30
30
  server: { port: ${app.port}, ssr: ${generation.capabilities.ssr}${appHasApi(app) ? `,
31
31
  bff: {
32
32
  effect: {
@@ -37,7 +37,7 @@ ${'rest' === resolveApiProtocol(app) ? " openapi: { path: '/openapi.json'
37
37
  runtimeFramework: 'effect',
38
38
  }` : ''} },
39
39
  source: { mainEntryName: 'main' },
40
- });
40
+ }${generation.capabilities.workers ? `, { appId: ${JSON.stringify(app.id)}, from: import.meta.url })` : ''});
41
41
  `;
42
42
  }
43
43
  const emitsUi = appEmitsBrowserUi(app);
@@ -59,7 +59,7 @@ function appDevDependencies(packageSource, enableTailwind, app) {
59
59
  const { '@rsbuild/plugin-tailwindcss': tailwindPluginVersion, tailwindcss: tailwindVersion, ...always } = ULTRAMODERN_PACKAGE_PINS.appDevDependencies;
60
60
  const renderer = resolveWorkspaceRenderer(app);
61
61
  const generationProfile = resolveAppGenerationProfile(app);
62
- const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && 'wrangler' !== name));
62
+ const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && ('wrangler' !== name || generationProfile?.capabilities.workers === true)));
63
63
  return {
64
64
  ...appHasApi(app) || 'shell' === app.kind && 'react' === renderer ? {
65
65
  '@modern-js/plugin-bff-build-extensions': frameworkRequest(packageSource)
@@ -85,8 +85,10 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
85
85
  ...additionalShells,
86
86
  ...remotes
87
87
  ];
88
+ const workerApps = apps.filter((app)=>resolveAppGenerationProfile(app)?.capabilities.workers);
89
+ const workerFilters = workerApps.map((app)=>`--filter ${packageName(scope, app.packageSuffix)}`).join(' ');
88
90
  if (bridge) throw new Error(`Renderer ${renderer} does not support React bridge configuration.`);
89
- const rootDevDependencies = Object.fromEntries(Object.entries(ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>'wrangler' !== name && 'zephyr-agent' !== name && 'miniflare' !== name));
91
+ const rootDevDependencies = Object.fromEntries(Object.entries(ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>('wrangler' !== name || workerApps.length > 0) && 'zephyr-agent' !== name && 'miniflare' !== name));
90
92
  return {
91
93
  private: true,
92
94
  name: scope,
@@ -101,6 +103,11 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
101
103
  dev: `pnpm --parallel ${apps.map((app)=>`--filter ${packageName(scope, app.packageSuffix)}`).join(' ')} dev`,
102
104
  'dev:shell': `pnpm --filter ${packageName(scope, primaryShell.packageSuffix)} dev`,
103
105
  build: 'pnpm -r --filter "./apps/*" --filter "./verticals/*" run build',
106
+ ...workerApps.length > 0 ? {
107
+ 'cloudflare:build': `pnpm -r ${workerFilters} run cloudflare:build`,
108
+ 'cloudflare:deploy': `pnpm -r ${workerFilters} run cloudflare:deploy`,
109
+ 'cloudflare:preview': `pnpm --parallel ${workerFilters} run cloudflare:preview`
110
+ } : {},
104
111
  typecheck: 'pnpm -r --filter "./packages/*" run typecheck && pnpm -r --filter "./apps/*" --filter "./verticals/*" run typecheck',
105
112
  'contract:check': 'ultramodern-create ultramodern validate',
106
113
  check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm contract:check',
@@ -1,8 +1,26 @@
1
1
  const patch_inventory = [
2
+ {
3
+ packageName: '@tanstack/router-core',
4
+ version: '1.171.34',
5
+ path: 'patches/@tanstack__router-core@1.171.34.patch',
6
+ sha256: '0e526bc0a1fd038c459fbf45b2b62da81f7f2516176b585f41fed7098ac4abbb',
7
+ repository: true,
8
+ workspace: null,
9
+ reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, including public types and emitted CJS/ESM source maps. Applies only to the accepted Octane router-core 1.171.34 closure during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
10
+ },
11
+ {
12
+ packageName: '@tanstack/router-core',
13
+ version: '1.171.37',
14
+ path: 'patches/@tanstack__router-core@1.171.37.patch',
15
+ sha256: '6ffa70914ed338f3cb56d3cd1f526e35286e09f287ecf48ee6dbc1aa18305458',
16
+ repository: true,
17
+ workspace: null,
18
+ reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, preserving current location caching and SSR rewrite behavior, public types and emitted CJS/ESM source maps. Applies only to Modern router-core 1.171.37 during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
19
+ },
2
20
  {
3
21
  packageName: 'ultracite',
4
- version: '7.12.2',
5
- path: 'patches/ultracite@7.12.2.patch',
22
+ version: '8.0.1',
23
+ path: 'patches/ultracite@8.0.1.patch',
6
24
  sha256: 'a18b2c7be68a6823a793f0def8ce13d7655c67c56c2200978a2be600cb29ba74',
7
25
  repository: false,
8
26
  workspace: null,
@@ -56,7 +56,7 @@ function parseNpmAlias(value) {
56
56
  };
57
57
  }
58
58
  function isForeignRendererPackage(name, renderer) {
59
- const react = 'react' === name || name.startsWith('react/') || 'react-dom' === name || name.startsWith('react-dom/') || 'react-router' === name || name.startsWith('react-router/') || 'react-router-dom' === name || name.startsWith('react-router-dom/') || '@types/react' === name && 'octane' !== renderer || '@types/react-dom' === name || '@tanstack/react-router' === name || name.startsWith('@tanstack/react-router/') || '@modern-js/renderer-react' === name || name.startsWith('@modern-js/renderer-react/') || 'react-server-dom-webpack' === name || name.startsWith('react-server-dom-webpack/') || 'react-server-dom-rspack' === name || name.startsWith('react-server-dom-rspack/') || 'react-server-dom-turbopack' === name || name.startsWith('react-server-dom-turbopack/') || 'react-refresh' === name || name.startsWith('react-refresh/') || '@rsbuild/plugin-react' === name || name.startsWith('@rsbuild/plugin-react/') || '@rspack/plugin-react-refresh' === name || name.startsWith('@rspack/plugin-react-refresh/') || '@babel/preset-react' === name || name.startsWith('@babel/plugin-transform-react-jsx') || '@modern-js/runtime' === name || name.startsWith('@modern-js/runtime/') || '@modern-js/runtime-renderer-extensions' === name || name.startsWith('@modern-js/runtime-renderer-extensions/') || '@modern-js/plugin-tanstack' === name || name.startsWith('@modern-js/plugin-tanstack/') || '@modern-js/plugin-i18n' === name || name.startsWith('@modern-js/plugin-i18n/') || '@modern-js/i18n-integration' === name || name.startsWith('@modern-js/i18n-integration/') || '@modern-js/i18n-runtime-extensions' === name || name.startsWith('@modern-js/i18n-runtime-extensions/') || '@modern-js/plugin-runtime' === name || name.startsWith('@modern-js/plugin-runtime/');
59
+ const react = 'react' === name || name.startsWith('react/') || 'react-dom' === name || name.startsWith('react-dom/') || 'react-router' === name || name.startsWith('react-router/') || 'react-router-dom' === name || name.startsWith('react-router-dom/') || '@types/react' === name && 'octane' !== renderer || '@types/react-dom' === name || '@tanstack/react-router' === name || name.startsWith('@tanstack/react-router/') || '@modern-js/renderer-react' === name || name.startsWith('@modern-js/renderer-react/') || 'react-server-dom-webpack' === name || name.startsWith('react-server-dom-webpack/') || 'react-server-dom-rspack' === name || name.startsWith('react-server-dom-rspack/') || 'react-server-dom-turbopack' === name || name.startsWith('react-server-dom-turbopack/') || 'react-refresh' === name || name.startsWith('react-refresh/') || '@rsbuild/plugin-react' === name || name.startsWith('@rsbuild/plugin-react/') || '@rspack/plugin-react-refresh' === name || name.startsWith('@rspack/plugin-react-refresh/') || '@babel/preset-react' === name || name.startsWith('@babel/plugin-transform-react-jsx') || '@modern-js/runtime' === name || name.startsWith('@modern-js/runtime/') || '@modern-js/runtime-renderer-extensions' === name || name.startsWith('@modern-js/runtime-renderer-extensions/') || '@modern-js/plugin-tanstack' === name || name.startsWith('@modern-js/plugin-tanstack/') || '@modern-js/plugin-i18n' === name || name.startsWith('@modern-js/plugin-i18n/') || '@modern-js/i18n-integration' === name || name.startsWith('@modern-js/i18n-integration/') || name.startsWith('@modern-js/i18n-runtime-extensions/') || '@modern-js/plugin-runtime' === name || name.startsWith('@modern-js/plugin-runtime/');
60
60
  if (react) return 'react' !== renderer;
61
61
  const owner = specifierRenderer(name);
62
62
  return void 0 !== owner && 'react' !== owner && owner !== renderer;
@@ -156,7 +156,7 @@ function assertAuthoredRendererDependencyPins(manifest, generation, options = {}
156
156
  for (const [name, version] of Object.entries({
157
157
  ...generation.dependencies,
158
158
  ...generation.devDependencies
159
- }))if (isForeignRendererPackage(name, 'none')) pins[name] = version;
159
+ }))if (name === profile.compiler.name || name === profile.router.coreName || isForeignRendererPackage(name, 'none')) pins[name] = version;
160
160
  for (const group of [
161
161
  'dependencies',
162
162
  'devDependencies',
@@ -245,7 +245,7 @@ function assertNativeRendererSourceSurface(root, app, generation, manifest) {
245
245
  ])assert(!node_fs.existsSync(node_path.join(appRoot, relative)), `${app.id} native renderer contains unsupported artifact ${relative}`);
246
246
  const tsconfig = JSON.parse(node_fs.readFileSync(node_path.join(appRoot, 'tsconfig.json'), 'utf8'));
247
247
  assert(tsconfig.compilerOptions?.jsxImportSource === generation.jsxImportSource && tsconfig.compilerOptions?.jsx === 'preserve', `${app.id} JSX compiler configuration disagrees with the selected renderer`);
248
- for (const script of Object.values(manifest.scripts ?? {}))assert('string' == typeof script && !/wrangler|i18n/iu.test(script) && (generation.capabilities.federation || !/module-federation/iu.test(script)), `${app.id} native renderer scripts claim an unsupported capability`);
248
+ for (const script of Object.values(manifest.scripts ?? {}))assert('string' == typeof script && !/i18n/iu.test(script) && (generation.capabilities.workers || !/wrangler/iu.test(script)) && (generation.capabilities.federation || !/module-federation/iu.test(script)), `${app.id} native renderer scripts claim an unsupported capability`);
249
249
  }
250
250
  function validateApiOnlySourceSurface(root, app) {
251
251
  assert(!Object.hasOwn(app.backendFederation?.versionBoundary ?? {}, 'ui'), `topology/reference-topology.json verticals.${app.id}.backendFederation must omit the UI boundary for an api-only unit`);
@@ -164,7 +164,7 @@ function validateWorkspace(root, expected) {
164
164
  requiredFile(root, `${app.path}/modern.config.ts`, `${app.id} Modern.js config`);
165
165
  if (input.emitsUi && !nativeRenderer) requiredFile(root, `${app.path}/src/modern.runtime.ts`, `${app.id} runtime`);
166
166
  requiredFile(root, `${app.path}/shared/ultramodern-build.json`, `${app.id} build stamp`);
167
- if (!nativeRenderer) {
167
+ if (!nativeRenderer || generation.capabilities.workers) {
168
168
  const cloudflare = record(app.cloudflare, `${app.id} cloudflare`);
169
169
  for (const field of [
170
170
  'workerName',
@@ -1,37 +1,37 @@
1
- const TANSTACK_ROUTER_VERSION = '1.170.41';
2
- const TANSTACK_ROUTER_CORE_VERSION = '1.171.34';
3
- const TANSTACK_HISTORY_VERSION = '1.162.4';
1
+ const TANSTACK_ROUTER_VERSION = '1.170.44';
2
+ const TANSTACK_ROUTER_CORE_VERSION = '1.171.37';
3
+ const TANSTACK_HISTORY_VERSION = '1.162.5';
4
4
  const MODULE_FEDERATION_VERSION = '2.9.2';
5
5
  const MODULE_FEDERATION_BRIDGE_REACT_FORK_VERSION = '2.9.3';
6
6
  const MODULE_FEDERATION_RUNTIME_FORK_VERSION = '2.9.3';
7
7
  const MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION = '2.9.4';
8
- const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.4.2';
9
- const ZEPHYR_AGENT_VERSION = '1.4.2';
10
- const WRANGLER_VERSION = '4.145.0';
8
+ const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.6.0';
9
+ const ZEPHYR_AGENT_VERSION = '1.6.0';
10
+ const WRANGLER_VERSION = '4.151.0';
11
11
  const CLOUDFLARE_COMPATIBILITY_DATE = '2026-06-02';
12
12
  const TAILWIND_VERSION = '4.3.3';
13
13
  const RSBUILD_PLUGIN_TAILWINDCSS_VERSION = '2.0.3';
14
- const EFFECT_VERSION = '4.0.0';
15
- const EFFECT_TSGO_VERSION = '0.53.0';
14
+ const EFFECT_VERSION = '4.0.5';
15
+ const EFFECT_TSGO_VERSION = '0.53.1';
16
16
  const TYPESCRIPT_STABLE_VERSION = '7.0.2';
17
17
  const TYPESCRIPT_VERSION = TYPESCRIPT_STABLE_VERSION;
18
- const OXLINT_VERSION = '1.86.0';
19
- const OXFMT_VERSION = '0.71.0';
20
- const ULTRACITE_VERSION = '7.12.2';
21
- const LEFTHOOK_VERSION = '2.1.17';
22
- const I18NEXT_VERSION = '26.4.2';
18
+ const OXLINT_VERSION = '1.88.0';
19
+ const OXFMT_VERSION = '0.73.0';
20
+ const ULTRACITE_VERSION = '8.0.1';
21
+ const LEFTHOOK_VERSION = '2.2.2';
22
+ const I18NEXT_VERSION = '26.4.6';
23
23
  const MODULE_FEDERATION_NODE_VERSION = '2.7.52';
24
- const MINIFLARE_VERSION = '5.20260930.0-alpha';
25
- const WORKERD_VERSION = '1.20260930.2';
26
- const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20261001.1';
24
+ const MINIFLARE_VERSION = '5.20261012.0-beta';
25
+ const WORKERD_VERSION = '1.20261015.1';
26
+ const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20261015.1';
27
27
  const NODE_FETCH_VERSION = '3.3.2';
28
- const REACT_VERSION = '19.3.0';
29
- const REACT_DOM_VERSION = '19.3.0';
30
- const TYPES_NODE_VERSION = '26.6.4';
28
+ const REACT_VERSION = '19.3.1';
29
+ const REACT_DOM_VERSION = '19.3.1';
30
+ const TYPES_NODE_VERSION = '26.6.5';
31
31
  const TYPES_REACT_VERSION = '19.3.0';
32
32
  const TYPES_REACT_DOM_VERSION = '19.3.0';
33
- const NODE_VERSION = '26.10.0';
34
- const PNPM_VERSION = '12.8.1';
33
+ const NODE_VERSION = '26.12.0';
34
+ const PNPM_VERSION = '12.11.2';
35
35
  const BRACES_FORK_VERSION = '3.0.4';
36
36
  const SHARP_VERSION = '0.35.5';
37
37
  const ULTRAMODERN_PACKAGE_PINS = {
@@ -89,6 +89,11 @@ function createWorkspaceAppPackageScripts(app) {
89
89
  dev: 'ultramodern dev',
90
90
  build: 'ultramodern build',
91
91
  serve: 'ultramodern serve',
92
+ ...resolveAppGenerationProfile(app)?.capabilities.workers ? {
93
+ 'cloudflare:build': 'ultramodern build --deploy-target cloudflare && ultramodern deploy --skip-build --deploy-target cloudflare',
94
+ 'cloudflare:deploy': 'pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json',
95
+ 'cloudflare:preview': `pnpm run cloudflare:build && wrangler dev --port ${app.port} --config .output/wrangler.json`
96
+ } : {},
92
97
  typecheck: resolveAppGenerationProfile(app)?.typecheckCommand ?? createStrictTsgoTypecheckCommand(app.directory)
93
98
  };
94
99
  const plan = createWorkspaceAppScriptPlan(app);
@@ -5,7 +5,7 @@ import { verticalsFromTopology } from "../../ultramodern-workspace/add-vertical/
5
5
  import { createNeutralOwnership, shellApp } from "../../ultramodern-workspace/descriptors.js";
6
6
  import { readModuleFederationExposePaths } from "../../ultramodern-workspace/mf-validation.js";
7
7
  import { toEnvSegment } from "../../ultramodern-workspace/naming.js";
8
- import { appSupportsFederation } from "../../ultramodern-workspace/renderer-profile.js";
8
+ import { getRendererGenerationProfile } from "../../ultramodern-workspace/renderer-profile.js";
9
9
  import { readJsonObject } from "./json.js";
10
10
  import { packageScopeFromRoot, readWorkspacePackageSource } from "./metadata.js";
11
11
  function normalizeWorkspaceInputs(workspaceRoot, inputs) {
@@ -119,7 +119,7 @@ function normalizeWorkspaceInputs(workspaceRoot, inputs) {
119
119
  rendererProfile: app.rendererProfile,
120
120
  routerBindings: app.routerBindings,
121
121
  rendererCapabilities: app.rendererCapabilities,
122
- ...'api-only' === app.surfaceProfile || void 0 !== app.renderer && !appSupportsFederation(app) ? {} : {
122
+ ...'api-only' === app.surfaceProfile || void 0 !== app.renderer && ('none' === app.renderer || !getRendererGenerationProfile(app.renderer).capabilities.federation) ? {} : {
123
123
  moduleFederation: {
124
124
  role: 'shell' === app.kind ? 'host' : 'remote',
125
125
  name: app.mfName,
@@ -9,12 +9,12 @@ function createAppModernConfig(app, enableTailwind = true) {
9
9
  const renderer = resolveWorkspaceRenderer(app);
10
10
  if (hasNativeAppGeneration(renderer)) {
11
11
  const generation = resolveAppGenerationProfile(app);
12
- const exposes = Object.keys(app.exposes ?? {}).length > 0;
13
- return `import { defineConfig } from '@modern-js/ultramodern-app-tools';
14
- ${exposes ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
12
+ const authoredAssetPrefix = !generation.capabilities.workers && Object.keys(app.exposes ?? {}).length > 0;
13
+ return `import { defineConfig${generation.capabilities.workers ? ', presetUltramodernWorkspace' : ''} } from '@modern-js/ultramodern-app-tools';
14
+ ${authoredAssetPrefix ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
15
15
  ${appHasApi(app) ? "import { bffPlugin } from '@modern-js/plugin-bff-build-extensions';\n" : ''}
16
16
  ${enableTailwind ? "import { pluginTailwindcss } from '@rsbuild/plugin-tailwindcss';\n" : ''}
17
- ${exposes ? `// Set ${createCloudflarePublicUrlEnv(app)} to this remote's public origin when deploying.
17
+ ${authoredAssetPrefix ? `// Set ${createCloudflarePublicUrlEnv(app)} to this remote's public origin when deploying.
18
18
  const remoteAddress = createRemoteManifestUrl({
19
19
  manifestEnv: ${JSON.stringify(createRemoteManifestEnv(app))},
20
20
  publicUrlEnv: ${JSON.stringify(createCloudflarePublicUrlEnv(app))},
@@ -24,10 +24,10 @@ const remoteAddress = createRemoteManifestUrl({
24
24
  const assetPrefix = new URL('.', remoteAddress.replace(/^[^@]+@(?=https?:\\/\\/)/u, '')).href;
25
25
 
26
26
  ` : ''}
27
- export default defineConfig({
27
+ export default defineConfig(${generation.capabilities.workers ? 'presetUltramodernWorkspace(' : ''}{
28
28
  ${enableTailwind ? ' builderPlugins: [pluginTailwindcss()],\n' : ''} renderer: ${JSON.stringify(renderer)},
29
29
  ${appHasApi(app) ? ' plugins: [bffPlugin()],\n' : ''}
30
- ${exposes ? ' output: { assetPrefix },\n' : ''}
30
+ ${authoredAssetPrefix ? ' output: { assetPrefix },\n' : ''}
31
31
  server: { port: ${app.port}, ssr: ${generation.capabilities.ssr}${appHasApi(app) ? `,
32
32
  bff: {
33
33
  effect: {
@@ -38,7 +38,7 @@ ${'rest' === resolveApiProtocol(app) ? " openapi: { path: '/openapi.json'
38
38
  runtimeFramework: 'effect',
39
39
  }` : ''} },
40
40
  source: { mainEntryName: 'main' },
41
- });
41
+ }${generation.capabilities.workers ? `, { appId: ${JSON.stringify(app.id)}, from: import.meta.url })` : ''});
42
42
  `;
43
43
  }
44
44
  const emitsUi = appEmitsBrowserUi(app);
@@ -60,7 +60,7 @@ function appDevDependencies(packageSource, enableTailwind, app) {
60
60
  const { '@rsbuild/plugin-tailwindcss': tailwindPluginVersion, tailwindcss: tailwindVersion, ...always } = ULTRAMODERN_PACKAGE_PINS.appDevDependencies;
61
61
  const renderer = resolveWorkspaceRenderer(app);
62
62
  const generationProfile = resolveAppGenerationProfile(app);
63
- const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && 'wrangler' !== name));
63
+ const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && ('wrangler' !== name || generationProfile?.capabilities.workers === true)));
64
64
  return {
65
65
  ...appHasApi(app) || 'shell' === app.kind && 'react' === renderer ? {
66
66
  '@modern-js/plugin-bff-build-extensions': frameworkRequest(packageSource)
@@ -86,8 +86,10 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
86
86
  ...additionalShells,
87
87
  ...remotes
88
88
  ];
89
+ const workerApps = apps.filter((app)=>resolveAppGenerationProfile(app)?.capabilities.workers);
90
+ const workerFilters = workerApps.map((app)=>`--filter ${packageName(scope, app.packageSuffix)}`).join(' ');
89
91
  if (bridge) throw new Error(`Renderer ${renderer} does not support React bridge configuration.`);
90
- const rootDevDependencies = Object.fromEntries(Object.entries(ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>'wrangler' !== name && 'zephyr-agent' !== name && 'miniflare' !== name));
92
+ const rootDevDependencies = Object.fromEntries(Object.entries(ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>('wrangler' !== name || workerApps.length > 0) && 'zephyr-agent' !== name && 'miniflare' !== name));
91
93
  return {
92
94
  private: true,
93
95
  name: scope,
@@ -102,6 +104,11 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
102
104
  dev: `pnpm --parallel ${apps.map((app)=>`--filter ${packageName(scope, app.packageSuffix)}`).join(' ')} dev`,
103
105
  'dev:shell': `pnpm --filter ${packageName(scope, primaryShell.packageSuffix)} dev`,
104
106
  build: 'pnpm -r --filter "./apps/*" --filter "./verticals/*" run build',
107
+ ...workerApps.length > 0 ? {
108
+ 'cloudflare:build': `pnpm -r ${workerFilters} run cloudflare:build`,
109
+ 'cloudflare:deploy': `pnpm -r ${workerFilters} run cloudflare:deploy`,
110
+ 'cloudflare:preview': `pnpm --parallel ${workerFilters} run cloudflare:preview`
111
+ } : {},
105
112
  typecheck: 'pnpm -r --filter "./packages/*" run typecheck && pnpm -r --filter "./apps/*" --filter "./verticals/*" run typecheck',
106
113
  'contract:check': 'ultramodern-create ultramodern validate',
107
114
  check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm contract:check',