Ship file viewer, editor improvements, and private package releases
This commit is contained in:
1 parent
645914955c
commit
a4a31032b9
158 files changed
+10523
-137
No files matched your search
@@ -210,14 +210,16 @@ function publishManifest(
|
||||
for (const [k, v] of Object.entries(m.bin)) out.bin[k] = js(v as string);
|
||||
}
|
||||
|
||||
if (m.dependencies) {
|
||||
out.dependencies = {};
|
||||
for (const [dep, range] of Object.entries(m.dependencies)) {
|
||||
out.dependencies[dep] = String(range).startsWith("workspace:")
|
||||
for (const field of ["dependencies", "optionalDependencies", "peerDependencies"]) {
|
||||
if (!m[field]) continue;
|
||||
out[field] = {};
|
||||
for (const [dep, range] of Object.entries(m[field])) {
|
||||
out[field][dep] = String(range).startsWith("workspace:")
|
||||
? `^${workspaceVersions.get(dep) ?? version}`
|
||||
: range;
|
||||
}
|
||||
}
|
||||
if (m.peerDependenciesMeta) out.peerDependenciesMeta = structuredClone(m.peerDependenciesMeta);
|
||||
|
||||
if (m.wrnexus) {
|
||||
out.wrnexus = structuredClone(m.wrnexus);
|
||||
@@ -264,8 +266,15 @@ async function main() {
|
||||
outDir: join(p.dir, "dist"),
|
||||
format: ["esm"],
|
||||
dts: true,
|
||||
external: [/^@wrnexus\//, /^bun:/, /^node:/],
|
||||
tsconfig: join(repoRoot, "tsconfig.json"),
|
||||
external: [
|
||||
/^@wrnexus\//,
|
||||
/^bun:/,
|
||||
/^node:/,
|
||||
...Object.keys(p.manifest.peerDependencies ?? {}),
|
||||
],
|
||||
tsconfig: existsSync(join(p.dir, "tsconfig.json"))
|
||||
? join(p.dir, "tsconfig.json")
|
||||
: join(repoRoot, "tsconfig.json"),
|
||||
clean: true,
|
||||
// Shared modules must be emitted ONCE as a chunk both entries import,
|
||||
// not inlined into each. Several packages hold mutable module state --
|
||||
|
||||
@@ -28,6 +28,9 @@ function run(command: string, args: string[], capture = false, allowFailure = fa
|
||||
}
|
||||
|
||||
function runNpm(args: string[], capture = false, allowFailure = false) {
|
||||
if (process.env.WRNEXUS_NPM_REGISTRY) {
|
||||
args = ["--registry", process.env.WRNEXUS_NPM_REGISTRY, ...args];
|
||||
}
|
||||
return process.platform === "win32"
|
||||
? run(
|
||||
process.env.ComSpec ?? "cmd.exe",
|
||||
@@ -138,7 +141,17 @@ if (mode === "plan") {
|
||||
run(process.execPath, ["test", ...selected.map((pkg) => `packages/${pkg.dir}`)]);
|
||||
run(process.execPath, ["run", "scripts/publish-packages.ts", ...selected.map((pkg) => pkg.name)]);
|
||||
runNpm(["whoami"]);
|
||||
for (const pkg of selected) {
|
||||
// Staging records dependencies first; preserve that order during publication.
|
||||
const integrity = JSON.parse(
|
||||
readFileSync(join(root, ".publish", "PACKAGE-INTEGRITY.json"), "utf8"),
|
||||
);
|
||||
const ordered = integrity.packages.map((entry: { name: string }) => {
|
||||
const pkg = selected.find((pkg) => pkg.name === entry.name);
|
||||
if (!pkg) throw new Error(`Unexpected staged package ${entry.name}`);
|
||||
return pkg;
|
||||
}) as PackageInfo[];
|
||||
if (ordered.length !== selected.length) throw new Error("Staged package selection is incomplete");
|
||||
for (const pkg of ordered) {
|
||||
const stage = join(root, ".publish", pkg.dir);
|
||||
if (!registryHas(pkg)) runNpm(["publish", stage, "--access", "restricted"]);
|
||||
console.log(` ✓ ${pkg.name}@${pkg.manifest.version}`);
|
||||
|
||||
@@ -53,6 +53,12 @@ if (
|
||||
|
||||
const consumer = mkdtempSync(join(tmpdir(), "wrnexus-staged-consumer-"));
|
||||
try {
|
||||
if (process.env.WRNEXUS_NPM_REGISTRY) {
|
||||
writeFileSync(
|
||||
join(consumer, ".npmrc"),
|
||||
`@wrnexus:registry=${process.env.WRNEXUS_NPM_REGISTRY}\n`,
|
||||
);
|
||||
}
|
||||
const tarballRoot = join(consumer, "tarballs");
|
||||
mkdirSync(tarballRoot, { recursive: true });
|
||||
const dependencies = {};
|
||||
@@ -74,6 +80,12 @@ try {
|
||||
}
|
||||
dependencies[pkg.manifest.name] = `file:${join(tarballRoot, filename).replace(/\\/g, "/")}`;
|
||||
}
|
||||
if (stagedPackageNames.has("@wrnexus/viewer")) {
|
||||
const viewer = JSON.parse(readFileSync(join(root, "packages/viewer/package.json"), "utf8"));
|
||||
for (const name of ["fflate", "mammoth", "pdfjs-dist", "xlsx"]) {
|
||||
dependencies[name] = viewer.devDependencies[name];
|
||||
}
|
||||
}
|
||||
writeFileSync(
|
||||
join(consumer, "package.json"),
|
||||
JSON.stringify(
|
||||
@@ -118,6 +130,33 @@ try {
|
||||
throw new Error(`Staged package import probe failed:\n${probe.stderr || probe.stdout}`);
|
||||
if (probe.stdout) process.stdout.write(probe.stdout);
|
||||
|
||||
if (stagedPackageNames.has("@wrnexus/viewer")) {
|
||||
writeFileSync(
|
||||
join(consumer, "viewer-probe.mjs"),
|
||||
`import { existsSync, readFileSync } from "node:fs";
|
||||
import { viewerPlugin } from "@wrnexus/viewer/plugin";
|
||||
const manifest = JSON.parse(readFileSync("node_modules/@wrnexus/viewer/package.json", "utf8"));
|
||||
if (!manifest.peerDependenciesMeta?.xlsx?.optional || manifest.peerDependencies?.["@wrnexus/uploader"]?.startsWith("workspace:")) throw new Error("Viewer peer metadata was lost");
|
||||
const plugin = viewerPlugin({ convert: { converters: [], resolveSource: async () => undefined }, uploads: {} });
|
||||
for (const asset of [...plugin.clientRuntimes, ...plugin.routeEntries, ...plugin.styleSources]) {
|
||||
if (!existsSync(asset.entry)) throw new Error("Missing published viewer asset: " + asset.entry);
|
||||
}
|
||||
for (const runtime of plugin.clientRuntimes.filter((runtime) => runtime.bundle !== false)) {
|
||||
const result = await Bun.build({ entrypoints: [runtime.entry], target: "browser" });
|
||||
if (!result.success) throw new AggregateError(result.logs, "Viewer browser runtime failed: " + runtime.id);
|
||||
}
|
||||
console.log("Published viewer routes, metadata, and browser runtimes passed.");
|
||||
`,
|
||||
);
|
||||
const viewer = spawnSync(bun, ["viewer-probe.mjs"], {
|
||||
cwd: consumer,
|
||||
encoding: "utf8",
|
||||
});
|
||||
if (viewer.status !== 0)
|
||||
throw new Error(`Staged viewer probe failed:\n${viewer.stderr || viewer.stdout}`);
|
||||
if (viewer.stdout) process.stdout.write(viewer.stdout);
|
||||
}
|
||||
|
||||
const browserPackages = ["@wrnexus/csr", "@wrnexus/reactive"].filter((name) =>
|
||||
existsSync(join(consumer, "node_modules", ...name.split("/"))),
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user