@bleedingdev/modern-js-ultramodern-create 3.9.3-ultramodern.8 → 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.
@@ -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,6 +28,24 @@ 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
51
  version: '8.0.1',
@@ -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 (name === profile.compiler.name || 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',
@@ -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);
@@ -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,4 +1,22 @@
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
22
  version: '8.0.1',
@@ -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 (name === profile.compiler.name || 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',
@@ -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);
@@ -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',
@@ -1,5 +1,23 @@
1
1
  import "node:module";
2
2
  const patch_inventory = [
3
+ {
4
+ packageName: '@tanstack/router-core',
5
+ version: '1.171.34',
6
+ path: 'patches/@tanstack__router-core@1.171.34.patch',
7
+ sha256: '0e526bc0a1fd038c459fbf45b2b62da81f7f2516176b585f41fed7098ac4abbb',
8
+ repository: true,
9
+ workspace: null,
10
+ 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.'
11
+ },
12
+ {
13
+ packageName: '@tanstack/router-core',
14
+ version: '1.171.37',
15
+ path: 'patches/@tanstack__router-core@1.171.37.patch',
16
+ sha256: '6ffa70914ed338f3cb56d3cd1f526e35286e09f287ecf48ee6dbc1aa18305458',
17
+ repository: true,
18
+ workspace: null,
19
+ 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.'
20
+ },
3
21
  {
4
22
  packageName: 'ultracite',
5
23
  version: '8.0.1',
@@ -57,7 +57,7 @@ function parseNpmAlias(value) {
57
57
  };
58
58
  }
59
59
  function isForeignRendererPackage(name, renderer) {
60
- 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/');
60
+ 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/');
61
61
  if (react) return 'react' !== renderer;
62
62
  const owner = specifierRenderer(name);
63
63
  return void 0 !== owner && 'react' !== owner && owner !== renderer;
@@ -157,7 +157,7 @@ function assertAuthoredRendererDependencyPins(manifest, generation, options = {}
157
157
  for (const [name, version] of Object.entries({
158
158
  ...generation.dependencies,
159
159
  ...generation.devDependencies
160
- }))if (name === profile.compiler.name || isForeignRendererPackage(name, 'none')) pins[name] = version;
160
+ }))if (name === profile.compiler.name || name === profile.router.coreName || isForeignRendererPackage(name, 'none')) pins[name] = version;
161
161
  for (const group of [
162
162
  'dependencies',
163
163
  'devDependencies',
@@ -246,7 +246,7 @@ function assertNativeRendererSourceSurface(root, app, generation, manifest) {
246
246
  ])assert(!node_fs.existsSync(node_path.join(appRoot, relative)), `${app.id} native renderer contains unsupported artifact ${relative}`);
247
247
  const tsconfig = JSON.parse(node_fs.readFileSync(node_path.join(appRoot, 'tsconfig.json'), 'utf8'));
248
248
  assert(tsconfig.compilerOptions?.jsxImportSource === generation.jsxImportSource && tsconfig.compilerOptions?.jsx === 'preserve', `${app.id} JSX compiler configuration disagrees with the selected renderer`);
249
- 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`);
249
+ 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`);
250
250
  }
251
251
  function validateApiOnlySourceSurface(root, app) {
252
252
  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`);
@@ -165,7 +165,7 @@ function validateWorkspace(root, expected) {
165
165
  requiredFile(root, `${app.path}/modern.config.ts`, `${app.id} Modern.js config`);
166
166
  if (input.emitsUi && !nativeRenderer) requiredFile(root, `${app.path}/src/modern.runtime.ts`, `${app.id} runtime`);
167
167
  requiredFile(root, `${app.path}/shared/ultramodern-build.json`, `${app.id} build stamp`);
168
- if (!nativeRenderer) {
168
+ if (!nativeRenderer || generation.capabilities.workers) {
169
169
  const cloudflare = record(app.cloudflare, `${app.id} cloudflare`);
170
170
  for (const field of [
171
171
  'workerName',
@@ -90,6 +90,11 @@ function createWorkspaceAppPackageScripts(app) {
90
90
  dev: 'ultramodern dev',
91
91
  build: 'ultramodern build',
92
92
  serve: 'ultramodern serve',
93
+ ...resolveAppGenerationProfile(app)?.capabilities.workers ? {
94
+ 'cloudflare:build': 'ultramodern build --deploy-target cloudflare && ultramodern deploy --skip-build --deploy-target cloudflare',
95
+ 'cloudflare:deploy': 'pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json',
96
+ 'cloudflare:preview': `pnpm run cloudflare:build && wrangler dev --port ${app.port} --config .output/wrangler.json`
97
+ } : {},
93
98
  typecheck: resolveAppGenerationProfile(app)?.typecheckCommand ?? createStrictTsgoTypecheckCommand(app.directory)
94
99
  };
95
100
  const plan = createWorkspaceAppScriptPlan(app);
package/package.json CHANGED
@@ -26,7 +26,7 @@
26
26
  "engines": {
27
27
  "node": ">=26.12.0"
28
28
  },
29
- "version": "3.9.3-ultramodern.8",
29
+ "version": "3.9.3-ultramodern.9",
30
30
  "types": "./dist/types/index.d.ts",
31
31
  "main": "./dist/esm-node/index.js",
32
32
  "bin": {
@@ -86,22 +86,22 @@
86
86
  "@babel/core": "7.29.7",
87
87
  "@babel/parser": "^8.0.7",
88
88
  "@effect/tsgo": "0.53.1",
89
- "@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.9.3-ultramodern.8",
90
- "@modern-js/app-tools-extensions": "npm:@bleedingdev/modern-js-app-tools-extensions@3.9.3-ultramodern.8",
91
- "@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.3-ultramodern.8",
89
+ "@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.9.3-ultramodern.9",
90
+ "@modern-js/app-tools-extensions": "npm:@bleedingdev/modern-js-app-tools-extensions@3.9.3-ultramodern.9",
91
+ "@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.3-ultramodern.9",
92
92
  "@modern-js/codesmith": "2.6.9",
93
- "@modern-js/i18n-integration": "npm:@bleedingdev/modern-js-i18n-integration@3.9.3-ultramodern.8",
94
- "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.9.3-ultramodern.8",
95
- "@modern-js/plugin-bff-build-extensions": "npm:@bleedingdev/modern-js-plugin-bff-build-extensions@3.9.3-ultramodern.8",
96
- "@modern-js/plugin-i18n": "npm:@bleedingdev/modern-js-plugin-i18n@3.9.3-ultramodern.8",
97
- "@modern-js/plugin-tanstack": "npm:@bleedingdev/modern-js-plugin-tanstack@3.9.3-ultramodern.8",
98
- "@modern-js/renderer-core": "npm:@bleedingdev/modern-js-renderer-core@3.9.3-ultramodern.8",
99
- "@modern-js/renderer-octane": "npm:@bleedingdev/modern-js-renderer-octane@3.9.3-ultramodern.8",
100
- "@modern-js/renderer-solid": "npm:@bleedingdev/modern-js-renderer-solid@3.9.3-ultramodern.8",
101
- "@modern-js/runtime": "npm:@bleedingdev/modern-js-runtime@3.9.3-ultramodern.8",
102
- "@modern-js/runtime-renderer-extensions": "npm:@bleedingdev/modern-js-runtime-renderer-extensions@3.9.3-ultramodern.8",
103
- "@modern-js/ultramodern-app-tools": "npm:@bleedingdev/modern-js-ultramodern-app-tools@3.9.3-ultramodern.8",
104
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.3-ultramodern.8",
93
+ "@modern-js/i18n-integration": "npm:@bleedingdev/modern-js-i18n-integration@3.9.3-ultramodern.9",
94
+ "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.9.3-ultramodern.9",
95
+ "@modern-js/plugin-bff-build-extensions": "npm:@bleedingdev/modern-js-plugin-bff-build-extensions@3.9.3-ultramodern.9",
96
+ "@modern-js/plugin-i18n": "npm:@bleedingdev/modern-js-plugin-i18n@3.9.3-ultramodern.9",
97
+ "@modern-js/plugin-tanstack": "npm:@bleedingdev/modern-js-plugin-tanstack@3.9.3-ultramodern.9",
98
+ "@modern-js/renderer-core": "npm:@bleedingdev/modern-js-renderer-core@3.9.3-ultramodern.9",
99
+ "@modern-js/renderer-octane": "npm:@bleedingdev/modern-js-renderer-octane@3.9.3-ultramodern.9",
100
+ "@modern-js/renderer-solid": "npm:@bleedingdev/modern-js-renderer-solid@3.9.3-ultramodern.9",
101
+ "@modern-js/runtime": "npm:@bleedingdev/modern-js-runtime@3.9.3-ultramodern.9",
102
+ "@modern-js/runtime-renderer-extensions": "npm:@bleedingdev/modern-js-runtime-renderer-extensions@3.9.3-ultramodern.9",
103
+ "@modern-js/ultramodern-app-tools": "npm:@bleedingdev/modern-js-ultramodern-app-tools@3.9.3-ultramodern.9",
104
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.3-ultramodern.9",
105
105
  "@module-federation/modern-js-v3": "npm:@bleedingdev/mf-modern-js-v3@2.9.4",
106
106
  "@rsbuild/plugin-tailwindcss": "2.0.3",
107
107
  "@typescript/native": "npm:typescript@7.0.2",
@@ -118,15 +118,15 @@
118
118
  "zephyr-rspack-plugin": "1.6.0"
119
119
  },
120
120
  "devDependencies": {
121
- "@modern-js/i18n-runtime-extensions": "npm:@bleedingdev/modern-js-i18n-runtime-extensions@3.9.3-ultramodern.8",
122
- "@octanejs/rspack-plugin": "https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-d5988dd93614/octanejs-rspack-plugin-0.2.4.tgz",
121
+ "@modern-js/i18n-runtime-extensions": "npm:@bleedingdev/modern-js-i18n-runtime-extensions@3.9.3-ultramodern.9",
122
+ "@octanejs/rspack-plugin": "https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-0bf2313bbdfb/octanejs-rspack-plugin-0.2.4.tgz",
123
123
  "@rslib/core": "1.0.3",
124
124
  "@scripts/rstest-config": "2.66.0",
125
125
  "@solidjs/compiler": "2.0.0-rc.15",
126
126
  "@tsrx/oxc": "0.20.0",
127
127
  "@types/node": "^26.6.5",
128
128
  "js-yaml": "5.5.0",
129
- "octane": "https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-d5988dd93614/octane-0.13.8.tgz"
129
+ "octane": "https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-0bf2313bbdfb/octane-0.13.8.tgz"
130
130
  },
131
131
  "publishConfig": {
132
132
  "access": "public"
@@ -142,6 +142,6 @@
142
142
  },
143
143
  "ultramodern": {
144
144
  "sourceName": "@modern-js/ultramodern-create",
145
- "frameworkVersion": "3.9.3-ultramodern.8"
145
+ "frameworkVersion": "3.9.3-ultramodern.9"
146
146
  }
147
147
  }