@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.
- package/README.md +49 -23
- package/dist/cjs/index.cjs +37 -4
- package/dist/cjs/locale/en.cjs +12 -2
- package/dist/cjs/locale/zh.cjs +12 -2
- package/dist/cjs/ultramodern-tooling/commands.cjs +431 -0
- package/dist/cjs/ultramodern-tooling/config.cjs +172 -0
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +87 -75
- package/dist/cjs/ultramodern-workspace/{effect-api.cjs → api.cjs} +207 -208
- package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
- package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
- package/dist/cjs/ultramodern-workspace/contracts.cjs +128 -657
- package/dist/cjs/ultramodern-workspace/demo-components.cjs +12 -12
- package/dist/cjs/ultramodern-workspace/descriptors.cjs +25 -25
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
- package/dist/cjs/ultramodern-workspace/generation-result.cjs +5 -5
- package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
- package/dist/cjs/ultramodern-workspace/mf-validation.cjs +571 -0
- package/dist/cjs/ultramodern-workspace/module-federation.cjs +39 -12
- package/dist/cjs/ultramodern-workspace/overlays.cjs +2 -2
- package/dist/cjs/ultramodern-workspace/package-json.cjs +58 -41
- package/dist/cjs/ultramodern-workspace/policy.cjs +4 -4
- package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
- package/dist/cjs/ultramodern-workspace/public-surface.cjs +2 -2
- package/dist/cjs/ultramodern-workspace/versions.cjs +15 -0
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +120 -50
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +64 -21
- package/dist/esm/index.js +37 -4
- package/dist/esm/locale/en.js +12 -2
- package/dist/esm/locale/zh.js +12 -2
- package/dist/esm/ultramodern-tooling/commands.js +378 -0
- package/dist/esm/ultramodern-tooling/config.js +120 -0
- package/dist/esm/ultramodern-workspace/add-vertical.js +88 -79
- package/dist/esm/ultramodern-workspace/{effect-api.js → api.js} +146 -147
- package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
- package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
- package/dist/esm/ultramodern-workspace/contracts.js +130 -611
- package/dist/esm/ultramodern-workspace/demo-components.js +13 -13
- package/dist/esm/ultramodern-workspace/descriptors.js +11 -11
- package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
- package/dist/esm/ultramodern-workspace/generation-result.js +6 -6
- package/dist/esm/ultramodern-workspace/index.js +1 -0
- package/dist/esm/ultramodern-workspace/mf-validation.js +516 -0
- package/dist/esm/ultramodern-workspace/module-federation.js +40 -13
- package/dist/esm/ultramodern-workspace/overlays.js +2 -2
- package/dist/esm/ultramodern-workspace/package-json.js +57 -40
- package/dist/esm/ultramodern-workspace/policy.js +5 -5
- package/dist/esm/ultramodern-workspace/public-api.js +1 -0
- package/dist/esm/ultramodern-workspace/public-surface.js +2 -2
- package/dist/esm/ultramodern-workspace/versions.js +7 -1
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +108 -34
- package/dist/esm/ultramodern-workspace/write-workspace.js +66 -26
- package/dist/esm-node/index.js +37 -4
- package/dist/esm-node/locale/en.js +12 -2
- package/dist/esm-node/locale/zh.js +12 -2
- package/dist/esm-node/ultramodern-tooling/commands.js +379 -0
- package/dist/esm-node/ultramodern-tooling/config.js +121 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +88 -79
- package/dist/esm-node/ultramodern-workspace/{effect-api.js → api.js} +146 -147
- package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
- package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
- package/dist/esm-node/ultramodern-workspace/contracts.js +130 -611
- package/dist/esm-node/ultramodern-workspace/demo-components.js +13 -13
- package/dist/esm-node/ultramodern-workspace/descriptors.js +11 -11
- package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
- package/dist/esm-node/ultramodern-workspace/generation-result.js +6 -6
- package/dist/esm-node/ultramodern-workspace/index.js +1 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation.js +517 -0
- package/dist/esm-node/ultramodern-workspace/module-federation.js +40 -13
- package/dist/esm-node/ultramodern-workspace/overlays.js +2 -2
- package/dist/esm-node/ultramodern-workspace/package-json.js +57 -40
- package/dist/esm-node/ultramodern-workspace/policy.js +5 -5
- package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
- package/dist/esm-node/ultramodern-workspace/public-surface.js +2 -2
- package/dist/esm-node/ultramodern-workspace/versions.js +7 -1
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +108 -34
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +66 -26
- package/dist/types/locale/en.d.ts +10 -0
- package/dist/types/locale/index.d.ts +20 -0
- package/dist/types/locale/zh.d.ts +10 -0
- package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
- package/dist/types/ultramodern-tooling/config.d.ts +43 -0
- package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
- package/dist/types/ultramodern-workspace/api.d.ts +73 -0
- package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
- package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
- package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
- package/dist/types/ultramodern-workspace/descriptors.d.ts +10 -10
- package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
- package/dist/types/ultramodern-workspace/index.d.ts +2 -0
- package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
- package/dist/types/ultramodern-workspace/package-json.d.ts +5 -4
- package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
- package/dist/types/ultramodern-workspace/types.d.ts +9 -7
- package/dist/types/ultramodern-workspace/versions.d.ts +6 -0
- package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +2 -7
- package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
- package/package.json +5 -3
- package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
- package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +2 -0
- package/template-workspace/.gitignore.handlebars +3 -0
- package/template-workspace/AGENTS.md.handlebars +11 -5
- package/template-workspace/README.md.handlebars +55 -13
- package/template-workspace/oxfmt.config.ts +1 -0
- package/template-workspace/oxlint.config.ts +1 -0
- package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +51 -0
- package/template-workspace/pnpm-workspace.yaml.handlebars +7 -0
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +77 -67
- package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +51 -8
- package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +366 -0
- package/templates/workspace-scripts/{check-ultramodern-i18n-boundaries.mjs → check-ultramodern-i18n-boundaries.mts} +1 -1
- package/templates/workspace-scripts/generate-public-surface-assets.mjs +246 -9
- package/templates/workspace-scripts/proof-cloudflare-version.mjs +277 -9
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +35 -10
- package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +165 -2
- package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
- package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +842 -84
- package/dist/types/ultramodern-workspace/effect-api.d.ts +0 -73
- /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rstest-best-practices/SKILL.md +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import {
|
|
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
|
|
214
|
-
const
|
|
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
|
-
${
|
|
219
|
+
${listApiItems},
|
|
220
220
|
runEffectRequest,
|
|
221
|
-
} from '../../
|
|
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
|
|
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
|
-
${
|
|
230
|
+
${listApiItems}({ limit: 1 }).pipe(
|
|
231
231
|
Effect.match({
|
|
232
232
|
onFailure: () => {
|
|
233
233
|
if (cancelled) {
|
|
234
234
|
return;
|
|
235
235
|
}
|
|
236
|
-
|
|
236
|
+
setApiStatus('unavailable');
|
|
237
237
|
},
|
|
238
238
|
onSuccess: data => {
|
|
239
239
|
if (cancelled) {
|
|
240
240
|
return;
|
|
241
241
|
}
|
|
242
|
-
|
|
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
|
|
254
|
+
const apiMarkup = appHasApi(app) ? ` <p data-testid="api-status">{apiStatus}</p>
|
|
255
255
|
` : '';
|
|
256
|
-
return `${
|
|
256
|
+
return `${apiImport}
|
|
257
257
|
export default function ${toPascalCase(app.id)}Home() {
|
|
258
258
|
const { language, supportedLanguages, t } = useModernI18n();
|
|
259
|
-
${
|
|
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
|
-
${
|
|
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
|
|
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
|
-
|
|
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
|
|
92
|
-
return void 0 !== app.
|
|
91
|
+
function appHasApi(app) {
|
|
92
|
+
return void 0 !== app.api;
|
|
93
93
|
}
|
|
94
|
-
function
|
|
95
|
-
return target.
|
|
94
|
+
function resolveApiPrefix(target) {
|
|
95
|
+
return target.api?.prefix ?? `/${toKebabCase(target.id)}-api`;
|
|
96
96
|
}
|
|
97
|
-
function
|
|
98
|
-
return target.
|
|
97
|
+
function resolveApiStem(target) {
|
|
98
|
+
return target.api?.stem ?? toKebabCase(target.id).replace(/-api$/, '');
|
|
99
99
|
}
|
|
100
|
-
function
|
|
101
|
-
return remotes.filter(
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
71
|
+
apiPrefixes: Object.fromEntries(createdApps.filter((app)=>app.apiPrefix).map((app)=>[
|
|
72
72
|
app.id,
|
|
73
|
-
app.
|
|
73
|
+
app.apiPrefix
|
|
74
74
|
])),
|
|
75
|
-
generatedContractPath:
|
|
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
|
-
...
|
|
96
|
-
|
|
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";
|