@dev.fast/review-share-protocol 0.1.1

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,63 @@
1
+ import { z } from "zod";
2
+ export declare const SHARE_FORMAT = "review-share/1";
3
+ export declare const MAX_SHARE_MANIFEST_BYTES: number;
4
+ export declare const MAX_SHARE_OBJECT_BYTES: number;
5
+ export declare const MAX_SHARE_BYTES: number;
6
+ export declare const MAX_SHARE_OBJECTS = 2048;
7
+ export declare const objectIdSchema: z.ZodString;
8
+ export declare const shareIdSchema: z.ZodUUID;
9
+ export declare const capabilitySchema: z.ZodString;
10
+ export declare const shareObjectSchema: z.ZodObject<{
11
+ id: z.ZodString;
12
+ size: z.ZodNumber;
13
+ sha256: z.ZodString;
14
+ }, z.core.$strict>;
15
+ export declare const sharePathSchema: z.ZodString;
16
+ /** The published identity is independent of the author's credential transport. */
17
+ export declare function normalizeGitHubRemote(remote: string): string;
18
+ export declare const gitHubRepositoryUrlSchema: z.ZodString;
19
+ export declare const shareManifestSchema: z.ZodObject<{
20
+ format: z.ZodLiteral<"review-share/1">;
21
+ reviewId: z.ZodString;
22
+ version: z.ZodNumber;
23
+ title: z.ZodString;
24
+ snapshot: z.ZodString;
25
+ presentation: z.ZodString;
26
+ objects: z.ZodArray<z.ZodObject<{
27
+ id: z.ZodString;
28
+ size: z.ZodNumber;
29
+ sha256: z.ZodString;
30
+ }, z.core.$strict>>;
31
+ resources: z.ZodArray<z.ZodObject<{
32
+ id: z.ZodString;
33
+ kind: z.ZodEnum<{
34
+ image: "image";
35
+ map: "map";
36
+ trace: "trace";
37
+ }>;
38
+ mimeType: z.ZodEnum<{
39
+ "application/json": "application/json";
40
+ "image/png": "image/png";
41
+ }>;
42
+ object: z.ZodString;
43
+ }, z.core.$strict>>;
44
+ repository: z.ZodObject<{
45
+ cloneUrl: z.ZodString;
46
+ }, z.core.$strict>;
47
+ }, z.core.$strict>;
48
+ export type ShareManifest = z.infer<typeof shareManifestSchema>;
49
+ export type ShareObject = z.infer<typeof shareObjectSchema>;
50
+ export declare const createShareSchema: z.ZodObject<{
51
+ requestId: z.ZodUUID;
52
+ manifest: z.ZodObject<{
53
+ sha256: z.ZodString;
54
+ size: z.ZodNumber;
55
+ }, z.core.$strict>;
56
+ }, z.core.$strict>;
57
+ export declare function shareLink(origin: string, id: string, capability: string): string;
58
+ export declare function parseShareLink(value: string): {
59
+ origin: string;
60
+ shareId: string;
61
+ capability: string;
62
+ };
63
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY,mBAAmB,CAAC;AAE7C,eAAO,MAAM,wBAAwB,QAAkB,CAAC;AAExD,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AAEvD,eAAO,MAAM,eAAe,QAAoB,CAAC;AAEjD,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,eAAO,MAAM,cAAc,aAAqC,CAAC;AAEjE,eAAO,MAAM,aAAa,WAAW,CAAC;AAEtC,eAAO,MAAM,gBAAgB,aAA0C,CAAC;AAExE,eAAO,MAAM,iBAAiB;;;;kBAS3B,CAAC;AAEJ,eAAO,MAAM,eAAe,aAazB,CAAC;AAEJ,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA8B5D;AAED,eAAO,MAAM,yBAAyB,aAMgC,CAAC;AAEvE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmD5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,iBAAiB;;;;;;kBAM5B,CAAC;AAEH,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM;IAQxC,MAAM;IACN,OAAO;IACP,UAAU;EAEb"}
package/dist/index.js ADDED
@@ -0,0 +1,116 @@
1
+ import { z } from "zod";
2
+ export const SHARE_FORMAT = "review-share/1";
3
+ export const MAX_SHARE_MANIFEST_BYTES = 2 * 1024 * 1024;
4
+ export const MAX_SHARE_OBJECT_BYTES = 32 * 1024 * 1024;
5
+ export const MAX_SHARE_BYTES = 128 * 1024 * 1024;
6
+ export const MAX_SHARE_OBJECTS = 2048;
7
+ export const objectIdSchema = z.string().regex(/^[a-f0-9]{64}$/);
8
+ export const shareIdSchema = z.uuid();
9
+ export const capabilitySchema = z.string().regex(/^[A-Za-z0-9_-]{43}$/);
10
+ export const shareObjectSchema = z
11
+ .strictObject({
12
+ id: objectIdSchema,
13
+ size: z.number().int().min(0).max(MAX_SHARE_OBJECT_BYTES),
14
+ sha256: objectIdSchema,
15
+ })
16
+ .refine((object) => object.id === object.sha256, "Object ID must match its digest.");
17
+ export const sharePathSchema = z
18
+ .string()
19
+ .min(1)
20
+ .max(4096)
21
+ .refine((file) => !file.startsWith("/") &&
22
+ !file.includes("\\") &&
23
+ !/[\u0000-\u001f\u007f]/.test(file) &&
24
+ file
25
+ .split("/")
26
+ .every((part) => part !== "" && part !== "." && part !== ".."), "Use a repository-relative file path.");
27
+ /** The published identity is independent of the author's credential transport. */
28
+ export function normalizeGitHubRemote(remote) {
29
+ const url = new URL(remote.trim().replace(/^git@github\.com:/, "https://github.com/"));
30
+ if (!["https:", "ssh:"].includes(url.protocol) ||
31
+ url.hostname !== "github.com" ||
32
+ url.port ||
33
+ url.search ||
34
+ url.hash ||
35
+ (url.protocol === "ssh:" && url.username !== "git"))
36
+ throw new Error("Sharing requires a GitHub repository remote.");
37
+ const parts = url.pathname
38
+ .replace(/\.git$/, "")
39
+ .split("/")
40
+ .slice(1);
41
+ if (parts.length !== 2 ||
42
+ parts.some((part) => !/^[A-Za-z0-9_.-]+$/.test(part) || part === "." || part === ".."))
43
+ throw new Error("Sharing requires a GitHub repository remote.");
44
+ return `https://github.com/${parts.join("/")}.git`;
45
+ }
46
+ export const gitHubRepositoryUrlSchema = z.string().refine((value) => {
47
+ try {
48
+ return normalizeGitHubRemote(value) === value;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }, "Use a canonical GitHub HTTPS repository URL without credentials.");
54
+ export const shareManifestSchema = z
55
+ .strictObject({
56
+ format: z.literal(SHARE_FORMAT),
57
+ reviewId: z.string().min(1).max(256),
58
+ version: z.number().int().nonnegative(),
59
+ title: z.string().min(1).max(4096),
60
+ snapshot: objectIdSchema,
61
+ presentation: objectIdSchema,
62
+ objects: z.array(shareObjectSchema).min(2).max(MAX_SHARE_OBJECTS),
63
+ resources: z
64
+ .array(z.strictObject({
65
+ id: z.string().min(1).max(256),
66
+ kind: z.enum(["image", "trace", "map"]),
67
+ mimeType: z.enum(["image/png", "application/json"]),
68
+ object: objectIdSchema,
69
+ }))
70
+ .max(MAX_SHARE_OBJECTS),
71
+ repository: z.strictObject({ cloneUrl: gitHubRepositoryUrlSchema }),
72
+ })
73
+ .superRefine((manifest, context) => {
74
+ const ids = new Set(manifest.objects.map((object) => object.id));
75
+ const fail = (message) => context.addIssue({ code: "custom", message });
76
+ if (ids.size !== manifest.objects.length)
77
+ fail("Duplicate object ID.");
78
+ if (manifest.objects.reduce((size, object) => size + object.size, 0) >
79
+ MAX_SHARE_BYTES)
80
+ fail("Share exceeds the total byte limit.");
81
+ for (const id of [
82
+ manifest.snapshot,
83
+ manifest.presentation,
84
+ ...manifest.resources.map((resource) => resource.object),
85
+ ])
86
+ if (!ids.has(id))
87
+ fail("Reference to an undeclared object.");
88
+ if (new Set(manifest.resources.map((resource) => resource.id)).size !==
89
+ manifest.resources.length)
90
+ fail("Duplicate resource ID.");
91
+ for (const resource of manifest.resources)
92
+ if ((resource.kind === "image") !== (resource.mimeType === "image/png"))
93
+ fail("Resource MIME type does not match its kind.");
94
+ });
95
+ export const createShareSchema = z.strictObject({
96
+ requestId: z.uuid(),
97
+ manifest: z.strictObject({
98
+ sha256: objectIdSchema,
99
+ size: z.number().int().positive().max(MAX_SHARE_MANIFEST_BYTES),
100
+ }),
101
+ });
102
+ export function shareLink(origin, id, capability) {
103
+ return new URL(`/s/${shareIdSchema.parse(id)}#${capabilitySchema.parse(capability)}`, origin).href;
104
+ }
105
+ export function parseShareLink(value) {
106
+ const url = new URL(value);
107
+ if (url.protocol !== "https:" || url.username || url.password || url.search)
108
+ throw new Error("Use an HTTPS Review share link.");
109
+ const match = /^\/s\/([^/]+)$/.exec(url.pathname);
110
+ return {
111
+ origin: url.origin,
112
+ shareId: shareIdSchema.parse(match?.[1]),
113
+ capability: capabilitySchema.parse(url.hash.slice(1)),
114
+ };
115
+ }
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@dev.fast/review-share-protocol",
3
+ "version": "0.1.1",
4
+ "description": "Portable immutable Review sharing envelope.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/devdotfast/review.git",
9
+ "directory": "packages/review-share-protocol"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js",
19
+ "default": "./dist/index.js"
20
+ }
21
+ },
22
+ "publishConfig": {
23
+ "access": "public",
24
+ "registry": "https://registry.npmjs.org"
25
+ },
26
+ "scripts": {
27
+ "build": "pnpm -w exec tsc -p packages/review-share-protocol/tsconfig.build.json",
28
+ "test": "vitest run --config vitest.config.ts",
29
+ "typecheck": "pnpm -w exec tsc -p packages/review-share-protocol/tsconfig.json --noEmit",
30
+ "prepublishOnly": "pnpm run build && pnpm run test"
31
+ },
32
+ "dependencies": {
33
+ "zod": "4.4.3"
34
+ },
35
+ "devDependencies": {
36
+ "vitest": "^4.1.11"
37
+ },
38
+ "engines": {
39
+ "node": ">=22"
40
+ }
41
+ }