@plasius/schema 1.2.18 → 1.3.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.
Files changed (36) hide show
  1. package/README.md +207 -1
  2. package/THIRD_PARTY_NOTICES.md +75 -0
  3. package/dist/chunk-6FE4FLKF.js +254 -0
  4. package/dist/chunk-6FE4FLKF.js.map +1 -0
  5. package/dist/chunk-AG2NAPDC.js +117 -0
  6. package/dist/chunk-AG2NAPDC.js.map +1 -0
  7. package/dist/chunk-UQHPDQZX.js +2606 -0
  8. package/dist/chunk-UQHPDQZX.js.map +1 -0
  9. package/dist/feedback-diagnostics-BaniQAFS.d.cts +353 -0
  10. package/dist/feedback-diagnostics-CnsI0B9-.d.ts +353 -0
  11. package/dist/feedback-diagnostics-vocabulary.cjs +156 -0
  12. package/dist/feedback-diagnostics-vocabulary.cjs.map +1 -0
  13. package/dist/feedback-diagnostics-vocabulary.d.cts +70 -0
  14. package/dist/feedback-diagnostics-vocabulary.d.ts +70 -0
  15. package/dist/feedback-diagnostics-vocabulary.js +33 -0
  16. package/dist/feedback-diagnostics-vocabulary.js.map +1 -0
  17. package/dist/feedback-diagnostics.cjs +2696 -0
  18. package/dist/feedback-diagnostics.cjs.map +1 -0
  19. package/dist/feedback-diagnostics.d.cts +2 -0
  20. package/dist/feedback-diagnostics.d.ts +2 -0
  21. package/dist/feedback-diagnostics.js +39 -0
  22. package/dist/feedback-diagnostics.js.map +1 -0
  23. package/dist/feedback-unicode-profile.cjs +283 -0
  24. package/dist/feedback-unicode-profile.cjs.map +1 -0
  25. package/dist/feedback-unicode-profile.d.cts +28 -0
  26. package/dist/feedback-unicode-profile.d.ts +28 -0
  27. package/dist/feedback-unicode-profile.js +13 -0
  28. package/dist/feedback-unicode-profile.js.map +1 -0
  29. package/dist/index.cjs +2258 -14
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +987 -286
  32. package/dist/index.d.ts +987 -286
  33. package/dist/index.js +1532 -2197
  34. package/dist/index.js.map +1 -1
  35. package/package.json +36 -12
  36. package/unicode/feedback-unicode-15.1.0-unassigned.json +13 -0
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/feedback-unicode-profile.ts
21
+ var feedback_unicode_profile_exports = {};
22
+ __export(feedback_unicode_profile_exports, {
23
+ FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256: () => FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256,
24
+ FEEDBACK_UNICODE_PROFILE_ID: () => FEEDBACK_UNICODE_PROFILE_ID,
25
+ containsFeedbackUnicodeProfileUnsupportedText: () => containsFeedbackUnicodeProfileUnsupportedText,
26
+ isFeedbackUnicodeProfileUnassigned: () => isFeedbackUnicodeProfileUnassigned
27
+ });
28
+ module.exports = __toCommonJS(feedback_unicode_profile_exports);
29
+
30
+ // unicode/feedback-unicode-15.1.0-unassigned.json
31
+ var feedback_unicode_15_1_0_unassigned_default = {
32
+ profileId: "unicode-15.1.0-nfkc-v1",
33
+ unicodeVersion: "15.1.0",
34
+ sourcePackage: "@unicode/unicode-15.1.0",
35
+ sourcePackageVersion: "1.6.17",
36
+ sourceProperty: "General_Category/Unassigned",
37
+ rangeEncoding: "flat-half-open-delta-uleb128-base64url-v1",
38
+ rangeCount: 707,
39
+ endpointCount: 1414,
40
+ codePointCount: 824718,
41
+ endpointSha256: "591e457524d6b4b988aa7c7687e76c95a78370fea38bbd1b09085be7fd935ef3",
42
+ payload: "-AYCBgQHAQEBFAGNAwEmAjICAwE3CBsEBguOAgE8AmUOOwIxAg8BHAIBAQsFHwECBuwBAQgCAgIWAQcBAQMEAgkCAgIECAEEAgEFAhkCAwEGBAICFgEHAQIBAgECAgEBBQQCAgMDAQcEAQEHEQoDAQkBAwEWAQcBAgEFAgoBAwEDAgEPBAIMBwcBAwEIAgICFgEHAQIBBQIJAgICAwcDBAIBBQISCgIBBgMDAQQDAgEBAQIDAgMDAwwEBQMDAQQCAQYBDhUFDQEDARcBEAIJAQMBBAcCAQMCAQIEAgoHFgEDARcBCgEFAgkBAwEEBwIGAgEEAgoBAwwNAQMBMwEDAQYEEAIaAQMBEgMYAQkBAQIHAwEEBgEBAQgGCgIDDDoEHSUCAQEBBQEYAQEBFwIFAQEBBwEKAgQgSAEkBCcBJAEPAQ0lxgEBAQUBAvkCAQQCBwEBAQQCKQEEAiEBBAIHAQEBBAIPATkBBAJDAiADGgZWAgYCnQUDWQcWCRgJFAwNAQMBAgxeAgoGCgYaBlkHKwVGCh8BDAQMBAEDKgIFCywEGgYLAz4CQQEdAgsGCgYOAh8xTQMvAXQIPAMPAzwHKwILCCsFlgQCBgImAgYCCAEBAQEBAQEfAjUBDwEOAgYBEwIDAQkBZQEMAhsBDQMhDyEPjAEElwUZCxWUDgIgAd0CBS0BAQUBAjgHAg4YCQcBBwEHAQcBBwEHAQcBBwF-IhoBWQzWARpQAVYCZwUrAV4BVAswAe3kAQM3CdwCFLgBCMsBBQIBAQEFGDsDCgY4CEYIDAZ0Cx4DTgELBCEBNwkOAgoCZxgcCgYCBgIGCQcBBwE8BH4CCgakVwwXBDEE7kQCaiYHDAUFGgEFAQEBAgECAX0QvQMCNgcBICoGMwETAQQEBQGHAQIBAb4BAwYCBgIGAgMDBwEHCgUCDAEaARMBAgEPAg4iewUDBC0DWAENAwEvLoIBHQMxDxwEJAkeBSsFHgElBA4qngECCgYkBCQEKAg0CwwBDwEHAQIBCwEPAQcBAkO3AgkWCggYBgEqAQlFBgIBASwBAgMBAhcBSAgJMBMBAgUhAxsFAUA4BBQCMgECBQgBAwEdAgMECgcJB0AgJwQMCTYDHQIbBRoHBAwHUEk3Mw0zBy4ICqYCHwEqAQMCAksrCCoWGiYcFBcJTgQkCUQKAQIZBwoGNQESCCcJYAEUCxIBLz4HAQEBBAEPAQsGOwUKBgQBCAICAhYBBwECAQUBCgICAgMCAQYBBQcCBwMFiwFcAQUeSAgKpgE2AiYiRQsKBg0TOgYKNhsCDwQXuQE8ZFMMCAIBAggBAgEeAQICDAkKRggCLgILG0gIUw1JBwr2AQkBLQEOCh0DIAIWAQ5JBwECASwDAQECAQkICgYGAQIBJQECAQYHCrYCGQcRASkDHFYBDzINmwdmbwEFC8QBzBRjDdYIqh_HBLlDuQQHHwEKBFEBCgYeAgYKRgoKAQcBFQUTsAVbZUsEOQcRQAULAg74LwjWCSoJ50UEAQcBAgGjAg8BHQMCAQ4ECIwDhBJrBQ0DCQcKAgjcJC4CFwl0PPYBCicCwgEVRnoUDBQMVwkZhwFVAUcBAgIBAgICBAEMAQEBBwFBAQQCCAEHARwBBAEFAQEDBwHUAgKkAgK-BQ8FAQ_QCB8GBtUBBwERAgcBAgEFBT4hAXAtAw4CCgQCwAIfEToFAdADKuYFBwEEAQIBDwHFAQIQKUwECgQCkQZETD3CAQQBGwECAQECAQEKAQQBAQEBBgEEAQEBAQEBAwECAQECAQEBAQEBAQEBAQIBAQIEAQcBBAEEAQEBCgERBQMBBQERNAKOAiwEZAwPAg8BDwElCq4BOB0NLAQJBwIOBpoB2AcEEQMNA3cEXwYMBAEPDAQ4CAoGKAgeAgJO1AIMDgINAwkHLgEHCA4ECQcJB5MBATclCoYI4M0CILogBt4BAoItDrE6D-4EohOeBOILyyYF4CDRuCsBHmCAAfABkPwD_v8DAv7_AwI"
43
+ };
44
+
45
+ // src/feedback-unicode-profile.codec.ts
46
+ var BASE64URL_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
47
+ var BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;
48
+ var MAX_UNICODE_ENDPOINT = 1114112;
49
+ var MAX_ENCODED_PAYLOAD_CHARACTERS = 8192;
50
+ var MAX_ULEB128_BYTES = 5;
51
+ var MAX_PROFILE_RANGE_COUNT = 707;
52
+ var MAX_PROFILE_ENDPOINT_COUNT = MAX_PROFILE_RANGE_COUNT * 2;
53
+ var MAX_PROFILE_CODE_POINT_COUNT = MAX_UNICODE_ENDPOINT;
54
+ var ARTIFACT_KEYS = /* @__PURE__ */ new Set([
55
+ "profileId",
56
+ "unicodeVersion",
57
+ "sourcePackage",
58
+ "sourcePackageVersion",
59
+ "sourceProperty",
60
+ "rangeEncoding",
61
+ "rangeCount",
62
+ "endpointCount",
63
+ "codePointCount",
64
+ "endpointSha256",
65
+ "payload"
66
+ ]);
67
+ function isRecord(value) {
68
+ return typeof value === "object" && value !== null && !Array.isArray(value);
69
+ }
70
+ function hasExpectedMetadata(artifact, expected) {
71
+ return Object.keys(artifact).length === ARTIFACT_KEYS.size && Object.keys(artifact).every((key) => ARTIFACT_KEYS.has(key)) && artifact.profileId === expected.profileId && artifact.unicodeVersion === expected.unicodeVersion && artifact.sourcePackage === expected.sourcePackage && artifact.sourcePackageVersion === expected.sourcePackageVersion && artifact.sourceProperty === expected.sourceProperty && artifact.rangeEncoding === expected.rangeEncoding && artifact.rangeCount === expected.rangeCount && artifact.endpointCount === expected.endpointCount && artifact.codePointCount === expected.codePointCount && artifact.endpointSha256 === expected.endpointSha256;
72
+ }
73
+ function isBoundedPositiveInteger(value, maximum) {
74
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0 && value <= maximum;
75
+ }
76
+ function hasBoundedCounts(artifact, expected) {
77
+ return isBoundedPositiveInteger(
78
+ artifact.rangeCount,
79
+ MAX_PROFILE_RANGE_COUNT
80
+ ) && isBoundedPositiveInteger(
81
+ expected.rangeCount,
82
+ MAX_PROFILE_RANGE_COUNT
83
+ ) && isBoundedPositiveInteger(
84
+ artifact.endpointCount,
85
+ MAX_PROFILE_ENDPOINT_COUNT
86
+ ) && isBoundedPositiveInteger(
87
+ expected.endpointCount,
88
+ MAX_PROFILE_ENDPOINT_COUNT
89
+ ) && artifact.endpointCount === artifact.rangeCount * 2 && expected.endpointCount === expected.rangeCount * 2 && isBoundedPositiveInteger(
90
+ artifact.codePointCount,
91
+ MAX_PROFILE_CODE_POINT_COUNT
92
+ ) && isBoundedPositiveInteger(
93
+ expected.codePointCount,
94
+ MAX_PROFILE_CODE_POINT_COUNT
95
+ );
96
+ }
97
+ function decodeCanonicalBase64Url(value) {
98
+ if (value.length === 0 || value.length > MAX_ENCODED_PAYLOAD_CHARACTERS || value.length % 4 === 1 || !BASE64URL_PATTERN.test(value)) {
99
+ return void 0;
100
+ }
101
+ const finalSextet = BASE64URL_ALPHABET.indexOf(value.at(-1) ?? "");
102
+ if (finalSextet < 0 || value.length % 4 === 2 && (finalSextet & 15) !== 0 || value.length % 4 === 3 && (finalSextet & 3) !== 0) {
103
+ return void 0;
104
+ }
105
+ const expectedByteCount = Math.floor(value.length * 6 / 8);
106
+ const output = new Uint8Array(expectedByteCount);
107
+ let outputIndex = 0;
108
+ let accumulator = 0;
109
+ let bitCount = 0;
110
+ for (const character of value) {
111
+ const sextet = BASE64URL_ALPHABET.indexOf(character);
112
+ if (sextet < 0) {
113
+ return void 0;
114
+ }
115
+ accumulator = accumulator << 6 | sextet;
116
+ bitCount += 6;
117
+ while (bitCount >= 8) {
118
+ bitCount -= 8;
119
+ output[outputIndex] = accumulator >> bitCount & 255;
120
+ outputIndex += 1;
121
+ accumulator &= (1 << bitCount) - 1;
122
+ }
123
+ }
124
+ if (outputIndex !== expectedByteCount || bitCount > 0 && accumulator !== 0) {
125
+ return void 0;
126
+ }
127
+ return output;
128
+ }
129
+ function decodeCanonicalEndpointDeltas(bytes, endpointCount) {
130
+ if (!isBoundedPositiveInteger(
131
+ endpointCount,
132
+ MAX_PROFILE_ENDPOINT_COUNT
133
+ ) || endpointCount % 2 !== 0) {
134
+ return void 0;
135
+ }
136
+ const endpoints = new Uint32Array(endpointCount);
137
+ let byteOffset = 0;
138
+ let previousEndpoint = 0;
139
+ for (let endpointIndex = 0; endpointIndex < endpointCount; endpointIndex += 1) {
140
+ let delta = 0;
141
+ let multiplier = 1;
142
+ let byteCount = 0;
143
+ while (true) {
144
+ if (byteOffset >= bytes.length || byteCount >= MAX_ULEB128_BYTES) {
145
+ return void 0;
146
+ }
147
+ const byte = bytes[byteOffset];
148
+ if (byte === void 0) {
149
+ return void 0;
150
+ }
151
+ byteOffset += 1;
152
+ byteCount += 1;
153
+ const payload = byte & 127;
154
+ delta += payload * multiplier;
155
+ if (!Number.isSafeInteger(delta)) {
156
+ return void 0;
157
+ }
158
+ if ((byte & 128) === 0) {
159
+ if (byteCount > 1 && payload === 0) {
160
+ return void 0;
161
+ }
162
+ break;
163
+ }
164
+ multiplier *= 128;
165
+ }
166
+ const endpoint = previousEndpoint + delta;
167
+ if (delta <= 0 || !Number.isSafeInteger(endpoint) || endpoint > MAX_UNICODE_ENDPOINT) {
168
+ return void 0;
169
+ }
170
+ endpoints[endpointIndex] = endpoint;
171
+ previousEndpoint = endpoint;
172
+ }
173
+ if (byteOffset !== bytes.length) {
174
+ return void 0;
175
+ }
176
+ return endpoints;
177
+ }
178
+ function hasExpectedRanges(endpoints, expected) {
179
+ let previousEnd = -1;
180
+ let codePointCount = 0;
181
+ for (let index = 0; index < endpoints.length; index += 2) {
182
+ const start = endpoints[index];
183
+ const end = endpoints[index + 1];
184
+ if (start === void 0 || end === void 0 || start <= previousEnd || end <= start || end > MAX_UNICODE_ENDPOINT) {
185
+ return false;
186
+ }
187
+ codePointCount += end - start;
188
+ previousEnd = end;
189
+ }
190
+ return codePointCount === expected.codePointCount;
191
+ }
192
+ function decodeFeedbackUnicodeProfileArtifact(value, expected) {
193
+ if (!isRecord(value) || !hasBoundedCounts(value, expected) || !hasExpectedMetadata(value, expected) || typeof value.payload !== "string") {
194
+ return void 0;
195
+ }
196
+ const bytes = decodeCanonicalBase64Url(value.payload);
197
+ if (bytes === void 0) {
198
+ return void 0;
199
+ }
200
+ const endpoints = decodeCanonicalEndpointDeltas(
201
+ bytes,
202
+ expected.endpointCount
203
+ );
204
+ return endpoints !== void 0 && hasExpectedRanges(endpoints, expected) ? endpoints : void 0;
205
+ }
206
+
207
+ // src/feedback-unicode-profile.ts
208
+ var FEEDBACK_UNICODE_PROFILE_ID = "unicode-15.1.0-nfkc-v1";
209
+ var FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256 = "591e457524d6b4b988aa7c7687e76c95a78370fea38bbd1b09085be7fd935ef3";
210
+ var MAX_UNICODE_CODE_POINT = 1114111;
211
+ var HIGH_SURROGATE_START = 55296;
212
+ var HIGH_SURROGATE_END = 56319;
213
+ var LOW_SURROGATE_START = 56320;
214
+ var LOW_SURROGATE_END = 57343;
215
+ var UNASSIGNED_RANGE_ENDPOINTS = decodeFeedbackUnicodeProfileArtifact(
216
+ feedback_unicode_15_1_0_unassigned_default,
217
+ {
218
+ profileId: FEEDBACK_UNICODE_PROFILE_ID,
219
+ unicodeVersion: "15.1.0",
220
+ sourcePackage: "@unicode/unicode-15.1.0",
221
+ sourcePackageVersion: "1.6.17",
222
+ sourceProperty: "General_Category/Unassigned",
223
+ rangeEncoding: "flat-half-open-delta-uleb128-base64url-v1",
224
+ rangeCount: 707,
225
+ endpointCount: 1414,
226
+ codePointCount: 824718,
227
+ endpointSha256: FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256
228
+ }
229
+ );
230
+ function isFeedbackUnicodeProfileUnassigned(codePoint) {
231
+ if (UNASSIGNED_RANGE_ENDPOINTS === void 0 || !Number.isInteger(codePoint) || codePoint < 0 || codePoint > MAX_UNICODE_CODE_POINT || codePoint >= HIGH_SURROGATE_START && codePoint <= LOW_SURROGATE_END) {
232
+ return true;
233
+ }
234
+ let lowerRange = 0;
235
+ let upperRange = UNASSIGNED_RANGE_ENDPOINTS.length / 2 - 1;
236
+ while (lowerRange <= upperRange) {
237
+ const rangeIndex = Math.floor((lowerRange + upperRange) / 2);
238
+ const start = UNASSIGNED_RANGE_ENDPOINTS[rangeIndex * 2];
239
+ const end = UNASSIGNED_RANGE_ENDPOINTS[rangeIndex * 2 + 1];
240
+ if (start === void 0 || end === void 0) {
241
+ return true;
242
+ }
243
+ if (codePoint < start) {
244
+ upperRange = rangeIndex - 1;
245
+ } else if (codePoint >= end) {
246
+ lowerRange = rangeIndex + 1;
247
+ } else {
248
+ return true;
249
+ }
250
+ }
251
+ return false;
252
+ }
253
+ function containsFeedbackUnicodeProfileUnsupportedText(text) {
254
+ if (typeof text !== "string") {
255
+ return true;
256
+ }
257
+ for (let index = 0; index < text.length; index += 1) {
258
+ const first = text.charCodeAt(index);
259
+ let codePoint = first;
260
+ if (first >= HIGH_SURROGATE_START && first <= HIGH_SURROGATE_END) {
261
+ const second = text.charCodeAt(index + 1);
262
+ if (!Number.isInteger(second) || second < LOW_SURROGATE_START || second > LOW_SURROGATE_END) {
263
+ return true;
264
+ }
265
+ codePoint = 65536 + (first - HIGH_SURROGATE_START << 10) + (second - LOW_SURROGATE_START);
266
+ index += 1;
267
+ } else if (first >= LOW_SURROGATE_START && first <= LOW_SURROGATE_END) {
268
+ return true;
269
+ }
270
+ if (isFeedbackUnicodeProfileUnassigned(codePoint)) {
271
+ return true;
272
+ }
273
+ }
274
+ return false;
275
+ }
276
+ // Annotate the CommonJS export names for ESM import in node:
277
+ 0 && (module.exports = {
278
+ FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256,
279
+ FEEDBACK_UNICODE_PROFILE_ID,
280
+ containsFeedbackUnicodeProfileUnsupportedText,
281
+ isFeedbackUnicodeProfileUnassigned
282
+ });
283
+ //# sourceMappingURL=feedback-unicode-profile.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/feedback-unicode-profile.ts","../unicode/feedback-unicode-15.1.0-unassigned.json","../src/feedback-unicode-profile.codec.ts"],"sourcesContent":["import profileArtifact from \"../unicode/feedback-unicode-15.1.0-unassigned.json\" with {\n type: \"json\",\n};\nimport { decodeFeedbackUnicodeProfileArtifact } from \"./feedback-unicode-profile.codec.js\";\n\n/** Canonical Unicode and normalization profile for transient feedback text. */\nexport const FEEDBACK_UNICODE_PROFILE_ID =\n \"unicode-15.1.0-nfkc-v1\" as const;\n\n/**\n * SHA-256 of the flattened half-open range endpoints encoded as unsigned\n * 32-bit big-endian integers.\n */\nexport const FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256 =\n \"591e457524d6b4b988aa7c7687e76c95a78370fea38bbd1b09085be7fd935ef3\" as const;\n\nconst MAX_UNICODE_CODE_POINT = 0x10ffff;\nconst HIGH_SURROGATE_START = 0xd800;\nconst HIGH_SURROGATE_END = 0xdbff;\nconst LOW_SURROGATE_START = 0xdc00;\nconst LOW_SURROGATE_END = 0xdfff;\n\nconst UNASSIGNED_RANGE_ENDPOINTS = decodeFeedbackUnicodeProfileArtifact(\n profileArtifact,\n {\n profileId: FEEDBACK_UNICODE_PROFILE_ID,\n unicodeVersion: \"15.1.0\",\n sourcePackage: \"@unicode/unicode-15.1.0\",\n sourcePackageVersion: \"1.6.17\",\n sourceProperty: \"General_Category/Unassigned\",\n rangeEncoding: \"flat-half-open-delta-uleb128-base64url-v1\",\n rangeCount: 707,\n endpointCount: 1_414,\n codePointCount: 824_718,\n endpointSha256: FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256,\n },\n);\n\n/**\n * Reports whether a numeric code point is unsupported by the pinned feedback\n * profile.\n *\n * Unicode 15.1 `General_Category=Unassigned` values return `true`. Invalid\n * numeric values and surrogate code points also return `true` so validation\n * callers fail closed.\n */\nexport function isFeedbackUnicodeProfileUnassigned(\n codePoint: number,\n): boolean {\n if (\n UNASSIGNED_RANGE_ENDPOINTS === undefined ||\n !Number.isInteger(codePoint) ||\n codePoint < 0 ||\n codePoint > MAX_UNICODE_CODE_POINT ||\n (codePoint >= HIGH_SURROGATE_START &&\n codePoint <= LOW_SURROGATE_END)\n ) {\n return true;\n }\n\n let lowerRange = 0;\n let upperRange = UNASSIGNED_RANGE_ENDPOINTS.length / 2 - 1;\n\n while (lowerRange <= upperRange) {\n const rangeIndex = Math.floor((lowerRange + upperRange) / 2);\n const start = UNASSIGNED_RANGE_ENDPOINTS[rangeIndex * 2];\n const end = UNASSIGNED_RANGE_ENDPOINTS[rangeIndex * 2 + 1];\n\n if (start === undefined || end === undefined) {\n return true;\n }\n if (codePoint < start) {\n upperRange = rangeIndex - 1;\n } else if (codePoint >= end) {\n lowerRange = rangeIndex + 1;\n } else {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Reports whether text contains a Unicode 15.1-unassigned code point or a\n * lone UTF-16 surrogate.\n *\n * The scan uses code units deliberately so malformed strings cannot be\n * silently replaced or normalized before profile enforcement. Callers must\n * apply their own UTF-16 length bound before passing untrusted text; this\n * generic helper intentionally does not impose a product-specific limit.\n */\nexport function containsFeedbackUnicodeProfileUnsupportedText(\n text: string,\n): boolean {\n if (typeof text !== \"string\") {\n return true;\n }\n\n for (let index = 0; index < text.length; index += 1) {\n const first = text.charCodeAt(index);\n let codePoint = first;\n\n if (first >= HIGH_SURROGATE_START && first <= HIGH_SURROGATE_END) {\n const second = text.charCodeAt(index + 1);\n if (\n !Number.isInteger(second) ||\n second < LOW_SURROGATE_START ||\n second > LOW_SURROGATE_END\n ) {\n return true;\n }\n codePoint =\n 0x10000 +\n ((first - HIGH_SURROGATE_START) << 10) +\n (second - LOW_SURROGATE_START);\n index += 1;\n } else if (first >= LOW_SURROGATE_START && first <= LOW_SURROGATE_END) {\n return true;\n }\n\n if (isFeedbackUnicodeProfileUnassigned(codePoint)) {\n return true;\n }\n }\n\n return false;\n}\n","{\n \"profileId\": \"unicode-15.1.0-nfkc-v1\",\n \"unicodeVersion\": \"15.1.0\",\n \"sourcePackage\": \"@unicode/unicode-15.1.0\",\n \"sourcePackageVersion\": \"1.6.17\",\n \"sourceProperty\": \"General_Category/Unassigned\",\n \"rangeEncoding\": \"flat-half-open-delta-uleb128-base64url-v1\",\n \"rangeCount\": 707,\n \"endpointCount\": 1414,\n \"codePointCount\": 824718,\n \"endpointSha256\": \"591e457524d6b4b988aa7c7687e76c95a78370fea38bbd1b09085be7fd935ef3\",\n \"payload\": \"-AYCBgQHAQEBFAGNAwEmAjICAwE3CBsEBguOAgE8AmUOOwIxAg8BHAIBAQsFHwECBuwBAQgCAgIWAQcBAQMEAgkCAgIECAEEAgEFAhkCAwEGBAICFgEHAQIBAgECAgEBBQQCAgMDAQcEAQEHEQoDAQkBAwEWAQcBAgEFAgoBAwEDAgEPBAIMBwcBAwEIAgICFgEHAQIBBQIJAgICAwcDBAIBBQISCgIBBgMDAQQDAgEBAQIDAgMDAwwEBQMDAQQCAQYBDhUFDQEDARcBEAIJAQMBBAcCAQMCAQIEAgoHFgEDARcBCgEFAgkBAwEEBwIGAgEEAgoBAwwNAQMBMwEDAQYEEAIaAQMBEgMYAQkBAQIHAwEEBgEBAQgGCgIDDDoEHSUCAQEBBQEYAQEBFwIFAQEBBwEKAgQgSAEkBCcBJAEPAQ0lxgEBAQUBAvkCAQQCBwEBAQQCKQEEAiEBBAIHAQEBBAIPATkBBAJDAiADGgZWAgYCnQUDWQcWCRgJFAwNAQMBAgxeAgoGCgYaBlkHKwVGCh8BDAQMBAEDKgIFCywEGgYLAz4CQQEdAgsGCgYOAh8xTQMvAXQIPAMPAzwHKwILCCsFlgQCBgImAgYCCAEBAQEBAQEfAjUBDwEOAgYBEwIDAQkBZQEMAhsBDQMhDyEPjAEElwUZCxWUDgIgAd0CBS0BAQUBAjgHAg4YCQcBBwEHAQcBBwEHAQcBBwF-IhoBWQzWARpQAVYCZwUrAV4BVAswAe3kAQM3CdwCFLgBCMsBBQIBAQEFGDsDCgY4CEYIDAZ0Cx4DTgELBCEBNwkOAgoCZxgcCgYCBgIGCQcBBwE8BH4CCgakVwwXBDEE7kQCaiYHDAUFGgEFAQEBAgECAX0QvQMCNgcBICoGMwETAQQEBQGHAQIBAb4BAwYCBgIGAgMDBwEHCgUCDAEaARMBAgEPAg4iewUDBC0DWAENAwEvLoIBHQMxDxwEJAkeBSsFHgElBA4qngECCgYkBCQEKAg0CwwBDwEHAQIBCwEPAQcBAkO3AgkWCggYBgEqAQlFBgIBASwBAgMBAhcBSAgJMBMBAgUhAxsFAUA4BBQCMgECBQgBAwEdAgMECgcJB0AgJwQMCTYDHQIbBRoHBAwHUEk3Mw0zBy4ICqYCHwEqAQMCAksrCCoWGiYcFBcJTgQkCUQKAQIZBwoGNQESCCcJYAEUCxIBLz4HAQEBBAEPAQsGOwUKBgQBCAICAhYBBwECAQUBCgICAgMCAQYBBQcCBwMFiwFcAQUeSAgKpgE2AiYiRQsKBg0TOgYKNhsCDwQXuQE8ZFMMCAIBAggBAgEeAQICDAkKRggCLgILG0gIUw1JBwr2AQkBLQEOCh0DIAIWAQ5JBwECASwDAQECAQkICgYGAQIBJQECAQYHCrYCGQcRASkDHFYBDzINmwdmbwEFC8QBzBRjDdYIqh_HBLlDuQQHHwEKBFEBCgYeAgYKRgoKAQcBFQUTsAVbZUsEOQcRQAULAg74LwjWCSoJ50UEAQcBAgGjAg8BHQMCAQ4ECIwDhBJrBQ0DCQcKAgjcJC4CFwl0PPYBCicCwgEVRnoUDBQMVwkZhwFVAUcBAgIBAgICBAEMAQEBBwFBAQQCCAEHARwBBAEFAQEDBwHUAgKkAgK-BQ8FAQ_QCB8GBtUBBwERAgcBAgEFBT4hAXAtAw4CCgQCwAIfEToFAdADKuYFBwEEAQIBDwHFAQIQKUwECgQCkQZETD3CAQQBGwECAQECAQEKAQQBAQEBBgEEAQEBAQEBAwECAQECAQEBAQEBAQEBAQIBAQIEAQcBBAEEAQEBCgERBQMBBQERNAKOAiwEZAwPAg8BDwElCq4BOB0NLAQJBwIOBpoB2AcEEQMNA3cEXwYMBAEPDAQ4CAoGKAgeAgJO1AIMDgINAwkHLgEHCA4ECQcJB5MBATclCoYI4M0CILogBt4BAoItDrE6D-4EohOeBOILyyYF4CDRuCsBHmCAAfABkPwD_v8DAv7_AwI\"\n}\n","const BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst MAX_UNICODE_ENDPOINT = 0x110000;\nconst MAX_ENCODED_PAYLOAD_CHARACTERS = 8_192;\nconst MAX_ULEB128_BYTES = 5;\nconst MAX_PROFILE_RANGE_COUNT = 707;\nconst MAX_PROFILE_ENDPOINT_COUNT = MAX_PROFILE_RANGE_COUNT * 2;\nconst MAX_PROFILE_CODE_POINT_COUNT = MAX_UNICODE_ENDPOINT;\nconst ARTIFACT_KEYS = new Set([\n \"profileId\",\n \"unicodeVersion\",\n \"sourcePackage\",\n \"sourcePackageVersion\",\n \"sourceProperty\",\n \"rangeEncoding\",\n \"rangeCount\",\n \"endpointCount\",\n \"codePointCount\",\n \"endpointSha256\",\n \"payload\",\n]);\n\nexport interface FeedbackUnicodeProfileExpectation {\n readonly profileId: string;\n readonly unicodeVersion: string;\n readonly sourcePackage: string;\n readonly sourcePackageVersion: string;\n readonly sourceProperty: string;\n readonly rangeEncoding: string;\n readonly rangeCount: number;\n readonly endpointCount: number;\n readonly codePointCount: number;\n readonly endpointSha256: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExpectedMetadata(\n artifact: Record<string, unknown>,\n expected: FeedbackUnicodeProfileExpectation,\n): boolean {\n return (\n Object.keys(artifact).length === ARTIFACT_KEYS.size &&\n Object.keys(artifact).every((key) => ARTIFACT_KEYS.has(key)) &&\n artifact.profileId === expected.profileId &&\n artifact.unicodeVersion === expected.unicodeVersion &&\n artifact.sourcePackage === expected.sourcePackage &&\n artifact.sourcePackageVersion === expected.sourcePackageVersion &&\n artifact.sourceProperty === expected.sourceProperty &&\n artifact.rangeEncoding === expected.rangeEncoding &&\n artifact.rangeCount === expected.rangeCount &&\n artifact.endpointCount === expected.endpointCount &&\n artifact.codePointCount === expected.codePointCount &&\n artifact.endpointSha256 === expected.endpointSha256\n );\n}\n\nfunction isBoundedPositiveInteger(\n value: unknown,\n maximum: number,\n): value is number {\n return (\n typeof value === \"number\" &&\n Number.isSafeInteger(value) &&\n value > 0 &&\n value <= maximum\n );\n}\n\nfunction hasBoundedCounts(\n artifact: Record<string, unknown>,\n expected: FeedbackUnicodeProfileExpectation,\n): boolean {\n return (\n isBoundedPositiveInteger(\n artifact.rangeCount,\n MAX_PROFILE_RANGE_COUNT,\n ) &&\n isBoundedPositiveInteger(\n expected.rangeCount,\n MAX_PROFILE_RANGE_COUNT,\n ) &&\n isBoundedPositiveInteger(\n artifact.endpointCount,\n MAX_PROFILE_ENDPOINT_COUNT,\n ) &&\n isBoundedPositiveInteger(\n expected.endpointCount,\n MAX_PROFILE_ENDPOINT_COUNT,\n ) &&\n artifact.endpointCount === artifact.rangeCount * 2 &&\n expected.endpointCount === expected.rangeCount * 2 &&\n isBoundedPositiveInteger(\n artifact.codePointCount,\n MAX_PROFILE_CODE_POINT_COUNT,\n ) &&\n isBoundedPositiveInteger(\n expected.codePointCount,\n MAX_PROFILE_CODE_POINT_COUNT,\n )\n );\n}\n\nfunction decodeCanonicalBase64Url(value: string): Uint8Array | undefined {\n if (\n value.length === 0 ||\n value.length > MAX_ENCODED_PAYLOAD_CHARACTERS ||\n value.length % 4 === 1 ||\n !BASE64URL_PATTERN.test(value)\n ) {\n return undefined;\n }\n\n const finalSextet = BASE64URL_ALPHABET.indexOf(value.at(-1) ?? \"\");\n if (\n finalSextet < 0 ||\n (value.length % 4 === 2 && (finalSextet & 0b1111) !== 0) ||\n (value.length % 4 === 3 && (finalSextet & 0b11) !== 0)\n ) {\n return undefined;\n }\n\n const expectedByteCount = Math.floor((value.length * 6) / 8);\n const output = new Uint8Array(expectedByteCount);\n let outputIndex = 0;\n let accumulator = 0;\n let bitCount = 0;\n\n for (const character of value) {\n const sextet = BASE64URL_ALPHABET.indexOf(character);\n if (sextet < 0) {\n return undefined;\n }\n accumulator = (accumulator << 6) | sextet;\n bitCount += 6;\n while (bitCount >= 8) {\n bitCount -= 8;\n output[outputIndex] = (accumulator >> bitCount) & 0xff;\n outputIndex += 1;\n accumulator &= (1 << bitCount) - 1;\n }\n }\n\n if (\n outputIndex !== expectedByteCount ||\n (bitCount > 0 && accumulator !== 0)\n ) {\n return undefined;\n }\n return output;\n}\n\nfunction decodeCanonicalEndpointDeltas(\n bytes: Uint8Array,\n endpointCount: number,\n): Uint32Array | undefined {\n if (\n !isBoundedPositiveInteger(\n endpointCount,\n MAX_PROFILE_ENDPOINT_COUNT,\n ) ||\n endpointCount % 2 !== 0\n ) {\n return undefined;\n }\n const endpoints = new Uint32Array(endpointCount);\n let byteOffset = 0;\n let previousEndpoint = 0;\n\n for (let endpointIndex = 0; endpointIndex < endpointCount; endpointIndex += 1) {\n let delta = 0;\n let multiplier = 1;\n let byteCount = 0;\n\n while (true) {\n if (byteOffset >= bytes.length || byteCount >= MAX_ULEB128_BYTES) {\n return undefined;\n }\n const byte = bytes[byteOffset];\n if (byte === undefined) {\n return undefined;\n }\n byteOffset += 1;\n byteCount += 1;\n\n const payload = byte & 0x7f;\n delta += payload * multiplier;\n if (!Number.isSafeInteger(delta)) {\n return undefined;\n }\n\n if ((byte & 0x80) === 0) {\n if (byteCount > 1 && payload === 0) {\n return undefined;\n }\n break;\n }\n multiplier *= 128;\n }\n\n const endpoint = previousEndpoint + delta;\n if (\n delta <= 0 ||\n !Number.isSafeInteger(endpoint) ||\n endpoint > MAX_UNICODE_ENDPOINT\n ) {\n return undefined;\n }\n endpoints[endpointIndex] = endpoint;\n previousEndpoint = endpoint;\n }\n\n if (byteOffset !== bytes.length) {\n return undefined;\n }\n return endpoints;\n}\n\nfunction hasExpectedRanges(\n endpoints: Uint32Array,\n expected: FeedbackUnicodeProfileExpectation,\n): boolean {\n let previousEnd = -1;\n let codePointCount = 0;\n\n for (let index = 0; index < endpoints.length; index += 2) {\n const start = endpoints[index];\n const end = endpoints[index + 1];\n if (\n start === undefined ||\n end === undefined ||\n start <= previousEnd ||\n end <= start ||\n end > MAX_UNICODE_ENDPOINT\n ) {\n return false;\n }\n codePointCount += end - start;\n previousEnd = end;\n }\n\n return codePointCount === expected.codePointCount;\n}\n\n/**\n * Decodes and validates the checked-in Unicode profile artifact.\n *\n * This is an internal supply-boundary helper. It deliberately returns no\n * partial data: malformed base64url, non-shortest ULEB128, overflow, range\n * disorder, count mismatch, trailing bytes, or metadata drift all fail\n * closed.\n */\nexport function decodeFeedbackUnicodeProfileArtifact(\n value: unknown,\n expected: FeedbackUnicodeProfileExpectation,\n): Uint32Array | undefined {\n if (\n !isRecord(value) ||\n !hasBoundedCounts(value, expected) ||\n !hasExpectedMetadata(value, expected) ||\n typeof value.payload !== \"string\"\n ) {\n return undefined;\n }\n\n const bytes = decodeCanonicalBase64Url(value.payload);\n if (bytes === undefined) {\n return undefined;\n }\n const endpoints = decodeCanonicalEndpointDeltas(\n bytes,\n expected.endpointCount,\n );\n return endpoints !== undefined && hasExpectedRanges(endpoints, expected)\n ? endpoints\n : undefined;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,28 @@
1
+ /** Canonical Unicode and normalization profile for transient feedback text. */
2
+ declare const FEEDBACK_UNICODE_PROFILE_ID: "unicode-15.1.0-nfkc-v1";
3
+ /**
4
+ * SHA-256 of the flattened half-open range endpoints encoded as unsigned
5
+ * 32-bit big-endian integers.
6
+ */
7
+ declare const FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256: "591e457524d6b4b988aa7c7687e76c95a78370fea38bbd1b09085be7fd935ef3";
8
+ /**
9
+ * Reports whether a numeric code point is unsupported by the pinned feedback
10
+ * profile.
11
+ *
12
+ * Unicode 15.1 `General_Category=Unassigned` values return `true`. Invalid
13
+ * numeric values and surrogate code points also return `true` so validation
14
+ * callers fail closed.
15
+ */
16
+ declare function isFeedbackUnicodeProfileUnassigned(codePoint: number): boolean;
17
+ /**
18
+ * Reports whether text contains a Unicode 15.1-unassigned code point or a
19
+ * lone UTF-16 surrogate.
20
+ *
21
+ * The scan uses code units deliberately so malformed strings cannot be
22
+ * silently replaced or normalized before profile enforcement. Callers must
23
+ * apply their own UTF-16 length bound before passing untrusted text; this
24
+ * generic helper intentionally does not impose a product-specific limit.
25
+ */
26
+ declare function containsFeedbackUnicodeProfileUnsupportedText(text: string): boolean;
27
+
28
+ export { FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256, FEEDBACK_UNICODE_PROFILE_ID, containsFeedbackUnicodeProfileUnsupportedText, isFeedbackUnicodeProfileUnassigned };
@@ -0,0 +1,28 @@
1
+ /** Canonical Unicode and normalization profile for transient feedback text. */
2
+ declare const FEEDBACK_UNICODE_PROFILE_ID: "unicode-15.1.0-nfkc-v1";
3
+ /**
4
+ * SHA-256 of the flattened half-open range endpoints encoded as unsigned
5
+ * 32-bit big-endian integers.
6
+ */
7
+ declare const FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256: "591e457524d6b4b988aa7c7687e76c95a78370fea38bbd1b09085be7fd935ef3";
8
+ /**
9
+ * Reports whether a numeric code point is unsupported by the pinned feedback
10
+ * profile.
11
+ *
12
+ * Unicode 15.1 `General_Category=Unassigned` values return `true`. Invalid
13
+ * numeric values and surrogate code points also return `true` so validation
14
+ * callers fail closed.
15
+ */
16
+ declare function isFeedbackUnicodeProfileUnassigned(codePoint: number): boolean;
17
+ /**
18
+ * Reports whether text contains a Unicode 15.1-unassigned code point or a
19
+ * lone UTF-16 surrogate.
20
+ *
21
+ * The scan uses code units deliberately so malformed strings cannot be
22
+ * silently replaced or normalized before profile enforcement. Callers must
23
+ * apply their own UTF-16 length bound before passing untrusted text; this
24
+ * generic helper intentionally does not impose a product-specific limit.
25
+ */
26
+ declare function containsFeedbackUnicodeProfileUnsupportedText(text: string): boolean;
27
+
28
+ export { FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256, FEEDBACK_UNICODE_PROFILE_ID, containsFeedbackUnicodeProfileUnsupportedText, isFeedbackUnicodeProfileUnassigned };
@@ -0,0 +1,13 @@
1
+ import {
2
+ FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256,
3
+ FEEDBACK_UNICODE_PROFILE_ID,
4
+ containsFeedbackUnicodeProfileUnsupportedText,
5
+ isFeedbackUnicodeProfileUnassigned
6
+ } from "./chunk-6FE4FLKF.js";
7
+ export {
8
+ FEEDBACK_UNICODE_PROFILE_ENDPOINT_SHA256,
9
+ FEEDBACK_UNICODE_PROFILE_ID,
10
+ containsFeedbackUnicodeProfileUnsupportedText,
11
+ isFeedbackUnicodeProfileUnassigned
12
+ };
13
+ //# sourceMappingURL=feedback-unicode-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}