@kumwe/studio-core 0.1.0-alpha.2 → 0.1.0-alpha.3

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.
package/dist/index.d.ts CHANGED
@@ -11,5 +11,6 @@ export { compareSemanticVersions, normalizeVersionRange, parseSemanticVersion, s
11
11
  export { StudioSession, type StudioSessionOptions } from './session.js';
12
12
  export { BlockRegistry, type BlockRegistrationOptions, type ResolvedBlockRegistration, } from './registry.js';
13
13
  export { assertStudioPropertySchema, STUDIO_SCHEMA_PROFILE_LIMITS } from './schema-profile.js';
14
+ export { STUDIO_DEFAULT_URL_POLICY, validateExternalUrl, type ExternalUrlPolicy, type ExternalUrlRejectionReason, type ExternalUrlValidationResult, } from './url-policy.js';
14
15
  export { validateBlueprint, type BlueprintValidationOptions, type BlueprintValidationResult, } from './validation.js';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,6BAA6B,GACnC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,GACjC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EACL,aAAa,EACb,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EACL,iBAAiB,EACjB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,6BAA6B,GACnC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,GACjC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EACL,aAAa,EACb,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,GACjC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -11,5 +11,6 @@ export { compareSemanticVersions, normalizeVersionRange, parseSemanticVersion, s
11
11
  export { StudioSession } from './session.js';
12
12
  export { BlockRegistry, } from './registry.js';
13
13
  export { assertStudioPropertySchema, STUDIO_SCHEMA_PROFILE_LIMITS } from './schema-profile.js';
14
+ export { STUDIO_DEFAULT_URL_POLICY, validateExternalUrl, } from './url-policy.js';
14
15
  export { validateBlueprint, } from './validation.js';
15
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,GAGnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,GAKxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,eAAe,EACf,oBAAoB,GAMrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,GAGtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GAEtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAA6B,MAAM,cAAc,CAAC;AACxE,OAAO,EACL,aAAa,GAGd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EACL,iBAAiB,GAGlB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,GAGnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,GAKxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EACL,eAAe,EACf,oBAAoB,GAMrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,GAGtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GAEtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAA6B,MAAM,cAAc,CAAC;AACxE,OAAO,EACL,aAAa,GAGd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EACL,yBAAyB,EACzB,mBAAmB,GAIpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,GAGlB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Canonical policy for external resource URLs (remote media imports, embeds).
3
+ * Studio never fetches author-supplied URLs itself; hosts that do MUST apply
4
+ * this validator before any fetch. The policy is purely lexical and
5
+ * deterministic — it classifies the WHATWG-parsed URL without network access,
6
+ * DNS resolution, clocks, or locale sensitivity. DNS-rebinding defence,
7
+ * redirect re-validation, and response verification therefore remain host
8
+ * runtime obligations of the hardened fetcher.
9
+ */
10
+ export type ExternalUrlRejectionReason = 'credentials-in-url' | 'host-not-allowed' | 'malformed' | 'scheme-not-allowed' | 'url-too-long';
11
+ export type ExternalUrlValidationResult = {
12
+ ok: false;
13
+ reason: ExternalUrlRejectionReason;
14
+ } | {
15
+ ok: true;
16
+ url: string;
17
+ };
18
+ export interface ExternalUrlPolicy {
19
+ /**
20
+ * Schemes admitted for fetching, compared against the parsed URL's
21
+ * lowercase protocol including its trailing colon (for example `https:`).
22
+ */
23
+ allowedSchemes: readonly string[];
24
+ /**
25
+ * Whether loopback, private, link-local, carrier-grade NAT, unspecified,
26
+ * broadcast, and special-use (`localhost`, `.local`, `.internal`,
27
+ * `.home.arpa`) hosts are admitted. An empty host is rejected regardless.
28
+ */
29
+ allowPrivateHosts: boolean;
30
+ /** Maximum accepted length of the raw candidate string, in code units. */
31
+ maxLength: number;
32
+ }
33
+ export declare const STUDIO_DEFAULT_URL_POLICY: Readonly<ExternalUrlPolicy>;
34
+ /**
35
+ * Validate one external resource URL against the policy. The candidate is
36
+ * parsed with the WHATWG URL parser and classification operates on the parsed
37
+ * `hostname`, so decimal, octal, hexadecimal, and dotted-partial IPv4
38
+ * spellings (`2130706433`, `0x7f000001`, `017700000001`, `127.1`) are
39
+ * normalized before range checks and cannot smuggle a private address past
40
+ * the policy. Punycode and IDN hosts that name none of the disallowed ranges
41
+ * are accepted lexically; whether such a name ultimately resolves to a
42
+ * private address is a DNS-time question the host fetcher must re-check.
43
+ */
44
+ export declare function validateExternalUrl(candidate: string, policy?: ExternalUrlPolicy): ExternalUrlValidationResult;
45
+ //# sourceMappingURL=url-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-policy.d.ts","sourceRoot":"","sources":["../src/url-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,MAAM,MAAM,0BAA0B,GACpC,oBAAoB,GAAG,kBAAkB,GAAG,WAAW,GAAG,oBAAoB,GAAG,cAAc,CAAC;AAElG,MAAM,MAAM,2BAA2B,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,0BAA0B,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;OAIG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,iBAAiB,CAIhE,CAAC;AAEH;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,iBAA6C,GACpD,2BAA2B,CAoB7B"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Canonical policy for external resource URLs (remote media imports, embeds).
3
+ * Studio never fetches author-supplied URLs itself; hosts that do MUST apply
4
+ * this validator before any fetch. The policy is purely lexical and
5
+ * deterministic — it classifies the WHATWG-parsed URL without network access,
6
+ * DNS resolution, clocks, or locale sensitivity. DNS-rebinding defence,
7
+ * redirect re-validation, and response verification therefore remain host
8
+ * runtime obligations of the hardened fetcher.
9
+ */
10
+ export const STUDIO_DEFAULT_URL_POLICY = Object.freeze({
11
+ allowedSchemes: Object.freeze(['https:']),
12
+ allowPrivateHosts: false,
13
+ maxLength: 2_048,
14
+ });
15
+ /**
16
+ * Validate one external resource URL against the policy. The candidate is
17
+ * parsed with the WHATWG URL parser and classification operates on the parsed
18
+ * `hostname`, so decimal, octal, hexadecimal, and dotted-partial IPv4
19
+ * spellings (`2130706433`, `0x7f000001`, `017700000001`, `127.1`) are
20
+ * normalized before range checks and cannot smuggle a private address past
21
+ * the policy. Punycode and IDN hosts that name none of the disallowed ranges
22
+ * are accepted lexically; whether such a name ultimately resolves to a
23
+ * private address is a DNS-time question the host fetcher must re-check.
24
+ */
25
+ export function validateExternalUrl(candidate, policy = STUDIO_DEFAULT_URL_POLICY) {
26
+ if (candidate.length > policy.maxLength) {
27
+ return { ok: false, reason: 'url-too-long' };
28
+ }
29
+ let parsed;
30
+ try {
31
+ parsed = new URL(candidate);
32
+ }
33
+ catch {
34
+ return { ok: false, reason: 'malformed' };
35
+ }
36
+ if (!policy.allowedSchemes.includes(parsed.protocol)) {
37
+ return { ok: false, reason: 'scheme-not-allowed' };
38
+ }
39
+ if (parsed.username.length > 0 || parsed.password.length > 0) {
40
+ return { ok: false, reason: 'credentials-in-url' };
41
+ }
42
+ if (!isPermittedHost(parsed.hostname, policy.allowPrivateHosts)) {
43
+ return { ok: false, reason: 'host-not-allowed' };
44
+ }
45
+ return { ok: true, url: parsed.href };
46
+ }
47
+ function isPermittedHost(hostname, allowPrivateHosts) {
48
+ if (hostname.length === 0) {
49
+ return false;
50
+ }
51
+ if (allowPrivateHosts) {
52
+ return true;
53
+ }
54
+ const trimmed = hostname.endsWith('.') ? hostname.slice(0, -1) : hostname;
55
+ if (trimmed.length === 0) {
56
+ return false;
57
+ }
58
+ if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
59
+ const groups = parseIpv6Groups(trimmed.slice(1, -1));
60
+ return groups !== undefined && !isDisallowedIpv6(groups);
61
+ }
62
+ const host = trimmed.toLowerCase();
63
+ if (host === 'localhost' || host.endsWith('.localhost')) {
64
+ return false;
65
+ }
66
+ if (host.endsWith('.local') || host.endsWith('.internal') || host.endsWith('.home.arpa')) {
67
+ return false;
68
+ }
69
+ const address = parseIpv4Host(host);
70
+ if (address !== undefined) {
71
+ return !isDisallowedIpv4(address);
72
+ }
73
+ return true;
74
+ }
75
+ function isDisallowedIpv4(address) {
76
+ const octet1 = Math.floor(address / 16_777_216) % 256;
77
+ const octet2 = Math.floor(address / 65_536) % 256;
78
+ return (address === 0 || // 0.0.0.0 unspecified
79
+ address === 4_294_967_295 || // 255.255.255.255 broadcast
80
+ octet1 === 127 || // 127.0.0.0/8 loopback
81
+ octet1 === 10 || // 10.0.0.0/8 private
82
+ (octet1 === 172 && octet2 >= 16 && octet2 <= 31) || // 172.16.0.0/12 private
83
+ (octet1 === 192 && octet2 === 168) || // 192.168.0.0/16 private
84
+ (octet1 === 169 && octet2 === 254) || // 169.254.0.0/16 link-local
85
+ (octet1 === 100 && octet2 >= 64 && octet2 <= 127) // 100.64.0.0/10 CGNAT
86
+ );
87
+ }
88
+ function isDisallowedIpv6(groups) {
89
+ const group = (index) => groups[index] ?? 0;
90
+ if (groups.every((piece) => piece === 0)) {
91
+ return true; // :: unspecified
92
+ }
93
+ if (groups.slice(0, 7).every((piece) => piece === 0) && group(7) === 1) {
94
+ return true; // ::1 loopback
95
+ }
96
+ if ((group(0) & 0xff_c0) === 0xfe_80) {
97
+ return true; // fe80::/10 link-local
98
+ }
99
+ if ((group(0) & 0xfe_00) === 0xfc_00) {
100
+ return true; // fc00::/7 unique-local
101
+ }
102
+ if (groups.slice(0, 5).every((piece) => piece === 0) &&
103
+ (group(5) === 0xff_ff || group(5) === 0)) {
104
+ // ::ffff:0:0/96 IPv4-mapped and the deprecated ::/96 IPv4-compatible
105
+ // block classify as their embedded IPv4 address.
106
+ return isDisallowedIpv4(group(6) * 65_536 + group(7));
107
+ }
108
+ return false;
109
+ }
110
+ /**
111
+ * Interpret a hostname the way the WHATWG IPv4 host parser does: up to four
112
+ * dot-separated numbers in decimal, octal (leading `0`), or hexadecimal
113
+ * (leading `0x`), where the final number may span the remaining octets.
114
+ * Returns the 32-bit address, or `undefined` when the host is not an IPv4
115
+ * candidate and must be treated as a name.
116
+ */
117
+ function parseIpv4Host(host) {
118
+ if (!/^[0-9A-Fa-fXx.]+$/u.test(host)) {
119
+ return undefined;
120
+ }
121
+ const parts = host.split('.');
122
+ if (parts.length > 4) {
123
+ return undefined;
124
+ }
125
+ const numbers = [];
126
+ for (const part of parts) {
127
+ const value = parseIpv4Number(part);
128
+ if (value === undefined) {
129
+ return undefined;
130
+ }
131
+ numbers.push(value);
132
+ }
133
+ const last = numbers[numbers.length - 1];
134
+ if (last === undefined) {
135
+ return undefined;
136
+ }
137
+ const prefix = numbers.slice(0, -1);
138
+ if (prefix.some((octet) => octet > 255) || last > 256 ** (4 - prefix.length) - 1) {
139
+ return undefined;
140
+ }
141
+ let address = last;
142
+ for (let index = 0; index < prefix.length; index += 1) {
143
+ address += (prefix[index] ?? 0) * 256 ** (3 - index);
144
+ }
145
+ return address;
146
+ }
147
+ function parseIpv4Number(part) {
148
+ if (part.length === 0) {
149
+ return undefined;
150
+ }
151
+ let digits = part;
152
+ let radix = 10;
153
+ if (digits.length >= 2 && (digits.startsWith('0x') || digits.startsWith('0X'))) {
154
+ digits = digits.slice(2);
155
+ radix = 16;
156
+ if (digits.length === 0) {
157
+ return 0;
158
+ }
159
+ }
160
+ else if (digits.length >= 2 && digits.startsWith('0')) {
161
+ digits = digits.slice(1);
162
+ radix = 8;
163
+ }
164
+ const pattern = radix === 16 ? /^[0-9A-Fa-f]+$/u : radix === 8 ? /^[0-7]+$/u : /^[0-9]+$/u;
165
+ if (!pattern.test(digits)) {
166
+ return undefined;
167
+ }
168
+ const value = Number.parseInt(digits, radix);
169
+ return value > 4_294_967_295 ? undefined : value;
170
+ }
171
+ /**
172
+ * Parse a bracket-stripped IPv6 literal into its eight 16-bit groups,
173
+ * expanding one `::` compression and accepting a trailing dotted-quad
174
+ * (IPv4-in-IPv6) suffix. Returns `undefined` for anything else so callers
175
+ * fail closed on hosts this parser cannot classify.
176
+ */
177
+ function parseIpv6Groups(literal) {
178
+ if (literal.length === 0 || literal.includes('%')) {
179
+ return undefined;
180
+ }
181
+ const marker = literal.indexOf('::');
182
+ if (marker === -1) {
183
+ const pieces = parseIpv6Pieces(literal, true);
184
+ return pieces?.length === 8 ? pieces : undefined;
185
+ }
186
+ if (literal.includes('::', marker + 1)) {
187
+ return undefined;
188
+ }
189
+ const head = parseIpv6Pieces(literal.slice(0, marker), false);
190
+ const tail = parseIpv6Pieces(literal.slice(marker + 2), true);
191
+ if (head === undefined || tail === undefined) {
192
+ return undefined;
193
+ }
194
+ const missing = 8 - head.length - tail.length;
195
+ if (missing < 1) {
196
+ return undefined;
197
+ }
198
+ const zeros = [];
199
+ for (let index = 0; index < missing; index += 1) {
200
+ zeros.push(0);
201
+ }
202
+ return [...head, ...zeros, ...tail];
203
+ }
204
+ function parseIpv6Pieces(text, allowIpv4Suffix) {
205
+ if (text.length === 0) {
206
+ return [];
207
+ }
208
+ const parts = text.split(':');
209
+ const pieces = [];
210
+ for (let index = 0; index < parts.length; index += 1) {
211
+ const part = parts[index];
212
+ if (part === undefined || part.length === 0) {
213
+ return undefined;
214
+ }
215
+ if (allowIpv4Suffix && index === parts.length - 1 && part.includes('.')) {
216
+ const embedded = parseDottedQuad(part);
217
+ if (embedded === undefined) {
218
+ return undefined;
219
+ }
220
+ pieces.push(Math.floor(embedded / 65_536), embedded % 65_536);
221
+ continue;
222
+ }
223
+ if (!/^[0-9A-Fa-f]{1,4}$/u.test(part)) {
224
+ return undefined;
225
+ }
226
+ pieces.push(Number.parseInt(part, 16));
227
+ }
228
+ return pieces;
229
+ }
230
+ function parseDottedQuad(text) {
231
+ const parts = text.split('.');
232
+ if (parts.length !== 4) {
233
+ return undefined;
234
+ }
235
+ let address = 0;
236
+ for (const part of parts) {
237
+ if (!/^(?:0|[1-9][0-9]{0,2})$/u.test(part)) {
238
+ return undefined;
239
+ }
240
+ const octet = Number(part);
241
+ if (octet > 255) {
242
+ return undefined;
243
+ }
244
+ address = address * 256 + octet;
245
+ }
246
+ return address;
247
+ }
248
+ //# sourceMappingURL=url-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-policy.js","sourceRoot":"","sources":["../src/url-policy.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kumwe/studio-core",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.0-alpha.3",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/kumwe/studio.git",