diff --git a/bun.lock b/bun.lock index 9c450e7b..4b054580 100644 --- a/bun.lock +++ b/bun.lock @@ -617,7 +617,7 @@ }, "packages/ui": { "name": "@wrnexus/ui", - "version": "0.8.12", + "version": "0.8.13", "dependencies": { "@wrnexus/core": "workspace:*", }, diff --git a/packages/ui/package.json b/packages/ui/package.json index 4d09380a..c79356f4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ui", - "version": "0.8.12", + "version": "0.8.13", "private": true, "type": "module", "main": "src/index.ts", diff --git a/scripts/lib/package-integrity.ts b/scripts/lib/package-integrity.ts index df4007db..935be270 100644 --- a/scripts/lib/package-integrity.ts +++ b/scripts/lib/package-integrity.ts @@ -1,6 +1,6 @@ import { createHash } from "node:crypto"; import { existsSync, readdirSync, readFileSync } from "node:fs"; -import { basename, join, relative } from "node:path"; +import { basename, dirname, join, relative, resolve } from "node:path"; export interface StagedFileIntegrity { path: string; @@ -122,6 +122,15 @@ export function validateAndHashStage( if (highConfidenceSecret.test(source)) { throw new Error(`${name} staged content matching a high-confidence secret in ${path}.`); } + if (path.endsWith(".wrn")) { + for (const match of source.matchAll(/\bfrom\s+["'](\.{1,2}\/[^"']+)["']/g)) { + const target = resolve(dirname(file), match[1]!); + const targetPath = relative(stage, target); + if (targetPath.startsWith("..") || !existsSync(target)) { + throw new Error(`${name} staged WRN import does not exist: ${path} -> ${match[1]}.`); + } + } + } } integrity.push({ path, diff --git a/scripts/publish-packages.ts b/scripts/publish-packages.ts index fe47f9f8..37fd9fdb 100644 --- a/scripts/publish-packages.ts +++ b/scripts/publish-packages.ts @@ -46,6 +46,7 @@ const HOMEPAGE = "https://wrnexusjs.dev"; const ASSETS: Record = { "@wrnexus/ui": [ "components", + "styles", "ui.css", "component-catalog.json", "component-migrations.json", diff --git a/scripts/test-package-integrity.mjs b/scripts/test-package-integrity.mjs index 27bbadbd..1e4a8e43 100644 --- a/scripts/test-package-integrity.mjs +++ b/scripts/test-package-integrity.mjs @@ -89,6 +89,23 @@ try { writeFileSync(join(keyHandlingSource, "dist", "index.d.ts"), "export {};\n"); validateAndHashStage(keyHandlingSource, manifest); + const missingWrnImport = join(root, "missing-wrn-import"); + mkdirSync(join(missingWrnImport, "dist"), { recursive: true }); + mkdirSync(join(missingWrnImport, "components"), { recursive: true }); + writeFileSync(join(missingWrnImport, "dist", "index.js"), "export {};\n"); + writeFileSync(join(missingWrnImport, "dist", "index.d.ts"), "export {};\n"); + writeFileSync( + join(missingWrnImport, "components", "Select.wrn"), + 'import Styles from "../styles/SelectStyles.wrn"\ncomponent Select {}\n', + ); + rejected = false; + try { + validateAndHashStage(missingWrnImport, manifest); + } catch { + rejected = true; + } + if (!rejected) throw new Error("Missing relative WRN import was not rejected."); + console.log("Package staging integrity probes passed."); } finally { rmSync(root, { recursive: true, force: true });