@vltpkg/registry-client 1.0.0-rc.3 → 1.0.0-rc.31

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 (88) hide show
  1. package/dist/{esm/add-header.d.ts → add-header.d.ts} +0 -1
  2. package/dist/{esm/add-header.js → add-header.js} +0 -1
  3. package/dist/auth.d.ts +44 -0
  4. package/dist/auth.js +118 -0
  5. package/dist/{esm/cache-entry.d.ts → cache-entry.d.ts} +0 -1
  6. package/dist/{esm/cache-entry.js → cache-entry.js} +0 -1
  7. package/dist/{esm/cache-revalidate.d.ts → cache-revalidate.d.ts} +0 -1
  8. package/dist/{esm/cache-revalidate.js → cache-revalidate.js} +7 -17
  9. package/dist/{esm/delete-header.d.ts → delete-header.d.ts} +0 -1
  10. package/dist/{esm/delete-header.js → delete-header.js} +0 -1
  11. package/dist/{esm/env.d.ts → env.d.ts} +0 -1
  12. package/dist/{esm/env.js → env.js} +0 -1
  13. package/dist/{esm/get-header.d.ts → get-header.d.ts} +0 -1
  14. package/dist/{esm/get-header.js → get-header.js} +0 -1
  15. package/dist/handle-304-response.d.ts +3 -0
  16. package/dist/handle-304-response.js +8 -0
  17. package/dist/{esm/index.d.ts → index.d.ts} +4 -3
  18. package/dist/{esm/index.js → index.js} +37 -17
  19. package/dist/{esm/is-cacheable.d.ts → is-cacheable.d.ts} +0 -1
  20. package/dist/{esm/is-cacheable.js → is-cacheable.js} +0 -1
  21. package/dist/{esm/is-iterable.d.ts → is-iterable.d.ts} +0 -1
  22. package/dist/{esm/is-iterable.js → is-iterable.js} +0 -1
  23. package/dist/oidc.d.ts +17 -0
  24. package/dist/oidc.js +150 -0
  25. package/dist/{esm/otplease.d.ts → otplease.d.ts} +6 -2
  26. package/dist/{esm/otplease.js → otplease.js} +19 -8
  27. package/dist/{esm/raw-header.d.ts → raw-header.d.ts} +0 -1
  28. package/dist/{esm/raw-header.js → raw-header.js} +2 -5
  29. package/dist/{esm/redirect.d.ts → redirect.d.ts} +0 -1
  30. package/dist/{esm/redirect.js → redirect.js} +0 -1
  31. package/dist/{esm/revalidate.d.ts → revalidate.d.ts} +0 -1
  32. package/dist/{esm/revalidate.js → revalidate.js} +1 -6
  33. package/dist/{esm/set-cache-headers.d.ts → set-cache-headers.d.ts} +0 -1
  34. package/dist/{esm/set-cache-headers.js → set-cache-headers.js} +0 -1
  35. package/dist/{esm/set-raw-header.d.ts → set-raw-header.d.ts} +0 -1
  36. package/dist/{esm/set-raw-header.js → set-raw-header.js} +1 -3
  37. package/dist/{esm/string-encoding.d.ts → string-encoding.d.ts} +0 -1
  38. package/dist/{esm/string-encoding.js → string-encoding.js} +0 -1
  39. package/dist/{esm/token-response.d.ts → token-response.d.ts} +0 -1
  40. package/dist/{esm/token-response.js → token-response.js} +0 -1
  41. package/dist/{esm/web-auth-challenge.d.ts → web-auth-challenge.d.ts} +0 -1
  42. package/dist/{esm/web-auth-challenge.js → web-auth-challenge.js} +0 -1
  43. package/package.json +37 -48
  44. package/dist/esm/add-header.d.ts.map +0 -1
  45. package/dist/esm/add-header.js.map +0 -1
  46. package/dist/esm/auth.d.ts +0 -9
  47. package/dist/esm/auth.d.ts.map +0 -1
  48. package/dist/esm/auth.js +0 -39
  49. package/dist/esm/auth.js.map +0 -1
  50. package/dist/esm/cache-entry.d.ts.map +0 -1
  51. package/dist/esm/cache-entry.js.map +0 -1
  52. package/dist/esm/cache-revalidate.d.ts.map +0 -1
  53. package/dist/esm/cache-revalidate.js.map +0 -1
  54. package/dist/esm/delete-header.d.ts.map +0 -1
  55. package/dist/esm/delete-header.js.map +0 -1
  56. package/dist/esm/env.d.ts.map +0 -1
  57. package/dist/esm/env.js.map +0 -1
  58. package/dist/esm/get-header.d.ts.map +0 -1
  59. package/dist/esm/get-header.js.map +0 -1
  60. package/dist/esm/handle-304-response.d.ts +0 -4
  61. package/dist/esm/handle-304-response.d.ts.map +0 -1
  62. package/dist/esm/handle-304-response.js +0 -10
  63. package/dist/esm/handle-304-response.js.map +0 -1
  64. package/dist/esm/index.d.ts.map +0 -1
  65. package/dist/esm/index.js.map +0 -1
  66. package/dist/esm/is-cacheable.d.ts.map +0 -1
  67. package/dist/esm/is-cacheable.js.map +0 -1
  68. package/dist/esm/is-iterable.d.ts.map +0 -1
  69. package/dist/esm/is-iterable.js.map +0 -1
  70. package/dist/esm/otplease.d.ts.map +0 -1
  71. package/dist/esm/otplease.js.map +0 -1
  72. package/dist/esm/package.json +0 -3
  73. package/dist/esm/raw-header.d.ts.map +0 -1
  74. package/dist/esm/raw-header.js.map +0 -1
  75. package/dist/esm/redirect.d.ts.map +0 -1
  76. package/dist/esm/redirect.js.map +0 -1
  77. package/dist/esm/revalidate.d.ts.map +0 -1
  78. package/dist/esm/revalidate.js.map +0 -1
  79. package/dist/esm/set-cache-headers.d.ts.map +0 -1
  80. package/dist/esm/set-cache-headers.js.map +0 -1
  81. package/dist/esm/set-raw-header.d.ts.map +0 -1
  82. package/dist/esm/set-raw-header.js.map +0 -1
  83. package/dist/esm/string-encoding.d.ts.map +0 -1
  84. package/dist/esm/string-encoding.js.map +0 -1
  85. package/dist/esm/token-response.d.ts.map +0 -1
  86. package/dist/esm/token-response.js.map +0 -1
  87. package/dist/esm/web-auth-challenge.d.ts.map +0 -1
  88. package/dist/esm/web-auth-challenge.js.map +0 -1
@@ -27,8 +27,10 @@ export const otplease = async (client, options, response) => {
27
27
  const challenge = getWebAuthChallenge(await response.body.json().catch(() => null));
28
28
  if (challenge) {
29
29
  return {
30
- ...options,
31
- otp: (await client.webAuthOpener(challenge)).token,
30
+ retry: {
31
+ ...options,
32
+ otp: (await client.webAuthOpener(challenge)).token,
33
+ },
32
34
  };
33
35
  }
34
36
  const { 'npm-notice': npmNotice } = response.headers;
@@ -39,8 +41,10 @@ export const otplease = async (client, options, response) => {
39
41
  await urlOpen(match[1]);
40
42
  log(notice);
41
43
  return {
42
- ...options,
43
- otp: await question('OTP: '),
44
+ retry: {
45
+ ...options,
46
+ otp: await question('OTP: '),
47
+ },
44
48
  };
45
49
  }
46
50
  }
@@ -48,16 +52,23 @@ export const otplease = async (client, options, response) => {
48
52
  response,
49
53
  });
50
54
  }
55
+ if (wwwAuth.has('bearer')) {
56
+ throw error('Missing or invalid authentication token. Run `vlt login` or `vlt token add` to authenticate.', { response });
57
+ }
51
58
  if (wwwAuth.size) {
52
59
  throw error('Unknown authentication challenge', { response });
53
60
  }
54
- // see if the body is prompting for otp
61
+ // Consume the body to check if it's prompting for OTP.
62
+ // We must return the consumed text so the caller doesn't try to
63
+ // re-read from the already-drained stream.
55
64
  const text = await response.body.text().catch(() => '');
56
65
  if (text.toLowerCase().includes('one-time pass')) {
57
66
  return {
58
- ...options,
59
- otp: await question(text),
67
+ retry: {
68
+ ...options,
69
+ otp: await question(text),
70
+ },
60
71
  };
61
72
  }
73
+ return { bodyConsumed: text };
62
74
  };
63
- //# sourceMappingURL=otplease.js.map
@@ -6,4 +6,3 @@ export declare const getRawHeader: (headers: Uint8Array[], key: string) => Uint8
6
6
  * Give it a key and value, and it'll overwrite or add the header entry
7
7
  */
8
8
  export declare const setRawHeader: (headers: Uint8Array[], key: string, value: Uint8Array | string) => Uint8Array[];
9
- //# sourceMappingURL=raw-header.d.ts.map
@@ -6,8 +6,7 @@ export const getRawHeader = (headers, key) => {
6
6
  const k = key.toLowerCase();
7
7
  for (let i = 0; i < headers.length; i += 2) {
8
8
  const name = headers[i];
9
- if (name &&
10
- name.length === key.length &&
9
+ if (name?.length === key.length &&
11
10
  getDecodedValue(name).toLowerCase() === k) {
12
11
  return headers[i + 1];
13
12
  }
@@ -21,8 +20,7 @@ export const setRawHeader = (headers, key, value) => {
21
20
  const encVal = typeof value === 'string' ? getEncondedValue(value) : value;
22
21
  for (let i = 0; i < headers.length; i += 2) {
23
22
  const name = headers[i];
24
- if (name &&
25
- name.length === k.length &&
23
+ if (name?.length === k.length &&
26
24
  getDecodedValue(name).toLowerCase() === k) {
27
25
  return [
28
26
  ...headers.slice(0, i + 1),
@@ -33,4 +31,3 @@ export const setRawHeader = (headers, key, value) => {
33
31
  }
34
32
  return [...headers, getEncondedValue(k), encVal];
35
33
  };
36
- //# sourceMappingURL=raw-header.js.map
@@ -20,4 +20,3 @@ export declare const isRedirect: (response: CacheEntry) => response is RedirectR
20
20
  * {@link isRedirect} on it.
21
21
  */
22
22
  export declare const redirect: (options: RegistryClientRequestOptions, response: RedirectResponse, from: URL) => [] | [URL, RegistryClientRequestOptions];
23
- //# sourceMappingURL=redirect.d.ts.map
@@ -62,4 +62,3 @@ export const redirect = (options, response, from) => {
62
62
  }
63
63
  }
64
64
  };
65
- //# sourceMappingURL=redirect.js.map
@@ -2,4 +2,3 @@ export declare const __CODE_SPLIT_SCRIPT_NAME: string;
2
2
  export declare const main: (cache?: string, input?: NodeJS.ReadStream & {
3
3
  fd: 0;
4
4
  }) => Promise<boolean>;
5
- //# sourceMappingURL=revalidate.d.ts.map
@@ -40,16 +40,11 @@ export const main = async (cache, input = process.stdin) => {
40
40
  }));
41
41
  return true;
42
42
  };
43
- const g = globalThis;
44
- if (isMain(g.__VLT_INTERNAL_MAIN ?? process.argv[1])) {
43
+ if (isMain(process.argv[1])) {
45
44
  process.title = 'vlt-cache-revalidate';
46
- // When compiled there can be other leading args supplied by Deno
47
- // so always use the last arg unless there are only two which means
48
- // no path was supplied.
49
45
  const cacheFolder = process.argv.length === 2 ? undefined : process.argv.at(-1);
50
46
  const res = await main(cacheFolder, process.stdin);
51
47
  if (!res) {
52
48
  process.exit(1);
53
49
  }
54
50
  }
55
- //# sourceMappingURL=revalidate.js.map
@@ -1,4 +1,3 @@
1
1
  import type { CacheEntry } from './cache-entry.ts';
2
2
  import type { RegistryClientRequestOptions } from './index.ts';
3
3
  export declare const setCacheHeaders: (options: RegistryClientRequestOptions, entry?: CacheEntry) => void;
4
- //# sourceMappingURL=set-cache-headers.d.ts.map
@@ -14,4 +14,3 @@ export const setCacheHeaders = (options, entry) => {
14
14
  options.headers = addHeader(options.headers, 'if-modified-since', date);
15
15
  }
16
16
  };
17
- //# sourceMappingURL=set-cache-headers.js.map
@@ -3,4 +3,3 @@
3
3
  * overwrite the current value of a header, or if not found, append
4
4
  */
5
5
  export declare const setRawHeader: (headers: Uint8Array[], key: string, value: Uint8Array | string) => Uint8Array[];
6
- //# sourceMappingURL=set-raw-header.d.ts.map
@@ -9,8 +9,7 @@ export const setRawHeader = (headers, key, value) => {
9
9
  const valBuf = getEncondedValue(value);
10
10
  for (let i = 0; i < headers.length; i += 2) {
11
11
  const k = headers[i];
12
- if (k &&
13
- k.length === keyBuf.length &&
12
+ if (k?.length === keyBuf.length &&
14
13
  getDecodedValue(k).toLowerCase() === key) {
15
14
  headers[i + 1] = valBuf;
16
15
  return headers;
@@ -19,4 +18,3 @@ export const setRawHeader = (headers, key, value) => {
19
18
  headers.push(keyBuf, valBuf);
20
19
  return headers;
21
20
  };
22
- //# sourceMappingURL=set-raw-header.js.map
@@ -6,4 +6,3 @@ export declare const getDecodedValue: (value: string | Uint8Array | undefined) =
6
6
  * Encodes a string to a Uint8Array
7
7
  */
8
8
  export declare const getEncondedValue: (value: Uint8Array | string | undefined) => Uint8Array;
9
- //# sourceMappingURL=string-encoding.d.ts.map
@@ -22,4 +22,3 @@ export const getEncondedValue = (value) => {
22
22
  }
23
23
  return value;
24
24
  };
25
- //# sourceMappingURL=string-encoding.js.map
@@ -2,4 +2,3 @@ export type TokenResponse = {
2
2
  token: string;
3
3
  };
4
4
  export declare const getTokenResponse: (b: unknown) => TokenResponse | undefined;
5
- //# sourceMappingURL=token-response.d.ts.map
@@ -5,4 +5,3 @@ export const getTokenResponse = (b) => (!!b &&
5
5
  b.token) ?
6
6
  { token: b.token }
7
7
  : undefined;
8
- //# sourceMappingURL=token-response.js.map
@@ -3,4 +3,3 @@ export type WebAuthChallenge = {
3
3
  authUrl: string;
4
4
  };
5
5
  export declare const getWebAuthChallenge: (o: unknown) => WebAuthChallenge | undefined;
6
- //# sourceMappingURL=web-auth-challenge.d.ts.map
@@ -11,4 +11,3 @@ export const getWebAuthChallenge = (o) => {
11
11
  return authUrl ? { doneUrl: o.doneUrl, authUrl } : undefined;
12
12
  }
13
13
  };
14
- //# sourceMappingURL=web-auth-challenge.js.map
package/package.json CHANGED
@@ -1,86 +1,75 @@
1
1
  {
2
2
  "name": "@vltpkg/registry-client",
3
3
  "description": "Fetch package artifacts and metadata from registries",
4
- "version": "1.0.0-rc.3",
4
+ "version": "1.0.0-rc.31",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
8
8
  "directory": "src/registry-client"
9
9
  },
10
- "author": "vlt technology inc. <support@vlt.sh> (http://vlt.sh)",
11
- "tshy": {
12
- "selfLink": false,
13
- "liveDev": true,
14
- "dialects": [
15
- "esm"
16
- ],
17
- "exports": {
18
- "./package.json": "./package.json",
19
- ".": "./src/index.ts",
20
- "./cache-entry": "./src/cache-entry.ts"
21
- }
10
+ "author": {
11
+ "name": "vlt technology inc.",
12
+ "email": "support@vlt.sh",
13
+ "url": "http://vlt.sh"
22
14
  },
23
15
  "dependencies": {
16
+ "@vltpkg/cache": "1.0.0-rc.31",
17
+ "@vltpkg/cache-unzip": "1.0.0-rc.31",
18
+ "@vltpkg/error-cause": "1.0.0-rc.31",
19
+ "@vltpkg/keychain": "1.0.0-rc.31",
20
+ "@vltpkg/output": "1.0.0-rc.31",
21
+ "@vltpkg/types": "1.0.0-rc.31",
22
+ "@vltpkg/url-open": "1.0.0-rc.31",
23
+ "@vltpkg/xdg": "1.0.0-rc.31",
24
24
  "cache-control-parser": "^2.0.6",
25
25
  "package-json-from-dist": "^1.0.1",
26
- "undici": "^7.15.0",
27
- "@vltpkg/cache": "1.0.0-rc.3",
28
- "@vltpkg/error-cause": "1.0.0-rc.3",
29
- "@vltpkg/output": "1.0.0-rc.3",
30
- "@vltpkg/cache-unzip": "1.0.0-rc.3",
31
- "@vltpkg/keychain": "1.0.0-rc.3",
32
- "@vltpkg/types": "1.0.0-rc.3",
33
- "@vltpkg/url-open": "1.0.0-rc.3",
34
- "@vltpkg/xdg": "1.0.0-rc.3"
26
+ "undici": "^7.16.0"
35
27
  },
36
28
  "devDependencies": {
37
- "@eslint/js": "^9.34.0",
38
- "@types/node": "^22.17.2",
39
- "eslint": "^9.34.0",
40
- "prettier": "^3.6.2",
41
- "tap": "^21.1.0",
42
- "tshy": "^3.0.2",
29
+ "@eslint/js": "^9.39.1",
30
+ "@types/node": "^22.19.2",
31
+ "eslint": "^9.39.1",
32
+ "prettier": "^3.7.4",
33
+ "tap": "^21.5.0",
43
34
  "typedoc": "~0.27.9",
44
35
  "typescript": "5.7.3",
45
- "typescript-eslint": "^8.40.0"
36
+ "typescript-eslint": "^8.49.0"
46
37
  },
47
38
  "license": "BSD-2-Clause-Patent",
48
39
  "engines": {
49
- "node": ">=22"
40
+ "node": ">=22.22.0"
41
+ },
42
+ "scripts": {
43
+ "format": "prettier --write . --log-level warn --ignore-path ../../.prettierignore --cache",
44
+ "format:check": "prettier --check . --ignore-path ../../.prettierignore --cache",
45
+ "lint": "eslint . --fix",
46
+ "lint:check": "eslint .",
47
+ "prepack": "tsc -p tsconfig.publish.json && ../../scripts/update-dist-exports.ts",
48
+ "snap": "tap",
49
+ "test": "tap",
50
+ "posttest": "tsc --noEmit",
51
+ "typecheck": "tsc --noEmit"
50
52
  },
51
53
  "tap": {
52
54
  "extends": "../../tap-config.yaml"
53
55
  },
54
56
  "prettier": "../../.prettierrc.js",
55
- "module": "./dist/esm/index.js",
57
+ "module": "./dist/index.js",
56
58
  "type": "module",
57
59
  "exports": {
58
60
  "./package.json": "./package.json",
59
61
  ".": {
60
62
  "import": {
61
- "types": "./dist/esm/index.d.ts",
62
- "default": "./dist/esm/index.js"
63
+ "default": "./dist/index.js"
63
64
  }
64
65
  },
65
66
  "./cache-entry": {
66
67
  "import": {
67
- "types": "./dist/esm/cache-entry.d.ts",
68
- "default": "./dist/esm/cache-entry.js"
68
+ "default": "./dist/cache-entry.js"
69
69
  }
70
70
  }
71
71
  },
72
72
  "files": [
73
73
  "dist"
74
- ],
75
- "scripts": {
76
- "format": "prettier --write . --log-level warn --ignore-path ../../.prettierignore --cache",
77
- "format:check": "prettier --check . --ignore-path ../../.prettierignore --cache",
78
- "lint": "eslint . --fix",
79
- "lint:check": "eslint .",
80
- "snap": "tap",
81
- "test": "tap",
82
- "posttest": "tsc --noEmit",
83
- "tshy": "tshy",
84
- "typecheck": "tsc --noEmit"
85
- }
86
- }
74
+ ]
75
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-header.d.ts","sourceRoot":"","sources":["../../src/add-header.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS,GACpB,CAAC,SACG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,GAC7B,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,GACjD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,GAC7C,MAAM,EAAE,WAEH,CAAC,GAAG,IAAI,GAAG,SAAS,OACxB,MAAM,UACH,MAAM,KACb,CAkBF,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-header.js","sourceRoot":"","sources":["../../src/add-header.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,qEAAqE;AACrE,iEAAiE;AACjE,MAAM,CAAC,MAAM,SAAS,GAAG,CAOvB,OAA6B,EAC7B,GAAW,EACX,KAAc,EACX,EAAE;IACL,IAAI,CAAC,KAAK;QAAE,OAAO,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAE7C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAO,CAAA;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAiB,CAAA;QAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,OAA8B,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;;YAC9C,OAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3C,OAAO,OAAO,CAAA;IAChB,CAAC;SAAM,IACL,UAAU,CAA0C,OAAO,CAAC,EAC5D,CAAC;QACD,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAiB,CAAA;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACpB,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { deleteHeader } from './delete-header.ts'\nimport { isIterable } from './is-iterable.ts'\n\n// this does some rude things with types, but not much way around it,\n// since the opts.headers type is so loosey goosey to begin with.\nexport const addHeader = <\n H extends\n | [string, string[] | string][]\n | Iterable<[string, string[] | string | undefined]>\n | Record<string, string[] | string | undefined>\n | string[],\n>(\n headers: H | null | undefined,\n key: string,\n value?: string,\n): H => {\n if (!value) return deleteHeader(headers, key)\n\n if (!headers) return { [key]: value } as H\n if (Array.isArray(headers)) {\n if (!headers.length) return [[key, value]] as unknown as H\n if (Array.isArray(headers[0]))\n (headers as [string, string][]).push([key, value])\n else (headers as string[]).push(key, value)\n return headers\n } else if (\n isIterable<[string, string[] | string | undefined]>(headers)\n ) {\n return [...headers, [key, value]] as unknown as H\n } else {\n headers[key] = value\n return headers\n }\n}\n"]}
@@ -1,9 +0,0 @@
1
- import { Keychain } from '@vltpkg/keychain';
2
- export type Token = `Bearer ${string}` | `Basic ${string}`;
3
- export declare const keychains: Map<string, Keychain<Token>>;
4
- export declare const getKC: (identity: string) => Keychain<Token>;
5
- export declare const isToken: (t: any) => t is Token;
6
- export declare const deleteToken: (registry: string, identity: string) => Promise<void>;
7
- export declare const setToken: (registry: string, token: Token, identity: string) => Promise<void>;
8
- export declare const getToken: (registry: string, identity: string) => Promise<Token | undefined>;
9
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,MAAM,KAAK,GAAG,UAAU,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAAA;AAG1D,eAAO,MAAM,SAAS,8BAAqC,CAAA;AAE3D,eAAO,MAAM,KAAK,aAAc,MAAM,oBAOrC,CAAA;AAED,eAAO,MAAM,OAAO,MAAO,GAAG,KAAG,CAAC,IAAI,KAEe,CAAA;AAErD,eAAO,MAAM,WAAW,aACZ,MAAM,YACN,MAAM,KACf,OAAO,CAAC,IAAI,CAKd,CAAA;AAED,eAAO,MAAM,QAAQ,aACT,MAAM,SACT,KAAK,YACF,MAAM,KACf,OAAO,CAAC,IAAI,CAGd,CAAA;AAED,eAAO,MAAM,QAAQ,aACT,MAAM,YACN,MAAM,KACf,OAAO,CAAC,KAAK,GAAG,SAAS,CAc3B,CAAA"}
package/dist/esm/auth.js DELETED
@@ -1,39 +0,0 @@
1
- import { Keychain } from '@vltpkg/keychain';
2
- // just exported for testing
3
- export const keychains = new Map();
4
- export const getKC = (identity) => {
5
- const kc = keychains.get(identity);
6
- if (kc)
7
- return kc;
8
- const i = identity ? `vlt/auth/${identity}` : 'vlt/auth';
9
- const nkc = new Keychain(i);
10
- keychains.set(identity, nkc);
11
- return nkc;
12
- };
13
- export const isToken = (t) => typeof t === 'string' &&
14
- (t.startsWith('Bearer ') || t.startsWith('Basic '));
15
- export const deleteToken = async (registry, identity) => {
16
- const kc = getKC(identity);
17
- await kc.load();
18
- kc.delete(new URL(registry).origin);
19
- await kc.save();
20
- };
21
- export const setToken = async (registry, token, identity) => {
22
- const kc = getKC(identity);
23
- return kc.set(new URL(registry).origin, token);
24
- };
25
- export const getToken = async (registry, identity) => {
26
- const kc = getKC(identity);
27
- registry = new URL(registry).origin;
28
- const envReg = process.env.VLT_REGISTRY;
29
- if (envReg && registry === new URL(envReg).origin) {
30
- const envTok = process.env.VLT_TOKEN;
31
- if (envTok)
32
- return `Bearer ${envTok}`;
33
- }
34
- const tok = process.env[`VLT_TOKEN_${registry.replace(/[^a-zA-Z0-9]+/g, '_')}`];
35
- if (tok)
36
- return `Bearer ${tok}`;
37
- return kc.get(registry);
38
- };
39
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAI3C,4BAA4B;AAC5B,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAA;AAE3D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,EAAE;IACxC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IACjB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,CAAA;IACxD,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAQ,CAAC,CAAC,CAAA;IAClC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAM,EAAc,EAAE,CAC5C,OAAO,CAAC,KAAK,QAAQ;IACrB,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;AAErD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,QAAgB,EAChB,QAAgB,EACD,EAAE;IACjB,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC1B,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;IACf,EAAE,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,QAAgB,EAChB,KAAY,EACZ,QAAgB,EACD,EAAE;IACjB,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC1B,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,QAAgB,EAChB,QAAgB,EACY,EAAE;IAC9B,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC1B,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAA;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IACvC,IAAI,MAAM,IAAI,QAAQ,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAA;QACpC,IAAI,MAAM;YAAE,OAAO,UAAU,MAAM,EAAE,CAAA;IACvC,CAAC;IACD,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CACT,aAAa,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CACvD,CAAA;IACH,IAAI,GAAG;QAAE,OAAO,UAAU,GAAG,EAAE,CAAA;IAC/B,OAAO,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACzB,CAAC,CAAA","sourcesContent":["import { Keychain } from '@vltpkg/keychain'\n\nexport type Token = `Bearer ${string}` | `Basic ${string}`\n\n// just exported for testing\nexport const keychains = new Map<string, Keychain<Token>>()\n\nexport const getKC = (identity: string) => {\n const kc = keychains.get(identity)\n if (kc) return kc\n const i = identity ? `vlt/auth/${identity}` : 'vlt/auth'\n const nkc = new Keychain<Token>(i)\n keychains.set(identity, nkc)\n return nkc\n}\n\nexport const isToken = (t: any): t is Token =>\n typeof t === 'string' &&\n (t.startsWith('Bearer ') || t.startsWith('Basic '))\n\nexport const deleteToken = async (\n registry: string,\n identity: string,\n): Promise<void> => {\n const kc = getKC(identity)\n await kc.load()\n kc.delete(new URL(registry).origin)\n await kc.save()\n}\n\nexport const setToken = async (\n registry: string,\n token: Token,\n identity: string,\n): Promise<void> => {\n const kc = getKC(identity)\n return kc.set(new URL(registry).origin, token)\n}\n\nexport const getToken = async (\n registry: string,\n identity: string,\n): Promise<Token | undefined> => {\n const kc = getKC(identity)\n registry = new URL(registry).origin\n const envReg = process.env.VLT_REGISTRY\n if (envReg && registry === new URL(envReg).origin) {\n const envTok = process.env.VLT_TOKEN\n if (envTok) return `Bearer ${envTok}`\n }\n const tok =\n process.env[\n `VLT_TOKEN_${registry.replace(/[^a-zA-Z0-9]+/g, '_')}`\n ]\n if (tok) return `Bearer ${tok}`\n return kc.get(registry)\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache-entry.d.ts","sourceRoot":"","sources":["../../src/cache-entry.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,GAAG,MAAM,sBAAsB,CAAA;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAS/C,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAyB/C,QAAA,MAAM,cAAc,eAA2C,CAAA;AAE/D,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IAExB;;;;;;;;;;;;;;OAcG;IACH,+BAA+B,CAAC,EAAE,MAAM,CAAA;CACzC,CAAA;AAED,qBAAa,UAAU;;gBAsBnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,UAAU,EAAE,EACrB,EACE,IAAI,EACJ,SAAS,EACT,cAAsB,EACtB,+BAA+B,EAC7B,0BAA+B,EACjC,aAAa,GACd,GAAE,iBAAsB;IAwC3B,MAAM;;;IAwCN,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM;IAShE,IAAI,IAAI,IAAI,IAAI,GAAG,SAAS,CAK3B;IAGD,IAAI,MAAM,IAAI,MAAM,CAQnB;IAGD,IAAI,YAAY,IAAI,GAAG,CAAC,YAAY,CAKnC;IAGD,IAAI,oBAAoB,IAAI,OAAO,CAWlC;IAGD,IAAI,WAAW,WAId;IAOD,IAAI,KAAK,IAAI,OAAO,CAmBnB;IAED;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,UAAU;IAcrB,IAAI,UAAU,WAEb;IACD,IAAI,OAAO,IAAI,UAAU,EAAE,CAE1B;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,UAAU,CAYtB;IAED;;;;;;;;;;;;OAYG;IACH,cAAc,CACZ,OAAO,GAAE,iBAAsB,GAC9B,IAAI,IAAI,UAAU,GAAG;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE;IAchD,IAAI,eAAe,IAAI,SAAS,CAO/B;IAED,IAAI,eAAe,CAAC,CAAC,EAAE,SAAS,EAG/B;IAED,IAAI,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,EAKrC;IACD,IAAI,SAAS,IANI,SAAS,GAAG,SAAS,CAQrC;IAED;;OAEG;IACH,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI5C;;OAEG;IACH,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO9C;;OAEG;IACH,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM;IAI/C;;OAEG;IACH,MAAM,IAAI,MAAM;IAUhB,IAAI,IAAI,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAE3C;IAGD,IAAI,MAAM,IAAI,OAAO,CAYpB;IAGD,IAAI,MAAM,IAAI,OAAO,CAcpB;IAED;;;;OAIG;IACH,KAAK;IAqBL;;;OAGG;IACH,IAAI;IAKJ;;OAEG;IACH,IAAI,IAAI,OAAO;IAQf;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU;IAuD7C,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAO/C;;OAEG;IACH,MAAM,IAAI,MAAM;CAkDjB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache-entry.js","sourceRoot":"","sources":["../../src/cache-entry.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,EAAE;AACF,4EAA4E;AAC5E,yDAAyD;AACzD,EAAE;AACF,sBAAsB;AACtB,EAAE;AACF,gBAAgB;AAChB,yBAAyB;AACzB,YAAY;AACZ,SAAS;AACT,EAAE;AACF,0EAA0E;AAC1E,+CAA+C;AAC/C,EAAE;AACF,8EAA8E;AAC9E,4DAA4D;AAC5D,EAAE;AACF,2EAA2E;AAC3E,eAAe;AAGf,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAE3C,OAAO,GAAG,MAAM,sBAAsB,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EACL,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAI7B,MAAM,QAAQ,GAAG,CAAC,GAAe,EAAE,MAAc,EAAE,EAAE;IACnD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;IACrB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACzB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACzB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEzB,oCAAoC;IACpC,qBAAqB;IACrB,IACE,CAAC,KAAK,SAAS;QACf,CAAC,KAAK,SAAS;QACf,CAAC,KAAK,SAAS;QACf,CAAC,KAAK,SAAS,EACf,CAAC;QACD,MAAM,KAAK,CAAC,6CAA6C,EAAE;YACzD,KAAK,EAAE,GAAG,CAAC,MAAM;SAClB,CAAC,CAAA;IACJ,CAAC;IACD,oBAAoB;IAEpB,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;AAC7C,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;AAkD/D,MAAM,OAAO,UAAU;IACrB,WAAW,CAAQ;IACnB,6CAA6C;IAC7C,QAAQ,CAAc;IACtB,4DAA4D;IAC5D,KAAK,CAAa;IAClB;;;OAGG;IACH,UAAU,GAAiB,EAAE,CAAA;IAC7B,gEAAgE;IAChE,WAAW,GAAG,CAAC,CAAA;IACf,6CAA6C;IAC7C,cAAc,CAAS;IACvB,UAAU,CAAY;IACtB,gBAAgB,CAAY;IAC5B,KAAK,CAAU;IACf,eAAe,CAAA;IACf,2BAA2B,CAAA;IAE3B,YACE,UAAkB,EAClB,OAAqB,EACrB,EACE,IAAI,EACJ,SAAS,EACT,cAAc,GAAG,KAAK,EACtB,+BAA+B,EAC7B,0BAA0B,GAAG,EAAE,EACjC,aAAa,MACQ,EAAE;QAEzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;QAC7B,IAAI,CAAC,eAAe,GAAG,cAAc,CAAA;QACrC,IAAI,CAAC,2BAA2B,GAAG,0BAA0B,CAAA;QAC7D,IAAI,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAEzC,uEAAuE;QACvE,gEAAgE;QAChE,IAAI,aAAa,IAAI,IAAI,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YAC/D,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;QACrC,CAAC;QAED,kEAAkE;QAClE,mCAAmC;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;YACvD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAA;YAClC,qBAAqB;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACnD,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;YAC3D,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;QACtB,CAAC;QACD,oBAAoB;IACtB,CAAC;IAED,IAAI,gBAAgB;QAClB,MAAM,GAAG,GAAuB,EAAE,CAAA;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7C,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACjD,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,MAAM;QACJ,MAAM,EACJ,UAAU,EACV,KAAK,EACL,oBAAoB,EACpB,YAAY,EACZ,IAAI,EACJ,WAAW,EACX,SAAS,EACT,MAAM,EACN,MAAM,EACN,MAAM,GACP,GAAG,IAAI,CAAA;QACR,qBAAqB;QACrB,MAAM,GAAG,GACP,IAAI,CAAC,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;YAClD,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,OAAO,GACX,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAClE,mBAAmB;QACnB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC;YACb,UAAU;YACV,OAAO,EAAE,IAAI,CAAC,gBAAgB;YAC9B,WAAW;YACX,SAAS;YACT,IAAI;YACJ,OAAO;YACP,YAAY;YACZ,KAAK;YACL,oBAAoB;YACpB,GAAG;YACH,MAAM;YACN,MAAM;YACN,MAAM;SACP,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CACvC,CAAA;IACH,CAAC;IAED,CAAC,cAAc,CAAC,CAAC,KAAa,EAAE,OAAuB;QACrD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;YACjC,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAA;QACF,OAAO,sCAAsC,GAAG,EAAE,CAAA;IACpD,CAAC;IAED,KAAK,CAAO;IACZ,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,EAAE;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAA;QACjC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,OAAO,CAAS;IAChB,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QACnD,8CAA8C;QAC9C,yDAAyD;QACzD,4CAA4C;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,GAAG,CAAA;QACrD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,aAAa,CAAmB;IAChC,IAAI,YAAY;QACd,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC,aAAa,CAAA;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;QAChD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC5C,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;IAED,qBAAqB,CAAU;IAC/B,IAAI,oBAAoB;QACtB,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS;YAC1C,OAAO,IAAI,CAAC,qBAAqB,CAAA;QACnC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QACzC,MAAM,GAAG,GACP,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAA;QAEhD,IAAI,CAAC,qBAAqB;YACxB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC/C,OAAO,IAAI,CAAC,qBAAqB,CAAA;IACnC,CAAC;IAED,YAAY,CAAS;IACrB,IAAI,WAAW;QACb,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,YAAY,CAAA;QAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;QAC9D,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAU;IAChB,IAAI,KAAK;QACP,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QAEjD,4BAA4B;QAC5B,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;QAE5D,0DAA0D;QAC1D,8CAA8C;QAC9C,8CAA8C;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAA;QAC3B,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;QAE3D,8CAA8C;QAC9C,yDAAyD;QACzD,4CAA4C;QAC5C,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAA;QAC5C,IAAI,CAAC,MAAM;YACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvD,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,CAAa;QACnB,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,UAAU,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;YACnC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,UAAU,CAAA;QAClC,CAAC;IACH,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IACD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,2CAA2C;QAC3C,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACjC,+DAA+D;QAC/D,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChD,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACrD,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACnC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YAChB,GAAG,IAAI,IAAI,CAAC,UAAU,CAAA;QACxB,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,cAAc,CACZ,UAA6B,EAAE;QAE/B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAA;QAClC,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,KAAK,CAAC,yBAAyB,EAAE;gBACrC,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI,CAAC,UAAU;gBACvB,KAAK,EAAE,IAAI,CAAC,eAAe;gBAC3B,GAAG,OAAO;aACX,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,eAAe;QACjB,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC,gBAAgB,CAAA;QACvD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,MAAM,CAAC,GAAc,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;QACtD,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;QACxB,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,eAAe,CAAC,CAAY;QAC9B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;QACzB,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,SAAS,CAAC,CAAwB;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;YACnB,IAAI,IAAI,CAAC,eAAe;gBAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IACD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,CAAS;QACjB,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACvC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,CAAS;QACvB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,CAAS,EAAE,KAA0B;QAC7C,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;IACvD,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,CAAC,KAAK,CAAC,MAAM,EACjB,IAAI,CAAC,KAAK,CAAC,UAAU,EACrB,IAAI,CAAC,KAAK,CAAC,UAAU,CACtB,CAAA;IACH,CAAC;IAED,qDAAqD;IACrD,oBAAoB;IACpB,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA;IAClD,CAAC;IAED,OAAO,CAAU;IACjB,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QACnD,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAA;QAC/C,oCAAoC;QACpC,IAAI,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACxB,sDAAsD;QACtD,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QACvB,4DAA4D;QAC5D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;QAC7D,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,OAAO,CAAU;IACjB,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QACnD,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAA;QACnD,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAA;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAA;QACtB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;QACjD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAA;YAC9C,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,4DAA4D;YAC5D,wDAAwD;YACxD,qBAAqB;YACrB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBACzB,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAA;YAC3C,oBAAoB;YACpB,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAA;YAC9C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;YAC/D,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,UAAU,CAAA;YAChC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,UAAU,CAAA;YACnC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAA;YAC7D,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAY,CAAA;QAC/C,IAAI,CAAC,KAAK,GAAG,GAAG,CAAA;QAChB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,MAAkB;QAC9B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,eAAe,CAAA;QACxB,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QACpC,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC7B,OAAO,eAAe,CAAA;QACxB,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACjE,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QAClD,6DAA6D;QAC7D,MAAM,OAAO,GAAiB,EAAE,CAAA;QAChC,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,IAAI,SAAS,GAA0B,SAAS,CAAA;QAChD,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;YACvC,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;YACnD,oEAAoE;YACpE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,eAAe,CACvB,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAC5B,CAAC,WAAW,EAAE,CAAA;gBACf,IAAI,CAAC,KAAK,WAAW;oBACnB,SAAS,GAAG,eAAe,CAAC,GAAG,CAAc,CAAA;YACjD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjB,CAAC,IAAI,IAAI,CAAA;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAEtC,MAAM,CAAC,GAAG,IAAI,UAAU,CACtB,UAAU,EACV,YAAY,CACV,OAAO,EACP,gBAAgB,EAChB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CACxB,EACD;YACE,IAAI;YACJ,SAAS;YACT,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI,CAAC,UAAU;SAC/B,CACF,CAAA;QAED,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,CAAC,CAAC,IAAI,EAAE,CAAA;YACV,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,eAAe,CAAA;YACxB,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,MAAkB;QACnC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QACpC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAA;QACzD,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IACvD,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC1C,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAE/C,qGAAqG;QACrG,IAAI,UAAU,GAAG,CAAC,GAAG,WAAW,CAAC,UAAU,CAAA;QAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,UAAU,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAA;QAE7D,oDAAoD;QACpD,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;QACtC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;QAC3C,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;QAC3C,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,IAAI,CAAA;QAC1C,YAAY,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAA;QAEnC,mDAAmD;QACnD,MAAM,YAAY,GAAiB,EAAE,CAAA;QACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAA;YAChD,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;YAC5B,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;YACxB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;YACxB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAA;YACvB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;YAChB,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC1B,CAAC;QAED,aAAa;QACb,MAAM,KAAK,GACT,YAAY,CAAC,UAAU;YACvB,WAAW,CAAC,UAAU;YACtB,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAA;QAEvB,qDAAqD;QACrD,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;QAC5C,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;QAC1B,GAAG,IAAI,YAAY,CAAC,UAAU,CAAA;QAC9B,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QACzB,GAAG,IAAI,WAAW,CAAC,UAAU,CAAA;QAC7B,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACnB,GAAG,IAAI,KAAK,CAAC,UAAU,CAAA;QACzB,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxB,OAAO,GAAG,CAAA;IACZ,CAAC;CACF;AAED,MAAM,eAAe,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA","sourcesContent":["// A response object in the cache.\n//\n// The cache stores Buffer objects, and it's convenient to have headers/body\n// together, so we have a simple data structure for this.\n//\n// The shape of it is:\n//\n// [head length]\n// <status code in ascii>\n// [headers]\n// [body]\n//\n// The [UInt32BE head length] is 4 bytes specifying the full length of the\n// status code plus all header keys and values.\n//\n// The [headers] section is key/value/key2/value2/... where each key and value\n// is a 4-byte Uint32BE length, followed by that many bytes.\n//\n// From there, the body can be of any indeterminate length, and is the rest\n// of the file.\n\nimport type { ErrorCauseOptions } from '@vltpkg/error-cause'\nimport { error } from '@vltpkg/error-cause'\nimport type { Integrity, JSONField } from '@vltpkg/types'\nimport ccp from 'cache-control-parser'\nimport { createHash } from 'node:crypto'\nimport type { InspectOptions } from 'node:util'\nimport { inspect } from 'node:util'\nimport { gunzipSync } from 'node:zlib'\nimport { getRawHeader, setRawHeader } from './raw-header.ts'\nimport {\n getDecodedValue,\n getEncondedValue,\n} from './string-encoding.ts'\n\nexport type JSONObj = Record<string, JSONField>\n\nconst readSize = (buf: Uint8Array, offset: number) => {\n const a = buf[offset]\n const b = buf[offset + 1]\n const c = buf[offset + 2]\n const d = buf[offset + 3]\n\n // not possible, we check the length\n /* c8 ignore start */\n if (\n a === undefined ||\n b === undefined ||\n c === undefined ||\n d === undefined\n ) {\n throw error('Invalid buffer, not long enough to readSize', {\n found: buf.length,\n })\n }\n /* c8 ignore stop */\n\n return (a << 24) | (b << 16) | (c << 8) | d\n}\n\nconst kCustomInspect = Symbol.for('nodejs.util.inspect.custom')\n\nexport type CacheEntryOptions = {\n /**\n * An optional body to use.\n *\n * This is used when decoding a cache entry from a buffer, and the body\n * is already in a ArrayBuffer we can use. When this option is\n * provided the `addBody` method should not be used.\n */\n body?: Uint8Array\n\n /**\n * An optional content length of the body to use, if undefined the\n * content-length header will be used.\n */\n contentLength?: number\n\n /**\n * The expected integrity value for this response body\n */\n integrity?: Integrity\n /**\n * Whether to trust the integrity, or calculate the actual value.\n *\n * This indicates that we just accept whatever the integrity is as the actual\n * integrity for saving back to the cache, because it's coming directly from\n * the registry that we fetched a packument from, and is an initial gzipped\n * artifact request.\n */\n trustIntegrity?: boolean\n\n /**\n * If the server does not serve a `stale-while-revalidate` value in the\n * `cache-control` header, then this multiplier is applied to the `max-age`\n * or `s-maxage` values.\n *\n * By default, this is `60`, so for example a response that is cacheable for\n * 5 minutes will allow a stale response while revalidating for up to 5\n * hours.\n *\n * If the server *does* provide a `stale-while-revalidate` value, then that\n * is always used.\n *\n * Set to 0 to prevent any `stale-while-revalidate` behavior unless\n * explicitly allowed by the server's `cache-control` header.\n */\n 'stale-while-revalidate-factor'?: number\n}\n\nexport class CacheEntry {\n #statusCode: number\n /** The raw headers as an array of buffers */\n #headers: Uint8Array[]\n /** The body buffer, used if the content length is known. */\n #body?: Uint8Array\n /**\n * If the content length is unknown we save the body in multiple parts\n * in order to only concatenate once at the end and save extra memory copies.\n */\n #bodyParts: Uint8Array[] = []\n /** Used to track the length of the body while reading chunks */\n #bodyLength = 0\n /** The total length of the body, if known */\n #contentLength?: number\n #integrity?: Integrity\n #integrityActual?: Integrity\n #json?: JSONObj\n #trustIntegrity\n #staleWhileRevalidateFactor\n\n constructor(\n statusCode: number,\n headers: Uint8Array[],\n {\n body,\n integrity,\n trustIntegrity = false,\n 'stale-while-revalidate-factor':\n staleWhileRevalidateFactor = 60,\n contentLength,\n }: CacheEntryOptions = {},\n ) {\n this.#headers = headers\n this.#statusCode = statusCode\n this.#trustIntegrity = trustIntegrity\n this.#staleWhileRevalidateFactor = staleWhileRevalidateFactor\n if (integrity) this.integrity = integrity\n\n // if content-legnth is known then we'll only allocate that much memory\n // and we'll avoid copying memory around when adding new chunks.\n if (contentLength != null && typeof contentLength === 'number') {\n this.#contentLength = contentLength\n }\n\n // if a body is provided then use that, in this case the `addBody`\n // method should no longer be used.\n if (body) {\n const buffer = new ArrayBuffer(body.byteLength)\n this.#body = new Uint8Array(buffer, 0, body.byteLength)\n this.#body.set(body, 0)\n this.#bodyLength = body.byteLength\n /* c8 ignore start */\n } else if (this.#contentLength) {\n const buffer = new ArrayBuffer(this.#contentLength)\n this.#body = new Uint8Array(buffer, 0, this.#contentLength)\n this.#bodyLength = 0\n }\n /* c8 ignore stop */\n }\n\n get #headersAsObject(): [string, string][] {\n const ret: [string, string][] = []\n for (let i = 0; i < this.#headers.length - 1; i += 2) {\n const key = getDecodedValue(this.#headers[i])\n const val = getDecodedValue(this.#headers[i + 1])\n ret.push([key, val])\n }\n return ret\n }\n\n toJSON() {\n const {\n statusCode,\n valid,\n staleWhileRevalidate,\n cacheControl,\n date,\n contentType,\n integrity,\n maxAge,\n isGzip,\n isJSON,\n } = this\n /* c8 ignore start */\n const age =\n date ?\n Math.floor((Date.now() - date.getTime()) / 1000)\n : undefined\n const expires =\n date ? new Date(date.getTime() + this.maxAge * 1000) : undefined\n /* c8 ignore end */\n return Object.fromEntries(\n Object.entries({\n statusCode,\n headers: this.#headersAsObject,\n contentType,\n integrity,\n date,\n expires,\n cacheControl,\n valid,\n staleWhileRevalidate,\n age,\n maxAge,\n isGzip,\n isJSON,\n }).filter(([_, v]) => v !== undefined),\n )\n }\n\n [kCustomInspect](depth: number, options: InspectOptions): string {\n const str = inspect(this.toJSON(), {\n depth,\n ...options,\n })\n return `@vltpkg/registry-client.CacheEntry ${str}`\n }\n\n #date?: Date\n get date(): Date | undefined {\n if (this.#date) return this.#date\n const dh = this.getHeaderString('date')\n if (dh) this.#date = new Date(dh)\n return this.#date\n }\n\n #maxAge?: number\n get maxAge(): number {\n if (this.#maxAge !== undefined) return this.#maxAge\n // see if the max-age has not yet been crossed\n // default to 5m if maxage is not set, as some registries\n // do not set a cache control header at all.\n const cc = this.cacheControl\n this.#maxAge = cc['max-age'] || cc['s-maxage'] || 300\n return this.#maxAge\n }\n\n #cacheControl?: ccp.CacheControl\n get cacheControl(): ccp.CacheControl {\n if (this.#cacheControl) return this.#cacheControl\n const cc = this.getHeaderString('cache-control')\n this.#cacheControl = cc ? ccp.parse(cc) : {}\n return this.#cacheControl\n }\n\n #staleWhileRevalidate?: boolean\n get staleWhileRevalidate(): boolean {\n if (this.#staleWhileRevalidate !== undefined)\n return this.#staleWhileRevalidate\n if (this.valid || !this.date) return true\n const swv =\n this.cacheControl['stale-while-revalidate'] ??\n this.maxAge * this.#staleWhileRevalidateFactor\n\n this.#staleWhileRevalidate =\n this.date.getTime() + swv * 1000 > Date.now()\n return this.#staleWhileRevalidate\n }\n\n #contentType?: string\n get contentType() {\n if (this.#contentType !== undefined) return this.#contentType\n this.#contentType = this.getHeaderString('content-type') ?? ''\n return this.#contentType\n }\n\n /**\n * `true` if the entry represents a cached response that is still\n * valid to use.\n */\n #valid?: boolean\n get valid(): boolean {\n if (this.#valid !== undefined) return this.#valid\n\n // immutable = never changes\n if (this.cacheControl.immutable) return (this.#valid = true)\n\n // some registries do text/json, some do application/json,\n // some do application/vnd.npm.install-v1+json\n // If it's NOT json, it's an immutable tarball\n const ct = this.contentType\n if (ct && !/\\bjson\\b/.test(ct)) return (this.#valid = true)\n\n // see if the max-age has not yet been crossed\n // default to 5m if maxage is not set, as some registries\n // do not set a cache control header at all.\n if (!this.date) return (this.#valid = false)\n this.#valid =\n this.date.getTime() + this.maxAge * 1000 > Date.now()\n return this.#valid\n }\n\n /**\n * Add contents to the entry body.\n */\n addBody(b: Uint8Array) {\n // when the content length is uknown we store each chunk in an array that\n // later on is concatenate into a single buffer, otherwise we just append\n // the new chunk of bytes to the already allocated buffer keeping track\n // of the current offset in the `this.#bodyLength` property.\n if (!this.#body) {\n this.#bodyParts.push(b)\n this.#bodyLength += b.byteLength\n } else {\n this.#body.set(b, this.#bodyLength)\n this.#bodyLength += b.byteLength\n }\n }\n\n get statusCode() {\n return this.#statusCode\n }\n get headers(): Uint8Array[] {\n return this.#headers\n }\n\n /**\n * Returns the body as a single Uint8Array, concatenating parts if needed.\n */\n get _body(): Uint8Array {\n // if the body is known we'll just use that\n if (this.#body) return this.#body\n // otherwise we concatenate the body parts into a single buffer\n const buffer = new ArrayBuffer(this.#bodyLength)\n const b = new Uint8Array(buffer, 0, this.#bodyLength)\n let off = 0\n for (const part of this.#bodyParts) {\n b.set(part, off)\n off += part.byteLength\n }\n return b\n }\n\n /**\n * Check that the sri integrity string that was provided to the ctor\n * matches the body that we actually received. This should only be called\n * AFTER the entire body has been completely downloaded.\n *\n * This method **will throw** if the integrity values do not match.\n *\n * Note that this will *usually* not be true if the value is coming out of\n * the cache, because the cache entries are un-gzipped in place. It should\n * _only_ be called for artifacts that come from an actual http response.\n *\n * Returns true if anything was actually verified.\n */\n checkIntegrity(\n context: ErrorCauseOptions = {},\n ): this is CacheEntry & { integrity: Integrity } {\n if (!this.#integrity) return false\n if (this.integrityActual !== this.#integrity) {\n throw error('Integrity check failure', {\n code: 'EINTEGRITY',\n response: this,\n wanted: this.#integrity,\n found: this.integrityActual,\n ...context,\n })\n }\n return true\n }\n\n get integrityActual(): Integrity {\n if (this.#integrityActual) return this.#integrityActual\n const hash = createHash('sha512')\n hash.update(this._body)\n const i: Integrity = `sha512-${hash.digest('base64')}`\n this.integrityActual = i\n return i\n }\n\n set integrityActual(i: Integrity) {\n this.#integrityActual = i\n this.setHeader('integrity', i)\n }\n\n set integrity(i: Integrity | undefined) {\n if (!this.#integrity && i) {\n this.#integrity = i\n if (this.#trustIntegrity) this.integrityActual = i\n }\n }\n get integrity() {\n return this.#integrity\n }\n\n /**\n * Give it a key, and it'll return the buffer of that header value\n */\n getHeader(h: string): Uint8Array | undefined {\n return getRawHeader(this.#headers, h)\n }\n\n /**\n * Give it a key, and it'll return the decoded string of that header value\n */\n getHeaderString(h: string): string | undefined {\n const value = getRawHeader(this.#headers, h)\n if (value) {\n return getDecodedValue(value)\n }\n }\n\n /**\n * Set a header to a specific value\n */\n setHeader(h: string, value: Uint8Array | string) {\n this.#headers = setRawHeader(this.#headers, h, value)\n }\n\n /**\n * Return the body of the entry as a Buffer\n */\n buffer(): Buffer {\n return Buffer.from(\n this._body.buffer,\n this._body.byteOffset,\n this._body.byteLength,\n )\n }\n\n // return the buffer if it's a tarball, or the parsed\n // JSON if it's not.\n get body(): Uint8Array | Record<string, any> {\n return this.isJSON ? this.json() : this.buffer()\n }\n\n #isJSON?: boolean\n get isJSON(): boolean {\n if (this.#isJSON !== undefined) return this.#isJSON\n const ct = this.getHeaderString('content-type')\n // if it says it's json, assume json\n if (ct) return (this.#isJSON = /\\bjson\\b/.test(ct))\n const text = this.text()\n // don't cache, because we might just not have it yet.\n if (!text) return false\n // all registry json starts with {, and no tarball ever can.\n this.#isJSON = text.startsWith('{')\n if (this.#isJSON) this.setHeader('content-type', 'text/json')\n return this.#isJSON\n }\n\n #isGzip?: boolean\n get isGzip(): boolean {\n if (this.#isGzip !== undefined) return this.#isGzip\n const ce = this.getHeaderString('content-encoding')\n if (ce && !/\\bgzip\\b/.test(ce)) return (this.#isGzip = false)\n const buf = this._body\n if (buf.length < 2) return false\n this.#isGzip = buf[0] === 0x1f && buf[1] === 0x8b\n if (this.#isGzip) {\n this.setHeader('content-encoding', 'gzip')\n } else {\n this.setHeader('content-encoding', 'identity')\n this.setHeader('content-length', String(this.#bodyLength))\n }\n return this.#isGzip\n }\n\n /**\n * Un-gzip encode the body.\n * Returns true if it was previously gzip (so something was done), otherwise\n * returns false.\n */\n unzip() {\n if (this.isGzip) {\n // we know that if we know it's gzip, that the body has been\n // flattened to a single buffer, so save the extra call.\n /* c8 ignore start */\n if (this._body.length === 0)\n throw error('Invalid buffer, cant unzip')\n /* c8 ignore stop */\n const b = gunzipSync(this._body)\n this.setHeader('content-encoding', 'identity')\n const u8 = new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n this.#body = u8\n this.#bodyLength = u8.byteLength\n this.#contentLength = u8.byteLength\n this.setHeader('content-length', String(this.#contentLength))\n this.#isGzip = false\n return true\n }\n return false\n }\n\n /**\n * Return the body of the entry as utf8 text\n * Automatically unzips if the content is gzip encoded\n */\n text() {\n this.unzip()\n return getDecodedValue(this._body)\n }\n\n /**\n * Parse the entry body as JSON and return the result\n */\n json(): JSONObj {\n if (this.#json !== undefined) return this.#json\n const text = this.text()\n const obj = JSON.parse(text || '{}') as JSONObj\n this.#json = obj\n return obj\n }\n\n /**\n * Pass the contents of a @vltpkg/cache.Cache object as a buffer,\n * and this static method will decode it into a CacheEntry representing\n * the cached response.\n */\n static decode(buffer: Uint8Array): CacheEntry {\n if (buffer.length < 4) {\n return emptyCacheEntry\n }\n const headSize = readSize(buffer, 0)\n if (buffer.length < headSize) {\n return emptyCacheEntry\n }\n const statusCode = Number(getDecodedValue(buffer.subarray(4, 7)))\n const headersBuffer = buffer.subarray(7, headSize)\n // walk through the headers array, building up the rawHeaders\n const headers: Uint8Array[] = []\n let i = 0\n let integrity: Integrity | undefined = undefined\n while (i < headersBuffer.length - 4) {\n const size = readSize(headersBuffer, i)\n const val = headersBuffer.subarray(i + 4, i + size)\n // if the last one was the key integrity, then this one is the value\n if (headers.length % 2 === 1) {\n const k = getDecodedValue(\n headers[headers.length - 1],\n ).toLowerCase()\n if (k === 'integrity')\n integrity = getDecodedValue(val) as Integrity\n }\n headers.push(val)\n i += size\n }\n const body = buffer.subarray(headSize)\n\n const c = new CacheEntry(\n statusCode,\n setRawHeader(\n headers,\n 'content-length',\n String(body.byteLength),\n ),\n {\n body,\n integrity,\n trustIntegrity: true,\n contentLength: body.byteLength,\n },\n )\n\n if (c.isJSON) {\n try {\n c.json()\n } catch {\n return emptyCacheEntry\n }\n }\n return c\n }\n\n static isGzipEntry(buffer: Uint8Array): boolean {\n if (buffer.length < 4) return false\n const headSize = readSize(buffer, 0)\n const gzipBytes = buffer.subarray(headSize, headSize + 2)\n return gzipBytes[0] === 0x1f && gzipBytes[1] === 0x8b\n }\n\n /**\n * Encode the entry as a single Buffer for writing to the cache\n */\n encode(): Buffer {\n if (this.isJSON) this.json()\n const statusStr = String(this.#statusCode)\n const statusBytes = getEncondedValue(statusStr)\n\n // compute headLength = 4 (length field itself) + statusBytes + Σ(4 + headerLen) for each header item\n let headLength = 4 + statusBytes.byteLength\n for (const h of this.#headers) headLength += 4 + h.byteLength\n\n // allocate and fill head length prefix (big-endian)\n const headLenBytes = new Uint8Array(4)\n headLenBytes[0] = (headLength >> 24) & 0xff\n headLenBytes[1] = (headLength >> 16) & 0xff\n headLenBytes[2] = (headLength >> 8) & 0xff\n headLenBytes[3] = headLength & 0xff\n\n // header chunks: [len, bytes] for each header item\n const headerChunks: Uint8Array[] = []\n for (const h of this.#headers) {\n const l = headLenBytes.byteLength + h.byteLength\n const lb = new Uint8Array(4)\n lb[0] = (l >> 24) & 0xff\n lb[1] = (l >> 16) & 0xff\n lb[2] = (l >> 8) & 0xff\n lb[3] = l & 0xff\n headerChunks.push(lb, h)\n }\n\n // total size\n const total =\n headLenBytes.byteLength +\n statusBytes.byteLength +\n headerChunks.reduce((n, b) => n + b.byteLength, 0) +\n this._body.byteLength\n\n // returns the concatenate buffer with all the pieces\n const outBuffer = new ArrayBuffer(total)\n const out = Buffer.from(outBuffer, 0, total)\n let off = 0\n out.set(headLenBytes, off)\n off += headLenBytes.byteLength\n out.set(statusBytes, off)\n off += statusBytes.byteLength\n for (const chunk of headerChunks) {\n out.set(chunk, off)\n off += chunk.byteLength\n }\n out.set(this._body, off)\n return out\n }\n}\n\nconst emptyCacheEntry = new CacheEntry(0, [], { contentLength: 0 })\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache-revalidate.d.ts","sourceRoot":"","sources":["../../src/cache-revalidate.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,QAAQ,SACb,MAAM,UACJ,MAAM,GAAG,KAAK,OACjB,MAAM,GAAG,GAAG,KAChB,IASF,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache-revalidate.js","sourceRoot":"","sources":["../../src/cache-revalidate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,MAAM,GACT,UAAiD,CAAC,IAAI,IAAI,SAAS,CAAA;AAEtE,IAAI,wBAAwB,GAAG,KAAK,CAAA;AACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAA;AAEjD,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAY,EACZ,MAAsB,EACtB,GAAiB,EACX,EAAE;IACR,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAU,CAAA;IACnD,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,GAAG,EAAE,CAAA;IAC9B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACV,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACvB,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC9B,wBAAwB,GAAG,IAAI,CAAA;QAC/B,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,GAAG,EAAE;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;QACnC,oBAAoB;QACpB,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,OAAM;QACnB,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QAC9B,MAAM,IAAI,GAAG,EAAE,CAAA;QACf,qBAAqB;QACrB,qDAAqD;QACrD,+DAA+D;QAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;YACxC,GAAG,CAAC,mBAAmB,GAAG,aAAa,CACrC,wBAAwB,CACzB,CAAC,QAAQ,EAAE,CAAA;YACZ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,sDAAsD;YACtD,uDAAuD;YACvD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CACP,yBAAyB,EACzB,+BAA+B,CAChC,CAAA;YACH,CAAC;YACD,oBAAoB;YACpB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAA;QAC3C,CAAC;QACD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACvB,sDAAsD;QACtD,gDAAgD;QAChD,gDAAgD;QAChD,oBAAoB;QACpB,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAA;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;YACzC,QAAQ;YACR,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;YACnC,GAAG;SACJ,CAAC,CAAA;QACF,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;QAC9B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;QAChB,wEAAwE;QACxE,+EAA+E;QAC/E,0EAA0E;QAC1E,oDAAoD;QACpD,gDAAgD;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { spawn } from 'node:child_process'\nimport { __CODE_SPLIT_SCRIPT_NAME } from './revalidate.ts'\nimport { pathToFileURL } from 'node:url'\n\nconst isDeno =\n (globalThis as typeof globalThis & { Deno?: any }).Deno != undefined\n\nlet didProcessBeforeExitHook = false\nconst registered = new Map<string, Set<string>>()\n\nexport const register = (\n path: string,\n method: 'HEAD' | 'GET',\n url: string | URL,\n): void => {\n const r = registered.get(path) ?? new Set<string>()\n const key = `${method} ${url}`\n r.add(key)\n registered.set(path, r)\n if (!didProcessBeforeExitHook) {\n didProcessBeforeExitHook = true\n process.on('beforeExit', handleBeforeExit)\n }\n}\n\nconst handleBeforeExit = () => {\n for (const [path, r] of registered) {\n /* c8 ignore next */\n if (!r.size) return\n const env = { ...process.env }\n const args = []\n /* c8 ignore start */\n // When compiled the script to be run is passed as an\n // environment variable and then routed by the main entry point\n if (process.env.__VLT_INTERNAL_COMPILED) {\n env.__VLT_INTERNAL_MAIN = pathToFileURL(\n __CODE_SPLIT_SCRIPT_NAME,\n ).toString()\n args.push(path)\n } else {\n // If we are running deno from source we need to add the\n // unstable flags we need. The '-A' flag does not need\n // to be passed in as Deno supplies that automatically.\n if (isDeno) {\n args.push(\n '--unstable-node-globals',\n '--unstable-bare-node-builtins',\n )\n }\n /* c8 ignore stop */\n args.push(__CODE_SPLIT_SCRIPT_NAME, path)\n }\n registered.delete(path)\n // Deno on Windows does not support detached processes\n // https://github.com/denoland/deno/issues/25867\n // TODO: figure out something better to do here?\n /* c8 ignore next */\n const detached = !(isDeno && process.platform === 'win32')\n const proc = spawn(process.execPath, args, {\n detached,\n stdio: ['pipe', 'ignore', 'ignore'],\n env,\n })\n for (const key of r) {\n proc.stdin.write(`${key}\\0`)\n }\n proc.stdin.end()\n // Another Deno oddity. Calling unref on a spawned process will kill the\n // process unless it is detached. https://github.com/denoland/deno/issues/21446\n // So in this case Deno on Windows will be slower to exit the main process\n // since it will wait for the child process to exit.\n // TODO: figure out something better to do here?\n if (detached) {\n proc.unref()\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delete-header.d.ts","sourceRoot":"","sources":["../../src/delete-header.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,GACvB,CAAC,SACG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,GAC7B,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,GACjD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,GAC7C,MAAM,EAAE,WAEH,CAAC,GAAG,IAAI,GAAG,SAAS,OACxB,MAAM,KACV,CA2BF,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delete-header.js","sourceRoot":"","sources":["../../src/delete-header.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAO1B,OAA6B,EAC7B,GAAW,EACR,EAAE;IACL,IAAI,CAAC,OAAO;QAAE,OAAO,EAAO,CAAA;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,OAAO,CAAA;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAI,OAA8B,CAAC,SAAS,CACrD,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAC/C,CAAA;YACD,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,OAAmB,CAAA;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC9C,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;oBACpB,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;SAAM,IACL,UAAU,CAA0C,OAAO,CAAC,EAC5D,CAAC;QACD,OAAO,YAAY,CAAC,CAAC,GAAG,OAAO,CAAiB,EAAE,GAAG,CAAC,CAAA;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,OAAO,CAAC,GAAG,CAAC,CAAA;QACnB,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { isIterable } from './is-iterable.ts'\n\nexport const deleteHeader = <\n H extends\n | [string, string[] | string][]\n | Iterable<[string, string[] | string | undefined]>\n | Record<string, string[] | string | undefined>\n | string[],\n>(\n headers: H | null | undefined,\n key: string,\n): H => {\n if (!headers) return {} as H\n if (Array.isArray(headers)) {\n if (!headers.length) return headers\n if (Array.isArray(headers[0])) {\n const index = (headers as [string, string][]).findIndex(\n ([k]) => k.toLowerCase() === key.toLowerCase(),\n )\n if (index !== -1) headers.splice(index, 1)\n } else {\n const h = headers as string[]\n for (let i = 0; i < h.length; i += 2) {\n if (h[i]?.toLowerCase() === key.toLowerCase()) {\n headers.splice(i, 2)\n break\n }\n }\n }\n return headers\n } else if (\n isIterable<[string, string[] | string | undefined]>(headers)\n ) {\n return deleteHeader([...headers] as unknown as H, key)\n } else {\n delete headers[key]\n return headers\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,MAAM,SAAc,CAAA;AACjC,eAAO,MAAM,KAAK,SAAwB,CAAA;AAG1C,eAAO,MAAM,MAAM,SAA+C,CAAA;AAGlE,eAAO,MAAM,GAAG,oBAAwC,CAAA;AACxD,eAAO,MAAM,IAAI,oBAA0C,CAAA;AAC3D,eAAO,MAAM,IAAI,oBAA0C,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,cAAc,CAAA;AAE/B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,UAGrB,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAA;AAE1D,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;AACjC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;AAC1C,kEAAkE;AAClE,gCAAgC;AAChC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAA;AAElE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;AACxD,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AAC3D,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA","sourcesContent":["import proc from 'node:process'\n\nconst { Deno, Bun } = globalThis as typeof globalThis & {\n Deno: undefined | object\n Bun: undefined | object\n}\n\nconst isObj = (v: unknown) => typeof v === 'object' && !!v\n\nexport const isDeno = isObj(Deno)\nexport const isBun = !isDeno && isObj(Bun)\n// bun and deno also report 'node' in process.versions so its only\n// node if it is not bun or deno\nexport const isNode = !isDeno && !isBun && 'node' in proc.versions\n\n// All the runtimes put their versions into process.versions\nexport const bun = isBun ? proc.versions.bun : undefined\nexport const deno = isDeno ? proc.versions.deno : undefined\nexport const node = isNode ? proc.versions.node : undefined\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-header.d.ts","sourceRoot":"","sources":["../../src/get-header.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,YAEhB,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,GACjD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,GAC7C,MAAM,EAAE,GACR,IAAI,GACJ,SAAS,OACR,MAAM,KACV,MAAM,EAAE,GAAG,MAAM,GAAG,SA8BtB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-header.js","sourceRoot":"","sources":["../../src/get-header.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,CAAI,CAAU,EAAoB,EAAE,CACrD,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAA;AAEtD,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,OAKa,EACb,GAAW,EACoB,EAAE;IACjC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAC9B,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,SAAS,CAAA;QACrC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,yBAAyB;YACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAGlB,EAAE,CAAC;gBACJ,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG;oBAAE,OAAO,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,sBAAsB;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,GAAG;oBAAE,OAAO,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IACL,UAAU,CAA0C,OAAO,CAAC,EAC5D,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG;gBAAE,OAAO,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG;gBAAE,OAAO,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;AACH,CAAC,CAAA","sourcesContent":["const isIterable = <T>(o: unknown): o is Iterable<T> =>\n !!o && typeof o === 'object' && Symbol.iterator in o\n\nexport const getHeader = (\n headers:\n | Iterable<[string, string[] | string | undefined]>\n | Record<string, string[] | string | undefined>\n | string[]\n | null\n | undefined,\n key: string,\n): string[] | string | undefined => {\n if (!headers) return undefined\n key = key.toLowerCase()\n if (Array.isArray(headers)) {\n if (!headers.length) return undefined\n if (Array.isArray(headers[0])) {\n // [string,HeaderValue][]\n for (const [k, v] of headers as unknown as [\n string,\n string[] | string,\n ][]) {\n if (k.toLowerCase() === key) return v\n }\n } else if (headers.length % 2 === 0) {\n // [k, v, k2, v2, ...]\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i]?.toLowerCase() === key) return headers[i + 1]\n }\n }\n } else if (\n isIterable<[string, string[] | string | undefined]>(headers)\n ) {\n for (const [k, v] of headers) {\n if (k.toLowerCase() === key) return v\n }\n } else {\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === key) return v\n }\n }\n}\n"]}
@@ -1,4 +0,0 @@
1
- import type { Dispatcher } from 'undici';
2
- import type { CacheEntry } from './cache-entry.ts';
3
- export declare const handle304Response: (resp: Dispatcher.ResponseData, entry?: CacheEntry) => entry is CacheEntry;
4
- //# sourceMappingURL=handle-304-response.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handle-304-response.d.ts","sourceRoot":"","sources":["../../src/handle-304-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,eAAO,MAAM,iBAAiB,SACtB,UAAU,CAAC,YAAY,UACrB,UAAU,KACjB,KAAK,IAAI,UASX,CAAA"}
@@ -1,10 +0,0 @@
1
- export const handle304Response = (resp, entry) => {
2
- if (resp.statusCode !== 304 || !entry)
3
- return false;
4
- const d = String(resp.headers.date ?? '') || new Date().toUTCString();
5
- entry.setHeader('date', d);
6
- // shouldn't have a body, but just in case.
7
- resp.body.resume();
8
- return true;
9
- };
10
- //# sourceMappingURL=handle-304-response.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handle-304-response.js","sourceRoot":"","sources":["../../src/handle-304-response.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAA6B,EAC7B,KAAkB,EACG,EAAE;IACvB,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IAEnD,MAAM,CAAC,GACL,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC7D,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC1B,2CAA2C;IAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA;IAClB,OAAO,IAAI,CAAA;AACb,CAAC,CAAA","sourcesContent":["import type { Dispatcher } from 'undici'\nimport type { CacheEntry } from './cache-entry.ts'\n\nexport const handle304Response = (\n resp: Dispatcher.ResponseData,\n entry?: CacheEntry,\n): entry is CacheEntry => {\n if (resp.statusCode !== 304 || !entry) return false\n\n const d =\n String(resp.headers.date ?? '') || new Date().toUTCString()\n entry.setHeader('date', d)\n // shouldn't have a body, but just in case.\n resp.body.resume()\n return true\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}