@bleedingdev/modern-js-ultramodern-create 3.9.0-ultramodern.2 → 3.9.0-ultramodern.4
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/dist/cjs/ultramodern-package-source.cjs +2 -1
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +5 -2
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +5 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +1 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +30 -9
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +9 -13
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +30 -7
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/shared-api-infrastructure.cjs +99 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.cjs +14 -5
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/workspace-artifact-ownership.cjs +215 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +72 -8
- package/dist/cjs/ultramodern-workspace/api/client.cjs +2 -2
- package/dist/cjs/ultramodern-workspace/api/service.cjs +45 -16
- package/dist/cjs/ultramodern-workspace/api/shared.cjs +26 -16
- package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +6 -2
- package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +18 -51
- package/dist/cjs/ultramodern-workspace/package-json.cjs +13 -1
- package/dist/cjs/ultramodern-workspace/policy.cjs +1 -0
- package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +3 -0
- package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +1 -1
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +5 -0
- package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +2 -1
- package/dist/cjs/ultramodern-workspace/write-app.cjs +10 -4
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +5 -3
- package/dist/esm/ultramodern-package-source.js +2 -1
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +5 -2
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +5 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +1 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +30 -9
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +9 -13
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +30 -7
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/shared-api-infrastructure.js +50 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +14 -5
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/workspace-artifact-ownership.js +166 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +73 -9
- package/dist/esm/ultramodern-workspace/api/client.js +2 -2
- package/dist/esm/ultramodern-workspace/api/service.js +45 -16
- package/dist/esm/ultramodern-workspace/api/shared.js +27 -17
- package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +6 -2
- package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +18 -51
- package/dist/esm/ultramodern-workspace/package-json.js +13 -1
- package/dist/esm/ultramodern-workspace/policy.js +1 -0
- package/dist/esm/ultramodern-workspace/tsconfigs.js +3 -0
- package/dist/esm/ultramodern-workspace/workspace-script-plan.js +1 -1
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +5 -0
- package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +2 -1
- package/dist/esm/ultramodern-workspace/write-app.js +10 -4
- package/dist/esm/ultramodern-workspace/write-workspace.js +6 -4
- package/dist/esm-node/ultramodern-package-source.js +2 -1
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +5 -2
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +5 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +1 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +30 -9
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +9 -13
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +30 -7
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/shared-api-infrastructure.js +51 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +14 -5
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/workspace-artifact-ownership.js +167 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +73 -9
- package/dist/esm-node/ultramodern-workspace/api/client.js +2 -2
- package/dist/esm-node/ultramodern-workspace/api/service.js +45 -16
- package/dist/esm-node/ultramodern-workspace/api/shared.js +27 -17
- package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +6 -2
- package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +18 -51
- package/dist/esm-node/ultramodern-workspace/package-json.js +13 -1
- package/dist/esm-node/ultramodern-workspace/policy.js +1 -0
- package/dist/esm-node/ultramodern-workspace/tsconfigs.js +3 -0
- package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +1 -1
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +5 -0
- package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +2 -1
- package/dist/esm-node/ultramodern-workspace/write-app.js +10 -4
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +6 -4
- package/dist/types/ultramodern-package-source.d.ts +1 -1
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +3 -1
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +7 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/shared-api-infrastructure.d.ts +4 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/workspace-artifact-ownership.d.ts +27 -0
- package/dist/types/ultramodern-workspace/api/client.d.ts +3 -1
- package/dist/types/ultramodern-workspace/api/service.d.ts +3 -1
- package/dist/types/ultramodern-workspace/api/shared.d.ts +2 -0
- package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +2 -2
- package/dist/types/ultramodern-workspace/package-json.d.ts +1 -1
- package/dist/types/ultramodern-workspace/policy.d.ts +2 -0
- package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +1 -1
- package/package.json +5 -4
- package/template-workspace/.modernjs/release-cohort.json +40 -40
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +4 -4
- package/templates/packages/effect-bff-runtime.ts +50 -0
- package/templates/packages/microvertical-api-baseline.ts +102 -0
- package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +49 -28
- package/templates/workspace-scripts/microvertical-api-baseline-boundary.mts +944 -0
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +25 -7
- package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +1 -1
|
@@ -53,7 +53,8 @@ const ULTRAMODERN_WORKSPACE_MODERN_PACKAGES = [
|
|
|
53
53
|
'@modern-js/plugin-bff',
|
|
54
54
|
'@modern-js/plugin-i18n',
|
|
55
55
|
'@modern-js/plugin-tanstack',
|
|
56
|
-
'@modern-js/runtime'
|
|
56
|
+
'@modern-js/runtime',
|
|
57
|
+
'@modern-js/runtime-extensions'
|
|
57
58
|
];
|
|
58
59
|
function modernPackageVersion(packageSource) {
|
|
59
60
|
return 'install' === packageSource.strategy ? packageSource.modernPackageVersion : WORKSPACE_PACKAGE_VERSION;
|
|
@@ -45,6 +45,7 @@ const external_node_fs_namespaceObject = require("node:fs");
|
|
|
45
45
|
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
46
46
|
const external_node_path_namespaceObject = require("node:path");
|
|
47
47
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
48
|
+
const descriptors_cjs_namespaceObject = require("../../../ultramodern-workspace/descriptors.cjs");
|
|
48
49
|
const module_federation_cjs_namespaceObject = require("../../../ultramodern-workspace/module-federation.cjs");
|
|
49
50
|
const external_config_cjs_namespaceObject = require("../../config.cjs");
|
|
50
51
|
const legacyApiMarkerPattern = /export const ultramodernApiMarker\s*=\s*\{[\s\S]*?\}\s+as const;\n?/u;
|
|
@@ -84,8 +85,10 @@ function updateGeneratedBuildIdentityModules(io, config) {
|
|
|
84
85
|
for (const app of (0, external_config_cjs_namespaceObject.allWorkspaceAppsFromToolingConfig)(config)){
|
|
85
86
|
const sharedApiPath = external_node_path_default().join(io.workspaceRoot, app.directory, 'shared/api.ts');
|
|
86
87
|
if (app.api && external_node_fs_default().existsSync(sharedApiPath)) io.write(sharedApiPath, rewriteApiMarkerIdentitySchema(rewriteLegacyApiMarkerBinding(external_node_fs_default().readFileSync(sharedApiPath, 'utf-8'))));
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
const reexportPath = external_node_path_default().join(io.workspaceRoot, app.directory, 'src/ultramodern-build.ts');
|
|
89
|
+
const includeUiMarker = (0, descriptors_cjs_namespaceObject.appEmitsBrowserUi)(app) && ('shell' !== app.kind || external_node_fs_default().existsSync(reexportPath));
|
|
90
|
+
if (external_node_fs_default().existsSync(reexportPath)) io.writeGenerated(reexportPath, (0, module_federation_cjs_namespaceObject.createUltramodernBuildReexportModule)(app, includeUiMarker));
|
|
91
|
+
io.writeGenerated(external_node_path_default().join(io.workspaceRoot, app.directory, 'shared/ultramodern-build.ts'), (0, module_federation_cjs_namespaceObject.createUltramodernBuildModule)(config.workspace.packageScope, app, includeUiMarker));
|
|
89
92
|
io.write(external_node_path_default().join(io.workspaceRoot, app.directory, 'shared/ultramodern-build.json'), (0, module_federation_cjs_namespaceObject.createUltramodernBuildArtifactJson)(config.workspace.packageScope, app));
|
|
90
93
|
}
|
|
91
94
|
}
|
|
@@ -160,6 +160,7 @@ function updateGeneratedModernConfigs(io, config) {
|
|
|
160
160
|
generatedModuleFederationConfig,
|
|
161
161
|
createGeneratedModuleFederationConfig(!enableBridgeRouter)
|
|
162
162
|
];
|
|
163
|
+
const ownsUiComposition = !external_node_fs_default().existsSync(moduleFederationConfigPath) || recognizedModuleFederationConfigs.includes(external_node_fs_default().readFileSync(moduleFederationConfigPath, 'utf8'));
|
|
163
164
|
if ((0, descriptors_cjs_namespaceObject.appEmitsBrowserUi)(app)) writeOwnedTypeScriptConfig(io, moduleFederationConfigPath, generatedModuleFederationConfig, recognizedModuleFederationConfigs);
|
|
164
165
|
else removeOwnedTypeScriptConfig(io, moduleFederationConfigPath, recognizedModuleFederationConfigs);
|
|
165
166
|
const backendFederationConfigPath = external_node_path_default().join(io.workspaceRoot, app.directory, 'backend-federation.config.ts');
|
|
@@ -170,6 +171,10 @@ function updateGeneratedModernConfigs(io, config) {
|
|
|
170
171
|
else removeOwnedTypeScriptConfig(io, backendFederationConfigPath, [
|
|
171
172
|
generatedBackendFederationConfig
|
|
172
173
|
]);
|
|
174
|
+
if (!ownsUiComposition) {
|
|
175
|
+
io.log(`${app.directory} preserves its consumer-owned federation composition instead of regenerating routes from unproven metadata.`);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
173
178
|
if ('shell' === app.kind) {
|
|
174
179
|
const shellUiRemotes = (0, descriptors_cjs_namespaceObject.resolveRemoteRefs)(app, remotes).filter(descriptors_cjs_namespaceObject.appEmitsBrowserUi);
|
|
175
180
|
const componentsPath = external_node_path_default().join(io.workspaceRoot, app.directory, 'src/routes/vertical-components.tsx');
|
|
@@ -113,6 +113,7 @@ function mergeTypeScriptConfig(generated, existing) {
|
|
|
113
113
|
...existingCompilerOptions,
|
|
114
114
|
...generatedCompilerOptions
|
|
115
115
|
};
|
|
116
|
+
if (Array.isArray(generatedCompilerOptions.types)) compilerOptions.types = mergeUniqueJsonValues(generatedCompilerOptions.types, existingCompilerOptions.types);
|
|
116
117
|
if (Array.isArray(generatedCompilerOptions.plugins) || Array.isArray(existingCompilerOptions.plugins)) compilerOptions.plugins = mergeTypeScriptPlugins(generatedCompilerOptions.plugins, existingCompilerOptions.plugins);
|
|
117
118
|
const merged = {
|
|
118
119
|
...existingConfig,
|
|
@@ -59,13 +59,20 @@ function updateDeclaredDependencies(packageJson, pins) {
|
|
|
59
59
|
}
|
|
60
60
|
return changed;
|
|
61
61
|
}
|
|
62
|
-
function updateModernDependencies(packageJson, packageSource) {
|
|
62
|
+
function updateModernDependencies(packageJson, packageSource, releaseCohort) {
|
|
63
63
|
let changed = false;
|
|
64
64
|
for (const section of [
|
|
65
65
|
'dependencies',
|
|
66
66
|
'devDependencies'
|
|
67
67
|
]){
|
|
68
68
|
const dependencies = packageJson[section];
|
|
69
|
+
if (dependencies && Object.hasOwn(dependencies, '@modern-js/runtime')) {
|
|
70
|
+
const runtimeExtensions = (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)('@modern-js/runtime-extensions', packageSource);
|
|
71
|
+
if (dependencies['@modern-js/runtime-extensions'] !== runtimeExtensions) {
|
|
72
|
+
dependencies['@modern-js/runtime-extensions'] = runtimeExtensions;
|
|
73
|
+
changed = true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
69
76
|
if (dependencies && Object.hasOwn(dependencies, '@modern-js/create')) {
|
|
70
77
|
dependencies[external_ultramodern_package_source_cjs_namespaceObject.ULTRAMODERN_CREATE_PACKAGE] = (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)(external_ultramodern_package_source_cjs_namespaceObject.ULTRAMODERN_CREATE_PACKAGE, packageSource);
|
|
71
78
|
delete dependencies['@modern-js/create'];
|
|
@@ -73,11 +80,23 @@ function updateModernDependencies(packageJson, packageSource) {
|
|
|
73
80
|
}
|
|
74
81
|
}
|
|
75
82
|
return updateDeclaredDependencies(packageJson, new Map([
|
|
76
|
-
...
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
...[
|
|
84
|
+
...modernPackageNames
|
|
85
|
+
].map((packageName)=>[
|
|
86
|
+
packageName,
|
|
87
|
+
(0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)(packageName, packageSource)
|
|
88
|
+
]),
|
|
89
|
+
...(releaseCohort?.packages ?? []).flatMap((item)=>[
|
|
90
|
+
[
|
|
91
|
+
item.sourceName,
|
|
92
|
+
(0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)(item.sourceName, packageSource)
|
|
93
|
+
],
|
|
94
|
+
[
|
|
95
|
+
item.targetName,
|
|
96
|
+
item.version
|
|
97
|
+
]
|
|
98
|
+
])
|
|
99
|
+
])) || changed;
|
|
81
100
|
}
|
|
82
101
|
const generatedToolingDependencyPins = new Map(Object.entries({
|
|
83
102
|
...policy_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.appDependencies,
|
|
@@ -170,6 +189,8 @@ function mergeGeneratedScript(consumer, framework, canRetireLegacyOxfmtCliExclus
|
|
|
170
189
|
const frameworkSegmentSet = new Set(frameworkSegments);
|
|
171
190
|
const canonicalFrameworkSegment = (segment)=>{
|
|
172
191
|
if (frameworkSegmentSet.has(segment)) return segment;
|
|
192
|
+
const referenceBuild = segment.replace('--project tsconfig.json', '--build tsconfig.json');
|
|
193
|
+
if (frameworkSegmentSet.has(referenceBuild)) return referenceBuild;
|
|
173
194
|
const portableEnvironmentSegment = `cross-env ${segment}`;
|
|
174
195
|
if (frameworkSegmentSet.has(portableEnvironmentSegment)) return portableEnvironmentSegment;
|
|
175
196
|
const portableOxfmtSegment = segment.replace(/ '!repos\/\*\*'$/u, '');
|
|
@@ -222,12 +243,12 @@ function mergeGeneratedScript(consumer, framework, canRetireLegacyOxfmtCliExclus
|
|
|
222
243
|
preservedConsumerSegments: consumerExtras.length > 0
|
|
223
244
|
};
|
|
224
245
|
}
|
|
225
|
-
function rewriteMigratedScriptReferences(scripts) {
|
|
246
|
+
function rewriteMigratedScriptReferences(scripts, preservedArtifacts) {
|
|
226
247
|
let changed = false;
|
|
227
248
|
const pattern = new RegExp(`(scripts/(?:${workspace_scripts_cjs_namespaceObject.migratedWorkspaceScriptBasenames.join('|')}))\\.mjs`, 'gu');
|
|
228
249
|
for (const [name, value] of Object.entries(scripts)){
|
|
229
250
|
if ('string' != typeof value) continue;
|
|
230
|
-
const next = value.replace(pattern,
|
|
251
|
+
const next = value.replace(pattern, (original, basename)=>preservedArtifacts?.has(`${basename}.mjs`) ? original : `${basename}.mts`);
|
|
231
252
|
if (next !== value) {
|
|
232
253
|
scripts[name] = next;
|
|
233
254
|
changed = true;
|
|
@@ -242,7 +263,7 @@ function updateGeneratedPackageScripts(packageJson, options = {}) {
|
|
|
242
263
|
const apps = options.apps ?? [];
|
|
243
264
|
const app = apps.find((candidate)=>`${candidate.directory}/package.json` === options.relativePackageFile);
|
|
244
265
|
const isRootPackage = 'package.json' === options.relativePackageFile;
|
|
245
|
-
if (rewriteMigratedScriptReferences(scripts)) changed = true;
|
|
266
|
+
if (rewriteMigratedScriptReferences(scripts, options.preservedArtifacts)) changed = true;
|
|
246
267
|
if (isRootPackage) {
|
|
247
268
|
for (const [name, [legacy, portable]] of legacyPortableRootScripts)if (true === options.canRetireLegacyOxfmtCliExclusion && scripts[name] === legacy) {
|
|
248
269
|
scripts[name] = portable;
|
|
@@ -244,11 +244,7 @@ function reconcilePatchedDependencies(document, includeDrizzleOrmPatch) {
|
|
|
244
244
|
patchKey(patch),
|
|
245
245
|
patch
|
|
246
246
|
]));
|
|
247
|
-
const ownedPackageNames = new Set(
|
|
248
|
-
...policy.required,
|
|
249
|
-
...policy.conditional,
|
|
250
|
-
...policy.stale
|
|
251
|
-
].map((patch)=>patch.packageName));
|
|
247
|
+
const ownedPackageNames = new Set(expectedPatches.map((patch)=>patch.packageName));
|
|
252
248
|
const patchedDependencies = ensureMap(document, 'patchedDependencies');
|
|
253
249
|
for (const [selector, patchPath] of Object.entries(patchedDependencies)){
|
|
254
250
|
const stalePatch = stale.get(selector);
|
|
@@ -257,15 +253,13 @@ function reconcilePatchedDependencies(document, includeDrizzleOrmPatch) {
|
|
|
257
253
|
delete patchedDependencies[selector];
|
|
258
254
|
continue;
|
|
259
255
|
}
|
|
260
|
-
const
|
|
261
|
-
if (
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
delete patchedDependencies[selector];
|
|
265
|
-
continue;
|
|
266
|
-
}
|
|
267
|
-
throw new Error(`Framework-owned patch selector ${selector} has unknown provenance.`);
|
|
256
|
+
const conditionalPatch = policy.conditional.find((patch)=>patchKey(patch) === selector);
|
|
257
|
+
if (conditionalPatch && !includeDrizzleOrmPatch && patchPath === conditionalPatch.path) {
|
|
258
|
+
delete patchedDependencies[selector];
|
|
259
|
+
continue;
|
|
268
260
|
}
|
|
261
|
+
const parts = packageVersionParts(selector);
|
|
262
|
+
if (parts && ownedPackageNames.has(parts.packageName) && !expected.has(selector)) throw new Error(`Framework-owned patch selector ${selector} has unknown provenance.`);
|
|
269
263
|
}
|
|
270
264
|
for (const [selector, patchPath] of expected)patchedDependencies[selector] = patchPath;
|
|
271
265
|
}
|
|
@@ -556,6 +550,8 @@ async function validateGeneratedPnpmLockReleaseAgePolicy(workspaceRoot, packageS
|
|
|
556
550
|
const firstPartyTargetNames = new Set(releaseCohort?.packages.map((item)=>item.targetName) ?? []);
|
|
557
551
|
const { document: lockfile } = (0, external_pnpm_yaml_cjs_namespaceObject.parsePnpmWorkspaceYaml)(external_node_fs_default().readFileSync(lockfilePath, 'utf-8'), lockfilePath);
|
|
558
552
|
const closure = (0, external_pnpm_yaml_cjs_namespaceObject.discoverReachablePnpmLockReleaseAgeClosure)(lockfile);
|
|
553
|
+
const firstPartySourceNames = new Set(releaseCohort?.packages.map((item)=>item.sourceName) ?? []);
|
|
554
|
+
for (const tarball of closure.tarballs)if (firstPartyTargetNames.has(tarball.packageName) || firstPartySourceNames.has(tarball.packageName)) throw new Error(`First-party lock candidate ${tarball.packageName} must resolve through the authenticated release cohort, not a tarball URL.`);
|
|
559
555
|
if (closure.unresolved.length > 0) {
|
|
560
556
|
const unresolved = closure.unresolved.slice(0, 20).map((candidate)=>{
|
|
561
557
|
const packageName = candidate.package ?? 'unknown package';
|
|
@@ -44,6 +44,11 @@ const integrityPattern = /^sha512-[A-Za-z0-9+/]+={0,2}$/u;
|
|
|
44
44
|
function isExactSemver(version) {
|
|
45
45
|
return utils_namespaceObject.semver.valid(version) === version;
|
|
46
46
|
}
|
|
47
|
+
function isHttpsTarballLocator(value) {
|
|
48
|
+
if (!value.startsWith('https://') || /[\s()]/u.test(value) || !URL.canParse(value)) return false;
|
|
49
|
+
const url = new URL(value);
|
|
50
|
+
return url.href === value && '' === url.username && '' === url.password && '' === url.hash;
|
|
51
|
+
}
|
|
47
52
|
function isYamlRecord(value) {
|
|
48
53
|
return Boolean(value) && 'object' == typeof value && !Array.isArray(value);
|
|
49
54
|
}
|
|
@@ -97,7 +102,7 @@ function splitPeerContext(locator) {
|
|
|
97
102
|
for (const segment of segments){
|
|
98
103
|
if (/^patch_hash=[a-f0-9]{32,128}$/u.test(segment) || /^[a-f0-9]{32,128}$/u.test(segment)) continue;
|
|
99
104
|
const peer = parsePackageKey(segment);
|
|
100
|
-
if (!peer) return {
|
|
105
|
+
if (!peer || isHttpsTarballLocator(peer.version)) return {
|
|
101
106
|
unresolved: locator
|
|
102
107
|
};
|
|
103
108
|
peers.push(peer);
|
|
@@ -109,11 +114,12 @@ function splitPeerContext(locator) {
|
|
|
109
114
|
}
|
|
110
115
|
function parsePackageLocator(rawLocator) {
|
|
111
116
|
const locator = rawLocator.replace(/^\//u, '');
|
|
112
|
-
const
|
|
117
|
+
const tarballSeparator = locator.indexOf('@https://');
|
|
118
|
+
const separator = tarballSeparator > 0 ? tarballSeparator : locator.lastIndexOf('@');
|
|
113
119
|
if (separator <= 0) return;
|
|
114
120
|
const packageName = locator.slice(0, separator);
|
|
115
121
|
const version = locator.slice(separator + 1);
|
|
116
|
-
if (!exactPackageNamePattern.test(packageName) || !isExactSemver(version)) return;
|
|
122
|
+
if (!exactPackageNamePattern.test(packageName) || !isExactSemver(version) && !isHttpsTarballLocator(version)) return;
|
|
117
123
|
return {
|
|
118
124
|
packageName,
|
|
119
125
|
version,
|
|
@@ -157,6 +163,11 @@ function dependencyIdentity(dependencyName, rawValue) {
|
|
|
157
163
|
const peerContext = splitPeerContext(value.startsWith('npm:') ? value.slice(4) : value);
|
|
158
164
|
if ('unresolved' in peerContext) return peerContext;
|
|
159
165
|
const { base, peers } = peerContext;
|
|
166
|
+
if (isHttpsTarballLocator(base) && exactPackageNamePattern.test(dependencyName)) return {
|
|
167
|
+
packageName: dependencyName,
|
|
168
|
+
version: base,
|
|
169
|
+
peers
|
|
170
|
+
};
|
|
160
171
|
const full = parsePackageLocator(base);
|
|
161
172
|
if (full) return {
|
|
162
173
|
...full,
|
|
@@ -299,13 +310,11 @@ function discoverReachablePnpmLockReleaseAgeClosure(lockfile) {
|
|
|
299
310
|
const currentPath = shortestIdentityPaths.get(key);
|
|
300
311
|
if (!currentPath || nodePath.length < currentPath.length) shortestIdentityPaths.set(key, nodePath);
|
|
301
312
|
}
|
|
313
|
+
const tarballs = [];
|
|
302
314
|
const candidates = [
|
|
303
315
|
...shortestIdentityPaths.entries()
|
|
304
316
|
].map(([key, path])=>{
|
|
305
|
-
const
|
|
306
|
-
key.slice(0, key.lastIndexOf('@')),
|
|
307
|
-
key.slice(key.lastIndexOf('@') + 1)
|
|
308
|
-
];
|
|
317
|
+
const { packageName, version } = nodes.get(nodeIdsByIdentity.get(key)[0]).identity;
|
|
309
318
|
const packageRecordsForIdentity = packageRecordsByIdentity.get(key);
|
|
310
319
|
if (!packageRecordsForIdentity?.length) return void recordUnresolved({
|
|
311
320
|
packageName,
|
|
@@ -313,12 +322,25 @@ function discoverReachablePnpmLockReleaseAgeClosure(lockfile) {
|
|
|
313
322
|
peers: []
|
|
314
323
|
}, path, 'missing exact SHA-512 lock integrity');
|
|
315
324
|
let integrity;
|
|
325
|
+
let tarballVersion;
|
|
316
326
|
for (const [packageKey, packageRecord] of packageRecordsForIdentity){
|
|
317
327
|
const resolution = requiredYamlRecord(requiredYamlRecord(packageRecord, `pnpm lockfile package ${packageKey}`).resolution, `pnpm lockfile package ${packageKey} resolution`);
|
|
318
328
|
if ('string' != typeof resolution.integrity || !integrityPattern.test(resolution.integrity)) throw new Error(`pnpm lockfile package ${packageKey} has uncertain registry integrity.`);
|
|
319
329
|
if (integrity && integrity !== resolution.integrity) throw new Error(`pnpm lockfile has conflicting registry integrity for ${key}.`);
|
|
320
330
|
integrity = resolution.integrity;
|
|
331
|
+
if (isHttpsTarballLocator(version)) {
|
|
332
|
+
const metadata = requiredYamlRecord(packageRecord, `pnpm lockfile package ${packageKey}`);
|
|
333
|
+
if (resolution.tarball !== version || 'string' != typeof metadata.version || !isExactSemver(metadata.version) || void 0 !== tarballVersion && tarballVersion !== metadata.version) throw new Error(`pnpm lockfile package ${packageKey} has uncertain tarball identity.`);
|
|
334
|
+
tarballVersion = metadata.version;
|
|
335
|
+
}
|
|
321
336
|
}
|
|
337
|
+
if (void 0 !== tarballVersion) return void tarballs.push({
|
|
338
|
+
packageName,
|
|
339
|
+
version: tarballVersion,
|
|
340
|
+
url: version,
|
|
341
|
+
integrity: integrity,
|
|
342
|
+
path
|
|
343
|
+
});
|
|
322
344
|
return {
|
|
323
345
|
packageName,
|
|
324
346
|
version,
|
|
@@ -333,6 +355,7 @@ function discoverReachablePnpmLockReleaseAgeClosure(lockfile) {
|
|
|
333
355
|
unresolved.sort((left, right)=>JSON.stringify(left).localeCompare(JSON.stringify(right)));
|
|
334
356
|
return {
|
|
335
357
|
candidates,
|
|
358
|
+
tarballs,
|
|
336
359
|
unresolved
|
|
337
360
|
};
|
|
338
361
|
}
|
package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/shared-api-infrastructure.cjs
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.n = (module)=>{
|
|
5
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
6
|
+
__webpack_require__.d(getter, {
|
|
7
|
+
a: getter
|
|
8
|
+
});
|
|
9
|
+
return getter;
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
(()=>{
|
|
13
|
+
__webpack_require__.d = (exports1, getters, values)=>{
|
|
14
|
+
var define = (defs, kind)=>{
|
|
15
|
+
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
[kind]: defs[key]
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
define(getters, "get");
|
|
21
|
+
define(values, "value");
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
(()=>{
|
|
25
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
26
|
+
})();
|
|
27
|
+
(()=>{
|
|
28
|
+
__webpack_require__.r = (exports1)=>{
|
|
29
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
30
|
+
value: 'Module'
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
33
|
+
value: true
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
var __webpack_exports__ = {};
|
|
38
|
+
__webpack_require__.r(__webpack_exports__);
|
|
39
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
40
|
+
ensureSharedApiInfrastructure: ()=>ensureSharedApiInfrastructure
|
|
41
|
+
});
|
|
42
|
+
const external_node_fs_namespaceObject = require("node:fs");
|
|
43
|
+
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
44
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
45
|
+
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
46
|
+
const fs_io_cjs_namespaceObject = require("../../../ultramodern-workspace/fs-io.cjs");
|
|
47
|
+
const package_json_cjs_namespaceObject = require("../../../ultramodern-workspace/package-json.cjs");
|
|
48
|
+
const external_io_cjs_namespaceObject = require("./io.cjs");
|
|
49
|
+
const directory = 'packages/shared-contracts';
|
|
50
|
+
function record(value, label) {
|
|
51
|
+
if (null === value || 'object' != typeof value || Array.isArray(value)) throw new Error(`${label} must be an object; resolve it before migration.`);
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function ensureSharedApiInfrastructure(io, scope, packageSource) {
|
|
55
|
+
for (const relativePath of [
|
|
56
|
+
'packages',
|
|
57
|
+
directory,
|
|
58
|
+
`${directory}/package.json`,
|
|
59
|
+
`${directory}/src`,
|
|
60
|
+
`${directory}/src/index.ts`
|
|
61
|
+
])if (external_node_fs_default().lstatSync(external_node_path_default().join(io.workspaceRoot, relativePath), {
|
|
62
|
+
throwIfNoEntry: false
|
|
63
|
+
})?.isSymbolicLink()) throw new Error(`Shared API migration cannot write through a symbolic link: ${relativePath}`);
|
|
64
|
+
const manifestPath = external_node_path_default().join(io.workspaceRoot, directory, 'package.json');
|
|
65
|
+
const defaults = (0, package_json_cjs_namespaceObject.createSharedPackage)(scope, 'shared-contracts', 'Shared workspace contracts', packageSource);
|
|
66
|
+
const manifest = external_node_fs_default().existsSync(manifestPath) ? record((0, external_io_cjs_namespaceObject.readJsonFile)(manifestPath), `${directory}/package.json`) : defaults;
|
|
67
|
+
const exports1 = void 0 === manifest.exports ? {} : 'string' == typeof manifest.exports ? {
|
|
68
|
+
'.': manifest.exports
|
|
69
|
+
} : record(manifest.exports, `${directory}/package.json exports`);
|
|
70
|
+
if (Object.keys(exports1).some((key)=>!key.startsWith('.')) || void 0 !== exports1['.'] && './src/index.ts' !== exports1['.']) throw new Error(`${directory}/package.json exports must expose ./src/index.ts at "." before adding shared API infrastructure; consumer exports were not overwritten.`);
|
|
71
|
+
for (const [subpath, target] of Object.entries(record(defaults.exports, 'Shared contract exports')))if (void 0 !== exports1[subpath] && exports1[subpath] !== target) throw new Error(`${directory}/package.json ${subpath} must expose ${String(target)}; consumer exports were not overwritten.`);
|
|
72
|
+
const dependencies = record(manifest.dependencies ?? {}, `${directory}/package.json dependencies`);
|
|
73
|
+
manifest.exports = {
|
|
74
|
+
...record(defaults.exports, 'Shared contract exports'),
|
|
75
|
+
...exports1
|
|
76
|
+
};
|
|
77
|
+
manifest.dependencies = {
|
|
78
|
+
...record(defaults.dependencies, 'Shared contract dependencies'),
|
|
79
|
+
...dependencies
|
|
80
|
+
};
|
|
81
|
+
const writeMissing = (relativePath, content)=>{
|
|
82
|
+
const filePath = external_node_path_default().join(io.workspaceRoot, directory, relativePath);
|
|
83
|
+
if (void 0 === external_node_fs_default().lstatSync(filePath, {
|
|
84
|
+
throwIfNoEntry: false
|
|
85
|
+
})) io.writeGenerated(filePath, content);
|
|
86
|
+
};
|
|
87
|
+
writeMissing('src/effect-bff-runtime.ts', (0, fs_io_cjs_namespaceObject.readFileTemplate)('packages/effect-bff-runtime.ts'));
|
|
88
|
+
writeMissing('src/microvertical-api-baseline.ts', (0, fs_io_cjs_namespaceObject.readFileTemplate)('packages/microvertical-api-baseline.ts'));
|
|
89
|
+
writeMissing('tsconfig.json', `${JSON.stringify((0, package_json_cjs_namespaceObject.createSharedPackageTsConfig)(directory), null, 2)}\n`);
|
|
90
|
+
writeMissing('src/index.ts', (0, fs_io_cjs_namespaceObject.readFileTemplate)('packages/shared-contracts-index.ts'));
|
|
91
|
+
(0, external_io_cjs_namespaceObject.writeJsonFile)(io, manifestPath, manifest);
|
|
92
|
+
}
|
|
93
|
+
exports.ensureSharedApiInfrastructure = __webpack_exports__.ensureSharedApiInfrastructure;
|
|
94
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
95
|
+
"ensureSharedApiInfrastructure"
|
|
96
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
97
|
+
Object.defineProperty(exports, '__esModule', {
|
|
98
|
+
value: true
|
|
99
|
+
});
|
|
@@ -45,11 +45,16 @@ const external_node_fs_namespaceObject = require("node:fs");
|
|
|
45
45
|
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
46
46
|
const external_node_path_namespaceObject = require("node:path");
|
|
47
47
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
48
|
+
const utils_namespaceObject = require("@modern-js/utils");
|
|
48
49
|
const policy_cjs_namespaceObject = require("../../../ultramodern-workspace/policy.cjs");
|
|
49
50
|
const { toolchain } = policy_cjs_namespaceObject.ULTRAMODERN_WORKSPACE_POLICY;
|
|
50
51
|
const retiredRootToolingDependencies = [
|
|
51
52
|
"@typescript/typescript6"
|
|
52
53
|
];
|
|
54
|
+
function migrationPnpmVersion(value) {
|
|
55
|
+
const baseline = toolchain.packageManager.version;
|
|
56
|
+
return 'string' == typeof value && utils_namespaceObject.semver.valid(value) && utils_namespaceObject.semver.major(value) === utils_namespaceObject.semver.major(baseline) && utils_namespaceObject.semver.gte(value, baseline) ? value : baseline;
|
|
57
|
+
}
|
|
53
58
|
function isRecord(value) {
|
|
54
59
|
return Boolean(value) && 'object' == typeof value && !Array.isArray(value);
|
|
55
60
|
}
|
|
@@ -67,22 +72,24 @@ function updateUltramodernConfigToolchain(config) {
|
|
|
67
72
|
const workspace = ensureRecord(config, 'workspace', 'workspace');
|
|
68
73
|
const packageManager = ensureRecord(workspace, 'packageManager', 'workspace.packageManager');
|
|
69
74
|
packageManager.name = toolchain.packageManager.name;
|
|
70
|
-
packageManager.version =
|
|
75
|
+
packageManager.version = migrationPnpmVersion(packageManager.version);
|
|
71
76
|
const node = ensureRecord(workspace, 'node', 'workspace.node');
|
|
72
77
|
node.version = toolchain.node.version;
|
|
73
78
|
node.engineRange = toolchain.node.engineRange;
|
|
74
79
|
}
|
|
75
80
|
function updateRootPackageToolchain(packageJson) {
|
|
76
|
-
packageJson.packageManager
|
|
81
|
+
const currentVersion = 'string' == typeof packageJson.packageManager ? packageJson.packageManager.match(/^pnpm@([^+]+)(?:\+.*)?$/u)?.[1] : void 0;
|
|
82
|
+
packageJson.packageManager = `${toolchain.packageManager.name}@${migrationPnpmVersion(currentVersion)}`;
|
|
77
83
|
const engines = ensureRecord(packageJson, 'engines', 'package.json engines');
|
|
78
84
|
engines.node = toolchain.node.engineRange;
|
|
79
85
|
engines.pnpm = toolchain.packageManager.engineRange;
|
|
80
86
|
const devDependencies = ensureRecord(packageJson, 'devDependencies', 'package.json devDependencies');
|
|
81
87
|
for (const packageName of retiredRootToolingDependencies)delete devDependencies[packageName];
|
|
82
88
|
devDependencies["@typescript/native"] = policy_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies["@typescript/native"];
|
|
89
|
+
devDependencies['@types/node'] = policy_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies["@types/node"];
|
|
83
90
|
devDependencies.miniflare = policy_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies.miniflare;
|
|
84
91
|
}
|
|
85
|
-
function updateMiseTools(content) {
|
|
92
|
+
function updateMiseTools(content, pnpmVersion) {
|
|
86
93
|
const lines = content.replace(/\r\n/gu, '\n').split('\n');
|
|
87
94
|
if ('' === lines.at(-1)) lines.pop();
|
|
88
95
|
let toolsStart = lines.findIndex((line)=>/^\s*\[tools\]\s*(?:#.*)?$/u.test(line));
|
|
@@ -109,13 +116,15 @@ function updateMiseTools(content) {
|
|
|
109
116
|
lines[index] = line;
|
|
110
117
|
};
|
|
111
118
|
upsertTool('node', toolchain.node.version);
|
|
112
|
-
upsertTool('pnpm',
|
|
119
|
+
upsertTool('pnpm', pnpmVersion);
|
|
113
120
|
return `${lines.join('\n')}\n`;
|
|
114
121
|
}
|
|
115
122
|
function updateGeneratedToolchainFiles(io) {
|
|
116
123
|
const misePath = external_node_path_default().join(io.workspaceRoot, '.mise.toml');
|
|
117
124
|
const miseContent = external_node_fs_default().existsSync(misePath) ? external_node_fs_default().readFileSync(misePath, 'utf-8') : '';
|
|
118
|
-
io.
|
|
125
|
+
const packageJson = JSON.parse(external_node_fs_default().readFileSync(external_node_path_default().join(io.workspaceRoot, 'package.json'), 'utf8'));
|
|
126
|
+
const pnpmVersion = migrationPnpmVersion(packageJson.packageManager?.match(/^pnpm@([^+]+)(?:\+.*)?$/u)?.[1]);
|
|
127
|
+
io.write(misePath, updateMiseTools(miseContent, pnpmVersion));
|
|
119
128
|
const workflowPath = external_node_path_default().join(io.workspaceRoot, '.github/workflows/ultramodern-workspace-gates.yml');
|
|
120
129
|
if (!external_node_fs_default().existsSync(workflowPath)) return;
|
|
121
130
|
const workflow = external_node_fs_default().readFileSync(workflowPath, 'utf-8');
|