@noeos/verification-engine 0.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 (184) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +11 -0
  4. package/README.md +7 -0
  5. package/dist/cjs/api/engine.js +271 -0
  6. package/dist/cjs/api/types.js +10 -0
  7. package/dist/cjs/chains/chain-builder.js +541 -0
  8. package/dist/cjs/chains/duplicate-detector.js +208 -0
  9. package/dist/cjs/chains/verify-chain.js +656 -0
  10. package/dist/cjs/contracts/generated.js +512 -0
  11. package/dist/cjs/contracts/schema-assets.js +6 -0
  12. package/dist/cjs/contracts/vector-assets.js +6 -0
  13. package/dist/cjs/domain/algorithm-id.js +5 -0
  14. package/dist/cjs/domain/byte-view.js +7 -0
  15. package/dist/cjs/domain/chain.js +3 -0
  16. package/dist/cjs/domain/diagnostic.js +6 -0
  17. package/dist/cjs/domain/digest.js +37 -0
  18. package/dist/cjs/domain/duplicate-policy.js +3 -0
  19. package/dist/cjs/domain/evidence.js +10 -0
  20. package/dist/cjs/domain/identifiers.js +52 -0
  21. package/dist/cjs/domain/json-value.js +3 -0
  22. package/dist/cjs/domain/limits.js +24 -0
  23. package/dist/cjs/domain/operation-result.js +19 -0
  24. package/dist/cjs/domain/position.js +16 -0
  25. package/dist/cjs/domain/protocol-version.js +5 -0
  26. package/dist/cjs/domain/rule.js +3 -0
  27. package/dist/cjs/domain/stream.js +3 -0
  28. package/dist/cjs/domain/version.js +16 -0
  29. package/dist/cjs/evidence/digest-evidence.js +22 -0
  30. package/dist/cjs/evidence/evidence-parser.js +288 -0
  31. package/dist/cjs/framing/frame-builders.js +124 -0
  32. package/dist/cjs/framing/frame-encoder.js +238 -0
  33. package/dist/cjs/framing/frame-parser.js +173 -0
  34. package/dist/cjs/framing/frame-types.js +3 -0
  35. package/dist/cjs/hashing/hash-adapter.js +90 -0
  36. package/dist/cjs/hashing/hash-frame.js +16 -0
  37. package/dist/cjs/index.js +16 -0
  38. package/dist/cjs/normalization/byte-sink.js +70 -0
  39. package/dist/cjs/normalization/jcs-profile.js +154 -0
  40. package/dist/cjs/normalization/normalize.js +56 -0
  41. package/dist/cjs/normalization/profile-registry.js +66 -0
  42. package/dist/cjs/normalization/profile.js +3 -0
  43. package/dist/cjs/normalization/raw-bytes-profile.js +27 -0
  44. package/dist/cjs/package.json +3 -0
  45. package/dist/cjs/profiles.js +9 -0
  46. package/dist/cjs/records/record-service.js +278 -0
  47. package/dist/cjs/rules/rule-set.js +211 -0
  48. package/dist/cjs/schemas.js +6 -0
  49. package/dist/cjs/validation/algorithm-validation.js +12 -0
  50. package/dist/cjs/validation/diagnostic-collector.js +159 -0
  51. package/dist/cjs/validation/digest-validation.js +48 -0
  52. package/dist/cjs/validation/identifier-validation.js +33 -0
  53. package/dist/cjs/validation/json-text-parser.js +297 -0
  54. package/dist/cjs/validation/json-value-validation.js +155 -0
  55. package/dist/cjs/validation/limit-validation.js +75 -0
  56. package/dist/cjs/validation/object-inspection.js +60 -0
  57. package/dist/cjs/validation/position-validation.js +13 -0
  58. package/dist/cjs/validation/result-helpers.js +9 -0
  59. package/dist/cjs/validation/utf8-validation.js +69 -0
  60. package/dist/cjs/validation/version-validation.js +31 -0
  61. package/dist/cjs/vectors.js +6 -0
  62. package/dist/esm/api/engine.js +266 -0
  63. package/dist/esm/api/types.js +4 -0
  64. package/dist/esm/chains/chain-builder.js +536 -0
  65. package/dist/esm/chains/duplicate-detector.js +204 -0
  66. package/dist/esm/chains/verify-chain.js +652 -0
  67. package/dist/esm/contracts/generated.js +509 -0
  68. package/dist/esm/contracts/schema-assets.js +2 -0
  69. package/dist/esm/contracts/vector-assets.js +2 -0
  70. package/dist/esm/domain/algorithm-id.js +2 -0
  71. package/dist/esm/domain/byte-view.js +4 -0
  72. package/dist/esm/domain/chain.js +2 -0
  73. package/dist/esm/domain/diagnostic.js +3 -0
  74. package/dist/esm/domain/digest.js +32 -0
  75. package/dist/esm/domain/duplicate-policy.js +2 -0
  76. package/dist/esm/domain/evidence.js +7 -0
  77. package/dist/esm/domain/identifiers.js +45 -0
  78. package/dist/esm/domain/json-value.js +2 -0
  79. package/dist/esm/domain/limits.js +21 -0
  80. package/dist/esm/domain/operation-result.js +15 -0
  81. package/dist/esm/domain/position.js +12 -0
  82. package/dist/esm/domain/protocol-version.js +2 -0
  83. package/dist/esm/domain/rule.js +2 -0
  84. package/dist/esm/domain/stream.js +2 -0
  85. package/dist/esm/domain/version.js +12 -0
  86. package/dist/esm/evidence/digest-evidence.js +19 -0
  87. package/dist/esm/evidence/evidence-parser.js +281 -0
  88. package/dist/esm/framing/frame-builders.js +114 -0
  89. package/dist/esm/framing/frame-encoder.js +234 -0
  90. package/dist/esm/framing/frame-parser.js +170 -0
  91. package/dist/esm/framing/frame-types.js +2 -0
  92. package/dist/esm/hashing/hash-adapter.js +84 -0
  93. package/dist/esm/hashing/hash-frame.js +12 -0
  94. package/dist/esm/index.js +5 -0
  95. package/dist/esm/normalization/byte-sink.js +66 -0
  96. package/dist/esm/normalization/jcs-profile.js +151 -0
  97. package/dist/esm/normalization/normalize.js +52 -0
  98. package/dist/esm/normalization/profile-registry.js +62 -0
  99. package/dist/esm/normalization/profile.js +2 -0
  100. package/dist/esm/normalization/raw-bytes-profile.js +24 -0
  101. package/dist/esm/profiles.js +6 -0
  102. package/dist/esm/records/record-service.js +270 -0
  103. package/dist/esm/rules/rule-set.js +206 -0
  104. package/dist/esm/schemas.js +2 -0
  105. package/dist/esm/validation/algorithm-validation.js +9 -0
  106. package/dist/esm/validation/diagnostic-collector.js +154 -0
  107. package/dist/esm/validation/digest-validation.js +43 -0
  108. package/dist/esm/validation/identifier-validation.js +27 -0
  109. package/dist/esm/validation/json-text-parser.js +294 -0
  110. package/dist/esm/validation/json-value-validation.js +152 -0
  111. package/dist/esm/validation/limit-validation.js +71 -0
  112. package/dist/esm/validation/object-inspection.js +54 -0
  113. package/dist/esm/validation/position-validation.js +10 -0
  114. package/dist/esm/validation/result-helpers.js +6 -0
  115. package/dist/esm/validation/utf8-validation.js +63 -0
  116. package/dist/esm/validation/version-validation.js +26 -0
  117. package/dist/esm/vectors.js +2 -0
  118. package/dist/types/api/engine.d.ts +8 -0
  119. package/dist/types/api/types.d.ts +124 -0
  120. package/dist/types/chains/chain-builder.d.ts +42 -0
  121. package/dist/types/chains/duplicate-detector.d.ts +18 -0
  122. package/dist/types/chains/verify-chain.d.ts +9 -0
  123. package/dist/types/contracts/generated.d.ts +442 -0
  124. package/dist/types/contracts/schema-assets.d.ts +2 -0
  125. package/dist/types/contracts/vector-assets.d.ts +2 -0
  126. package/dist/types/domain/algorithm-id.d.ts +4 -0
  127. package/dist/types/domain/byte-view.d.ts +1 -0
  128. package/dist/types/domain/chain.d.ts +43 -0
  129. package/dist/types/domain/diagnostic.d.ts +23 -0
  130. package/dist/types/domain/digest.d.ts +12 -0
  131. package/dist/types/domain/duplicate-policy.d.ts +26 -0
  132. package/dist/types/domain/evidence.d.ts +100 -0
  133. package/dist/types/domain/identifiers.d.ts +29 -0
  134. package/dist/types/domain/json-value.d.ts +6 -0
  135. package/dist/types/domain/limits.d.ts +13 -0
  136. package/dist/types/domain/operation-result.d.ts +12 -0
  137. package/dist/types/domain/position.d.ts +8 -0
  138. package/dist/types/domain/protocol-version.d.ts +2 -0
  139. package/dist/types/domain/rule.d.ts +34 -0
  140. package/dist/types/domain/stream.d.ts +5 -0
  141. package/dist/types/domain/version.d.ts +8 -0
  142. package/dist/types/evidence/digest-evidence.d.ts +4 -0
  143. package/dist/types/evidence/evidence-parser.d.ts +8 -0
  144. package/dist/types/framing/frame-builders.d.ts +40 -0
  145. package/dist/types/framing/frame-encoder.d.ts +6 -0
  146. package/dist/types/framing/frame-parser.d.ts +4 -0
  147. package/dist/types/framing/frame-types.d.ts +27 -0
  148. package/dist/types/hashing/hash-adapter.d.ts +12 -0
  149. package/dist/types/hashing/hash-frame.d.ts +6 -0
  150. package/dist/types/index.d.ts +8 -0
  151. package/dist/types/normalization/byte-sink.d.ts +19 -0
  152. package/dist/types/normalization/jcs-profile.d.ts +3 -0
  153. package/dist/types/normalization/normalize.d.ts +11 -0
  154. package/dist/types/normalization/profile-registry.d.ts +26 -0
  155. package/dist/types/normalization/profile.d.ts +22 -0
  156. package/dist/types/normalization/raw-bytes-profile.d.ts +2 -0
  157. package/dist/types/profiles.d.ts +8 -0
  158. package/dist/types/records/record-service.d.ts +38 -0
  159. package/dist/types/rules/rule-set.d.ts +13 -0
  160. package/dist/types/schemas.d.ts +2 -0
  161. package/dist/types/validation/algorithm-validation.d.ts +3 -0
  162. package/dist/types/validation/diagnostic-collector.d.ts +24 -0
  163. package/dist/types/validation/digest-validation.d.ts +6 -0
  164. package/dist/types/validation/identifier-validation.d.ts +6 -0
  165. package/dist/types/validation/json-text-parser.d.ts +4 -0
  166. package/dist/types/validation/json-value-validation.d.ts +4 -0
  167. package/dist/types/validation/limit-validation.d.ts +4 -0
  168. package/dist/types/validation/object-inspection.d.ts +11 -0
  169. package/dist/types/validation/position-validation.d.ts +3 -0
  170. package/dist/types/validation/result-helpers.d.ts +3 -0
  171. package/dist/types/validation/utf8-validation.d.ts +5 -0
  172. package/dist/types/validation/version-validation.d.ts +9 -0
  173. package/dist/types/vectors.d.ts +2 -0
  174. package/package.json +61 -0
  175. package/schemas/chain-summary.v1.schema.json +156 -0
  176. package/schemas/diagnostic.v1.schema.json +107 -0
  177. package/schemas/link-evidence.v1.schema.json +165 -0
  178. package/schemas/record-evidence.v1.schema.json +91 -0
  179. package/schemas/vector-set.v1.schema.json +52 -0
  180. package/vectors/evidence.json +26 -0
  181. package/vectors/framing.json +136 -0
  182. package/vectors/hashing.json +58 -0
  183. package/vectors/invalid.json +56 -0
  184. package/vectors/manifest.json +46 -0
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.validateProfileVersion = validateProfileVersion;
5
+ exports.validateProtocolVersion = validateProtocolVersion;
6
+ exports.validateProfileReference = validateProfileReference;
7
+ const identifier_validation_js_1 = require("./identifier-validation.js");
8
+ const version_js_1 = require("../domain/version.js");
9
+ const operation_result_js_1 = require("../domain/operation-result.js");
10
+ const result_helpers_js_1 = require("./result-helpers.js");
11
+ const semverPattern = /^(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-(?:0|[1-9A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9A-Za-z-][0-9A-Za-z-]*))*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u;
12
+ function validateProfileVersion(value) {
13
+ if (typeof value !== "string" || value.length > 256 || !semverPattern.test(value)) {
14
+ return (0, result_helpers_js_1.failureWithCode)("VERSION_INVALID", "input");
15
+ }
16
+ return (0, operation_result_js_1.success)(version_js_1.ProfileVersion.fromValidated(value));
17
+ }
18
+ function validateProtocolVersion(value) {
19
+ if (value !== 1)
20
+ return (0, result_helpers_js_1.failureWithCode)("VERSION_INVALID", "input");
21
+ return (0, operation_result_js_1.success)(1);
22
+ }
23
+ function validateProfileReference(id, version) {
24
+ const idResult = (0, identifier_validation_js_1.validateProfileId)(id);
25
+ if (!idResult.ok)
26
+ return idResult;
27
+ const versionResult = validateProfileVersion(version);
28
+ if (!versionResult.ok)
29
+ return versionResult;
30
+ return (0, operation_result_js_1.success)(Object.freeze({ id: idResult.value, version: versionResult.value }));
31
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.VECTOR_SET = void 0;
5
+ var vector_assets_js_1 = require("./contracts/vector-assets.js");
6
+ Object.defineProperty(exports, "VECTOR_SET", { enumerable: true, get: function () { return vector_assets_js_1.VECTOR_SET; } });
@@ -0,0 +1,266 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { ProfileId } from "../domain/identifiers.js";
3
+ import { ProfileVersion } from "../domain/version.js";
4
+ import { DEFAULT_LIMITS } from "../domain/limits.js";
5
+ import { ProfileRegistry } from "../normalization/profile-registry.js";
6
+ import { RuleSet } from "../rules/rule-set.js";
7
+ import { validateLimits } from "../validation/limit-validation.js";
8
+ import { validateProfileId } from "../validation/identifier-validation.js";
9
+ import { validateProfileVersion } from "../validation/version-validation.js";
10
+ import { hashRecord, verifyComputedRecord, } from "../records/record-service.js";
11
+ import { ChainBuilder as InternalChainBuilder } from "../chains/chain-builder.js";
12
+ import { verifyChain, verifyChainStream } from "../chains/verify-chain.js";
13
+ import { digestEvidence } from "../evidence/digest-evidence.js";
14
+ import { parseRecordEvidence } from "../evidence/evidence-parser.js";
15
+ /** @public */
16
+ export function createEngine(options = {}) {
17
+ const limits = resolveLimits(options.limits);
18
+ const additionalProfiles = (options.profiles ?? []).map((profile) => adaptProfile(profile));
19
+ let profiles;
20
+ try {
21
+ profiles = new ProfileRegistry(additionalProfiles);
22
+ }
23
+ catch {
24
+ throw new EngineConfigurationError("PROFILE_VERSION_CONFLICT");
25
+ }
26
+ const rulesResult = RuleSet.create(options.rules, limits);
27
+ if (!rulesResult.ok)
28
+ throw new EngineConfigurationError("RULE_VERSION_CONFLICT");
29
+ const defaultPolicy = options.duplicatePolicy;
30
+ const observer = options.onEvent;
31
+ if (observer !== undefined && typeof observer !== "function") {
32
+ throw new EngineConfigurationError("INPUT_TYPE_INVALID");
33
+ }
34
+ return Object.freeze(new EngineImpl(limits, profiles, rulesResult.value, defaultPolicy, observer));
35
+ }
36
+ /** @public */
37
+ export class EngineConfigurationError extends TypeError {
38
+ code;
39
+ constructor(code) {
40
+ super(code);
41
+ this.code = code;
42
+ this.name = "EngineConfigurationError";
43
+ }
44
+ }
45
+ class EngineImpl {
46
+ limits;
47
+ profiles;
48
+ rules;
49
+ defaultPolicy;
50
+ observer;
51
+ recordServiceOptions;
52
+ constructor(limits, profiles, rules, defaultPolicy, observer) {
53
+ this.limits = limits;
54
+ this.profiles = profiles;
55
+ this.rules = rules;
56
+ this.defaultPolicy = defaultPolicy;
57
+ this.observer = observer;
58
+ this.recordServiceOptions = Object.freeze({ limits, profiles, rules });
59
+ }
60
+ hashRecord(input) {
61
+ if (this.observer !== undefined) {
62
+ this.emit({
63
+ name: "operation.started",
64
+ operation: "hash-record",
65
+ recordsSeen: 0,
66
+ bytesNormalized: 0,
67
+ });
68
+ }
69
+ const result = hashRecord(input, this.recordServiceOptions);
70
+ this.emitResult(result, "hash-record");
71
+ return result;
72
+ }
73
+ verifyRecord(input) {
74
+ const evidence = parseRecordEvidenceInput(input.evidence, this.limits);
75
+ if (!evidence.ok)
76
+ return invalidRecordResult(evidence.diagnostics);
77
+ const result = verifyComputedRecord(evidence.value, input.payload, this.recordServiceOptions);
78
+ const diagnostics = result.diagnostics;
79
+ const status = result.ok ? "valid" : "invalid";
80
+ return Object.freeze({
81
+ status,
82
+ diagnostics,
83
+ evidence: result.ok ? result.value : undefined,
84
+ stats: Object.freeze({
85
+ recordsSeen: 1,
86
+ recordsVerified: result.ok ? 1 : 0,
87
+ linksVerified: 0,
88
+ bytesNormalized: result.ok ? result.value.normalizedByteLength : 0,
89
+ errors: diagnostics.filter(({ severity }) => severity === "error").length,
90
+ warnings: diagnostics.filter(({ severity }) => severity === "warning").length,
91
+ info: diagnostics.filter(({ severity }) => severity === "info").length,
92
+ }),
93
+ boundaries: Object.freeze({
94
+ start: "not-applicable",
95
+ end: "not-applicable",
96
+ }),
97
+ verificationMode: "internal",
98
+ });
99
+ }
100
+ createChain(config) {
101
+ const internal = InternalChainBuilder.create({
102
+ ...config,
103
+ ...(config.duplicatePolicy === undefined && this.defaultPolicy !== undefined
104
+ ? { duplicatePolicy: this.defaultPolicy }
105
+ : {}),
106
+ rules: this.rulesAsUnknown(),
107
+ }, { limits: this.limits, profiles: this.profiles });
108
+ if (!internal.ok)
109
+ throw new EngineConfigurationError(firstCode(internal.diagnostics));
110
+ return new PublicChainBuilder(internal.value);
111
+ }
112
+ verifyChain(input) {
113
+ return verifyChain({
114
+ ...input,
115
+ ...(input.duplicatePolicy === undefined && this.defaultPolicy !== undefined
116
+ ? { duplicatePolicy: this.defaultPolicy }
117
+ : {}),
118
+ rules: this.rulesAsUnknown(),
119
+ }, { limits: this.limits, profiles: this.profiles });
120
+ }
121
+ async verifyStream(input) {
122
+ const { signal, ...streamConfig } = input;
123
+ return verifyChainStream({
124
+ ...streamConfig,
125
+ ...(streamConfig.duplicatePolicy === undefined && this.defaultPolicy !== undefined
126
+ ? { duplicatePolicy: this.defaultPolicy }
127
+ : {}),
128
+ rules: this.rulesAsUnknown(),
129
+ }, { limits: this.limits, profiles: this.profiles }, signal);
130
+ }
131
+ digestEvidence(input) {
132
+ return digestEvidence(input, this.limits);
133
+ }
134
+ rulesAsUnknown() {
135
+ return this.rules.toArray();
136
+ }
137
+ emit(event) {
138
+ if (this.observer === undefined)
139
+ return;
140
+ try {
141
+ this.observer(Object.freeze({ ...event }));
142
+ }
143
+ catch {
144
+ // Observer failures are intentionally isolated from deterministic operation results.
145
+ }
146
+ }
147
+ emitResult(result, operation) {
148
+ if (this.observer === undefined)
149
+ return;
150
+ if (result.ok)
151
+ this.emit({ name: "operation.completed", operation, recordsSeen: 1, bytesNormalized: 0 });
152
+ for (const diagnostic of result.diagnostics) {
153
+ this.emit({
154
+ name: "diagnostic.emitted",
155
+ operation,
156
+ recordsSeen: 0,
157
+ bytesNormalized: 0,
158
+ code: diagnostic.code,
159
+ });
160
+ }
161
+ }
162
+ }
163
+ class PublicChainBuilder {
164
+ inner;
165
+ constructor(inner) {
166
+ this.inner = inner;
167
+ }
168
+ append(input) {
169
+ return this.inner.append(input);
170
+ }
171
+ appendAll(input) {
172
+ return this.inner.appendAll(input);
173
+ }
174
+ appendStream(input, options) {
175
+ return this.inner.appendStream(input, options);
176
+ }
177
+ snapshot() {
178
+ return this.inner.snapshot();
179
+ }
180
+ finalize() {
181
+ return this.inner.finalize();
182
+ }
183
+ abort(reason) {
184
+ this.inner.abort(reason);
185
+ }
186
+ }
187
+ function adaptProfile(profile) {
188
+ if (!isRecord(profile) ||
189
+ typeof profile.validate !== "function" ||
190
+ typeof profile.normalize !== "function") {
191
+ throw new EngineConfigurationError("INPUT_TYPE_INVALID");
192
+ }
193
+ const id = validateProfileId(profile.id);
194
+ const version = validateProfileVersion(profile.version);
195
+ if (!id.ok)
196
+ throw new EngineConfigurationError(firstCode(id.diagnostics));
197
+ if (!version.ok)
198
+ throw new EngineConfigurationError(firstCode(version.diagnostics));
199
+ validateManifest(profile, id.value.value, version.value.value);
200
+ const adapted = {
201
+ id: ProfileId.fromValidated(id.value.value),
202
+ version: ProfileVersion.fromValidated(version.value.value),
203
+ inputKind: profile.inputKind,
204
+ validate(input, limits) {
205
+ return profile.validate(input, limits);
206
+ },
207
+ normalize(input, sink, limits) {
208
+ return profile.normalize(input, sink, limits);
209
+ },
210
+ };
211
+ return Object.freeze(adapted);
212
+ }
213
+ function validateManifest(profile, id, version) {
214
+ if (!isRecord(profile.manifest))
215
+ throw new EngineConfigurationError("INPUT_TYPE_INVALID");
216
+ const manifest = profile.manifest;
217
+ if (Object.keys(manifest).length !== 5 ||
218
+ manifest.name !== id ||
219
+ manifest.version !== version ||
220
+ typeof manifest.vectorSha256 !== "string" ||
221
+ !/^[0-9a-f]{64}$/u.test(manifest.vectorSha256) ||
222
+ typeof manifest.license !== "string" ||
223
+ manifest.license.length === 0) {
224
+ throw new EngineConfigurationError("INPUT_TYPE_INVALID");
225
+ }
226
+ const limits = validateLimits(manifest.limits);
227
+ if (!limits.ok)
228
+ throw new EngineConfigurationError(firstCode(limits.diagnostics));
229
+ }
230
+ function resolveLimits(value) {
231
+ const candidate = value === undefined ? DEFAULT_LIMITS : { ...DEFAULT_LIMITS, ...value };
232
+ const result = validateLimits(candidate);
233
+ if (!result.ok)
234
+ throw new EngineConfigurationError(firstCode(result.diagnostics));
235
+ return result.value;
236
+ }
237
+ function parseRecordEvidenceInput(value, limits) {
238
+ return parseRecordEvidence(value, limits);
239
+ }
240
+ function invalidRecordResult(diagnostics) {
241
+ return Object.freeze({
242
+ status: "invalid",
243
+ diagnostics,
244
+ evidence: undefined,
245
+ stats: Object.freeze({
246
+ recordsSeen: 0,
247
+ recordsVerified: 0,
248
+ linksVerified: 0,
249
+ bytesNormalized: 0,
250
+ errors: diagnostics.length,
251
+ warnings: 0,
252
+ info: 0,
253
+ }),
254
+ boundaries: Object.freeze({ start: "not-applicable", end: "not-applicable" }),
255
+ verificationMode: "internal",
256
+ });
257
+ }
258
+ function firstCode(diagnostics) {
259
+ const code = diagnostics[0]?.code;
260
+ if (code === "INPUT_LIMIT_EXCEEDED" || code === "RULE_VERSION_CONFLICT")
261
+ return code;
262
+ return "INPUT_TYPE_INVALID";
263
+ }
264
+ function isRecord(value) {
265
+ return typeof value === "object" && value !== null && !Array.isArray(value);
266
+ }
@@ -0,0 +1,4 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { CHAIN_SUMMARY_EVIDENCE_SCHEMA, LINK_EVIDENCE_SCHEMA, RECORD_EVIDENCE_SCHEMA, } from "../domain/evidence.js";
3
+ import { DIAGNOSTIC_SCHEMA } from "../domain/diagnostic.js";
4
+ export { CHAIN_SUMMARY_EVIDENCE_SCHEMA, DIAGNOSTIC_SCHEMA, LINK_EVIDENCE_SCHEMA, RECORD_EVIDENCE_SCHEMA, };