@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.
- package/README.md +25 -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 +185 -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 +127 -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 +33 -18
- package/dist/cjs/ultramodern-workspace/overlays.cjs +2 -2
- package/dist/cjs/ultramodern-workspace/package-json.cjs +57 -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 +5 -0
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +119 -50
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +62 -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 +132 -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 +129 -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 +34 -19
- package/dist/esm/ultramodern-workspace/overlays.js +2 -2
- package/dist/esm/ultramodern-workspace/package-json.js +56 -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 +3 -1
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +107 -34
- package/dist/esm/ultramodern-workspace/write-workspace.js +64 -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 +133 -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 +129 -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 +34 -19
- package/dist/esm-node/ultramodern-workspace/overlays.js +2 -2
- package/dist/esm-node/ultramodern-workspace/package-json.js +56 -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 +3 -1
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +107 -34
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +64 -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 +2 -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 +15 -12
- 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 +4 -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 +344 -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 +840 -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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
|
213
|
-
const
|
|
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
|
-
${
|
|
218
|
+
${listApiItems},
|
|
219
219
|
runEffectRequest,
|
|
220
|
-
} from '../../
|
|
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
|
|
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
|
-
${
|
|
229
|
+
${listApiItems}({ limit: 1 }).pipe(
|
|
230
230
|
Effect.match({
|
|
231
231
|
onFailure: () => {
|
|
232
232
|
if (cancelled) {
|
|
233
233
|
return;
|
|
234
234
|
}
|
|
235
|
-
|
|
235
|
+
setApiStatus('unavailable');
|
|
236
236
|
},
|
|
237
237
|
onSuccess: data => {
|
|
238
238
|
if (cancelled) {
|
|
239
239
|
return;
|
|
240
240
|
}
|
|
241
|
-
|
|
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
|
|
253
|
+
const apiMarkup = appHasApi(app) ? ` <p data-testid="api-status">{apiStatus}</p>
|
|
254
254
|
` : '';
|
|
255
|
-
return `${
|
|
255
|
+
return `${apiImport}
|
|
256
256
|
export default function ${toPascalCase(app.id)}Home() {
|
|
257
257
|
const { language, supportedLanguages, t } = useModernI18n();
|
|
258
|
-
${
|
|
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
|
-
${
|
|
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
|
|
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
|
-
|
|
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
|
|
91
|
-
return void 0 !== app.
|
|
90
|
+
function appHasApi(app) {
|
|
91
|
+
return void 0 !== app.api;
|
|
92
92
|
}
|
|
93
|
-
function
|
|
94
|
-
return target.
|
|
93
|
+
function resolveApiPrefix(target) {
|
|
94
|
+
return target.api?.prefix ?? `/${toKebabCase(target.id)}-api`;
|
|
95
95
|
}
|
|
96
|
-
function
|
|
97
|
-
return target.
|
|
96
|
+
function resolveApiStem(target) {
|
|
97
|
+
return target.api?.stem ?? toKebabCase(target.id).replace(/-api$/, '');
|
|
98
98
|
}
|
|
99
|
-
function
|
|
100
|
-
return remotes.filter(
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
70
|
+
apiPrefixes: Object.fromEntries(createdApps.filter((app)=>app.apiPrefix).map((app)=>[
|
|
71
71
|
app.id,
|
|
72
|
-
app.
|
|
72
|
+
app.apiPrefix
|
|
73
73
|
])),
|
|
74
|
-
generatedContractPath:
|
|
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
|
-
...
|
|
95
|
-
|
|
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";
|