@kumwe/studio-preview 0.1.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,29 @@
1
+ import { type CanonicalSerializationOptions } from '@kumwe/studio-core';
2
+ import type { BlueprintDocument, NodeId, StableId, StudioArtifact } from '@kumwe/studio-protocol';
3
+ export interface PreviewDigestOptions extends CanonicalSerializationOptions {
4
+ /** Web Crypto implementation used to hash the canonical bytes. */
5
+ subtle?: Pick<SubtleCrypto, 'digest'>;
6
+ }
7
+ export interface PreviewMarkerInventory {
8
+ markerMap: Record<StableId, NodeId>;
9
+ markers: StableId[];
10
+ }
11
+ /**
12
+ * Return the exact digest preimage for a complete, schema-valid Studio draft.
13
+ * No transport envelope, prefix, BOM, viewport, revision override, or trailing
14
+ * newline is added: the preimage is only the canonical UTF-8 artifact bytes.
15
+ * The authoritative host MUST schema- and semantics-validate the artifact
16
+ * before treating this helper's result as a valid draft identity.
17
+ */
18
+ export declare function canonicalPreviewDraftBytes(draft: StudioArtifact, options?: Readonly<CanonicalSerializationOptions>): Uint8Array;
19
+ /** Compute the lowercase SHA-256 hex identity of a complete Studio draft. */
20
+ export declare function computePreviewDraftDigest(draft: StudioArtifact, options?: Readonly<PreviewDigestOptions>): Promise<string>;
21
+ /** Create the canonical marker for one zero-based Blueprint preorder ordinal. */
22
+ export declare function createPreviewMarker(draftDigest: string, ordinal: number): StableId;
23
+ /**
24
+ * Build the portable marker inventory for a Blueprint. Traversal is roots in
25
+ * array order, each node before descendants, slot names in ascending UTF-16
26
+ * code-unit order, and children in array order. Node ids must be unique.
27
+ */
28
+ export declare function createPreviewMarkerInventory(draft: BlueprintDocument, draftDigest: string): PreviewMarkerInventory;
29
+ //# sourceMappingURL=preview-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-identity.d.ts","sourceRoot":"","sources":["../src/preview-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EACV,iBAAiB,EAGjB,MAAM,EACN,QAAQ,EACR,cAAc,EACf,MAAM,wBAAwB,CAAC;AAKhC,MAAM,WAAW,oBAAqB,SAAQ,6BAA6B;IACzE,kEAAkE;IAClE,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,QAAQ,CAAC,6BAA6B,CAAM,GACpD,UAAU,CAEZ;AAED,6EAA6E;AAC7E,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,QAAQ,CAAC,oBAAoB,CAAM,GAC3C,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAQlF;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,MAAM,GAClB,sBAAsB,CA4BxB"}
@@ -0,0 +1,61 @@
1
+ import { canonicalUtf8Bytes } from '@kumwe/studio-core';
2
+ const draftDigestPattern = /^[0-9a-f]{64}$/u;
3
+ const maximumMarkerOrdinal = 99_999;
4
+ /**
5
+ * Return the exact digest preimage for a complete, schema-valid Studio draft.
6
+ * No transport envelope, prefix, BOM, viewport, revision override, or trailing
7
+ * newline is added: the preimage is only the canonical UTF-8 artifact bytes.
8
+ * The authoritative host MUST schema- and semantics-validate the artifact
9
+ * before treating this helper's result as a valid draft identity.
10
+ */
11
+ export function canonicalPreviewDraftBytes(draft, options = {}) {
12
+ return canonicalUtf8Bytes(draft, options);
13
+ }
14
+ /** Compute the lowercase SHA-256 hex identity of a complete Studio draft. */
15
+ export async function computePreviewDraftDigest(draft, options = {}) {
16
+ const subtle = options.subtle ?? globalThis.crypto.subtle;
17
+ const serializationOptions = options.maximumDepth === undefined ? {} : { maximumDepth: options.maximumDepth };
18
+ const preimage = Uint8Array.from(canonicalPreviewDraftBytes(draft, serializationOptions));
19
+ const digest = await subtle.digest('SHA-256', preimage);
20
+ return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');
21
+ }
22
+ /** Create the canonical marker for one zero-based Blueprint preorder ordinal. */
23
+ export function createPreviewMarker(draftDigest, ordinal) {
24
+ if (!draftDigestPattern.test(draftDigest)) {
25
+ throw new TypeError('Preview draft digest must be 64 lowercase hexadecimal characters.');
26
+ }
27
+ if (!Number.isSafeInteger(ordinal) || ordinal < 0 || ordinal > maximumMarkerOrdinal) {
28
+ throw new RangeError(`Preview marker ordinal must be between 0 and ${maximumMarkerOrdinal}.`);
29
+ }
30
+ return `studio.preview/node/${draftDigest}/${ordinal}`;
31
+ }
32
+ /**
33
+ * Build the portable marker inventory for a Blueprint. Traversal is roots in
34
+ * array order, each node before descendants, slot names in ascending UTF-16
35
+ * code-unit order, and children in array order. Node ids must be unique.
36
+ */
37
+ export function createPreviewMarkerInventory(draft, draftDigest) {
38
+ const markerMap = {};
39
+ const markers = [];
40
+ const nodeIds = new Set();
41
+ const visit = (node) => {
42
+ if (nodeIds.has(node.id)) {
43
+ throw new TypeError(`Preview marker inventory cannot contain duplicate node id ${node.id}.`);
44
+ }
45
+ nodeIds.add(node.id);
46
+ const marker = createPreviewMarker(draftDigest, markers.length);
47
+ markers.push(marker);
48
+ markerMap[marker] = node.id;
49
+ const slots = Object.entries(node.slots).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0);
50
+ for (const [, children] of slots) {
51
+ for (const child of children) {
52
+ visit(child);
53
+ }
54
+ }
55
+ };
56
+ for (const root of draft.roots) {
57
+ visit(root);
58
+ }
59
+ return { markerMap, markers };
60
+ }
61
+ //# sourceMappingURL=preview-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-identity.js","sourceRoot":"","sources":["../src/preview-identity.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@kumwe/studio-preview",
3
+ "version": "0.1.0-alpha.10",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/kumwe/studio.git",
7
+ "directory": "packages/preview"
8
+ },
9
+ "homepage": "https://github.com/kumwe/studio/tree/main/packages/preview#readme",
10
+ "bugs": "https://github.com/kumwe/studio/issues",
11
+ "description": "Origin-bound request channel for server-rendered Studio previews.",
12
+ "type": "module",
13
+ "sideEffects": false,
14
+ "files": [
15
+ "LICENSE",
16
+ "THIRD_PARTY_NOTICES.md",
17
+ "third-party-licenses",
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -b"
29
+ },
30
+ "dependencies": {
31
+ "@kumwe/studio-core": "0.1.0-alpha.10",
32
+ "@kumwe/studio-protocol": "0.1.0-alpha.10"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public",
36
+ "provenance": true
37
+ },
38
+ "license": "MIT",
39
+ "engines": {
40
+ "node": ">=24.0.0"
41
+ }
42
+ }