@bleedingdev/modern-js-create 3.4.0-ultramodern.9 → 3.5.0-ultramodern.1

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 +49 -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 +431 -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 +128 -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 +39 -12
  19. package/dist/cjs/ultramodern-workspace/overlays.cjs +2 -2
  20. package/dist/cjs/ultramodern-workspace/package-json.cjs +58 -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 +15 -0
  25. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +120 -50
  26. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +64 -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 +378 -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 +130 -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 +40 -13
  44. package/dist/esm/ultramodern-workspace/overlays.js +2 -2
  45. package/dist/esm/ultramodern-workspace/package-json.js +57 -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 +7 -1
  50. package/dist/esm/ultramodern-workspace/workspace-scripts.js +108 -34
  51. package/dist/esm/ultramodern-workspace/write-workspace.js +66 -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 +379 -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 +130 -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 +40 -13
  69. package/dist/esm-node/ultramodern-workspace/overlays.js +2 -2
  70. package/dist/esm-node/ultramodern-workspace/package-json.js +57 -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 +7 -1
  75. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +108 -34
  76. package/dist/esm-node/ultramodern-workspace/write-workspace.js +66 -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 +6 -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 +55 -13
  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 +7 -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 +366 -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 +842 -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,5 +1,5 @@
1
1
  import "node:module";
2
- import { appHasEffectApi, effectApiStem, remoteDependencyAlias, shellApp } from "./descriptors.js";
2
+ import { appHasApi, remoteDependencyAlias, resolveApiStem, shellApp } from "./descriptors.js";
3
3
  import { createTw, packageName, tailwindPrefixForApp, toPascalCase } from "./naming.js";
4
4
  function createShellPage(remotes = []) {
5
5
  const tw = createTw(tailwindPrefixForApp(shellApp));
@@ -210,36 +210,36 @@ ${showcaseItems}
210
210
  }
211
211
  function createRemotePage(app) {
212
212
  const tw = createTw(tailwindPrefixForApp(app));
213
- const listEffectItems = `list${toPascalCase(effectApiStem(app))}`;
214
- const effectBffImport = appHasEffectApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
213
+ const listApiItems = `list${toPascalCase(resolveApiStem(app))}`;
214
+ const apiImport = appHasApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
215
215
  import { Link } from '@modern-js/plugin-tanstack/runtime';
216
216
  import { useEffect, useState } from 'react';
217
217
  import {
218
218
  Effect,
219
- ${listEffectItems},
219
+ ${listApiItems},
220
220
  runEffectRequest,
221
- } from '../../effect/${effectApiStem(app)}-client';
221
+ } from '../../api/${resolveApiStem(app)}-client';
222
222
  import { UltramodernRouteHead } from '../ultramodern-route-head';
223
223
  import { ultramodernUiMarker } from '../../ultramodern-build';
224
224
  ` : "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";
225
- const effectBffState = appHasEffectApi(app) ? ` const [effectApiStatus, setEffectApiStatus] = useState('pending');
225
+ const apiState = appHasApi(app) ? ` const [apiStatus, setApiStatus] = useState('pending');
226
226
 
227
227
  useEffect(() => {
228
228
  let cancelled = false;
229
229
  void runEffectRequest(
230
- ${listEffectItems}({ limit: 1 }).pipe(
230
+ ${listApiItems}({ limit: 1 }).pipe(
231
231
  Effect.match({
232
232
  onFailure: () => {
233
233
  if (cancelled) {
234
234
  return;
235
235
  }
236
- setEffectApiStatus('unavailable');
236
+ setApiStatus('unavailable');
237
237
  },
238
238
  onSuccess: data => {
239
239
  if (cancelled) {
240
240
  return;
241
241
  }
242
- setEffectApiStatus(data.items.at(0)?.title ?? 'empty');
242
+ setApiStatus(data.items.at(0)?.title ?? 'empty');
243
243
  },
244
244
  }),
245
245
  ),
@@ -251,12 +251,12 @@ import { ultramodernUiMarker } from '../../ultramodern-build';
251
251
  }, []);
252
252
 
253
253
  ` : '';
254
- const effectBffMarkup = appHasEffectApi(app) ? ` <p data-testid="effect-bff-status">{effectApiStatus}</p>
254
+ const apiMarkup = appHasApi(app) ? ` <p data-testid="api-status">{apiStatus}</p>
255
255
  ` : '';
256
- return `${effectBffImport}
256
+ return `${apiImport}
257
257
  export default function ${toPascalCase(app.id)}Home() {
258
258
  const { language, supportedLanguages, t } = useModernI18n();
259
- ${effectBffState} return (
259
+ ${apiState} return (
260
260
  <main className="${tw('min-h-screen bg-um-canvas px-4 py-6 text-um-foreground sm:px-8')}">
261
261
  <UltramodernRouteHead />
262
262
  <nav aria-label={t('${app.domain}.language.switcher')} className="${tw('flex gap-3')}">
@@ -277,7 +277,7 @@ ${effectBffState} return (
277
277
  <p className="${tw('sr-only')}" data-build-marker={ultramodernUiMarker.build} data-testid="ultramodern-ui-marker">
278
278
  {ultramodernUiMarker.appId}:{ultramodernUiMarker.version}
279
279
  </p>
280
- ${effectBffMarkup} </main>
280
+ ${apiMarkup} </main>
281
281
  );
282
282
  }
283
283
  `;
@@ -1,6 +1,6 @@
1
1
  import "node:module";
2
2
  import { packageName, toCamelCase, toEnvSegment, toKebabCase, toPascalCase } from "./naming.js";
3
- const GENERATED_CONTRACT_PATH = '.modernjs/ultramodern-generated-contract.json';
3
+ const ULTRAMODERN_CONFIG_PATH = '.modernjs/ultramodern.json';
4
4
  const shellApp = {
5
5
  id: 'shell-super-app',
6
6
  directory: 'apps/shell-super-app',
@@ -77,7 +77,7 @@ function createVerticalDescriptor(name, port) {
77
77
  './Route': './src/federation-entry.tsx',
78
78
  './Widget': `./src/components/${domain}-widget.tsx`
79
79
  },
80
- effectApi: {
80
+ api: {
81
81
  stem: domain,
82
82
  prefix: `/${domain}-api`,
83
83
  consumedBy: [
@@ -88,17 +88,17 @@ function createVerticalDescriptor(name, port) {
88
88
  ownership: createNeutralOwnership(id)
89
89
  };
90
90
  }
91
- function appHasEffectApi(app) {
92
- return void 0 !== app.effectApi;
91
+ function appHasApi(app) {
92
+ return void 0 !== app.api;
93
93
  }
94
- function effectApiPrefix(target) {
95
- return target.effectApi?.prefix ?? `/${toKebabCase(target.id)}-api`;
94
+ function resolveApiPrefix(target) {
95
+ return target.api?.prefix ?? `/${toKebabCase(target.id)}-api`;
96
96
  }
97
- function effectApiStem(target) {
98
- return target.effectApi?.stem ?? toKebabCase(target.id).replace(/-api$/, '');
97
+ function resolveApiStem(target) {
98
+ return target.api?.stem ?? toKebabCase(target.id).replace(/-api$/, '');
99
99
  }
100
- function verticalEffectApps(remotes = []) {
101
- return remotes.filter(appHasEffectApi);
100
+ function verticalApiApps(remotes = []) {
101
+ return remotes.filter(appHasApi);
102
102
  }
103
103
  function remoteDependencyAlias(remote) {
104
104
  return toCamelCase(remote.domain ?? remote.id.replace(/^remote-/, ''));
@@ -131,4 +131,4 @@ function createCloudflarePublicUrlEnv(app) {
131
131
  function appI18nNamespace(app) {
132
132
  return 'shell' === app.kind ? 'shell' : app.domain ?? app.id;
133
133
  }
134
- export { GENERATED_CONTRACT_PATH, appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, effectApiStem, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalEffectApps, zephyrRemoteDependency };
134
+ export { ULTRAMODERN_CONFIG_PATH, appHasApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, remoteDependencyAlias, resolveApiPrefix, resolveApiStem, resolveRemoteRefs, sharedPackages, shellApp, verticalApiApps, zephyrRemoteDependency };
@@ -1,14 +1,48 @@
1
1
  import "node:module";
2
+ import { spawnSync } from "node:child_process";
2
3
  import node_crypto from "node:crypto";
3
4
  import node_fs from "node:fs";
5
+ import { createRequire } from "node:module";
4
6
  import node_path from "node:path";
5
- import { fileURLToPath } from "node:url";
7
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
8
  import { resolveCreatePackageRoot } from "../create-package-root.js";
7
9
  import { normalizePath } from "./naming.js";
8
10
  const fs_io_dirname = node_path.dirname(fileURLToPath(import.meta.url));
11
+ const fs_io_require = createRequire(import.meta.url);
9
12
  const createPackageRoot = resolveCreatePackageRoot(fs_io_dirname);
10
13
  const workspaceTemplateDir = node_path.join(createPackageRoot, 'template-workspace');
11
14
  const fileTemplatesDir = node_path.join(createPackageRoot, 'templates');
15
+ const preformatConfigDir = '.modern-js';
16
+ const preformatConfigPath = node_path.join(preformatConfigDir, 'ultramodern-preformat.oxfmt.config.mjs');
17
+ const workspaceOxfmtIgnorePatterns = [
18
+ '.agents',
19
+ '.codex/skills',
20
+ '.output',
21
+ '**/*.json',
22
+ 'dist',
23
+ 'node_modules',
24
+ 'repos/**',
25
+ '.modern',
26
+ '.modernjs',
27
+ '**/modern-tanstack/**',
28
+ '**/routeTree.gen.*'
29
+ ];
30
+ const formattableExtensions = new Set([
31
+ '.cjs',
32
+ '.cts',
33
+ '.js',
34
+ '.json',
35
+ '.jsonc',
36
+ '.jsx',
37
+ '.mjs',
38
+ '.mts',
39
+ '.md',
40
+ '.mdx',
41
+ '.ts',
42
+ '.tsx',
43
+ '.yaml',
44
+ '.yml'
45
+ ]);
12
46
  function readFileTemplate(relativePath) {
13
47
  return node_fs.readFileSync(node_path.join(fileTemplatesDir, relativePath), 'utf-8');
14
48
  }
@@ -44,6 +78,86 @@ function writeFileReplacing(targetDir, relativePath, content) {
44
78
  function writeJson(targetDir, relativePath, value) {
45
79
  writeFile(targetDir, relativePath, `${JSON.stringify(value, null, 2)}\n`);
46
80
  }
81
+ function formatGeneratedWorkspaceFiles(targetDir, relativePaths) {
82
+ const oxfmtBin = resolveOxfmtBin();
83
+ const oxfmtConfigPath = writePreformatConfig(targetDir);
84
+ const targets = void 0 === relativePaths ? [
85
+ targetDir,
86
+ `!${normalizePath(node_path.join(targetDir, 'repos'))}/**`
87
+ ] : relativePaths.filter((relativePath)=>formattableExtensions.has(node_path.extname(relativePath))).map((relativePath)=>node_path.join(targetDir, relativePath));
88
+ if (0 === targets.length) return void removePreformatConfig(targetDir);
89
+ try {
90
+ const result = spawnSync(process.execPath, [
91
+ oxfmtBin,
92
+ '--config',
93
+ oxfmtConfigPath,
94
+ '--no-error-on-unmatched-pattern',
95
+ ...targets
96
+ ], {
97
+ cwd: targetDir,
98
+ encoding: 'utf-8',
99
+ env: {
100
+ ...process.env,
101
+ FORCE_COLOR: '0'
102
+ }
103
+ });
104
+ if (0 !== result.status) {
105
+ const detail = [
106
+ result.stderr.trim(),
107
+ result.stdout.trim()
108
+ ].filter(Boolean).join('\n');
109
+ throw new Error([
110
+ 'Failed to format generated UltraModern workspace output.',
111
+ detail
112
+ ].filter(Boolean).join('\n'));
113
+ }
114
+ } finally{
115
+ removePreformatConfig(targetDir);
116
+ }
117
+ }
118
+ function writePreformatConfig(targetDir) {
119
+ const configPath = node_path.join(targetDir, preformatConfigPath);
120
+ node_fs.mkdirSync(node_path.dirname(configPath), {
121
+ recursive: true
122
+ });
123
+ const oxfmtUrl = pathToFileURL(resolveOxfmtEntry()).href;
124
+ const ultraciteConfigUrl = pathToFileURL(resolveUltraciteOxfmtConfig()).href;
125
+ node_fs.writeFileSync(configPath, [
126
+ `import { defineConfig } from ${JSON.stringify(oxfmtUrl)};`,
127
+ `import ultracite from ${JSON.stringify(ultraciteConfigUrl)};`,
128
+ '',
129
+ 'export default defineConfig({',
130
+ ' extends: [ultracite],',
131
+ ' ignorePatterns: [',
132
+ ...workspaceOxfmtIgnorePatterns.map((pattern)=>` ${JSON.stringify(pattern)},`),
133
+ ' ],',
134
+ ' singleQuote: true,',
135
+ '});',
136
+ ''
137
+ ].join('\n'), 'utf-8');
138
+ return configPath;
139
+ }
140
+ function removePreformatConfig(targetDir) {
141
+ node_fs.rmSync(node_path.join(targetDir, preformatConfigPath), {
142
+ force: true
143
+ });
144
+ try {
145
+ node_fs.rmdirSync(node_path.join(targetDir, preformatConfigDir));
146
+ } catch {}
147
+ }
148
+ function resolveOxfmtBin() {
149
+ const packageJsonPath = fs_io_require.resolve('oxfmt/package.json');
150
+ const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, 'utf-8'));
151
+ const binPath = 'string' == typeof packageJson.bin ? packageJson.bin : packageJson.bin?.oxfmt;
152
+ if ('string' != typeof binPath || 0 === binPath.length) throw new Error('Unable to resolve oxfmt binary from package metadata.');
153
+ return node_path.join(node_path.dirname(packageJsonPath), binPath);
154
+ }
155
+ function resolveOxfmtEntry() {
156
+ return fs_io_require.resolve('oxfmt');
157
+ }
158
+ function resolveUltraciteOxfmtConfig() {
159
+ return fs_io_require.resolve('ultracite/oxfmt');
160
+ }
47
161
  function renderTemplate(template, data) {
48
162
  return template.replace(/\{\{(\w+)\}\}/g, (match, key)=>data[key] ?? match);
49
163
  }
@@ -88,4 +202,4 @@ function readJsonFile(filePath) {
88
202
  function writeJsonFile(filePath, value) {
89
203
  node_fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf-8');
90
204
  }
91
- export { assertSafeRelativePath, collectTemplateFiles, copyRootTemplate, createPackageRoot, ensureInsideRoot, fileTemplatesDir, hashFile, hashTemplateTree, readFileTemplate, readJsonFile, renderFileTemplate, renderTemplate, workspaceTemplateDir, writeFile, writeFileReplacing, writeJson, writeJsonFile };
205
+ export { assertSafeRelativePath, collectTemplateFiles, copyRootTemplate, createPackageRoot, ensureInsideRoot, fileTemplatesDir, formatGeneratedWorkspaceFiles, hashFile, hashTemplateTree, readFileTemplate, readJsonFile, renderFileTemplate, renderTemplate, workspaceTemplateDir, writeFile, writeFileReplacing, writeJson, writeJsonFile };
@@ -2,7 +2,7 @@ import "node:module";
2
2
  import node_crypto from "node:crypto";
3
3
  import node_fs from "node:fs";
4
4
  import node_path from "node:path";
5
- import { GENERATED_CONTRACT_PATH, appHasEffectApi } from "./descriptors.js";
5
+ import { ULTRAMODERN_CONFIG_PATH, appHasApi } from "./descriptors.js";
6
6
  import { normalizePath, packageName } from "./naming.js";
7
7
  const ignoredSnapshotDirectories = new Set([
8
8
  '.git',
@@ -68,11 +68,11 @@ function createGenerationResult(options) {
68
68
  app.id,
69
69
  app.moduleFederationName
70
70
  ])),
71
- effectApiPrefixes: Object.fromEntries(createdApps.filter((app)=>app.effectApiPrefix).map((app)=>[
71
+ apiPrefixes: Object.fromEntries(createdApps.filter((app)=>app.apiPrefix).map((app)=>[
72
72
  app.id,
73
- app.effectApiPrefix
73
+ app.apiPrefix
74
74
  ])),
75
- generatedContractPath: GENERATED_CONTRACT_PATH,
75
+ generatedContractPath: ULTRAMODERN_CONFIG_PATH,
76
76
  warnings: options.warnings ?? []
77
77
  };
78
78
  }
@@ -92,8 +92,8 @@ function createGeneratedAppDescriptor(scope, app) {
92
92
  ...app.exposes
93
93
  }
94
94
  } : {},
95
- ...appHasEffectApi(app) ? {
96
- effectApiPrefix: app.effectApi.prefix
95
+ ...appHasApi(app) ? {
96
+ apiPrefix: app.api.prefix
97
97
  } : {}
98
98
  };
99
99
  }
@@ -1,4 +1,5 @@
1
1
  import "node:module";
2
2
  export { addUltramodernVertical, planUltramodernVertical } from "./add-vertical.js";
3
+ export { normalizeUltramodernBridgeConfig } from "./bridge-config.js";
3
4
  export { ultramodernWorkspaceVersions } from "./versions.js";
4
5
  export { generateUltramodernWorkspace } from "./write-workspace.js";