diff --git a/docs/assets/browser-starter/project.zip b/docs/assets/browser-starter/project.zip index 34f39b3..20d099c 100644 Binary files a/docs/assets/browser-starter/project.zip and b/docs/assets/browser-starter/project.zip differ diff --git a/docs/assets/browser-starter/source.json b/docs/assets/browser-starter/source.json index 879c4b8..ba6cf8c 100644 --- a/docs/assets/browser-starter/source.json +++ b/docs/assets/browser-starter/source.json @@ -1,28 +1,28 @@ { "source_repository": "https://github.com/fullbleed-engine/fullbleed-node", - "source_commit": "bbb140f115a69ad77fc54bb9b5be2e908b7b6669", + "source_commit": "7da8faa0dd7e5653c796b2b113ca580bcc25ca3b", "source_directory": "examples/browser", - "package_version": "0.3.0", - "engine_version": "2.5.8", - "package_integrity": "sha512-9HimnoHTEpgtGhqi9gF+IMSEW8g3GRK11yUkmL6OYD40D/RhWoIF7SqKuDs6nrHF7loWnhtNDWz3Hp/DNaBbMQ==", - "zip_bytes": 23695, - "zip_sha256": "f9910a8712a7e54b4db888576e803df72e328ac396bf30730b232f74b0939114", + "package_version": "0.3.1", + "engine_version": "2.5.10", + "package_integrity": "sha512-95CVTnYKduXD5KcEj9MLfzPsqofahZB2BsJ62Dfg0tOTlPFEHT8vx/T3f8xp4VQYkihOPQdMDiWQzYNHJkLpWA==", + "zip_bytes": 23705, + "zip_sha256": "fec06c1ca935ea71abcf10f7044a5df0e49ff3ffe3e4d77f0bee66969d256ae9", "files": { "fullbleed-browser-starter/.gitignore": "c023fec2bf12476cb47709e859f1fbb785aeb1e03281e52141e0bee1ee7dad72", "fullbleed-browser-starter/LICENSE": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9", - "fullbleed-browser-starter/README.md": "1a1cc25ecb04b943b26703114135e42cfbb44baa4b939eb7534e6013e67563ca", + "fullbleed-browser-starter/README.md": "886bb0ea403780834262b4432a4b866671098fb1f7074524007bc37dccab4a1d", "fullbleed-browser-starter/index.html": "79baecb0b24716e78799893fc0076d88b2c026354f9f31acdf799c8f305c954b", - "fullbleed-browser-starter/package-lock.json": "c24943d2d37f25768ce71581290e03aba5daac39beeae11e94bf2318d539ba17", - "fullbleed-browser-starter/package.json": "638a60e7b5aebe6f614f0808bfbe085866392b094e1b403b5dffd52141fe1c43", + "fullbleed-browser-starter/package-lock.json": "16e4f019872bd1cd5f2a743769f3ec958f9aa78901b6f2f3fd2816e613369346", + "fullbleed-browser-starter/package.json": "36df50538f36f3dc9086e03d0777183c5b2bce508801f0d7c00ef21e23806f6d", "fullbleed-browser-starter/public/favicon.svg": "3eed6dcf1013e48bc64886fed4cf815c609ed06b404742bdacdc44c1df8d3118", "fullbleed-browser-starter/src/invoice.css": "0b310ce0f2964fd6b9b68e4afafa9307b4ff8c6b2f1fc753367dc755620ce427", "fullbleed-browser-starter/src/invoice.html": "1f065ad6694021649e61b3f666cba6dc01aacdcbd8e80e97425b383e60d7d2fe", "fullbleed-browser-starter/src/main.js": "10312b7064b0b2c19d97194b3953f639cc1f6842c35acf85f5e9543fa9c1d27f", "fullbleed-browser-starter/src/report.css": "519591ae75c239ec602324f008dd99108ebeae0b9306df7215fa5f0442905473", "fullbleed-browser-starter/src/report.html": "46b0e975d43914c8b4492218feae09ea0ad684091a9f9ee3b18f66a87202e521", - "fullbleed-browser-starter/src/style.css": "1b1511e7d52e094aa5c93e52ade218f2cad28e73a50faf64919a525208d4ac06", + "fullbleed-browser-starter/src/style.css": "5005045f66a84a038a0f7a0f7e15b8b5e9eac2489f9717d4a581fec5075bf6f4", "fullbleed-browser-starter/vite.config.js": "ec725922705a3c5ba2df191a564c54c0cac6e8997ecd3d00b8a42c647bec8e74" }, - "local_ui_evidence": "https://github.com/fullbleed-engine/fullbleed-node/blob/55261db4edc915f546d0e55e578d613bae858c22/verification/browser-starter-030.json", - "source_verification_run": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37428069613" + "local_ui_evidence": "https://github.com/fullbleed-engine/fullbleed-node/blob/7da8faa0dd7e5653c796b2b113ca580bcc25ca3b/verification/starters-031.json", + "source_verification_run": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37465413013" } diff --git a/docs/assets/nextjs/invoice.pdf b/docs/assets/nextjs/invoice.pdf index 5689eee..caf8fe6 100644 Binary files a/docs/assets/nextjs/invoice.pdf and b/docs/assets/nextjs/invoice.pdf differ diff --git a/docs/assets/nextjs/invoice.png b/docs/assets/nextjs/invoice.png index 82d648f..5918b8c 100644 Binary files a/docs/assets/nextjs/invoice.png and b/docs/assets/nextjs/invoice.png differ diff --git a/docs/assets/nextjs/project.zip b/docs/assets/nextjs/project.zip index afb5ddb..5eee59f 100644 Binary files a/docs/assets/nextjs/project.zip and b/docs/assets/nextjs/project.zip differ diff --git a/docs/assets/nextjs/source.json b/docs/assets/nextjs/source.json index 45b3753..ff6a8c4 100644 --- a/docs/assets/nextjs/source.json +++ b/docs/assets/nextjs/source.json @@ -1,22 +1,45 @@ { "sourceRepository": "https://github.com/fullbleed-engine/fullbleed-node", - "sourceCommit": "4f574b5e11d3a680a50c561bf9ea071de29d0cb8", + "sourceCommit": "7da8faa0dd7e5653c796b2b113ca580bcc25ca3b", "files": 18, "assets": [ { "file": "project.zip", - "sha256": "d6586c7b3d5f465fa08ac292b02c634b2ad649f0722616c47b5bc26cf751e157", - "bytes": 105014 + "sha256": "06d1383ed8a40ab2853e7f9a51a9a7baddb7981b7c02fc0d3772587c8823553f", + "bytes": 104788 }, { "file": "invoice.pdf", - "sha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", - "bytes": 40289 + "sha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", + "bytes": 40386 }, { "file": "invoice.png", - "sha256": "b76f6db748fb47b928c93c12fe788de94a0f5d8da4bb350f644a58705c163cf7", - "bytes": 107399 + "sha256": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7", + "bytes": 107272 } - ] + ], + "fileHashes": { + "fullbleed-nextjs/.gitignore": "b4abc38d76926640e3f2cbe3bf25c8f5aec6cc43dd978c48d3ad5cc20d964f66", + "fullbleed-nextjs/LICENSE": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9", + "fullbleed-nextjs/README.md": "0b47cb42317df65f497447bb1084c888194886f82e5223960ed2ecaa55b22273", + "fullbleed-nextjs/app/api/invoices/[id]/route.js": "d6348ce64b44feac7010e21fb0f55723e0858c7867222ae831c45d3440a3b052", + "fullbleed-nextjs/app/globals.css": "02e0b545a14eaf15e6d3d8fc8c0e8c0f1c5ce5c1b8dc461b4343d330f291233e", + "fullbleed-nextjs/app/layout.js": "2df89bff0d2f002b432b3fdb73fd64edf59c57641d9ea6df3f0051cf2329cf27", + "fullbleed-nextjs/app/page.js": "24c7996f8172992f925cdb1e47455d0095397d0832f747c90ecb409f2a1d460c", + "fullbleed-nextjs/lib/invoice.mjs": "fd87dd082fa19659ec572d97255c1902e1e728e43ebbc3e0ade9891fa7736cf2", + "fullbleed-nextjs/next.config.mjs": "e93613419f5aaa6264f0405e5afbb6f5eea4c956e42e7ebf30a6c85a4d9d89b3", + "fullbleed-nextjs/package-lock.json": "57dfea0b9c49f604477b28c88847764bda16c006383df852269bdd2b712daf43", + "fullbleed-nextjs/package.json": "7e52578d679fa9422b15cf5a69fa065d7b6c68d076362ddfc4e885134dfd5766", + "fullbleed-nextjs/public/invoice.png": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7", + "fullbleed-nextjs/templates/invoice.css": "cda22b39ab1f7a1eeac7cd76d162b05cd3568c2430c099123ba30a2fbd58a296", + "fullbleed-nextjs/templates/invoice.html": "d9a5b1950ddab61f08628b0fcc773cb36f05d9401bb3d87273bca02452b1835e", + "fullbleed-nextjs/tools/copy-public.mjs": "25005e2612d90ed5127f268144c45bcd259ceb1e68c832723549e57a06b8d3dd", + "fullbleed-nextjs/tools/render-preview.mjs": "0e5f1c0e49e2ec35a77eec460d735a1228ae82a30b86a7eb687af4056c23522b", + "fullbleed-nextjs/tools/start.mjs": "4c185a0801ca4f89a30a0c1e75710f1c22c84463d29477900162b05a8bc52eab", + "fullbleed-nextjs/tools/verify.mjs": "54623914ff28a47ea63a553d063ac50a206df0424270dacb3f3a99054982a888" + }, + "packageVersion": "0.3.1", + "engineVersion": "2.5.10", + "sourceVerificationRun": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37465413382" } diff --git a/docs/assets/nextjs/verification.json b/docs/assets/nextjs/verification.json index d060af0..0b43859 100644 --- a/docs/assets/nextjs/verification.json +++ b/docs/assets/nextjs/verification.json @@ -1,10 +1,9 @@ { - "checkedAt": "2026-10-06T01:06:26.050552+00:00", - "sourceRepository": "https://github.com/fullbleed-engine/fullbleed-node", - "sourceCommit": "4f574b5e11d3a680a50c561bf9ea071de29d0cb8", - "pullRequest": "https://github.com/fullbleed-engine/fullbleed-node/pull/17", - "ciRun": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37397228563", - "standaloneChecks": [ + "ok": true, + "checkedAt": "2026-10-06T12:49:16.905884+00:00", + "sourceCommit": "7da8faa0dd7e5653c796b2b113ca580bcc25ca3b", + "sourceRun": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37465413382", + "checks": [ { "name": "standalone artifact is isolated from the source application", "passed": true @@ -76,16 +75,16 @@ ], "ciResults": [ { - "checkedAt": "2026-10-06T01:04:06.668Z", + "checkedAt": "2026-10-06T12:44:31.828Z", "node": "v22.23.3", "platform": "linux", "next": "16.3.8", - "nodePackage": "0.2.0", - "engineVersion": "2.5.8", + "nodePackage": "0.3.1", + "engineVersion": "2.5.10", "isolation": "process", - "packageLockSha256": "ceda9f7f9099fa91ab5a98d6ce8fd0ba4d2db761b46a19b412688f8db045c179", + "packageLockSha256": "57dfea0b9c49f604477b28c88847764bda16c006383df852269bdd2b712daf43", "pages": 1, - "pdfSha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", + "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "burst": [ 200, 503, @@ -100,20 +99,22 @@ 503, 503 ], + "scope": "Real next build standalone server with released Fullbleed npm package and fictional data; HTTP recovery after deliberate child failure. No hosted platform or application-authentication claim.", "artifact": "nextjs-ubuntu-latest-22", - "checksPassed": 17 + "checksPassed": 17, + "previewSha256": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7" }, { - "checkedAt": "2026-10-06T01:04:06.836Z", + "checkedAt": "2026-10-06T12:44:44.228Z", "node": "v24.21.0", "platform": "linux", "next": "16.3.8", - "nodePackage": "0.2.0", - "engineVersion": "2.5.8", + "nodePackage": "0.3.1", + "engineVersion": "2.5.10", "isolation": "process", - "packageLockSha256": "ceda9f7f9099fa91ab5a98d6ce8fd0ba4d2db761b46a19b412688f8db045c179", + "packageLockSha256": "57dfea0b9c49f604477b28c88847764bda16c006383df852269bdd2b712daf43", "pages": 1, - "pdfSha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", + "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "burst": [ 200, 503, @@ -128,20 +129,22 @@ 503, 503 ], + "scope": "Real next build standalone server with released Fullbleed npm package and fictional data; HTTP recovery after deliberate child failure. No hosted platform or application-authentication claim.", "artifact": "nextjs-ubuntu-latest-24", - "checksPassed": 17 + "checksPassed": 17, + "previewSha256": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7" }, { - "checkedAt": "2026-10-06T01:04:28.012Z", + "checkedAt": "2026-10-06T12:44:58.768Z", "node": "v24.21.0", "platform": "win32", "next": "16.3.8", - "nodePackage": "0.2.0", - "engineVersion": "2.5.8", + "nodePackage": "0.3.1", + "engineVersion": "2.5.10", "isolation": "process", - "packageLockSha256": "ceda9f7f9099fa91ab5a98d6ce8fd0ba4d2db761b46a19b412688f8db045c179", + "packageLockSha256": "57dfea0b9c49f604477b28c88847764bda16c006383df852269bdd2b712daf43", "pages": 1, - "pdfSha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", + "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "burst": [ 200, 503, @@ -156,21 +159,23 @@ 503, 503 ], + "scope": "Real next build standalone server with released Fullbleed npm package and fictional data; HTTP recovery after deliberate child failure. No hosted platform or application-authentication claim.", "artifact": "nextjs-windows-latest-24", - "checksPassed": 17 + "checksPassed": 17, + "previewSha256": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7" } ], "downloadedStarter": { "ok": true, - "checkedAt": "2026-10-06T01:05:03.951160+00:00", - "sourceCommit": "4f574b5e11d3a680a50c561bf9ea071de29d0cb8", + "checkedAt": "2026-10-06T12:46:56.297591+00:00", + "sourceCommit": "7da8faa0dd7e5653c796b2b113ca580bcc25ca3b", "downloadFiles": 18, - "projectZipSha256": "d6586c7b3d5f465fa08ac292b02c634b2ad649f0722616c47b5bc26cf751e157", - "node": "v22.23.3", + "projectZipSha256": "06d1383ed8a40ab2853e7f9a51a9a7baddb7981b7c02fc0d3772587c8823553f", + "node": "v26.10.0", "platform": "win32", "next": "16.3.8", - "nodePackage": "0.2.0", - "engineVersion": "2.5.8", + "nodePackage": "0.3.1", + "engineVersion": "2.5.10", "isolation": "process", "commands": [ { @@ -190,8 +195,8 @@ "exitCode": 0 } ], - "pdfSha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", - "previewSha256": "b76f6db748fb47b928c93c12fe788de94a0f5d8da4bb350f644a58705c163cf7", + "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", + "previewSha256": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7", "checks": [ { "name": "standalone artifact is isolated from the source application", @@ -266,46 +271,29 @@ }, "browser": { "ok": true, - "checked_at": "2026-10-06T01:05:29.710577+00:00", + "checked_at": "2026-10-06T12:42:59.420658+00:00", "browser": "154.0.8037.98", - "isolation": "process", "checks": [ { "width": 1440, "keyboard": false, - "layout": { - "width": 1440, - "documentWidth": 1440, - "bodyWidth": 1440 - }, - "pdf_sha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", + "pdf_sha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "page_errors": [] }, { "width": 390, "keyboard": true, - "layout": { - "width": 390, - "documentWidth": 390, - "bodyWidth": 390 - }, - "pdf_sha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", + "pdf_sha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "page_errors": [] }, { "width": 320, "keyboard": false, - "layout": { - "width": 320, - "documentWidth": 320, - "bodyWidth": 320 - }, - "pdf_sha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", + "pdf_sha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "page_errors": [] } ], - "scope": "Independent headless Chrome and isolated Next standalone artifact; real PDF downloads, keyboard activation, narrow layouts. Existing authenticated browser sessions were not used." + "scope": "Owned anonymous Chrome; production Next.js standalone server; real downloads and responsive layouts." }, - "scope": "Published npm 0.2.0 with process isolation in the Next.js standalone starter. Three CI environments and a fresh downloadable ZIP install pass 17 HTTP/process/error-recovery checks. Real browser downloads match the retained invoice. No application authorization, hosted-provider, speed, or standards certification claim.", - "mergedCommit": "36a5b1d382c27d5a0f3414c732a88529e0bf5c7b" + "scope": "Published npm 0.3.1 / core 2.5.10. Three CI environments and the exact downloadable ZIP pass 17 standalone HTTP checks; their PDFs and previews match. Owned Chrome checks real downloads and narrow layouts. No application authorization, hosting-provider, or standards conformance claim." } diff --git a/docs/assets/node/invoice.pdf b/docs/assets/node/invoice.pdf index 5689eee..caf8fe6 100644 Binary files a/docs/assets/node/invoice.pdf and b/docs/assets/node/invoice.pdf differ diff --git a/docs/assets/node/invoice.png b/docs/assets/node/invoice.png index 82d648f..5918b8c 100644 Binary files a/docs/assets/node/invoice.png and b/docs/assets/node/invoice.png differ diff --git a/docs/assets/node/project.json b/docs/assets/node/project.json index 580f5d0..22ac593 100644 --- a/docs/assets/node/project.json +++ b/docs/assets/node/project.json @@ -1,13 +1,13 @@ { - "package_version": "0.2.0", - "engine_version": "2.5.8", - "source_commit": "969f23c479cd02f366cc1d2e099b6bda19dfaac9", - "package_url": "https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.2.0/fullbleed-0.2.0.tgz", - "package_integrity": "sha512-7khp008/oaJxMbroCQuv82ICOnJVQ1RUgYsOZWAqcW92qjKEAVzRK80UZDIJkNWcaMh1yDdTR8BJ5PAFc3QbnA==", - "package_sha256": "90bd0bbf4ae542b6be1deb3103ba492b9d8675e47b71f895060b40419d705f4a", + "package_version": "0.3.1", + "engine_version": "2.5.10", + "source_commit": "9675fdf065e6119a5d9dda877038b868b7c03ff9", + "package_url": "https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.3.1/fullbleed-0.3.1.tgz", + "package_integrity": "sha512-95CVTnYKduXD5KcEj9MLfzPsqofahZB2BsJ62Dfg0tOTlPFEHT8vx/T3f8xp4VQYkihOPQdMDiWQzYNHJkLpWA==", + "package_sha256": "919cc5b49a82641c7105af782e6a1f28f592849d6a04e866f74e8158c2cd3864", "rendered": { - "invoice.pdf": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", - "invoice.png": "b76f6db748fb47b928c93c12fe788de94a0f5d8da4bb350f644a58705c163cf7" + "invoice.pdf": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", + "invoice.png": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7" }, "quickstart": { "invoice.pdf": "1486fd3a94f088196e8f70687df0f16a33782c138466a5626cddc46e69f5e419", @@ -17,8 +17,8 @@ "license": "MIT", "verification_scope": "Reviewed invoice and quickstart, installed from the published npm package. No PDF standards certification.", "report": { - "report.pdf": "cbe463b5759957261dc41aadd8727f8d01485e405c2e2841c9b34c0289876c10", - "report-2.png": "3e31e42b3c7cac8b01633e5675cb1446feec553afb392d4d6a7b73f8c8582ad9" + "report.pdf": "139df89824e6a73c13ff62f1237bb8eb9f71e790dcbd051b1bb713ed2bc47802", + "report-2.png": "c8fe5102e9219962ea068201be0a6730cb37de797649f4b5f44478433e79b018" }, "files": { "LICENSE": { @@ -26,8 +26,8 @@ "sha256": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9" }, "README.md": { - "bytes": 902, - "sha256": "98501bbbfe6844436d01f3d53cf7ea33c58910333734a981ff4ec599cc26f8ba" + "bytes": 903, + "sha256": "05b2da134a8f387a1802d680562fed0ab25d3709e84d4174532621ea110470dc" }, "invoice.css": { "bytes": 3546, @@ -38,17 +38,17 @@ "sha256": "195725eeeb32c521e19b47dbacbb55048bebb6df8566ab135cdc41fbf33fe57a" }, "package-lock.json": { - "bytes": 1075, - "sha256": "9041f8e21fcde488123d7178b0d0f00b98b6e856141e2c0465ff914daf59d549" + "bytes": 1165, + "sha256": "f02d59c85701fb9e049a07229ce1dd03ee5cc3616e669f62b1e8baa1ff7d5a9b" }, "package.json": { "bytes": 241, - "sha256": "6f638329f16f5dd22b767ce3784ce01ef219fcf7bb371261d0a28e0a2b3b5184" + "sha256": "daf61804b3404d3c7649921887b2b45a2c77a93a16ca41c110d4a4810ba071bf" }, "render.mjs": { "bytes": 1064, "sha256": "dd63e83658800df2672c8c5ca1b176dbe49fc0d5c49b8c2b79af91515a68e776" } }, - "zip_sha256": "3cdf9f3fb454dd269f4b2430eec7bd7ff468ce65d24e30f949c48ff4e39022a3" + "zip_sha256": "6fb5b62f917ecaaff0c03ad3cb887f5559c64f135d78878178c5d063c1fe7632" } diff --git a/docs/assets/node/project.zip b/docs/assets/node/project.zip index 56c4f5b..a6004c5 100644 Binary files a/docs/assets/node/project.zip and b/docs/assets/node/project.zip differ diff --git a/docs/assets/node/report-2.png b/docs/assets/node/report-2.png index 7bf75d9..2a0b3be 100644 Binary files a/docs/assets/node/report-2.png and b/docs/assets/node/report-2.png differ diff --git a/docs/assets/node/report.pdf b/docs/assets/node/report.pdf index b990d18..210f710 100644 Binary files a/docs/assets/node/report.pdf and b/docs/assets/node/report.pdf differ diff --git a/docs/assets/react-starter/baseline/invoice.pdf b/docs/assets/react-starter/baseline/invoice.pdf index 5689eee..caf8fe6 100644 Binary files a/docs/assets/react-starter/baseline/invoice.pdf and b/docs/assets/react-starter/baseline/invoice.pdf differ diff --git a/docs/assets/react-starter/baseline/report.pdf b/docs/assets/react-starter/baseline/report.pdf index b990d18..210f710 100644 Binary files a/docs/assets/react-starter/baseline/report.pdf and b/docs/assets/react-starter/baseline/report.pdf differ diff --git a/docs/assets/react-starter/baseline/verification.json b/docs/assets/react-starter/baseline/verification.json index cd2c2a6..9d012ea 100644 --- a/docs/assets/react-starter/baseline/verification.json +++ b/docs/assets/react-starter/baseline/verification.json @@ -1,24 +1,24 @@ { - "package": "0.3.0", - "engine": "2.5.8", + "package": "0.3.1", + "engine": "2.5.10", "node": "v26.10.0", "records": [ { "design": "invoice", "pages": 1, - "pdfSha256": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", + "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "previews": [ - "b76f6db748fb47b928c93c12fe788de94a0f5d8da4bb350f644a58705c163cf7" + "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7" ] }, { "design": "report", "pages": 3, - "pdfSha256": "cbe463b5759957261dc41aadd8727f8d01485e405c2e2841c9b34c0289876c10", + "pdfSha256": "139df89824e6a73c13ff62f1237bb8eb9f71e790dcbd051b1bb713ed2bc47802", "previews": [ - "a5fbccdb2fb68e5bbebb8ae6d42f6eb4cdf69ec142237734a2c6d2069825dbdb", - "3e31e42b3c7cac8b01633e5675cb1446feec553afb392d4d6a7b73f8c8582ad9", - "77b10e0766025c34131fbdcfb1dde0bd3015a79cabf1db741af65b63121b035d" + "33ee3398d59f6836368cdab0f3c725c3cf12cbf2f9f3a3ac6a6b168f6c1886f5", + "c8fe5102e9219962ea068201be0a6730cb37de797649f4b5f44478433e79b018", + "a3e8acbc7ba4147c56d45b606d3974ec4aecbda1b5d7362451e5e8890491dc7d" ] } ] diff --git a/docs/assets/react-starter/project.zip b/docs/assets/react-starter/project.zip index 42c6e6e..a8bf391 100644 Binary files a/docs/assets/react-starter/project.zip and b/docs/assets/react-starter/project.zip differ diff --git a/docs/assets/react-starter/source.json b/docs/assets/react-starter/source.json index 72afdea..cd59a32 100644 --- a/docs/assets/react-starter/source.json +++ b/docs/assets/react-starter/source.json @@ -1,20 +1,20 @@ { "source_repository": "https://github.com/fullbleed-engine/fullbleed-node", - "source_commit": "bbb140f115a69ad77fc54bb9b5be2e908b7b6669", + "source_commit": "7da8faa0dd7e5653c796b2b113ca580bcc25ca3b", "source_directory": "examples/react", - "package_version": "0.3.0", - "engine_version": "2.5.8", + "package_version": "0.3.1", + "engine_version": "2.5.10", "react_version": "19.3.0", - "package_integrity": "sha512-9HimnoHTEpgtGhqi9gF+IMSEW8g3GRK11yUkmL6OYD40D/RhWoIF7SqKuDs6nrHF7loWnhtNDWz3Hp/DNaBbMQ==", - "zip_bytes": 29607, - "zip_sha256": "b3a6d9c90f00b40924380957356fd65d18592d077d615205d1b512baac8ca468", + "package_integrity": "sha512-95CVTnYKduXD5KcEj9MLfzPsqofahZB2BsJ62Dfg0tOTlPFEHT8vx/T3f8xp4VQYkihOPQdMDiWQzYNHJkLpWA==", + "zip_bytes": 29617, + "zip_sha256": "cdb07cbe2fd6a744eb5d49971813f7ab5297f25b31292a35a3f76994492e8264", "files": { "fullbleed-react-starter/.gitignore": "25d896ffa2be7ed008ad87c3956a0a88f54167d04a7cef5cf774d6989d3b5a7b", "fullbleed-react-starter/LICENSE": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9", - "fullbleed-react-starter/README.md": "c225aae582988820fab32bdc4eb2290ba798969fda2cc7ee05a3c1308a90d278", + "fullbleed-react-starter/README.md": "098a1ce15c586d7b3d3a5a459ac107230a2cbae3422f55916040a79a027e009f", "fullbleed-react-starter/index.html": "cadf48a3476088b2efbe9012bb4b2d21fa24f1dd3e99f974f444c88fbf1ee165", - "fullbleed-react-starter/package-lock.json": "b85e1b32398760557ae8b3d0706ff7b4c9a3fc010ee2670f27fab8c41d20f274", - "fullbleed-react-starter/package.json": "dfd4ec62d5ba730af674e1fff930ae6ddbcd3e0970e109a56d4a883c0a2062ab", + "fullbleed-react-starter/package-lock.json": "e38b0d8775b14bc62ad99cb4b5f518fbf5c797ab208e5cf184d5e4c39a0f0e72", + "fullbleed-react-starter/package.json": "14cb9c05cccdc589f09f8281fdd7b92345aba5e15e0ffbbfa93230deef94861f", "fullbleed-react-starter/public/favicon.svg": "3eed6dcf1013e48bc64886fed4cf815c609ed06b404742bdacdc44c1df8d3118", "fullbleed-react-starter/src/App.tsx": "5dbcd45d570a3e4d69f12237d252e30afe71f52cb8411c3ffe094dc72f559b9f", "fullbleed-react-starter/src/invoice.css": "0b310ce0f2964fd6b9b68e4afafa9307b4ff8c6b2f1fc753367dc755620ce427", @@ -22,11 +22,12 @@ "fullbleed-react-starter/src/main.tsx": "f8f523ef5fc0b1e4095830466e0caa648c01f7b42036694b800c25d43d5e2c84", "fullbleed-react-starter/src/report.css": "519591ae75c239ec602324f008dd99108ebeae0b9306df7215fa5f0442905473", "fullbleed-react-starter/src/report.html": "46b0e975d43914c8b4492218feae09ea0ad684091a9f9ee3b18f66a87202e521", - "fullbleed-react-starter/src/style.css": "7fb16e026c7bad729ecd7d5bdbd85e0822ebb5bf4767f8d3d997dc54bbc3e244", + "fullbleed-react-starter/src/style.css": "940621b782b9e39fc48f5a257c119763e11cedd158fb570a82f483ea20aa9951", "fullbleed-react-starter/src/usePdfPreview.ts": "587e8702bd32f42abe2720f9d29dcc68e6d75aba8cb3ceacbdfcf2b583f378cc", "fullbleed-react-starter/tsconfig.json": "382c3c4a68901c016c3038c9653f1adaf145738c68de40a34821181ead2d7289", "fullbleed-react-starter/vite.config.js": "4b74d0189e7f58a4c75d168367e9b8a53000555dd3de594c497f70fb5e02fff0" }, "verification_workflow": "https://github.com/fullbleed-engine/fullbleed-node/actions/workflows/react-starter.yml", - "source_verification_run": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37428069659" + "source_verification_run": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37465413017", + "local_ui_evidence": "https://github.com/fullbleed-engine/fullbleed-node/blob/7da8faa0dd7e5653c796b2b113ca580bcc25ca3b/verification/starters-031.json" } diff --git a/docs/getting-started/node.md b/docs/getting-started/node.md index 94a75a5..d14aa7d 100644 --- a/docs/getting-started/node.md +++ b/docs/getting-started/node.md @@ -8,26 +8,20 @@ Fullbleed's optional Node package renders static HTML/CSS into PDFs using a bundled WebAssembly build of the Rust engine. It includes fonts and runs locally; you do not need Python, Rust, or a browser to use the installed package. -This guide uses **Node package 0.2.0**, powered by **Fullbleed 2.5.8**. The +This guide uses **Node package 0.3.1**, powered by **Fullbleed 2.5.10**. The integration and core engine have separate versions. -Version 0.2.0 adds optional process isolation for server applications. A failed -render child can reject its request while the caller keeps running. The engine -and default worker mode are unchanged from 0.1.5. +Version 0.3.1 corrects inline layout for letter-spaced text and short labels. +The downloadable invoice and report below use that engine. Optional process +isolation lets a failed render child reject its request while the caller keeps +running; see the server guidance below. -Version 0.1.5 fixes regular font selection when an italic face is registered first. Use the actual family name for normal/italic CSS selection, or a PostScript name for an explicit face. Review appearance and line breaks when upgrading; the -[font-family guide](../engine/font-registration.md) explains the change. +[font-family guide](../engine/font-registration.md) explains font selection. -The earlier 0.1.4 release compacted embedded font metadata. In its retained comparison, the -designed invoice below drops from **91,590 to 40,289 bytes** (56.0% smaller), and -the three-page report from **94,529 to 46,259 bytes** (51.1% smaller). Text and -page pixels match the previous release. The [seven-fixture font verification](https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.1.4/font-verification.json) -checks all bundled font faces and a custom math font. Savings vary by document. - -For rendering inside a web page, [use the browser entry and starter](../guides/browser-pdf.md) -in npm 0.3.0. This server guide and its downloads remain pinned to the verified 0.2.0 example. +For rendering inside a web page, [use the browser entry and starter](../guides/browser-pdf.md). +Both guides use the same published npm version. ## Create your first PDF @@ -37,7 +31,7 @@ With Node.js 22 or newer, install the [npm package](https://www.npmjs.com/packag npm install fullbleed ``` -To pin this guide's version, use `npm install --save-exact fullbleed@0.2.0`. +To pin this guide's version, use `npm install --save-exact fullbleed@0.3.1`. The npm package contains the same verified bytes as the GitHub release. Save this as `invoice.mjs` and run `node invoice.mjs`: @@ -95,7 +89,7 @@ of the finalized PDF. Fullbleed 2.5.5 fixes gradient fills that were missing fro these PNG previews in earlier releases. [Open the report PDF](../assets/node/report.pdf){ .md-button } -[Explore its HTML and CSS](https://github.com/fullbleed-engine/fullbleed-node/tree/v0.2.0/examples){ .md-button } +[Explore its HTML and CSS](https://github.com/fullbleed-engine/fullbleed-node/tree/v0.3.1/examples){ .md-button } ## Bring fonts and image assets @@ -106,7 +100,7 @@ in CSS. Pass images through `assets`, mapping relative names to `Buffer` or The engine uses an in-memory filesystem for the supplied inputs and does not fetch remote URLs. Data URIs also work for document images. The -[package API reference](https://github.com/fullbleed-engine/fullbleed-node/tree/v0.2.0#fonts-and-assets) +[package API reference](https://github.com/fullbleed-engine/fullbleed-node/tree/v0.3.1#fonts-and-assets) includes a complete font and asset example. ## Use it in an application @@ -156,7 +150,7 @@ Process startup adds latency and memory use. There is no process pool or automatic retry; keep concurrency bounded. Application startup flags and `NODE_OPTIONS` are not replayed in the child. This option requires a normal Node executable and is not an operating-system security sandbox. See the -[process isolation guide](https://github.com/fullbleed-engine/fullbleed-node/blob/v0.2.0/docs/process-isolation.md) +[process isolation guide](https://github.com/fullbleed-engine/fullbleed-node/blob/v0.3.1/docs/process-isolation.md) for deployment details and the tested failure paths. The Next.js starter uses this mode for its PDF route. @@ -181,17 +175,15 @@ TypeScript. Its release evidence compares retained native and WebAssembly fixtures and installs the same tarball across Node 22, 24, and 26 on Windows, Linux, and macOS. These are scoped engineering checks, not PDF standards certification. -The [npm publication record](https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.2.0/npm-publication-0.2.0.json) -confirms the registry tarball matches that release. A fresh registry install on -Windows / Node 22 reproduces its PDF/PNG hashes, including ESM/CommonJS and -recovery after a cold timeout. The process consumer also forbids parent -WebAssembly and render workers, checks that application preloads stay out of -children, forces a child termination, and renders again. The release's CI -checks retain seven embedded-font fixtures and ten custom-family cases with -independent font, text, and page-pixel checks. -[Inspect the family-selection evidence](https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.2.0/font-family-verification.json). +The [public-install verification](https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.3.1/npm-public-verification.json) +records the registry tarball hash, checks its installed files, and exercises +24 inline-layout cases using worker and process isolation. The +[release verification](https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.3.1/release-verification.json) +retains native/Wasm comparisons, font checks, browser downloads, and failure +recovery. The invoice and report on this page match the reviewed 2.5.10 layout; +the [download manifest](../assets/node/project.json) records their exact hashes. [Package source and API](https://github.com/fullbleed-engine/fullbleed-node) · [npm package](https://www.npmjs.com/package/fullbleed) · -[Versioned release and evidence](https://github.com/fullbleed-engine/fullbleed-node/releases/tag/v0.2.0) · +[Versioned release and evidence](https://github.com/fullbleed-engine/fullbleed-node/releases/tag/v0.3.1) · [CSS coverage](../css-coverage.md) · [Examples](../examples.md) diff --git a/docs/guides/browser-pdf.md b/docs/guides/browser-pdf.md index 10d57ca..c4f8235 100644 --- a/docs/guides/browser-pdf.md +++ b/docs/guides/browser-pdf.md @@ -17,7 +17,7 @@ Change the customer, reference, and ink color, or open **Edit the HTML & CSS** t paste your own template. Generate a preview, then download the actual PDF. All sample names, organizations, and amounts are fictional. -This guide uses **npm package 0.3.0**, wrapping **Fullbleed engine 2.5.8**. +This guide uses **npm package 0.3.1**, wrapping **Fullbleed engine 2.5.10**. The browser and Node entries share the pinned engine and bundled fonts. ## Run the starter @@ -46,7 +46,7 @@ Install the package and copy its runtime into the directory your framework serves as static files: ```sh -npm install --save-exact fullbleed@0.3.0 +npm install --save-exact fullbleed@0.3.1 npx fullbleed-browser-assets public/fullbleed ``` @@ -110,7 +110,7 @@ completion or cancellation requests worker termination before the promise settle Browsers do not expose a native thread-exit promise. Keep concurrent jobs bounded for the devices you support, especially when generating page previews. -The [0.3.0 release evidence](https://github.com/fullbleed-engine/fullbleed-node/releases/tag/v0.3.0) +The [0.3.1 release evidence](https://github.com/fullbleed-engine/fullbleed-node/releases/tag/v0.3.1) retains checks in Chrome, Firefox, and Playwright WebKit, including PDF/PNG comparison with the installed Node package, independent PDF text checks, cancellation, damaged assets, and recovery. Playwright WebKit is not branded diff --git a/docs/guides/nextjs-pdf.md b/docs/guides/nextjs-pdf.md index 8b2656d..4cedfd9 100644 --- a/docs/guides/nextjs-pdf.md +++ b/docs/guides/nextjs-pdf.md @@ -34,8 +34,8 @@ Open `http://127.0.0.1:3000` and select **Download sample PDF**. The route `/api/invoices/NS-1042` returns the invoice as an attachment. The browser stays on the starter page. Use `npm run dev` while editing the app. -The lockfile pins Next.js 16.3.8, React 19.3.0 and Fullbleed Node 0.2.0, powered -by engine 2.5.8. Fullbleed is installed from npm. The registry tarball is +The lockfile pins Next.js 16.3.8, React 19.3.0 and Fullbleed Node 0.3.1, powered +by engine 2.5.10. Fullbleed is installed from npm. The registry tarball is byte-identical to the verified GitHub release. For an existing Node application, start with the [Node.js quickstart](../getting-started/node.md). diff --git a/docs/guides/react-pdf.md b/docs/guides/react-pdf.md index 24a1c0f..e96eef1 100644 --- a/docs/guides/react-pdf.md +++ b/docs/guides/react-pdf.md @@ -10,7 +10,7 @@ or an HTML/CSS template and the actual PDF updates after a short pause. The engine renders in a browser worker; this starter needs no PDF server or account. [Open the React demo](../assets/react-demo/index.html){ .md-button .md-button--primary } -[Edit source online](https://stackblitz.com/github/fullbleed-engine/fullbleed-node/tree/bbb140f115a69ad77fc54bb9b5be2e908b7b6669/examples/react?startScript=dev){ .md-button } +[Edit source online](https://stackblitz.com/github/fullbleed-engine/fullbleed-node/tree/7da8faa0dd7e5653c796b2b113ca580bcc25ca3b/examples/react?startScript=dev){ .md-button } [Download the React project](../assets/react-starter/project.zip){ .md-button } The project includes a designed invoice, a three-page report, a React form and @@ -47,7 +47,7 @@ color and wait for **Ready**. **Download PDF** saves the generated document. Turn off **Update automatically** to generate only when you choose **Generate PDF**. **Cancel** stops a pending preview or active render. -The lockfile pins Fullbleed npm **0.3.0** / engine **2.5.8**, React **19.3.0**, +The lockfile pins Fullbleed npm **0.3.1** / engine **2.5.10**, React **19.3.0**, TypeScript **7.0.2**, and Vite **8.3.2**. The ZIP includes its source and lockfile; the build downloads the published dependencies and copies their verified runtime. @@ -78,7 +78,7 @@ through the SDK's `fonts` and `assets` options. Install the package and copy its runtime into your app's static directory: ```sh -npm install --save-exact fullbleed@0.3.0 +npm install --save-exact fullbleed@0.3.1 npx fullbleed-browser-assets public/fullbleed ``` diff --git a/examples/node/.gitignore b/examples/node/.gitignore new file mode 100644 index 0000000..e0e6e61 --- /dev/null +++ b/examples/node/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +output/ diff --git a/examples/node/README.md b/examples/node/README.md index a7ca99d..b7474a8 100644 --- a/examples/node/README.md +++ b/examples/node/README.md @@ -1,7 +1,7 @@ # A designed invoice from Node.js -This fictional Northstar Studio invoice uses Fullbleed's Node package 0.2.0, -which bundles the Fullbleed 2.5.8 engine and Inter, DM Serif Display, and Bebas +This fictional Northstar Studio invoice uses Fullbleed's Node package 0.3.1, +which bundles the Fullbleed 2.5.10 engine and Inter, DM Serif Display, and Bebas Neue fonts. You need Node.js 22 or newer; no Python or Rust installation is needed. ```bash @@ -13,7 +13,7 @@ Open `output/invoice/invoice.pdf` and `output/invoice/page-1.png`. Change the `customer` value in `render.mjs`; the script escapes it before insertion into HTML. Edit `invoice.html` and `invoice.css` for your own layout and data. -The lockfile pins Fullbleed 0.2.0 from npm and its integrity hash. +The lockfile pins Fullbleed 0.3.1 from npm and its integrity hash. The package renders locally; it does not upload documents to a service. The sample and engine are MIT licensed. The package retains the bundled font diff --git a/examples/node/package-lock.json b/examples/node/package-lock.json index 5ea1372..f2bc510 100644 --- a/examples/node/package-lock.json +++ b/examples/node/package-lock.json @@ -8,7 +8,7 @@ "name": "fullbleed-node-invoice", "version": "1.0.0", "dependencies": { - "fullbleed": "0.2.0" + "fullbleed": "0.3.1" }, "engines": { "node": ">=22" @@ -21,13 +21,16 @@ "license": "MIT OR Apache-2.0" }, "node_modules/fullbleed": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fullbleed/-/fullbleed-0.2.0.tgz", - "integrity": "sha512-7khp008/oaJxMbroCQuv82ICOnJVQ1RUgYsOZWAqcW92qjKEAVzRK80UZDIJkNWcaMh1yDdTR8BJ5PAFc3QbnA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fullbleed/-/fullbleed-0.3.1.tgz", + "integrity": "sha512-95CVTnYKduXD5KcEj9MLfzPsqofahZB2BsJ62Dfg0tOTlPFEHT8vx/T3f8xp4VQYkihOPQdMDiWQzYNHJkLpWA==", "license": "MIT", "dependencies": { "@bjorn3/browser_wasi_shim": "0.4.2" }, + "bin": { + "fullbleed-browser-assets": "src/copy-browser-assets.cjs" + }, "engines": { "node": ">=22" } diff --git a/examples/node/package.json b/examples/node/package.json index e301e82..e82f3e4 100644 --- a/examples/node/package.json +++ b/examples/node/package.json @@ -10,6 +10,6 @@ "node": ">=22" }, "dependencies": { - "fullbleed": "0.2.0" + "fullbleed": "0.3.1" } } diff --git a/examples/node/source.json b/examples/node/source.json index 60c83fc..e0d8ee6 100644 --- a/examples/node/source.json +++ b/examples/node/source.json @@ -1,13 +1,13 @@ { - "package_version": "0.2.0", - "engine_version": "2.5.8", - "source_commit": "969f23c479cd02f366cc1d2e099b6bda19dfaac9", - "package_url": "https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.2.0/fullbleed-0.2.0.tgz", - "package_integrity": "sha512-7khp008/oaJxMbroCQuv82ICOnJVQ1RUgYsOZWAqcW92qjKEAVzRK80UZDIJkNWcaMh1yDdTR8BJ5PAFc3QbnA==", - "package_sha256": "90bd0bbf4ae542b6be1deb3103ba492b9d8675e47b71f895060b40419d705f4a", + "package_version": "0.3.1", + "engine_version": "2.5.10", + "source_commit": "9675fdf065e6119a5d9dda877038b868b7c03ff9", + "package_url": "https://github.com/fullbleed-engine/fullbleed-node/releases/download/v0.3.1/fullbleed-0.3.1.tgz", + "package_integrity": "sha512-95CVTnYKduXD5KcEj9MLfzPsqofahZB2BsJ62Dfg0tOTlPFEHT8vx/T3f8xp4VQYkihOPQdMDiWQzYNHJkLpWA==", + "package_sha256": "919cc5b49a82641c7105af782e6a1f28f592849d6a04e866f74e8158c2cd3864", "rendered": { - "invoice.pdf": "9d93174ed961bb2ef577f5f38d2836763b414edc53365f1a9c61e2b50d40f054", - "invoice.png": "b76f6db748fb47b928c93c12fe788de94a0f5d8da4bb350f644a58705c163cf7" + "invoice.pdf": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", + "invoice.png": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7" }, "quickstart": { "invoice.pdf": "1486fd3a94f088196e8f70687df0f16a33782c138466a5626cddc46e69f5e419", @@ -17,7 +17,7 @@ "license": "MIT", "verification_scope": "Reviewed invoice and quickstart, installed from the published npm package. No PDF standards certification.", "report": { - "report.pdf": "cbe463b5759957261dc41aadd8727f8d01485e405c2e2841c9b34c0289876c10", - "report-2.png": "3e31e42b3c7cac8b01633e5675cb1446feec553afb392d4d6a7b73f8c8582ad9" + "report.pdf": "139df89824e6a73c13ff62f1237bb8eb9f71e790dcbd051b1bb713ed2bc47802", + "report-2.png": "c8fe5102e9219962ea068201be0a6730cb37de797649f4b5f44478433e79b018" } } diff --git a/tools/build_browser_starter.py b/tools/build_browser_starter.py index c9969a8..ab84ce6 100644 --- a/tools/build_browser_starter.py +++ b/tools/build_browser_starter.py @@ -44,7 +44,7 @@ project = workspace / 'fullbleed-browser-starter' package = json.loads((project / 'package.json').read_text()) lock = json.loads((project / 'package-lock.json').read_text()) -assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.0' +assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.1' assert package['devDependencies']['vite'] == '8.3.2' assert lock['packages']['node_modules/fullbleed']['integrity'] == manifest['package_integrity'] assert lock['packages']['node_modules/fullbleed']['resolved'].startswith('https://registry.npmjs.org/') @@ -59,7 +59,7 @@ installed = project / 'node_modules/fullbleed' assert json.loads((installed / 'package.json').read_text())['version'] == manifest['package_version'] runtime = json.loads((project / 'dist/fullbleed/build.json').read_text()) -assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.8' +assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.10' for name, expected in runtime['files'].items(): value = (project / 'dist/fullbleed' / name).read_bytes() assert len(value) == expected['bytes'] and digest(value) == expected['sha256'] diff --git a/tools/build_react_starter.py b/tools/build_react_starter.py index 69c8bb8..70f122e 100644 --- a/tools/build_react_starter.py +++ b/tools/build_react_starter.py @@ -44,7 +44,7 @@ project = workspace / 'fullbleed-react-starter' package = json.loads((project / 'package.json').read_text()) lock = json.loads((project / 'package-lock.json').read_text()) -assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.0' +assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.1' assert package['devDependencies']['vite'] == '8.3.2' assert package['dependencies']['react'] == package['dependencies']['react-dom'] == manifest['react_version'] assert lock['packages']['node_modules/fullbleed']['integrity'] == manifest['package_integrity'] @@ -60,7 +60,7 @@ installed = project / 'node_modules/fullbleed' assert json.loads((installed / 'package.json').read_text())['version'] == manifest['package_version'] runtime = json.loads((project / 'dist/fullbleed/build.json').read_text()) -assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.8' +assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.10' for name, expected in runtime['files'].items(): value = (project / 'dist/fullbleed' / name).read_bytes() assert len(value) == expected['bytes'] and digest(value) == expected['sha256'] diff --git a/tools/verify_nextjs_starter.py b/tools/verify_nextjs_starter.py index e3362bc..0479357 100644 --- a/tools/verify_nextjs_starter.py +++ b/tools/verify_nextjs_starter.py @@ -40,6 +40,7 @@ with zipfile.ZipFile(assets / "project.zip") as archive: names = archive.namelist() assert len(names) == len(set(names)) == manifest["files"] + assert set(names) == set(manifest["fileHashes"]) for entry in archive.infolist(): relative = PurePosixPath(entry.filename) assert not relative.is_absolute() and ".." not in relative.parts @@ -47,6 +48,7 @@ assert relative.parts[0] == "fullbleed-nextjs" and len(relative.parts) > 1 assert not entry.is_dir() and entry.file_size <= 10 * 1024 * 1024 assert (entry.external_attr >> 16) & 0o170000 != 0o120000, "No symlinks" + assert digest(archive.read(entry)) == manifest["fileHashes"][entry.filename] destination = workspace.joinpath(*relative.parts).resolve() assert destination.is_relative_to(workspace) destination.parent.mkdir(parents=True, exist_ok=True) @@ -77,6 +79,8 @@ def run(label, arguments): assert preview["pages"] == 1 and preview["missingGlyphs"] == 0 assert len(verification["checks"]) == 17 and all(item["passed"] for item in verification["checks"]) assert verification["isolation"] == "process" +assert verification["nodePackage"] == manifest["packageVersion"] +assert verification["engineVersion"] == manifest["engineVersion"] for actual, expected in [("output/invoice.pdf", "invoice.pdf"), ("output/route.pdf", "invoice.pdf"), ("public/invoice.png", "invoice.png")]: