32 lines
1.7 KiB
JavaScript
32 lines
1.7 KiB
JavaScript
// Preserve the backend's exact transitive SDK graph; top-level version equality alone is insufficient.
|
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
const backend = JSON.parse(readFileSync(new URL('../../backend/package-lock.json', import.meta.url)));
|
|
const manifest = JSON.parse(readFileSync(new URL('./package.json', import.meta.url)));
|
|
const packages = { '': { name: manifest.name, version: manifest.version, dependencies: manifest.dependencies, engines: manifest.engines } };
|
|
function resolve(from, dependency) {
|
|
const parts = from.split('/').filter(Boolean);
|
|
while (true) {
|
|
const candidate = [...parts, 'node_modules', dependency].join('/');
|
|
if (backend.packages[candidate]) return candidate;
|
|
if (!parts.length) return null;
|
|
parts.pop();
|
|
}
|
|
}
|
|
const queue = Object.keys(manifest.dependencies).map(name => resolve('', name));
|
|
while (queue.length) {
|
|
const path = queue.pop();
|
|
if (!path) throw new Error('Missing dependency in backend lockfile');
|
|
if (packages[path]) continue;
|
|
const entry = { ...backend.packages[path] };
|
|
delete entry.dev;
|
|
packages[path] = entry;
|
|
for (const name of Object.keys(entry.dependencies || {})) queue.push(resolve(path, name));
|
|
for (const name of Object.keys(entry.optionalDependencies || {})) {
|
|
const resolved = resolve(path, name);
|
|
if (resolved) queue.push(resolved);
|
|
}
|
|
}
|
|
writeFileSync(new URL('./package-lock.json', import.meta.url), JSON.stringify({ name: manifest.name, version: manifest.version,
|
|
lockfileVersion: 3, requires: true, packages: Object.fromEntries(Object.entries(packages).sort(([a], [b]) => a.localeCompare(b))) }, null, 2) + '\n');
|
|
console.log(`Copied ${Object.keys(packages).length - 1} locked backend dependencies.`);
|