@bleedingdev/modern-js-create 3.2.0-ultramodern.55 → 3.2.0-ultramodern.57

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 (2) hide show
  1. package/dist/index.js +65 -27
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1507,6 +1507,7 @@ ${bffConfig} output: {
1507
1507
  localisedUrls: ultramodernLocalisedUrls as Record<string, Record<string, string>>,
1508
1508
  ignoreRedirectRoutes: [
1509
1509
  '/@mf-types',
1510
+ '/assets',
1510
1511
  '/bundles',
1511
1512
  '${effectApiPrefix(app)}',
1512
1513
  '/locales',
@@ -1547,7 +1548,7 @@ ${bffPluginEntry} moduleFederationPlugin(),
1547
1548
  : {}),
1548
1549
  server: {
1549
1550
  port,
1550
- publicDir: './locales',
1551
+ publicDir: ['./locales', './assets'],
1551
1552
  ssr: {
1552
1553
  mode: 'stream',
1553
1554
  moduleFederationAppSSR: true,
@@ -2144,35 +2145,66 @@ function createCommerceAssetSvg(title, palette) {
2144
2145
  </svg>
2145
2146
  `;
2146
2147
  }
2148
+ const commerceAssetPublicRoot = 'assets/ultramodern';
2149
+ function commerceAssetPublicPath(filename) {
2150
+ return `${commerceAssetPublicRoot}/${filename}`;
2151
+ }
2152
+ function commerceAssetUrl(filename) {
2153
+ return `/${commerceAssetPublicRoot}/${filename}`;
2154
+ }
2147
2155
  function commerceAssetsForApp(app) {
2148
2156
  if ('shell' === app.kind) return {
2149
- 'src/assets/hero-field.svg': createCommerceAssetSvg('Tractor crossing cultivated fields', {
2157
+ [commerceAssetPublicPath('hero-field.svg')]: createCommerceAssetSvg('Tractor crossing cultivated fields', {
2150
2158
  accent: '#d6b85d',
2151
2159
  ground: '#84ad58',
2152
2160
  sky: '#9fd6e8',
2153
2161
  tractor: '#005f73'
2162
+ }),
2163
+ [commerceAssetPublicPath('autonomy.svg')]: createCommerceAssetSvg('Autonomous tractor concept', {
2164
+ accent: '#c26a2e',
2165
+ ground: '#668f55',
2166
+ sky: '#d5e7de',
2167
+ tractor: '#f2a51a'
2168
+ }),
2169
+ [commerceAssetPublicPath('field-loader.svg')]: createCommerceAssetSvg('Field Loader 112 tractor', {
2170
+ accent: '#d6b85d',
2171
+ ground: '#84ad58',
2172
+ sky: '#9fd6e8',
2173
+ tractor: '#00624b'
2174
+ }),
2175
+ [commerceAssetPublicPath('orchard.svg')]: createCommerceAssetSvg('Orchard tractor between tight rows', {
2176
+ accent: '#b45b2d',
2177
+ ground: '#6f9b4a',
2178
+ sky: '#c9ebff',
2179
+ tractor: '#1d5d9b'
2180
+ }),
2181
+ [commerceAssetPublicPath('vineyard.svg')]: createCommerceAssetSvg('Vineyard narrow tractor', {
2182
+ accent: '#b88d58',
2183
+ ground: '#5e8a45',
2184
+ sky: '#f1dcb9',
2185
+ tractor: '#914d76'
2154
2186
  })
2155
2187
  };
2156
2188
  if ('remote-explore' === app.id) return {
2157
- 'src/assets/autonomy.svg': createCommerceAssetSvg('Autonomous tractor concept', {
2189
+ [commerceAssetPublicPath('autonomy.svg')]: createCommerceAssetSvg('Autonomous tractor concept', {
2158
2190
  accent: '#c26a2e',
2159
2191
  ground: '#668f55',
2160
2192
  sky: '#d5e7de',
2161
2193
  tractor: '#f2a51a'
2162
2194
  }),
2163
- 'src/assets/field-loader.svg': createCommerceAssetSvg('Field Loader 112 tractor', {
2195
+ [commerceAssetPublicPath('field-loader.svg')]: createCommerceAssetSvg('Field Loader 112 tractor', {
2164
2196
  accent: '#d6b85d',
2165
2197
  ground: '#84ad58',
2166
2198
  sky: '#9fd6e8',
2167
2199
  tractor: '#00624b'
2168
2200
  }),
2169
- 'src/assets/orchard.svg': createCommerceAssetSvg('Orchard tractor between tight rows', {
2201
+ [commerceAssetPublicPath('orchard.svg')]: createCommerceAssetSvg('Orchard tractor between tight rows', {
2170
2202
  accent: '#b45b2d',
2171
2203
  ground: '#6f9b4a',
2172
2204
  sky: '#c9ebff',
2173
2205
  tractor: '#1d5d9b'
2174
2206
  }),
2175
- 'src/assets/vineyard.svg': createCommerceAssetSvg('Vineyard narrow tractor', {
2207
+ [commerceAssetPublicPath('vineyard.svg')]: createCommerceAssetSvg('Vineyard narrow tractor', {
2176
2208
  accent: '#b88d58',
2177
2209
  ground: '#5e8a45',
2178
2210
  sky: '#f1dcb9',
@@ -2180,7 +2212,7 @@ function commerceAssetsForApp(app) {
2180
2212
  })
2181
2213
  };
2182
2214
  if ('remote-decide' === app.id) return {
2183
- 'src/assets/field-loader.svg': createCommerceAssetSvg('Field Loader 112 tractor detail', {
2215
+ [commerceAssetPublicPath('field-loader.svg')]: createCommerceAssetSvg('Field Loader 112 tractor detail', {
2184
2216
  accent: '#d6b85d',
2185
2217
  ground: '#84ad58',
2186
2218
  sky: '#9fd6e8',
@@ -2343,12 +2375,13 @@ function createShellPage() {
2343
2375
  return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
2344
2376
  import { Helmet } from '@modern-js/runtime/head';
2345
2377
  import { useLocation } from '@modern-js/plugin-tanstack/runtime';
2346
- import heroField from '../../assets/hero-field.svg';
2347
2378
  import ShellFrame from '../shell-frame';
2348
2379
  import { StorePicker } from '../remote-components';
2349
2380
  import { ultramodernLocalisedUrls } from '../ultramodern-route-metadata';
2350
2381
  import { ultramodernUiMarker } from '../../ultramodern-build';
2351
2382
 
2383
+ const heroField = '${commerceAssetUrl('hero-field.svg')}';
2384
+
2352
2385
  ${createLocalizedHeadComponent()}
2353
2386
  export default function ShellHome() {
2354
2387
  const { i18nInstance, language } = useModernI18n();
@@ -2976,16 +3009,12 @@ export default function Header() {
2976
3009
  }
2977
3010
  `;
2978
3011
  if ('remote-explore' === app.id && './Recommendations' === expose) return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
2979
- import autonomyImage from '../assets/autonomy.svg';
2980
- import fieldLoaderImage from '../assets/field-loader.svg';
2981
- import orchardImage from '../assets/orchard.svg';
2982
- import vineyardImage from '../assets/vineyard.svg';
2983
3012
 
2984
3013
  const tractors = [
2985
- { badge: 'explore.recommendations.bestRows', image: orchardImage, name: 'Orchard Tractor', slug: 'orchard-tractor' },
2986
- { badge: 'explore.recommendations.aiFirst', image: autonomyImage, name: 'Autonomy Retrofit Kit', slug: 'autonomy-retrofit-kit' },
2987
- { badge: 'explore.recommendations.loaderReady', image: fieldLoaderImage, name: 'Field Loader 112', slug: 'field-loader-112' },
2988
- { badge: 'explore.recommendations.vineyard', image: vineyardImage, name: 'Vineyard Narrow 80', slug: 'vineyard-narrow-80' },
3014
+ { badge: 'explore.recommendations.bestRows', image: '${commerceAssetUrl('orchard.svg')}', name: 'Orchard Tractor', slug: 'orchard-tractor' },
3015
+ { badge: 'explore.recommendations.aiFirst', image: '${commerceAssetUrl('autonomy.svg')}', name: 'Autonomy Retrofit Kit', slug: 'autonomy-retrofit-kit' },
3016
+ { badge: 'explore.recommendations.loaderReady', image: '${commerceAssetUrl('field-loader.svg')}', name: 'Field Loader 112', slug: 'field-loader-112' },
3017
+ { badge: 'explore.recommendations.vineyard', image: '${commerceAssetUrl('vineyard.svg')}', name: 'Vineyard Narrow 80', slug: 'vineyard-narrow-80' },
2989
3018
  ] as const;
2990
3019
 
2991
3020
  export default function Recommendations() {
@@ -3009,8 +3038,9 @@ export default function Recommendations() {
3009
3038
  }
3010
3039
  `;
3011
3040
  if ('remote-explore' === app.id && './StorePicker' === expose) return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
3012
- import fieldLoaderImage from '../assets/field-loader.svg';
3013
- import vineyardImage from '../assets/vineyard.svg';
3041
+
3042
+ const fieldLoaderImage = '${commerceAssetUrl('field-loader.svg')}';
3043
+ const vineyardImage = '${commerceAssetUrl('vineyard.svg')}';
3014
3044
 
3015
3045
  export default function StorePicker() {
3016
3046
  const { i18nInstance } = useModernI18n();
@@ -3042,9 +3072,10 @@ export default function StorePicker() {
3042
3072
  if ('./Widget' === expose) return createRemoteWidget(app);
3043
3073
  const componentName = `${toPascalCase(app.domain ?? app.id)}${toPascalCase(expose.replace(/^\.\//u, ''))}`;
3044
3074
  if ('remote-decide' === app.id && './ProductPage' === expose) return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
3045
- import fieldLoaderImage from '../assets/field-loader.svg';
3046
3075
  import { AddToCart, Recommendations } from './remote-components';
3047
3076
 
3077
+ const fieldLoaderImage = '${commerceAssetUrl('field-loader.svg')}';
3078
+
3048
3079
  export default function ${componentName}() {
3049
3080
  const { i18nInstance } = useModernI18n();
3050
3081
  const t = i18nInstance['t'].bind(i18nInstance);
@@ -4460,7 +4491,10 @@ function createAppGeneratedContract(scope, app, apps, enableTailwind) {
4460
4491
  appI18nNamespace(app),
4461
4492
  'translation'
4462
4493
  ],
4463
- publicDir: './locales',
4494
+ publicDir: [
4495
+ './locales',
4496
+ './assets'
4497
+ ],
4464
4498
  localisedUrls: createLocalisedUrlsMap(app),
4465
4499
  resourceOwnership: {
4466
4500
  ownerAppId: app.id,
@@ -5358,9 +5392,9 @@ main().then(
5358
5392
  );
5359
5393
  `;
5360
5394
  }
5361
- function writeGeneratedWorkspaceScripts(targetDir, scope, enableTailwind) {
5395
+ function writeGeneratedWorkspaceScripts(targetDir, scope, enableTailwind, remotes = remoteApps) {
5362
5396
  writeFileReplacing(targetDir, "scripts/assert-mf-types.mjs", createAssertMfTypesScript());
5363
- writeFileReplacing(targetDir, "scripts/validate-ultramodern-workspace.mjs", createWorkspaceValidationScript(scope, enableTailwind));
5397
+ writeFileReplacing(targetDir, "scripts/validate-ultramodern-workspace.mjs", createWorkspaceValidationScript(scope, enableTailwind, remotes));
5364
5398
  writeFileReplacing(targetDir, "scripts/proof-cloudflare-version.mjs", createCloudflareVersionProofScript());
5365
5399
  }
5366
5400
  function writeApp(targetDir, scope, app, packageSource, enableTailwind) {
@@ -5583,6 +5617,7 @@ function remoteTopologyEntry(scope, remote) {
5583
5617
  ...effectApiTopologyMetadata(remote) ? {
5584
5618
  api: effectApiTopologyMetadata(remote)
5585
5619
  } : {},
5620
+ cloudflare: createCloudflareDeployContract(scope, remote),
5586
5621
  ownership: remote.ownership
5587
5622
  };
5588
5623
  }
@@ -5596,6 +5631,7 @@ function ownershipEntry(scope, owner) {
5596
5631
  }
5597
5632
  function remotesFromTopology(topology, ports) {
5598
5633
  return (topology.remotes ?? []).map((remote)=>{
5634
+ const packageSuffix = remote.package?.split('/').at(-1) ?? remote.id;
5599
5635
  const effectApi = remote.api?.effect ? {
5600
5636
  stem: 'string' == typeof remote.api.effect.basePath ? remote.api.effect.basePath.split('/').filter(Boolean).at(-1) ?? remote.domain ?? String(remote.id).replace(/^remote-/, '') : remote.domain ?? String(remote.id).replace(/^remote-/, ''),
5601
5637
  prefix: remote.api.effect.bff?.prefix ?? `/${remote.domain ?? String(remote.id).replace(/^remote-/, '')}-api`,
@@ -5606,8 +5642,8 @@ function remotesFromTopology(topology, ports) {
5606
5642
  } : void 0;
5607
5643
  return {
5608
5644
  id: remote.id,
5609
- directory: '',
5610
- packageSuffix: remote.package?.split('/').at(-1) ?? remote.id,
5645
+ directory: 'string' == typeof remote.path ? remote.path : `apps/remotes/${packageSuffix}`,
5646
+ packageSuffix,
5611
5647
  displayName: remote.id,
5612
5648
  kind: remote.kind ?? 'vertical',
5613
5649
  domain: remote.domain ?? String(remote.id).replace(/^remote-/, ''),
@@ -5681,16 +5717,18 @@ function addUltramodernMicroVertical(options) {
5681
5717
  writeJsonFile(topologyPath, topology);
5682
5718
  writeJsonFile(ownershipPath, ownership);
5683
5719
  writeJsonFile(overlayPath, overlay);
5720
+ const updatedRemotes = remotesFromTopology(topology, overlay.ports);
5684
5721
  writeJsonFile(node_path.join(options.workspaceRoot, GENERATED_CONTRACT_PATH), createGeneratedContract(scope, [
5685
5722
  {
5686
5723
  ...shellApp,
5687
- remoteRefs: remotesFromTopology(topology, overlay.ports).map((remote)=>remote.id)
5724
+ remoteRefs: updatedRemotes.map((remote)=>remote.id)
5688
5725
  },
5689
- ...remotesFromTopology(topology, overlay.ports)
5726
+ ...updatedRemotes
5690
5727
  ], enableTailwind));
5691
5728
  const shellConfigPath = node_path.join(options.workspaceRoot, `${shellApp.directory}/module-federation.config.ts`);
5692
- writeFileReplacing(options.workspaceRoot, `${shellApp.directory}/module-federation.config.ts`, createShellModuleFederationConfig(remotesFromTopology(topology, overlay.ports)));
5729
+ writeFileReplacing(options.workspaceRoot, `${shellApp.directory}/module-federation.config.ts`, createShellModuleFederationConfig(updatedRemotes));
5693
5730
  if (!node_fs.existsSync(shellConfigPath)) throw new Error('Shell Module Federation config was not regenerated');
5731
+ writeGeneratedWorkspaceScripts(options.workspaceRoot, scope, enableTailwind, updatedRemotes);
5694
5732
  addShellZephyrDependency(options.workspaceRoot, scope, remote);
5695
5733
  addShellWorkspaceDependency(options.workspaceRoot, scope, remote);
5696
5734
  addRootDevScript(options.workspaceRoot, scope, remote.packageSuffix, name);
package/package.json CHANGED
@@ -21,7 +21,7 @@
21
21
  "engines": {
22
22
  "node": ">=20"
23
23
  },
24
- "version": "3.2.0-ultramodern.55",
24
+ "version": "3.2.0-ultramodern.57",
25
25
  "types": "./dist/types/index.d.ts",
26
26
  "main": "./dist/index.js",
27
27
  "bin": {
@@ -41,7 +41,7 @@
41
41
  "@types/node": "^25.9.1",
42
42
  "@typescript/native-preview": "7.0.0-dev.20260527.2",
43
43
  "tsx": "^4.22.3",
44
- "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.2.0-ultramodern.55"
44
+ "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.2.0-ultramodern.57"
45
45
  },
46
46
  "publishConfig": {
47
47
  "registry": "https://registry.npmjs.org/",
@@ -54,6 +54,6 @@
54
54
  "start": "node ./dist/index.js"
55
55
  },
56
56
  "ultramodern": {
57
- "frameworkVersion": "3.2.0-ultramodern.55"
57
+ "frameworkVersion": "3.2.0-ultramodern.57"
58
58
  }
59
59
  }