@bleedingdev/modern-js-create 3.4.0-ultramodern.8 → 3.5.0-ultramodern.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +25 -23
  2. package/dist/cjs/index.cjs +37 -4
  3. package/dist/cjs/locale/en.cjs +12 -2
  4. package/dist/cjs/locale/zh.cjs +12 -2
  5. package/dist/cjs/ultramodern-tooling/commands.cjs +185 -0
  6. package/dist/cjs/ultramodern-tooling/config.cjs +172 -0
  7. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +87 -75
  8. package/dist/cjs/ultramodern-workspace/{effect-api.cjs → api.cjs} +207 -208
  9. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
  10. package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
  11. package/dist/cjs/ultramodern-workspace/contracts.cjs +127 -657
  12. package/dist/cjs/ultramodern-workspace/demo-components.cjs +12 -12
  13. package/dist/cjs/ultramodern-workspace/descriptors.cjs +25 -25
  14. package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
  15. package/dist/cjs/ultramodern-workspace/generation-result.cjs +5 -5
  16. package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
  17. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +571 -0
  18. package/dist/cjs/ultramodern-workspace/module-federation.cjs +33 -18
  19. package/dist/cjs/ultramodern-workspace/overlays.cjs +2 -2
  20. package/dist/cjs/ultramodern-workspace/package-json.cjs +57 -41
  21. package/dist/cjs/ultramodern-workspace/policy.cjs +4 -4
  22. package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
  23. package/dist/cjs/ultramodern-workspace/public-surface.cjs +2 -2
  24. package/dist/cjs/ultramodern-workspace/versions.cjs +5 -0
  25. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +119 -50
  26. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +62 -21
  27. package/dist/esm/index.js +37 -4
  28. package/dist/esm/locale/en.js +12 -2
  29. package/dist/esm/locale/zh.js +12 -2
  30. package/dist/esm/ultramodern-tooling/commands.js +132 -0
  31. package/dist/esm/ultramodern-tooling/config.js +120 -0
  32. package/dist/esm/ultramodern-workspace/add-vertical.js +88 -79
  33. package/dist/esm/ultramodern-workspace/{effect-api.js → api.js} +146 -147
  34. package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
  35. package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
  36. package/dist/esm/ultramodern-workspace/contracts.js +129 -611
  37. package/dist/esm/ultramodern-workspace/demo-components.js +13 -13
  38. package/dist/esm/ultramodern-workspace/descriptors.js +11 -11
  39. package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
  40. package/dist/esm/ultramodern-workspace/generation-result.js +6 -6
  41. package/dist/esm/ultramodern-workspace/index.js +1 -0
  42. package/dist/esm/ultramodern-workspace/mf-validation.js +516 -0
  43. package/dist/esm/ultramodern-workspace/module-federation.js +34 -19
  44. package/dist/esm/ultramodern-workspace/overlays.js +2 -2
  45. package/dist/esm/ultramodern-workspace/package-json.js +56 -40
  46. package/dist/esm/ultramodern-workspace/policy.js +5 -5
  47. package/dist/esm/ultramodern-workspace/public-api.js +1 -0
  48. package/dist/esm/ultramodern-workspace/public-surface.js +2 -2
  49. package/dist/esm/ultramodern-workspace/versions.js +3 -1
  50. package/dist/esm/ultramodern-workspace/workspace-scripts.js +107 -34
  51. package/dist/esm/ultramodern-workspace/write-workspace.js +64 -26
  52. package/dist/esm-node/index.js +37 -4
  53. package/dist/esm-node/locale/en.js +12 -2
  54. package/dist/esm-node/locale/zh.js +12 -2
  55. package/dist/esm-node/ultramodern-tooling/commands.js +133 -0
  56. package/dist/esm-node/ultramodern-tooling/config.js +121 -0
  57. package/dist/esm-node/ultramodern-workspace/add-vertical.js +88 -79
  58. package/dist/esm-node/ultramodern-workspace/{effect-api.js → api.js} +146 -147
  59. package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
  60. package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
  61. package/dist/esm-node/ultramodern-workspace/contracts.js +129 -611
  62. package/dist/esm-node/ultramodern-workspace/demo-components.js +13 -13
  63. package/dist/esm-node/ultramodern-workspace/descriptors.js +11 -11
  64. package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
  65. package/dist/esm-node/ultramodern-workspace/generation-result.js +6 -6
  66. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  67. package/dist/esm-node/ultramodern-workspace/mf-validation.js +517 -0
  68. package/dist/esm-node/ultramodern-workspace/module-federation.js +34 -19
  69. package/dist/esm-node/ultramodern-workspace/overlays.js +2 -2
  70. package/dist/esm-node/ultramodern-workspace/package-json.js +56 -40
  71. package/dist/esm-node/ultramodern-workspace/policy.js +5 -5
  72. package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
  73. package/dist/esm-node/ultramodern-workspace/public-surface.js +2 -2
  74. package/dist/esm-node/ultramodern-workspace/versions.js +3 -1
  75. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +107 -34
  76. package/dist/esm-node/ultramodern-workspace/write-workspace.js +64 -26
  77. package/dist/types/locale/en.d.ts +10 -0
  78. package/dist/types/locale/index.d.ts +20 -0
  79. package/dist/types/locale/zh.d.ts +10 -0
  80. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  81. package/dist/types/ultramodern-tooling/config.d.ts +43 -0
  82. package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
  83. package/dist/types/ultramodern-workspace/api.d.ts +73 -0
  84. package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
  85. package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
  86. package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
  87. package/dist/types/ultramodern-workspace/descriptors.d.ts +10 -10
  88. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
  89. package/dist/types/ultramodern-workspace/index.d.ts +2 -0
  90. package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
  91. package/dist/types/ultramodern-workspace/package-json.d.ts +5 -4
  92. package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
  93. package/dist/types/ultramodern-workspace/types.d.ts +9 -7
  94. package/dist/types/ultramodern-workspace/versions.d.ts +2 -0
  95. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +2 -7
  96. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
  97. package/package.json +5 -3
  98. package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
  99. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +2 -0
  100. package/template-workspace/.gitignore.handlebars +3 -0
  101. package/template-workspace/AGENTS.md.handlebars +11 -5
  102. package/template-workspace/README.md.handlebars +15 -12
  103. package/template-workspace/oxfmt.config.ts +1 -0
  104. package/template-workspace/oxlint.config.ts +1 -0
  105. package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +51 -0
  106. package/template-workspace/pnpm-workspace.yaml.handlebars +4 -0
  107. package/template-workspace/scripts/bootstrap-agent-skills.mjs +77 -67
  108. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +51 -8
  109. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +344 -0
  110. package/templates/workspace-scripts/{check-ultramodern-i18n-boundaries.mjs → check-ultramodern-i18n-boundaries.mts} +1 -1
  111. package/templates/workspace-scripts/generate-public-surface-assets.mjs +246 -9
  112. package/templates/workspace-scripts/proof-cloudflare-version.mjs +277 -9
  113. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +35 -10
  114. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +165 -2
  115. package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
  116. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +840 -84
  117. package/dist/types/ultramodern-workspace/effect-api.d.ts +0 -73
  118. /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
  119. /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
  120. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
  121. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
  122. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
  123. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
  124. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
  125. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
  126. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
  127. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
  128. /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
  129. /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
  130. /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
  131. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
  132. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
  133. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
  134. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
  135. /package/template-workspace/{.agents → .codex}/skills/rstest-best-practices/SKILL.md +0 -0
@@ -1,4 +1,4 @@
1
- import { appHasEffectApi, effectApiStem, remoteDependencyAlias, shellApp } from "./descriptors.js";
1
+ import { appHasApi, remoteDependencyAlias, resolveApiStem, shellApp } from "./descriptors.js";
2
2
  import { createTw, packageName, tailwindPrefixForApp, toPascalCase } from "./naming.js";
3
3
  function createShellPage(remotes = []) {
4
4
  const tw = createTw(tailwindPrefixForApp(shellApp));
@@ -209,36 +209,36 @@ ${showcaseItems}
209
209
  }
210
210
  function createRemotePage(app) {
211
211
  const tw = createTw(tailwindPrefixForApp(app));
212
- const listEffectItems = `list${toPascalCase(effectApiStem(app))}`;
213
- const effectBffImport = appHasEffectApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
212
+ const listApiItems = `list${toPascalCase(resolveApiStem(app))}`;
213
+ const apiImport = appHasApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
214
214
  import { Link } from '@modern-js/plugin-tanstack/runtime';
215
215
  import { useEffect, useState } from 'react';
216
216
  import {
217
217
  Effect,
218
- ${listEffectItems},
218
+ ${listApiItems},
219
219
  runEffectRequest,
220
- } from '../../effect/${effectApiStem(app)}-client';
220
+ } from '../../api/${resolveApiStem(app)}-client';
221
221
  import { UltramodernRouteHead } from '../ultramodern-route-head';
222
222
  import { ultramodernUiMarker } from '../../ultramodern-build';
223
223
  ` : "import { useModernI18n } from '@modern-js/plugin-i18n/runtime';\nimport { Link } from '@modern-js/plugin-tanstack/runtime';\nimport { UltramodernRouteHead } from '../ultramodern-route-head';\nimport { ultramodernUiMarker } from '../../ultramodern-build';\n";
224
- const effectBffState = appHasEffectApi(app) ? ` const [effectApiStatus, setEffectApiStatus] = useState('pending');
224
+ const apiState = appHasApi(app) ? ` const [apiStatus, setApiStatus] = useState('pending');
225
225
 
226
226
  useEffect(() => {
227
227
  let cancelled = false;
228
228
  void runEffectRequest(
229
- ${listEffectItems}({ limit: 1 }).pipe(
229
+ ${listApiItems}({ limit: 1 }).pipe(
230
230
  Effect.match({
231
231
  onFailure: () => {
232
232
  if (cancelled) {
233
233
  return;
234
234
  }
235
- setEffectApiStatus('unavailable');
235
+ setApiStatus('unavailable');
236
236
  },
237
237
  onSuccess: data => {
238
238
  if (cancelled) {
239
239
  return;
240
240
  }
241
- setEffectApiStatus(data.items.at(0)?.title ?? 'empty');
241
+ setApiStatus(data.items.at(0)?.title ?? 'empty');
242
242
  },
243
243
  }),
244
244
  ),
@@ -250,12 +250,12 @@ import { ultramodernUiMarker } from '../../ultramodern-build';
250
250
  }, []);
251
251
 
252
252
  ` : '';
253
- const effectBffMarkup = appHasEffectApi(app) ? ` <p data-testid="effect-bff-status">{effectApiStatus}</p>
253
+ const apiMarkup = appHasApi(app) ? ` <p data-testid="api-status">{apiStatus}</p>
254
254
  ` : '';
255
- return `${effectBffImport}
255
+ return `${apiImport}
256
256
  export default function ${toPascalCase(app.id)}Home() {
257
257
  const { language, supportedLanguages, t } = useModernI18n();
258
- ${effectBffState} return (
258
+ ${apiState} return (
259
259
  <main className="${tw('min-h-screen bg-um-canvas px-4 py-6 text-um-foreground sm:px-8')}">
260
260
  <UltramodernRouteHead />
261
261
  <nav aria-label={t('${app.domain}.language.switcher')} className="${tw('flex gap-3')}">
@@ -276,7 +276,7 @@ ${effectBffState} return (
276
276
  <p className="${tw('sr-only')}" data-build-marker={ultramodernUiMarker.build} data-testid="ultramodern-ui-marker">
277
277
  {ultramodernUiMarker.appId}:{ultramodernUiMarker.version}
278
278
  </p>
279
- ${effectBffMarkup} </main>
279
+ ${apiMarkup} </main>
280
280
  );
281
281
  }
282
282
  `;
@@ -1,5 +1,5 @@
1
1
  import { packageName, toCamelCase, toEnvSegment, toKebabCase, toPascalCase } from "./naming.js";
2
- const GENERATED_CONTRACT_PATH = '.modernjs/ultramodern-generated-contract.json';
2
+ const ULTRAMODERN_CONFIG_PATH = '.modernjs/ultramodern.json';
3
3
  const shellApp = {
4
4
  id: 'shell-super-app',
5
5
  directory: 'apps/shell-super-app',
@@ -76,7 +76,7 @@ function createVerticalDescriptor(name, port) {
76
76
  './Route': './src/federation-entry.tsx',
77
77
  './Widget': `./src/components/${domain}-widget.tsx`
78
78
  },
79
- effectApi: {
79
+ api: {
80
80
  stem: domain,
81
81
  prefix: `/${domain}-api`,
82
82
  consumedBy: [
@@ -87,17 +87,17 @@ function createVerticalDescriptor(name, port) {
87
87
  ownership: createNeutralOwnership(id)
88
88
  };
89
89
  }
90
- function appHasEffectApi(app) {
91
- return void 0 !== app.effectApi;
90
+ function appHasApi(app) {
91
+ return void 0 !== app.api;
92
92
  }
93
- function effectApiPrefix(target) {
94
- return target.effectApi?.prefix ?? `/${toKebabCase(target.id)}-api`;
93
+ function resolveApiPrefix(target) {
94
+ return target.api?.prefix ?? `/${toKebabCase(target.id)}-api`;
95
95
  }
96
- function effectApiStem(target) {
97
- return target.effectApi?.stem ?? toKebabCase(target.id).replace(/-api$/, '');
96
+ function resolveApiStem(target) {
97
+ return target.api?.stem ?? toKebabCase(target.id).replace(/-api$/, '');
98
98
  }
99
- function verticalEffectApps(remotes = []) {
100
- return remotes.filter(appHasEffectApi);
99
+ function verticalApiApps(remotes = []) {
100
+ return remotes.filter(appHasApi);
101
101
  }
102
102
  function remoteDependencyAlias(remote) {
103
103
  return toCamelCase(remote.domain ?? remote.id.replace(/^remote-/, ''));
@@ -130,4 +130,4 @@ function createCloudflarePublicUrlEnv(app) {
130
130
  function appI18nNamespace(app) {
131
131
  return 'shell' === app.kind ? 'shell' : app.domain ?? app.id;
132
132
  }
133
- export { GENERATED_CONTRACT_PATH, appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, effectApiStem, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalEffectApps, zephyrRemoteDependency };
133
+ export { ULTRAMODERN_CONFIG_PATH, appHasApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, remoteDependencyAlias, resolveApiPrefix, resolveApiStem, resolveRemoteRefs, sharedPackages, shellApp, verticalApiApps, zephyrRemoteDependency };
@@ -1,13 +1,47 @@
1
+ import { spawnSync } from "node:child_process";
1
2
  import node_crypto from "node:crypto";
2
3
  import node_fs from "node:fs";
4
+ import { createRequire } from "node:module";
3
5
  import node_path from "node:path";
4
- import { fileURLToPath } from "node:url";
6
+ import { fileURLToPath, pathToFileURL } from "node:url";
5
7
  import { resolveCreatePackageRoot } from "../create-package-root.js";
6
8
  import { normalizePath } from "./naming.js";
7
9
  const fs_io_dirname = node_path.dirname(fileURLToPath(import.meta.url));
10
+ const fs_io_require = createRequire(import.meta.url);
8
11
  const createPackageRoot = resolveCreatePackageRoot(fs_io_dirname);
9
12
  const workspaceTemplateDir = node_path.join(createPackageRoot, 'template-workspace');
10
13
  const fileTemplatesDir = node_path.join(createPackageRoot, 'templates');
14
+ const preformatConfigDir = '.modern-js';
15
+ const preformatConfigPath = node_path.join(preformatConfigDir, 'ultramodern-preformat.oxfmt.config.mjs');
16
+ const workspaceOxfmtIgnorePatterns = [
17
+ '.agents',
18
+ '.codex/skills',
19
+ '.output',
20
+ '**/*.json',
21
+ 'dist',
22
+ 'node_modules',
23
+ 'repos/**',
24
+ '.modern',
25
+ '.modernjs',
26
+ '**/modern-tanstack/**',
27
+ '**/routeTree.gen.*'
28
+ ];
29
+ const formattableExtensions = new Set([
30
+ '.cjs',
31
+ '.cts',
32
+ '.js',
33
+ '.json',
34
+ '.jsonc',
35
+ '.jsx',
36
+ '.mjs',
37
+ '.mts',
38
+ '.md',
39
+ '.mdx',
40
+ '.ts',
41
+ '.tsx',
42
+ '.yaml',
43
+ '.yml'
44
+ ]);
11
45
  function readFileTemplate(relativePath) {
12
46
  return node_fs.readFileSync(node_path.join(fileTemplatesDir, relativePath), 'utf-8');
13
47
  }
@@ -43,6 +77,86 @@ function writeFileReplacing(targetDir, relativePath, content) {
43
77
  function writeJson(targetDir, relativePath, value) {
44
78
  writeFile(targetDir, relativePath, `${JSON.stringify(value, null, 2)}\n`);
45
79
  }
80
+ function formatGeneratedWorkspaceFiles(targetDir, relativePaths) {
81
+ const oxfmtBin = resolveOxfmtBin();
82
+ const oxfmtConfigPath = writePreformatConfig(targetDir);
83
+ const targets = void 0 === relativePaths ? [
84
+ targetDir,
85
+ `!${normalizePath(node_path.join(targetDir, 'repos'))}/**`
86
+ ] : relativePaths.filter((relativePath)=>formattableExtensions.has(node_path.extname(relativePath))).map((relativePath)=>node_path.join(targetDir, relativePath));
87
+ if (0 === targets.length) return void removePreformatConfig(targetDir);
88
+ try {
89
+ const result = spawnSync(process.execPath, [
90
+ oxfmtBin,
91
+ '--config',
92
+ oxfmtConfigPath,
93
+ '--no-error-on-unmatched-pattern',
94
+ ...targets
95
+ ], {
96
+ cwd: targetDir,
97
+ encoding: 'utf-8',
98
+ env: {
99
+ ...process.env,
100
+ FORCE_COLOR: '0'
101
+ }
102
+ });
103
+ if (0 !== result.status) {
104
+ const detail = [
105
+ result.stderr.trim(),
106
+ result.stdout.trim()
107
+ ].filter(Boolean).join('\n');
108
+ throw new Error([
109
+ 'Failed to format generated UltraModern workspace output.',
110
+ detail
111
+ ].filter(Boolean).join('\n'));
112
+ }
113
+ } finally{
114
+ removePreformatConfig(targetDir);
115
+ }
116
+ }
117
+ function writePreformatConfig(targetDir) {
118
+ const configPath = node_path.join(targetDir, preformatConfigPath);
119
+ node_fs.mkdirSync(node_path.dirname(configPath), {
120
+ recursive: true
121
+ });
122
+ const oxfmtUrl = pathToFileURL(resolveOxfmtEntry()).href;
123
+ const ultraciteConfigUrl = pathToFileURL(resolveUltraciteOxfmtConfig()).href;
124
+ node_fs.writeFileSync(configPath, [
125
+ `import { defineConfig } from ${JSON.stringify(oxfmtUrl)};`,
126
+ `import ultracite from ${JSON.stringify(ultraciteConfigUrl)};`,
127
+ '',
128
+ 'export default defineConfig({',
129
+ ' extends: [ultracite],',
130
+ ' ignorePatterns: [',
131
+ ...workspaceOxfmtIgnorePatterns.map((pattern)=>` ${JSON.stringify(pattern)},`),
132
+ ' ],',
133
+ ' singleQuote: true,',
134
+ '});',
135
+ ''
136
+ ].join('\n'), 'utf-8');
137
+ return configPath;
138
+ }
139
+ function removePreformatConfig(targetDir) {
140
+ node_fs.rmSync(node_path.join(targetDir, preformatConfigPath), {
141
+ force: true
142
+ });
143
+ try {
144
+ node_fs.rmdirSync(node_path.join(targetDir, preformatConfigDir));
145
+ } catch {}
146
+ }
147
+ function resolveOxfmtBin() {
148
+ const packageJsonPath = fs_io_require.resolve('oxfmt/package.json');
149
+ const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, 'utf-8'));
150
+ const binPath = 'string' == typeof packageJson.bin ? packageJson.bin : packageJson.bin?.oxfmt;
151
+ if ('string' != typeof binPath || 0 === binPath.length) throw new Error('Unable to resolve oxfmt binary from package metadata.');
152
+ return node_path.join(node_path.dirname(packageJsonPath), binPath);
153
+ }
154
+ function resolveOxfmtEntry() {
155
+ return fs_io_require.resolve('oxfmt');
156
+ }
157
+ function resolveUltraciteOxfmtConfig() {
158
+ return fs_io_require.resolve('ultracite/oxfmt');
159
+ }
46
160
  function renderTemplate(template, data) {
47
161
  return template.replace(/\{\{(\w+)\}\}/g, (match, key)=>data[key] ?? match);
48
162
  }
@@ -87,4 +201,4 @@ function readJsonFile(filePath) {
87
201
  function writeJsonFile(filePath, value) {
88
202
  node_fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf-8');
89
203
  }
90
- export { assertSafeRelativePath, collectTemplateFiles, copyRootTemplate, createPackageRoot, ensureInsideRoot, fileTemplatesDir, hashFile, hashTemplateTree, readFileTemplate, readJsonFile, renderFileTemplate, renderTemplate, workspaceTemplateDir, writeFile, writeFileReplacing, writeJson, writeJsonFile };
204
+ export { assertSafeRelativePath, collectTemplateFiles, copyRootTemplate, createPackageRoot, ensureInsideRoot, fileTemplatesDir, formatGeneratedWorkspaceFiles, hashFile, hashTemplateTree, readFileTemplate, readJsonFile, renderFileTemplate, renderTemplate, workspaceTemplateDir, writeFile, writeFileReplacing, writeJson, writeJsonFile };
@@ -1,7 +1,7 @@
1
1
  import node_crypto from "node:crypto";
2
2
  import node_fs from "node:fs";
3
3
  import node_path from "node:path";
4
- import { GENERATED_CONTRACT_PATH, appHasEffectApi } from "./descriptors.js";
4
+ import { ULTRAMODERN_CONFIG_PATH, appHasApi } from "./descriptors.js";
5
5
  import { normalizePath, packageName } from "./naming.js";
6
6
  const ignoredSnapshotDirectories = new Set([
7
7
  '.git',
@@ -67,11 +67,11 @@ function createGenerationResult(options) {
67
67
  app.id,
68
68
  app.moduleFederationName
69
69
  ])),
70
- effectApiPrefixes: Object.fromEntries(createdApps.filter((app)=>app.effectApiPrefix).map((app)=>[
70
+ apiPrefixes: Object.fromEntries(createdApps.filter((app)=>app.apiPrefix).map((app)=>[
71
71
  app.id,
72
- app.effectApiPrefix
72
+ app.apiPrefix
73
73
  ])),
74
- generatedContractPath: GENERATED_CONTRACT_PATH,
74
+ generatedContractPath: ULTRAMODERN_CONFIG_PATH,
75
75
  warnings: options.warnings ?? []
76
76
  };
77
77
  }
@@ -91,8 +91,8 @@ function createGeneratedAppDescriptor(scope, app) {
91
91
  ...app.exposes
92
92
  }
93
93
  } : {},
94
- ...appHasEffectApi(app) ? {
95
- effectApiPrefix: app.effectApi.prefix
94
+ ...appHasApi(app) ? {
95
+ apiPrefix: app.api.prefix
96
96
  } : {}
97
97
  };
98
98
  }
@@ -1,3 +1,4 @@
1
1
  export { addUltramodernVertical, planUltramodernVertical } from "./add-vertical.js";
2
+ export { normalizeUltramodernBridgeConfig } from "./bridge-config.js";
2
3
  export { ultramodernWorkspaceVersions } from "./versions.js";
3
4
  export { generateUltramodernWorkspace } from "./write-workspace.js";