@certrev/cert-block 1.3.0 → 2.0.0

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.
Files changed (73) hide show
  1. package/CHANGELOG.md +167 -0
  2. package/README.md +125 -9
  3. package/dist/builder/card-contract.d.ts +143 -0
  4. package/dist/builder/card-contract.d.ts.map +1 -0
  5. package/dist/builder/card-contract.js +262 -0
  6. package/dist/builder/card-contract.js.map +1 -0
  7. package/dist/builder/card-report.d.ts +37 -0
  8. package/dist/builder/card-report.d.ts.map +1 -0
  9. package/dist/builder/card-report.js +43 -0
  10. package/dist/builder/card-report.js.map +1 -0
  11. package/dist/builder/cert-review-card.d.ts +7 -5
  12. package/dist/builder/cert-review-card.d.ts.map +1 -1
  13. package/dist/builder/cert-review-card.js +163 -19
  14. package/dist/builder/cert-review-card.js.map +1 -1
  15. package/dist/builder/contract-card.d.ts +53 -0
  16. package/dist/builder/contract-card.d.ts.map +1 -0
  17. package/dist/builder/contract-card.js +141 -0
  18. package/dist/builder/contract-card.js.map +1 -0
  19. package/dist/builder/delivered-face.d.ts +9 -0
  20. package/dist/builder/delivered-face.d.ts.map +1 -1
  21. package/dist/builder/delivered-face.js +18 -5
  22. package/dist/builder/delivered-face.js.map +1 -1
  23. package/dist/builder/delivery-runtime.d.ts +15 -1
  24. package/dist/builder/delivery-runtime.d.ts.map +1 -1
  25. package/dist/builder/delivery-runtime.js +24 -1
  26. package/dist/builder/delivery-runtime.js.map +1 -1
  27. package/dist/builder/index.d.ts +3 -0
  28. package/dist/builder/index.d.ts.map +1 -1
  29. package/dist/builder/index.js +4 -0
  30. package/dist/builder/index.js.map +1 -1
  31. package/dist/builder/ssr-seed.d.ts +18 -0
  32. package/dist/builder/ssr-seed.d.ts.map +1 -1
  33. package/dist/builder/ssr-seed.js +25 -3
  34. package/dist/builder/ssr-seed.js.map +1 -1
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/reader/reader-css.generated.d.ts +1 -1
  40. package/dist/reader/reader-css.generated.d.ts.map +1 -1
  41. package/dist/reader/reader-css.generated.js +1 -1
  42. package/dist/reader/reader-css.generated.js.map +1 -1
  43. package/dist/reader/render.d.ts.map +1 -1
  44. package/dist/reader/render.js +71 -34
  45. package/dist/reader/render.js.map +1 -1
  46. package/dist/reader/tokens.d.ts +2 -0
  47. package/dist/reader/tokens.d.ts.map +1 -1
  48. package/dist/reader/tokens.js +28 -6
  49. package/dist/reader/tokens.js.map +1 -1
  50. package/dist/verify/get-verified-delivery.d.ts +28 -0
  51. package/dist/verify/get-verified-delivery.d.ts.map +1 -1
  52. package/dist/verify/get-verified-delivery.js +21 -2
  53. package/dist/verify/get-verified-delivery.js.map +1 -1
  54. package/dist/verify/key-set.d.ts +67 -0
  55. package/dist/verify/key-set.d.ts.map +1 -0
  56. package/dist/verify/key-set.js +190 -0
  57. package/dist/verify/key-set.js.map +1 -0
  58. package/package.json +115 -112
  59. package/src/builder/card-contract.ts +314 -0
  60. package/src/builder/card-report.ts +61 -0
  61. package/src/builder/cert-review-card.tsx +239 -25
  62. package/src/builder/contract-card.tsx +159 -0
  63. package/src/builder/delivered-face.ts +18 -4
  64. package/src/builder/delivery-runtime.ts +30 -1
  65. package/src/builder/index.tsx +12 -0
  66. package/src/builder/ssr-seed.ts +32 -3
  67. package/src/index.ts +9 -0
  68. package/src/reader/reader-css.generated.ts +1 -1
  69. package/src/reader/reader.css +297 -2
  70. package/src/reader/render.ts +87 -38
  71. package/src/reader/tokens.ts +29 -6
  72. package/src/verify/get-verified-delivery.ts +41 -2
  73. package/src/verify/key-set.ts +225 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-set.d.ts","sourceRoot":"","sources":["../../src/verify/key-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAGN,KAAK,qBAAqB,EAE1B,KAAK,qBAAqB,EAC1B,MAAM,uBAAuB,CAAA;AAI9B,6CAA6C;AAC7C,eAAO,MAAM,YAAY,sBAAsB,CAAA;AAE/C,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAA;IACb,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnG;AAED,iGAAiG;AACjG,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;CACzD;AA4BD;;;GAGG;AACH,wBAAsB,YAAY,CACjC,IAAI,EAAE,OAAO,EACb,eAAe,EAAE,qBAAqB,EACtC,QAAQ,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA2ChC;AAED,MAAM,WAAW,qBAAqB;IACrC,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,qDAAqD;IACrD,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAA;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,KAAK,CAAA;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AA+DD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,qBAAqB,CASjF;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * ─────────────────────────────────────────────────────────────────────────────
3
+ * The issuer key SET a card trusts (2.0.0): baked keys first, then CertREV's signed published set
4
+ * ─────────────────────────────────────────────────────────────────────────────
5
+ *
6
+ * Through 1.3.x the Builder card trusted exactly one baked key (`cert-issuer-1`), so a key rotation would have needed
7
+ * every brand to install a new package. 2.0 trusts a SET without adding a trust root:
8
+ *
9
+ * 1. A kid the package bakes resolves to the baked key, always (a published set never overrides a baked key).
10
+ * 2. Any other kid makes ONE read of the delivery origin's published key set, `GET <origin>/api/cert/v1/keys`
11
+ * (`credentials: 'omit'`, the card's deadline): a browser reads it at most once per page and origin, a server at
12
+ * most once per origin per hour (single-flight, a failure remembered for ten minutes).
13
+ * 3. The set is accepted only when it is signed by a BAKED kid, over the RFC 8785 bytes of exactly this object:
14
+ *
15
+ * { kind: 'certrev.keyset', v: 1, issuedAt, keys: [{ kid, crv: 'Ed25519', x }] } (x: base64url, 32 bytes)
16
+ *
17
+ * answered as `{ keyset, signature: { alg: 'ed25519', kid, sig, signedAt? } }`. Refused: another `kind` or `v`
18
+ * (an envelope, a tombstone or a release record can never verify as a key set: their signed bytes are other
19
+ * objects), a set whose `issuedAt` is older than the one already accepted from that origin (no rollback), a set
20
+ * whose keys do not hold its signer's kid with the same key (it may not drop or replace the key that vouches for
21
+ * it), a malformed key, a signature that does not verify.
22
+ * 4. Anything else (no route, a network error, a refused set) leaves the kid unknown: the kernel suppresses the
23
+ * envelope with `unknown_key`, so the card renders nothing and reports, exactly as for an unknown kid in 1.3.x.
24
+ *
25
+ * The route is the portal's (ADR 0001 section 3 addendum). Today every envelope is signed by the baked
26
+ * `cert-issuer-1`, so step 2 never runs and nothing is fetched.
27
+ */
28
+ import { base64urlDecode, canonicalBytes, importEd25519PublicKey, } from '../contract/kernel.js';
29
+ import { TtlCache } from './cache.js';
30
+ import { DEFAULT_FETCH_TIMEOUT_MS, fetchWithDeadline } from './fetch-with-deadline.js';
31
+ /** Where an origin publishes its key set. */
32
+ export const KEY_SET_PATH = '/api/cert/v1/keys';
33
+ const ED25519 = { name: 'Ed25519' };
34
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
35
+ const isString = (v) => typeof v === 'string';
36
+ function rawKey(x) {
37
+ if (!isString(x) || !/^[A-Za-z0-9_-]+$/.test(x))
38
+ return null;
39
+ try {
40
+ const bytes = base64urlDecode(x);
41
+ return bytes.length === 32 ? bytes : null;
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /** Ed25519 verify under a declared key or an imported one; any failure (a bad key, no WebCrypto Ed25519) is false. */
48
+ async function verifies(key, sig, bytes) {
49
+ try {
50
+ const imported = 'format' in key ? await importEd25519PublicKey(key) : key;
51
+ // Fresh ArrayBuffer-backed copies: WebCrypto's BufferSource excludes a SharedArrayBuffer view.
52
+ return await crypto.subtle.verify(ED25519, imported, new Uint8Array(sig), new Uint8Array(bytes));
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /**
59
+ * Judge one key-set response body against the baked keys (and the set already accepted from the same origin, for
60
+ * the no-rollback rule). Returns the accepted set, or null. Never throws.
61
+ */
62
+ export async function verifyKeySet(body, bakedResolveKid, previous) {
63
+ if (!isRecord(body) || !isRecord(body.keyset) || !isRecord(body.signature))
64
+ return null;
65
+ const { keyset, signature } = body;
66
+ if (keyset.kind !== 'certrev.keyset' || keyset.v !== 1)
67
+ return null;
68
+ if (!isString(keyset.issuedAt))
69
+ return null;
70
+ const issuedAt = Date.parse(keyset.issuedAt);
71
+ if (!Number.isFinite(issuedAt))
72
+ return null;
73
+ if (previous && issuedAt < previous.issuedAt)
74
+ return null;
75
+ if (!Array.isArray(keyset.keys) || keyset.keys.length === 0)
76
+ return null;
77
+ if (signature.alg !== 'ed25519' || !isString(signature.kid) || !isString(signature.sig))
78
+ return null;
79
+ // The signer must be a kid this package bakes.
80
+ let baked;
81
+ try {
82
+ baked = await bakedResolveKid(signature.kid);
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ if (!baked)
88
+ return null;
89
+ const keys = new Map();
90
+ for (const entry of keyset.keys) {
91
+ if (!isRecord(entry) || !isString(entry.kid) || entry.kid === '' || entry.crv !== 'Ed25519')
92
+ return null;
93
+ const bytes = rawKey(entry.x);
94
+ if (!bytes || keys.has(entry.kid))
95
+ return null;
96
+ keys.set(entry.kid, { format: 'raw', bytes });
97
+ }
98
+ // The set must keep the key that signed it.
99
+ const signerEntry = keys.get(signature.kid);
100
+ if (!signerEntry)
101
+ return null;
102
+ let sig;
103
+ let bytes;
104
+ try {
105
+ sig = base64urlDecode(signature.sig);
106
+ bytes = canonicalBytes(keyset);
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ if (!(await verifies(baked, sig, bytes)))
112
+ return null;
113
+ // ... and publish it as the same key: the signature must verify under the published entry too.
114
+ if (!(await verifies(signerEntry, sig, bytes)))
115
+ return null;
116
+ return { issuedAt, keys };
117
+ }
118
+ /** Server: one read per origin per hour, a failure remembered for ten minutes (single-flight across renders). */
119
+ const serverSets = new TtlCache({ ttlMs: 3_600_000, negativeTtlMs: 600_000, maxEntries: 50 });
120
+ /** Browser: one read per origin for the page's lifetime, whatever it settled to. */
121
+ const pageSets = new Map();
122
+ /** The newest set accepted per origin (both runtimes), for the no-rollback rule. */
123
+ const acceptedSets = new Map();
124
+ function originOf(baseUrl) {
125
+ try {
126
+ return new URL(baseUrl).origin;
127
+ }
128
+ catch {
129
+ return null;
130
+ }
131
+ }
132
+ async function loadKeySet(origin, opts) {
133
+ let res;
134
+ try {
135
+ res = await fetchWithDeadline(opts.fetchImpl, `${origin}${KEY_SET_PATH}`, { headers: { accept: 'application/json' }, credentials: 'omit' }, opts.timeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS);
136
+ }
137
+ catch {
138
+ return acceptedSets.get(origin) ?? null;
139
+ }
140
+ if (!res.ok)
141
+ return acceptedSets.get(origin) ?? null;
142
+ let body;
143
+ try {
144
+ body = await res.json();
145
+ }
146
+ catch {
147
+ return acceptedSets.get(origin) ?? null;
148
+ }
149
+ const previous = acceptedSets.get(origin);
150
+ const accepted = await verifyKeySet(body, opts.bakedResolveKid, previous);
151
+ // A refused set (older, unsigned, malformed) never replaces one this origin already proved.
152
+ if (!accepted)
153
+ return previous ?? null;
154
+ acceptedSets.set(origin, accepted);
155
+ return accepted;
156
+ }
157
+ function publishedSet(origin, opts) {
158
+ if (typeof document !== 'undefined') {
159
+ let pending = pageSets.get(origin);
160
+ if (!pending) {
161
+ pending = loadKeySet(origin, opts);
162
+ pageSets.set(origin, pending);
163
+ }
164
+ return pending;
165
+ }
166
+ return serverSets.getOrLoad(origin, () => loadKeySet(origin, opts), (v) => v === null);
167
+ }
168
+ /**
169
+ * The resolver a card verifies with: the baked kids, then (for any other kid) the origin's published, signed set.
170
+ * Never throws; an unresolved kid is null (`unknown_key`).
171
+ */
172
+ export function keySetResolver(opts) {
173
+ return async (kid) => {
174
+ const baked = await opts.bakedResolveKid(kid);
175
+ if (baked)
176
+ return baked;
177
+ const origin = originOf(opts.baseUrl);
178
+ if (!origin)
179
+ return null;
180
+ const set = await publishedSet(origin, opts);
181
+ return set?.keys.get(kid) ?? null;
182
+ };
183
+ }
184
+ /** Test seam: forget every published set (a new page and process). */
185
+ export function forgetKeySetsForTests() {
186
+ serverSets.clear();
187
+ pageSets.clear();
188
+ acceptedSets.clear();
189
+ }
190
+ //# sourceMappingURL=key-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-set.js","sourceRoot":"","sources":["../../src/verify/key-set.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,113 +1,116 @@
1
1
  {
2
- "name": "@certrev/cert-block",
3
- "version": "1.3.0",
4
- "description": "Headless render edge for the CertREV CertDeliveryEnvelope: SSR-safe React cert components, a framework-agnostic <certrev-badge> Web Component, a schema.org JSON-LD projector, and a fail-closed verify layer over the shared VerdictKernel.",
5
- "repository": {
6
- "type": "git",
7
- "url": "git+https://github.com/CertREV/cert-kit.git",
8
- "directory": "packages/cert-block"
9
- },
10
- "homepage": "https://github.com/CertREV/cert-kit/tree/HEAD/packages/cert-block#readme",
11
- "bugs": {
12
- "url": "https://github.com/CertREV/cert-kit/issues"
13
- },
14
- "type": "module",
15
- "main": "./dist/index.js",
16
- "types": "./dist/index.d.ts",
17
- "exports": {
18
- ".": {
19
- "types": "./dist/index.d.ts",
20
- "default": "./dist/index.js"
21
- },
22
- "./builder": {
23
- "types": "./dist/builder/index.d.ts",
24
- "default": "./dist/builder/index.js"
25
- },
26
- "./builder/face": {
27
- "types": "./dist/builder/envelope-face.d.ts",
28
- "default": "./dist/builder/envelope-face.js"
29
- },
30
- "./reader": {
31
- "types": "./dist/reader/index.d.ts",
32
- "default": "./dist/reader/index.js"
33
- },
34
- "./reader.css": "./src/reader/reader.css",
35
- "./webcomponent": {
36
- "types": "./dist/webcomponent/certrev-badge.d.ts",
37
- "default": "./dist/webcomponent/certrev-badge.js"
38
- },
39
- "./fixtures": {
40
- "types": "./dist/contract/fixtures.d.ts",
41
- "default": "./dist/contract/fixtures.js"
42
- },
43
- "./modal": {
44
- "types": "./dist/modal/index.d.ts",
45
- "default": "./dist/modal/index.js"
46
- },
47
- "./modal/placement": {
48
- "types": "./dist/modal/placement.d.ts",
49
- "default": "./dist/modal/placement.js"
50
- },
51
- "./modal/certrev-cert.js": "./dist/modal/certrev-cert.js"
52
- },
53
- "files": [
54
- "dist",
55
- "src",
56
- "!src/**/__tests__",
57
- "!src/**/*.test.ts",
58
- "!src/**/*.test.tsx",
59
- "README.md",
60
- "CHANGELOG.md"
61
- ],
62
- "publishConfig": {
63
- "registry": "https://registry.npmjs.org",
64
- "access": "public"
65
- },
66
- "publishTargets": [
67
- "npmjs",
68
- "github-packages"
69
- ],
70
- "scripts": {
71
- "build": "tsc && pnpm build:modal-bundle",
72
- "build:modal-bundle": "pnpm dlx esbuild@0.27.7 src/modal/certrev-cert.entry.ts --bundle --minify --target=es2020 --format=iife --legal-comments=none --tsconfig-raw='{\"compilerOptions\":{\"target\":\"ES2017\",\"module\":\"esnext\",\"strict\":true}}' --banner:js='/* biome-ignore-all format: generated cert-badge bundle, see @certrev/cert-block src/modal/ */ /* biome-ignore-all lint: generated cert-badge bundle, see @certrev/cert-block src/modal/ */' --outfile=dist/modal/certrev-cert.js",
73
- "refresh:reader": "node scripts/refresh-reader.mjs",
74
- "typecheck": "tsc --noEmit",
75
- "test": "vitest run"
76
- },
77
- "dependencies": {
78
- "@certrev/cert-contract": "^0.6.0"
79
- },
80
- "peerDependencies": {
81
- "react": ">=18.0.0"
82
- },
83
- "peerDependenciesMeta": {
84
- "react": {
85
- "optional": false
86
- }
87
- },
88
- "devDependencies": {
89
- "@testing-library/react": "^16.1.0",
90
- "@types/node": "^20.0.0",
91
- "@types/react": "^18.3.0",
92
- "@types/react-dom": "^18.3.0",
93
- "jsdom": "^25.0.0",
94
- "react": "^18.3.1",
95
- "react-dom": "^18.3.1",
96
- "typescript": "^6.0.3",
97
- "vitest": "^4.1.5"
98
- },
99
- "keywords": [
100
- "certrev",
101
- "certification",
102
- "react",
103
- "server-components",
104
- "hydrogen",
105
- "shopify",
106
- "json-ld",
107
- "schema-org",
108
- "web-component",
109
- "ed25519",
110
- "ssr"
111
- ],
112
- "license": "MIT"
113
- }
2
+ "name": "@certrev/cert-block",
3
+ "version": "2.0.0",
4
+ "description": "Headless render edge for the CertREV CertDeliveryEnvelope: SSR-safe React cert components, a framework-agnostic <certrev-badge> Web Component, a schema.org JSON-LD projector, and a fail-closed verify layer over the shared VerdictKernel.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/CertREV/cert-kit.git",
8
+ "directory": "packages/cert-block"
9
+ },
10
+ "homepage": "https://github.com/CertREV/cert-kit/tree/HEAD/packages/cert-block#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/CertREV/cert-kit/issues"
13
+ },
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "./builder": {
23
+ "types": "./dist/builder/index.d.ts",
24
+ "default": "./dist/builder/index.js"
25
+ },
26
+ "./builder/face": {
27
+ "types": "./dist/builder/envelope-face.d.ts",
28
+ "default": "./dist/builder/envelope-face.js"
29
+ },
30
+ "./reader": {
31
+ "types": "./dist/reader/index.d.ts",
32
+ "default": "./dist/reader/index.js"
33
+ },
34
+ "./reader.css": "./src/reader/reader.css",
35
+ "./webcomponent": {
36
+ "types": "./dist/webcomponent/certrev-badge.d.ts",
37
+ "default": "./dist/webcomponent/certrev-badge.js"
38
+ },
39
+ "./fixtures": {
40
+ "types": "./dist/contract/fixtures.d.ts",
41
+ "default": "./dist/contract/fixtures.js"
42
+ },
43
+ "./modal": {
44
+ "types": "./dist/modal/index.d.ts",
45
+ "default": "./dist/modal/index.js"
46
+ },
47
+ "./modal/placement": {
48
+ "types": "./dist/modal/placement.d.ts",
49
+ "default": "./dist/modal/placement.js"
50
+ },
51
+ "./modal/certrev-cert.js": "./dist/modal/certrev-cert.js"
52
+ },
53
+ "files": [
54
+ "dist",
55
+ "src",
56
+ "!src/**/__tests__",
57
+ "!src/**/*.test.ts",
58
+ "!src/**/*.test.tsx",
59
+ "README.md",
60
+ "CHANGELOG.md"
61
+ ],
62
+ "publishConfig": {
63
+ "registry": "https://registry.npmjs.org",
64
+ "access": "public"
65
+ },
66
+ "publishTargets": [
67
+ "npmjs",
68
+ "github-packages"
69
+ ],
70
+ "dependencies": {
71
+ "@certrev/cert-contract": "^0.6.0"
72
+ },
73
+ "peerDependencies": {
74
+ "react": ">=18.0.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "react": {
78
+ "optional": false
79
+ }
80
+ },
81
+ "devDependencies": {
82
+ "@testing-library/react": "^16.1.0",
83
+ "@types/node": "^20.0.0",
84
+ "@types/react": "^18.3.0",
85
+ "@types/react-dom": "^18.3.0",
86
+ "esbuild": "0.27.7",
87
+ "jsdom": "^25.0.0",
88
+ "playwright-core": "1.59.1",
89
+ "react": "^18.3.1",
90
+ "react-dom": "^18.3.1",
91
+ "typescript": "^6.0.3",
92
+ "vitest": "^4.1.5"
93
+ },
94
+ "keywords": [
95
+ "certrev",
96
+ "certification",
97
+ "react",
98
+ "server-components",
99
+ "hydrogen",
100
+ "shopify",
101
+ "json-ld",
102
+ "schema-org",
103
+ "web-component",
104
+ "ed25519",
105
+ "ssr"
106
+ ],
107
+ "license": "MIT",
108
+ "scripts": {
109
+ "build": "tsc && pnpm build:modal-bundle",
110
+ "build:modal-bundle": "pnpm dlx esbuild@0.27.7 src/modal/certrev-cert.entry.ts --bundle --minify --target=es2020 --format=iife --legal-comments=none --tsconfig-raw='{\"compilerOptions\":{\"target\":\"ES2017\",\"module\":\"esnext\",\"strict\":true}}' --banner:js='/* biome-ignore-all format: generated cert-badge bundle, see @certrev/cert-block src/modal/ */ /* biome-ignore-all lint: generated cert-badge bundle, see @certrev/cert-block src/modal/ */' --outfile=dist/modal/certrev-cert.js",
111
+ "refresh:reader": "node scripts/refresh-reader.mjs",
112
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.e2e.json",
113
+ "test": "vitest run",
114
+ "test:replica": "vitest run --config vitest.e2e.config.ts"
115
+ }
116
+ }