74 lines
3.0 KiB
JavaScript
74 lines
3.0 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Re-sync the vendored @photo-gallery/sdk from the sibling SDK checkout.
|
|
*
|
|
* The SDK is not published to a registry yet, so it is vendored into `vendor/photo-gallery-sdk`
|
|
* and depended on as `file:./vendor/photo-gallery-sdk` — a path INSIDE this repo, so CI and Vercel
|
|
* (which only ever check out this repo) can resolve it. See vendor/README.md.
|
|
*
|
|
* npm run sync:gallery-sdk
|
|
* git add vendor/photo-gallery-sdk && git commit -m "chore: sync @photo-gallery/sdk"
|
|
*
|
|
* Only what the package would publish is copied. Its `node_modules` is deliberately left behind:
|
|
* without it the SDK's sources resolve `@types/react` from this repo (React 19) instead of the
|
|
* pnpm workspace's React 18, which is what lets them type-check here.
|
|
*/
|
|
|
|
import { cp, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
import { dirname, resolve } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const root = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
const source =
|
|
process.env.GALLERY_SDK_PATH ??
|
|
resolve(root, "../advance-photo-gallery-web-sdk/packages/photo-sdk");
|
|
const target = resolve(root, "vendor/photo-gallery-sdk");
|
|
|
|
const ENTRIES = ["src", "package.json", "README.md"];
|
|
|
|
const exists = async (p) => {
|
|
try {
|
|
await stat(p);
|
|
return true;
|
|
} catch {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
if (!(await exists(source))) {
|
|
console.error(`[sync:gallery-sdk] SDK checkout not found at ${source}`);
|
|
console.error(" Clone advance-photo-gallery-web-sdk beside this repo, or set GALLERY_SDK_PATH.");
|
|
process.exit(1);
|
|
}
|
|
|
|
for (const entry of ENTRIES) {
|
|
const from = resolve(source, entry);
|
|
if (!(await exists(from))) continue;
|
|
const to = resolve(target, entry);
|
|
await rm(to, { recursive: true, force: true });
|
|
await cp(from, to, { recursive: true });
|
|
console.log(`[sync:gallery-sdk] ${entry}`);
|
|
}
|
|
|
|
/*
|
|
* Strip devDependencies + scripts from the vendored manifest.
|
|
*
|
|
* npm never installs a published package's devDependencies, but it DOES install them for a local
|
|
* `file:` path package. Left in place, the SDK's `@types/react@18` lands in
|
|
* vendor/photo-gallery-sdk/node_modules and its sources then type-check against React 18 inside a
|
|
* React 19 program — "Type 'bigint' is not assignable to type 'ReactNode'". Removing them makes the
|
|
* vendored copy behave exactly like the tarball it stands in for.
|
|
*/
|
|
const manifestPath = resolve(target, "package.json");
|
|
const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
|
|
delete manifest.devDependencies;
|
|
delete manifest.scripts;
|
|
manifest._vendored = {
|
|
from: "advance-photo-gallery-web-sdk/packages/photo-sdk",
|
|
note: "Generated by scripts/sync-gallery-sdk.mjs — do not hand-edit. See vendor/README.md.",
|
|
};
|
|
await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
console.log("[sync:gallery-sdk] package.json (devDependencies + scripts stripped)");
|
|
|
|
console.log("[sync:gallery-sdk] done — commit vendor/photo-gallery-sdk, then restart the dev server.");
|