@lowlighter/toolbox 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +14 -0
  2. package/clone.d.ts +9 -0
  3. package/clone.js +37 -0
  4. package/deno.lock +53 -0
  5. package/env.d.ts +28 -0
  6. package/env.js +28 -0
  7. package/evaluate.d.ts +49 -0
  8. package/evaluate.js +90 -0
  9. package/events.d.ts +8 -0
  10. package/events.js +28 -0
  11. package/filesystem.d.ts +19 -0
  12. package/filesystem.js +40 -0
  13. package/fixtures/filesystem/a/b/foo.txt +1 -0
  14. package/fixtures/filesystem/a/c/bar.txt +1 -0
  15. package/fixtures/filesystem/a/c/baz.txt +1 -0
  16. package/fixtures/filesystem/a/d/qux.ts +1 -0
  17. package/format.d.ts +9 -0
  18. package/format.js +21 -0
  19. package/identicon.d.ts +6 -0
  20. package/identicon.js +32 -0
  21. package/imgb64.d.ts +1 -0
  22. package/imgb64.js +15 -0
  23. package/mod.ts +1 -0
  24. package/noop.d.ts +1 -0
  25. package/noop.js +2 -0
  26. package/package.json +116 -0
  27. package/permissions.d.ts +1 -0
  28. package/permissions.js +31 -0
  29. package/pluralize.d.ts +6 -0
  30. package/pluralize.js +44 -0
  31. package/promises.d.ts +1 -0
  32. package/promises.js +12 -0
  33. package/resolve.d.ts +5 -0
  34. package/resolve.js +18 -0
  35. package/scripts/code_quality.d.ts +0 -0
  36. package/scripts/code_quality.js +210 -0
  37. package/scripts/download_lambda_chromium.d.ts +10 -0
  38. package/scripts/download_lambda_chromium.js +133 -0
  39. package/scripts/highlight_coverage.d.ts +0 -0
  40. package/scripts/highlight_coverage.js +62 -0
  41. package/scripts/publish/_utils.js +95 -0
  42. package/scripts/publish/npm.d.ts +11 -0
  43. package/scripts/publish/npm.js +130 -0
  44. package/scripts/publish/x.d.ts +20 -0
  45. package/scripts/publish/x.js +303 -0
  46. package/timezone.d.ts +2 -0
  47. package/timezone.js +8 -0
package/package.json ADDED
@@ -0,0 +1,116 @@
1
+ {
2
+ "name": "@lowlighter/toolbox",
3
+ "version": "1.0.1",
4
+ "type": "module",
5
+ "exports": {
6
+ "./clone": {
7
+ "types": "./clone.d.ts",
8
+ "import": "./clone.js",
9
+ "default": "./clone.js"
10
+ },
11
+ "./scripts/download-lambda-chromium": {
12
+ "types": "./scripts/download_lambda_chromium.d.ts",
13
+ "import": "./scripts/download_lambda_chromium.js",
14
+ "default": "./scripts/download_lambda_chromium.js"
15
+ },
16
+ "./scripts/code-quality": {
17
+ "types": "./scripts/code_quality.d.ts",
18
+ "import": "./scripts/code_quality.js",
19
+ "default": "./scripts/code_quality.js"
20
+ },
21
+ "./scripts/highlight-coverage": {
22
+ "types": "./scripts/highlight_coverage.d.ts",
23
+ "import": "./scripts/highlight_coverage.js",
24
+ "default": "./scripts/highlight_coverage.js"
25
+ },
26
+ "./env": {
27
+ "types": "./env.d.ts",
28
+ "import": "./env.js",
29
+ "default": "./env.js"
30
+ },
31
+ "./evaluate": {
32
+ "types": "./evaluate.d.ts",
33
+ "import": "./evaluate.js",
34
+ "default": "./evaluate.js"
35
+ },
36
+ "./events": {
37
+ "types": "./events.d.ts",
38
+ "import": "./events.js",
39
+ "default": "./events.js"
40
+ },
41
+ "./filesystem": {
42
+ "types": "./filesystem.d.ts",
43
+ "import": "./filesystem.js",
44
+ "default": "./filesystem.js"
45
+ },
46
+ "./format": {
47
+ "types": "./format.d.ts",
48
+ "import": "./format.js",
49
+ "default": "./format.js"
50
+ },
51
+ "./identicon": {
52
+ "types": "./identicon.d.ts",
53
+ "import": "./identicon.js",
54
+ "default": "./identicon.js"
55
+ },
56
+ "./imgb64": {
57
+ "types": "./imgb64.d.ts",
58
+ "import": "./imgb64.js",
59
+ "default": "./imgb64.js"
60
+ },
61
+ "./noop": {
62
+ "types": "./noop.d.ts",
63
+ "import": "./noop.js",
64
+ "default": "./noop.js"
65
+ },
66
+ "./permissions": {
67
+ "types": "./permissions.d.ts",
68
+ "import": "./permissions.js",
69
+ "default": "./permissions.js"
70
+ },
71
+ "./pluralize": {
72
+ "types": "./pluralize.d.ts",
73
+ "import": "./pluralize.js",
74
+ "default": "./pluralize.js"
75
+ },
76
+ "./promises": {
77
+ "types": "./promises.d.ts",
78
+ "import": "./promises.js",
79
+ "default": "./promises.js"
80
+ },
81
+ "./scripts/publish/npm": {
82
+ "types": "./scripts/publish/npm.d.ts",
83
+ "import": "./scripts/publish/npm.js",
84
+ "default": "./scripts/publish/npm.js"
85
+ },
86
+ "./scripts/publish/x": {
87
+ "types": "./scripts/publish/x.d.ts",
88
+ "import": "./scripts/publish/x.js",
89
+ "default": "./scripts/publish/x.js"
90
+ },
91
+ "./resolve": {
92
+ "types": "./resolve.d.ts",
93
+ "import": "./resolve.js",
94
+ "default": "./resolve.js"
95
+ },
96
+ "./timezone": {
97
+ "types": "./timezone.d.ts",
98
+ "import": "./timezone.js",
99
+ "default": "./timezone.js"
100
+ }
101
+ },
102
+ "dependencies": {
103
+ "@jsr/std__cli": "^1.0.28",
104
+ "@jsr/std__encoding": "^1.0.10",
105
+ "@jsr/std__fmt": "^1.0.10",
106
+ "@jsr/std__fs": "^1.0.23",
107
+ "@jsr/std__jsonc": "^1.0.2",
108
+ "@jsr/std__path": "^1.1.4",
109
+ "@jsr/std__streams": "^1.0.17",
110
+ "@jsr/std__tar": "^0.1.10",
111
+ "highlight.js": "^11",
112
+ "@lowlighter/typing": "^4.1.0",
113
+ "@lowlighter/run": "^3.4.0",
114
+ "@lowlighter/git": "^1.0.0"
115
+ }
116
+ }
@@ -0,0 +1 @@
1
+ /** Compute deno permissions flag from a `Deno.PermissionOptions`-like object. */ export declare function flags(permissions: Deno.PermissionOptions | boolean | null): string;
package/permissions.js ADDED
@@ -0,0 +1,31 @@
1
+ /** Compute deno permissions flag from a `Deno.PermissionOptions`-like object. */ export function flags(permissions) {
2
+ const flags = [];
3
+ if (permissions === true || permissions === "inherit") flags.push("--allow-all");
4
+ if (typeof permissions === "object" && permissions) {
5
+ for (const type of [
6
+ "env",
7
+ "ffi",
8
+ "import",
9
+ "net",
10
+ "read",
11
+ "run",
12
+ "sys",
13
+ "write"
14
+ ]){
15
+ if (permissions[type] === true || permissions[type] === "inherit") {
16
+ flags.push(`--allow-${type}`);
17
+ continue;
18
+ }
19
+ if (permissions[type] === false) {
20
+ flags.push(`--deny-${type}`);
21
+ continue;
22
+ }
23
+ if (Array.isArray(permissions[type])) {
24
+ flags.push(`--allow-${type}=${permissions[type].map(String).join(",")}`);
25
+ continue;
26
+ }
27
+ }
28
+ }
29
+ return flags.join(" ");
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9wZXJtaXNzaW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQ29tcHV0ZSBkZW5vIHBlcm1pc3Npb25zIGZsYWcgZnJvbSBhIGBEZW5vLlBlcm1pc3Npb25PcHRpb25zYC1saWtlIG9iamVjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGFncyhwZXJtaXNzaW9uczogRGVuby5QZXJtaXNzaW9uT3B0aW9ucyB8IGJvb2xlYW4gfCBudWxsKTogc3RyaW5nIHtcbiAgY29uc3QgZmxhZ3MgPSBbXVxuICBpZiAoKHBlcm1pc3Npb25zID09PSB0cnVlKSB8fCAocGVybWlzc2lvbnMgPT09IFwiaW5oZXJpdFwiKSlcbiAgICBmbGFncy5wdXNoKFwiLS1hbGxvdy1hbGxcIilcbiAgaWYgKCh0eXBlb2YgcGVybWlzc2lvbnMgPT09IFwib2JqZWN0XCIpICYmIHBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtcImVudlwiLCBcImZmaVwiLCBcImltcG9ydFwiLCBcIm5ldFwiLCBcInJlYWRcIiwgXCJydW5cIiwgXCJzeXNcIiwgXCJ3cml0ZVwiXSBhcyBjb25zdCkge1xuICAgICAgaWYgKChwZXJtaXNzaW9uc1t0eXBlXSA9PT0gdHJ1ZSkgfHwgKHBlcm1pc3Npb25zW3R5cGVdID09PSBcImluaGVyaXRcIikpIHtcbiAgICAgICAgZmxhZ3MucHVzaChgLS1hbGxvdy0ke3R5cGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChwZXJtaXNzaW9uc1t0eXBlXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZmxhZ3MucHVzaChgLS1kZW55LSR7dHlwZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGVybWlzc2lvbnNbdHlwZV0pKSB7XG4gICAgICAgIGZsYWdzLnB1c2goYC0tYWxsb3ctJHt0eXBlfT0ke3Blcm1pc3Npb25zW3R5cGVdLm1hcChTdHJpbmcpLmpvaW4oXCIsXCIpfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmbGFncy5qb2luKFwiIFwiKVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtFQUErRSxHQUMvRSxPQUFPLFNBQVMsTUFBTSxXQUFvRDtFQUN4RSxNQUFNLFFBQVEsRUFBRTtFQUNoQixJQUFJLEFBQUMsZ0JBQWdCLFFBQVUsZ0JBQWdCLFdBQzdDLE1BQU0sSUFBSSxDQUFDO0VBQ2IsSUFBSSxBQUFDLE9BQU8sZ0JBQWdCLFlBQWEsYUFBYTtJQUNwRCxLQUFLLE1BQU0sUUFBUTtNQUFDO01BQU87TUFBTztNQUFVO01BQU87TUFBUTtNQUFPO01BQU87S0FBUSxDQUFXO01BQzFGLElBQUksQUFBQyxXQUFXLENBQUMsS0FBSyxLQUFLLFFBQVUsV0FBVyxDQUFDLEtBQUssS0FBSyxXQUFZO1FBQ3JFLE1BQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU07UUFDNUI7TUFDRjtNQUNBLElBQUksV0FBVyxDQUFDLEtBQUssS0FBSyxPQUFPO1FBQy9CLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU07UUFDM0I7TUFDRjtNQUNBLElBQUksTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRztRQUNwQyxNQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNO1FBQ3ZFO01BQ0Y7SUFDRjtFQUNGO0VBQ0EsT0FBTyxNQUFNLElBQUksQ0FBQztBQUNwQiJ9
package/pluralize.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Returns the plural form of a common English noun, preserving its casing.
3
+ *
4
+ * Intended for deriving SQL table names from singular schema names, so it only
5
+ * handles the regular cases and a handful of everyday irregulars.
6
+ */ export declare function pluralize(noun: string): string;
package/pluralize.js ADDED
@@ -0,0 +1,44 @@
1
+ // Singular → plural rules, tried top to bottom; first match wins. Covers the
2
+ // regular cases plus the few irregulars common in data models.
3
+ const rules = [
4
+ [
5
+ /(pe)(?:rson|ople)$/i,
6
+ "$1ople"
7
+ ],
8
+ [
9
+ /(child)(?:ren)?$/i,
10
+ "$1ren"
11
+ ],
12
+ [
13
+ /(?<!hu)(m)[ae]n$/i,
14
+ "$1en"
15
+ ],
16
+ [
17
+ /([^aeiouy])y$/i,
18
+ "$1ies"
19
+ ],
20
+ [
21
+ /([aeiou]z)$/i,
22
+ "$1zes"
23
+ ],
24
+ [
25
+ /(s|x|z|ch|sh)$/i,
26
+ "$1es"
27
+ ],
28
+ [
29
+ /$/i,
30
+ "s"
31
+ ]
32
+ ];
33
+ /**
34
+ * Returns the plural form of a common English noun, preserving its casing.
35
+ *
36
+ * Intended for deriving SQL table names from singular schema names, so it only
37
+ * handles the regular cases and a handful of everyday irregulars.
38
+ */ export function pluralize(noun) {
39
+ if (!noun) return noun;
40
+ const [regex, replacement] = rules.find(([regex])=>regex.test(noun));
41
+ const plural = noun.replace(regex, replacement);
42
+ return noun === noun.toUpperCase() ? plural.toUpperCase() : plural;
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9wbHVyYWxpemUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU2luZ3VsYXIg4oaSIHBsdXJhbCBydWxlcywgdHJpZWQgdG9wIHRvIGJvdHRvbTsgZmlyc3QgbWF0Y2ggd2lucy4gQ292ZXJzIHRoZVxuLy8gcmVndWxhciBjYXNlcyBwbHVzIHRoZSBmZXcgaXJyZWd1bGFycyBjb21tb24gaW4gZGF0YSBtb2RlbHMuXG5jb25zdCBydWxlczogW1JlZ0V4cCwgc3RyaW5nXVtdID0gW1xuICBbLyhwZSkoPzpyc29ufG9wbGUpJC9pLCBcIiQxb3BsZVwiXSwgLy8gcGVyc29uIOKGkiBwZW9wbGVcbiAgWy8oY2hpbGQpKD86cmVuKT8kL2ksIFwiJDFyZW5cIl0sIC8vIGNoaWxkIOKGkiBjaGlsZHJlblxuICBbLyg/PCFodSkobSlbYWVdbiQvaSwgXCIkMWVuXCJdLCAvLyBtYW4sIHdvbWFuIOKGkiBtZW4sIHdvbWVuIChidXQgaHVtYW4g4oaSIGh1bWFucylcbiAgWy8oW15hZWlvdXldKXkkL2ksIFwiJDFpZXNcIl0sIC8vIGNhdGVnb3J5IOKGkiBjYXRlZ29yaWVzXG4gIFsvKFthZWlvdV16KSQvaSwgXCIkMXplc1wiXSwgLy8gcXVpeiDihpIgcXVpenplc1xuICBbLyhzfHh8enxjaHxzaCkkL2ksIFwiJDFlc1wiXSwgLy8gYm94LCBjbGFzcywgc3RhdHVzIOKGkiBib3hlcywgY2xhc3Nlcywgc3RhdHVzZXNcbiAgWy8kL2ksIFwic1wiXSwgLy8gZGVmYXVsdDogdXNlciDihpIgdXNlcnNcbl1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbHVyYWwgZm9ybSBvZiBhIGNvbW1vbiBFbmdsaXNoIG5vdW4sIHByZXNlcnZpbmcgaXRzIGNhc2luZy5cbiAqXG4gKiBJbnRlbmRlZCBmb3IgZGVyaXZpbmcgU1FMIHRhYmxlIG5hbWVzIGZyb20gc2luZ3VsYXIgc2NoZW1hIG5hbWVzLCBzbyBpdCBvbmx5XG4gKiBoYW5kbGVzIHRoZSByZWd1bGFyIGNhc2VzIGFuZCBhIGhhbmRmdWwgb2YgZXZlcnlkYXkgaXJyZWd1bGFycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdXJhbGl6ZShub3VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIW5vdW4pXG4gICAgcmV0dXJuIG5vdW5cbiAgY29uc3QgW3JlZ2V4LCByZXBsYWNlbWVudF0gPSBydWxlcy5maW5kKChbcmVnZXhdKSA9PiByZWdleC50ZXN0KG5vdW4pKSFcbiAgY29uc3QgcGx1cmFsID0gbm91bi5yZXBsYWNlKHJlZ2V4LCByZXBsYWNlbWVudClcbiAgcmV0dXJuIG5vdW4gPT09IG5vdW4udG9VcHBlckNhc2UoKSA/IHBsdXJhbC50b1VwcGVyQ2FzZSgpIDogcGx1cmFsXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkVBQTZFO0FBQzdFLCtEQUErRDtBQUMvRCxNQUFNLFFBQTRCO0VBQ2hDO0lBQUM7SUFBdUI7R0FBUztFQUNqQztJQUFDO0lBQXFCO0dBQVE7RUFDOUI7SUFBQztJQUFxQjtHQUFPO0VBQzdCO0lBQUM7SUFBa0I7R0FBUTtFQUMzQjtJQUFDO0lBQWdCO0dBQVE7RUFDekI7SUFBQztJQUFtQjtHQUFPO0VBQzNCO0lBQUM7SUFBTTtHQUFJO0NBQ1o7QUFFRDs7Ozs7Q0FLQyxHQUNELE9BQU8sU0FBUyxVQUFVLElBQVk7RUFDcEMsSUFBSSxDQUFDLE1BQ0gsT0FBTztFQUNULE1BQU0sQ0FBQyxPQUFPLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFLLE1BQU0sSUFBSSxDQUFDO0VBQ2hFLE1BQU0sU0FBUyxLQUFLLE9BQU8sQ0FBQyxPQUFPO0VBQ25DLE9BQU8sU0FBUyxLQUFLLFdBQVcsS0FBSyxPQUFPLFdBQVcsS0FBSztBQUM5RCJ9
package/promises.d.ts ADDED
@@ -0,0 +1 @@
1
+ /** Returns the current state of a promise. */ export declare function state(promise: Promise<unknown>): Promise<"pending" | "fulfilled" | "rejected">;
package/promises.js ADDED
@@ -0,0 +1,12 @@
1
+ /** Returns the current state of a promise. */ export async function state(promise) {
2
+ const check = new Promise((resolve)=>setTimeout(resolve, 0));
3
+ try {
4
+ return await Promise.race([
5
+ promise.then((_)=>"fulfilled").catch((_)=>"rejected"),
6
+ check.then((_)=>"pending")
7
+ ]);
8
+ } finally{
9
+ await check;
10
+ }
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9wcm9taXNlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIHByb21pc2UuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhdGUocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8XCJwZW5kaW5nXCIgfCBcImZ1bGZpbGxlZFwiIHwgXCJyZWplY3RlZFwiPiB7XG4gIGNvbnN0IGNoZWNrID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbcHJvbWlzZS50aGVuKChfKSA9PiBcImZ1bGZpbGxlZFwiIGFzIGNvbnN0KS5jYXRjaCgoXykgPT4gXCJyZWplY3RlZFwiIGFzIGNvbnN0KSwgY2hlY2sudGhlbigoXykgPT4gXCJwZW5kaW5nXCIgYXMgY29uc3QpXSlcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBjaGVja1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNENBQTRDLEdBQzVDLE9BQU8sZUFBZSxNQUFNLE9BQXlCO0VBQ25ELE1BQU0sUUFBUSxJQUFJLFFBQWMsQ0FBQyxVQUFZLFdBQVcsU0FBUztFQUNqRSxJQUFJO0lBQ0YsT0FBTyxNQUFNLFFBQVEsSUFBSSxDQUFDO01BQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFNLGFBQXNCLEtBQUssQ0FBQyxDQUFDLElBQU07TUFBc0IsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFNO0tBQW9CO0VBQ2hKLFNBQVU7SUFDUixNQUFNO0VBQ1I7QUFDRiJ9
package/resolve.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /** Options for {@linkcode resolve} */ export type ResolveOptions = {
2
+ /** Base URL (defaults to current working directory). */ base?: string | ImportMeta;
3
+ /** Entrypoint (defaults to "mod.ts"). */ entrypoint?: string;
4
+ };
5
+ /** Resolve a module specifier in a similar way to `import.meta.resolve`. */ export declare function resolve(specifier: string, {}?: ResolveOptions): string;
package/resolve.js ADDED
@@ -0,0 +1,18 @@
1
+ // Imports
2
+ import { dirname, fromFileUrl, isAbsolute, join, toFileUrl } from "@std/path";
3
+ import { normalize } from "@std/path/posix/normalize";
4
+ import { cwd } from "./filesystem.js";
5
+ /** Resolve a module specifier in a similar way to `import.meta.resolve`. */ export function resolve(specifier, { base, entrypoint = "mod.ts" } = {}) {
6
+ if ([
7
+ "./",
8
+ "../",
9
+ "/"
10
+ ].some((prefix)=>specifier.startsWith(prefix))) {
11
+ if (specifier.endsWith("/")) specifier += entrypoint;
12
+ if (typeof base === "object") base = new URL(base.url).protocol === "file:" ? dirname(fromFileUrl(base.url)) : undefined;
13
+ base ??= cwd();
14
+ return toFileUrl(normalize(isAbsolute(specifier) ? specifier : join(base, specifier))).href;
15
+ }
16
+ return import.meta.resolve(specifier);
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9yZXNvbHZlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCB7IGRpcm5hbWUsIGZyb21GaWxlVXJsLCBpc0Fic29sdXRlLCBqb2luLCB0b0ZpbGVVcmwgfSBmcm9tIFwiQHN0ZC9wYXRoXCJcbmltcG9ydCB7IG5vcm1hbGl6ZSB9IGZyb20gXCJAc3RkL3BhdGgvcG9zaXgvbm9ybWFsaXplXCJcbmltcG9ydCB7IGN3ZCB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0uanNcIlxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSByZXNvbHZlfSAqL1xuZXhwb3J0IHR5cGUgUmVzb2x2ZU9wdGlvbnMgPSB7XG4gIC8qKiBCYXNlIFVSTCAoZGVmYXVsdHMgdG8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkuICovXG4gIGJhc2U/OiBzdHJpbmcgfCBJbXBvcnRNZXRhXG4gIC8qKiBFbnRyeXBvaW50IChkZWZhdWx0cyB0byBcIm1vZC50c1wiKS4gKi9cbiAgZW50cnlwb2ludD86IHN0cmluZ1xufVxuXG4vKiogUmVzb2x2ZSBhIG1vZHVsZSBzcGVjaWZpZXIgaW4gYSBzaW1pbGFyIHdheSB0byBgaW1wb3J0Lm1ldGEucmVzb2x2ZWAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShzcGVjaWZpZXI6IHN0cmluZywgeyBiYXNlLCBlbnRyeXBvaW50ID0gXCJtb2QudHNcIiB9OiBSZXNvbHZlT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgaWYgKFtcIi4vXCIsIFwiLi4vXCIsIFwiL1wiXS5zb21lKChwcmVmaXgpID0+IHNwZWNpZmllci5zdGFydHNXaXRoKHByZWZpeCkpKSB7XG4gICAgaWYgKHNwZWNpZmllci5lbmRzV2l0aChcIi9cIikpXG4gICAgICBzcGVjaWZpZXIgKz0gZW50cnlwb2ludFxuICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJvYmplY3RcIilcbiAgICAgIGJhc2UgPSAobmV3IFVSTChiYXNlLnVybCkucHJvdG9jb2wgPT09IFwiZmlsZTpcIikgPyBkaXJuYW1lKGZyb21GaWxlVXJsKGJhc2UudXJsKSkgOiB1bmRlZmluZWRcbiAgICBiYXNlID8/PSBjd2QoKVxuICAgIHJldHVybiB0b0ZpbGVVcmwobm9ybWFsaXplKGlzQWJzb2x1dGUoc3BlY2lmaWVyKSA/IHNwZWNpZmllciA6IGpvaW4oYmFzZSwgc3BlY2lmaWVyKSkpLmhyZWZcbiAgfVxuICByZXR1cm4gaW1wb3J0Lm1ldGEucmVzb2x2ZShzcGVjaWZpZXIpXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLFNBQVMsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsUUFBUSxZQUFXO0FBQzdFLFNBQVMsU0FBUyxRQUFRLDRCQUEyQjtBQUNyRCxTQUFTLEdBQUcsUUFBUSxrQkFBaUI7QUFVckMsMEVBQTBFLEdBQzFFLE9BQU8sU0FBUyxRQUFRLFNBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxRQUFRLEVBQWtCLEdBQUcsQ0FBQyxDQUFDO0VBQzdGLElBQUk7SUFBQztJQUFNO0lBQU87R0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVcsVUFBVSxVQUFVLENBQUMsVUFBVTtJQUNyRSxJQUFJLFVBQVUsUUFBUSxDQUFDLE1BQ3JCLGFBQWE7SUFDZixJQUFJLE9BQU8sU0FBUyxVQUNsQixPQUFPLEFBQUMsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLFFBQVEsS0FBSyxVQUFXLFFBQVEsWUFBWSxLQUFLLEdBQUcsS0FBSztJQUNyRixTQUFTO0lBQ1QsT0FBTyxVQUFVLFVBQVUsV0FBVyxhQUFhLFlBQVksS0FBSyxNQUFNLGFBQWEsSUFBSTtFQUM3RjtFQUNBLE9BQU8sWUFBWSxPQUFPLENBQUM7QUFDN0IifQ==
File without changes
@@ -0,0 +1,210 @@
1
+ // deno-lint-ignore-file no-console
2
+ import { parseArgs } from "@std/cli";
3
+ import { cyan, gray, green, red, stripAnsiCode, yellow } from "@std/fmt/colors";
4
+ import { basename, join } from "@std/path";
5
+ import { exists } from "@std/fs";
6
+ const decoder = new TextDecoder();
7
+ const args = parseArgs(Deno.args, {
8
+ string: [
9
+ "cwd",
10
+ "reporter",
11
+ "_"
12
+ ],
13
+ boolean: [
14
+ "dev",
15
+ "doc",
16
+ "help"
17
+ ],
18
+ default: {
19
+ reporter: "dot",
20
+ coverage: 80
21
+ }
22
+ });
23
+ if (args.cwd) Deno.chdir(args.cwd);
24
+ if (args.help) {
25
+ console.error(`Usage: deno run -A jsr:@libs/toolbox/code-quality <file_test.ts>...`);
26
+ console.error(``);
27
+ console.error(`Options:`);
28
+ console.error(` --cwd=DIR Change working directory before running tests (use $INIT_CWD in deno task)`);
29
+ console.error(` --dev Only run deno test and deno coverage`);
30
+ console.error(` --doc Run documentation checks (default: false)`);
31
+ console.error(` --reporter=TYPE Test reporter type (default: dot)`);
32
+ console.error(` --coverage=NUM Minimum coverage threshold percentage (default: 80, set to 0 to disable)`);
33
+ console.error(` --help Show this help message`);
34
+ console.error(``);
35
+ Deno.exit(2);
36
+ }
37
+ let success = true;
38
+ for (const mod_path of args._){
39
+ if (!mod_path.endsWith("_test.ts")) continue;
40
+ const mod_test = join(Deno.cwd(), mod_path);
41
+ const mod = mod_test.replace(/_test\.ts$/, ".ts");
42
+ console.error(cyan("─".repeat(80)));
43
+ console.error(cyan(`${mod}`));
44
+ console.error(cyan("─".repeat(80)));
45
+ if (!await exists(mod_test)) {
46
+ console.error(red(`✗ File not found: ${mod_test}`));
47
+ success = false;
48
+ continue;
49
+ }
50
+ // deno check
51
+ if (args.dev) console.error(gray(`∅ deno check`));
52
+ else {
53
+ const check = await new Deno.Command(Deno.execPath(), {
54
+ args: [
55
+ "check",
56
+ "--quiet",
57
+ mod,
58
+ mod_test
59
+ ],
60
+ stdout: "inherit",
61
+ stderr: "inherit"
62
+ }).output();
63
+ success &&= check.success;
64
+ console.error((check.success ? green : red)(`${check.success ? "✓" : "✗"} deno check`));
65
+ }
66
+ // deno lint
67
+ if (args.dev) console.error(gray(`∅ deno lint`));
68
+ else {
69
+ const lint = await new Deno.Command(Deno.execPath(), {
70
+ args: [
71
+ "lint",
72
+ "--quiet",
73
+ mod,
74
+ mod_test
75
+ ],
76
+ stdout: "inherit",
77
+ stderr: "inherit"
78
+ }).output();
79
+ success &&= lint.success;
80
+ console.error((lint.success ? green : red)(`${lint.success ? "✓" : "✗"} deno lint`));
81
+ }
82
+ // deno fmt
83
+ if (args.dev) console.error(gray(`∅ deno fmt --check`));
84
+ else {
85
+ const fmt = await new Deno.Command(Deno.execPath(), {
86
+ args: [
87
+ "fmt",
88
+ "--quiet",
89
+ "--check",
90
+ mod,
91
+ mod_test
92
+ ],
93
+ stdout: "inherit",
94
+ stderr: "inherit"
95
+ }).output();
96
+ success &&= fmt.success;
97
+ console.error((fmt.success ? green : red)(`${fmt.success ? "✓" : "✗"} deno fmt --check`));
98
+ }
99
+ // deno test
100
+ const test = await new Deno.Command(Deno.execPath(), {
101
+ args: [
102
+ "test",
103
+ "--no-check",
104
+ "--clean",
105
+ "--coverage",
106
+ "--coverage-raw-data-only",
107
+ "--seed=0",
108
+ `--reporter=${args.reporter}`,
109
+ "--sanitize-ops",
110
+ "--sanitize-resources",
111
+ "--trace-leaks",
112
+ "--allow-all",
113
+ mod_test
114
+ ],
115
+ stdout: "inherit",
116
+ stderr: "inherit"
117
+ }).output();
118
+ success &&= test.success;
119
+ console.error((test.success ? green : red)(`${test.success ? "✓" : "✗"} deno test`));
120
+ // deno coverage
121
+ if (test.success) {
122
+ const parsed = Number.parseFloat(`${args.coverage}`);
123
+ const threshold = Number.isFinite(parsed) ? parsed : 80;
124
+ const coverage = await new Deno.Command(Deno.execPath(), {
125
+ args: [
126
+ "coverage",
127
+ `--include=${mod}`
128
+ ],
129
+ stdout: "piped",
130
+ stderr: "inherit"
131
+ }).output();
132
+ const result = stripAnsiCode(decoder.decode(coverage.stdout)).trim().match(/^\|\s*All files\s*\|\s*(?<branch>\d+(?:\.\d+)?)\s*\|\s*(?<func>\d+(?:\.\d+)?)\s*\|\s*(?<line>\d+(?:\.\d+)?)\s*\|$/m)?.groups ?? {};
133
+ const branch = Number.parseFloat(result.branch) || 0;
134
+ const func = Number.parseFloat(result.func) || 0;
135
+ const line = Number.parseFloat(result.line) || 0;
136
+ const pass = line >= threshold && branch >= threshold && func >= threshold;
137
+ console.error((branch === 100 && func === 100 && line === 100 ? green : pass ? yellow : red)(`${pass ? "✓" : "✗"} deno coverage --threshold=${threshold}%`));
138
+ console.error((branch === 100 ? green : branch >= threshold ? yellow : red)(` ├─ branch: ${branch.toFixed(1)}%`));
139
+ console.error((func === 100 ? green : func >= threshold ? yellow : red)(` ├─ function: ${func.toFixed(1)}%`));
140
+ console.error((line === 100 ? green : line >= threshold ? yellow : red)(` └─ line: ${line.toFixed(1)}%`));
141
+ if (branch < 100 || func < 100 || line < 100) await new Deno.Command(Deno.execPath(), {
142
+ args: [
143
+ "coverage",
144
+ "--detailed",
145
+ `--include=${mod}`
146
+ ],
147
+ stdout: "inherit",
148
+ stderr: "inherit"
149
+ }).output();
150
+ }
151
+ // Documentation checks
152
+ if (args.doc) {
153
+ console.error(gray("┄".repeat(80)));
154
+ // deno doc
155
+ if (basename(mod) === "mod.ts") {
156
+ const doc = await new Deno.Command(Deno.execPath(), {
157
+ args: [
158
+ "doc",
159
+ "--quiet",
160
+ "--lint",
161
+ mod
162
+ ],
163
+ stdout: "inherit",
164
+ stderr: "inherit"
165
+ }).output();
166
+ success &&= doc.success;
167
+ console.error((doc.success ? green : red)(`${doc.success ? "✓" : "✗"} deno doc --lint`));
168
+ } else {
169
+ console.error(gray(`∅ deno doc --lint`));
170
+ }
171
+ // deno check --doc
172
+ const check = await new Deno.Command(Deno.execPath(), {
173
+ args: [
174
+ "check",
175
+ "--quiet",
176
+ "--doc-only",
177
+ mod,
178
+ mod_test
179
+ ],
180
+ stdout: "inherit",
181
+ stderr: "inherit"
182
+ }).output();
183
+ success &&= check.success;
184
+ console.error((check.success ? green : red)(`${check.success ? "✓" : "✗"} deno check --doc`));
185
+ // deno test --doc
186
+ const test = await new Deno.Command(Deno.execPath(), {
187
+ args: [
188
+ "test",
189
+ "--no-check",
190
+ "--seed=0",
191
+ `--reporter=${args.reporter}`,
192
+ "--doc",
193
+ mod
194
+ ],
195
+ stdout: "inherit",
196
+ stderr: "inherit"
197
+ }).output();
198
+ success &&= test.success;
199
+ console.error((test.success ? green : red)(`${test.success ? "✓" : "✗"} deno test --doc`));
200
+ }
201
+ }
202
+ if (success) {
203
+ console.error(green("─".repeat(80)));
204
+ console.error(green(`✓ Success`));
205
+ } else {
206
+ console.error(red("─".repeat(80)));
207
+ console.error(red(`✗ Failure`));
208
+ Deno.exit(1);
209
+ }
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9zY3JpcHRzL2NvZGVfcXVhbGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBkZW5vLWxpbnQtaWdub3JlLWZpbGUgbm8tY29uc29sZVxuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIkBzdGQvY2xpXCJcbmltcG9ydCB7IGN5YW4sIGdyYXksIGdyZWVuLCByZWQsIHN0cmlwQW5zaUNvZGUsIHllbGxvdyB9IGZyb20gXCJAc3RkL2ZtdC9jb2xvcnNcIlxuaW1wb3J0IHsgYmFzZW5hbWUsIGpvaW4gfSBmcm9tIFwiQHN0ZC9wYXRoXCJcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCJAc3RkL2ZzXCJcblxuY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG5jb25zdCBhcmdzID0gcGFyc2VBcmdzKERlbm8uYXJncywgeyBzdHJpbmc6IFtcImN3ZFwiLCBcInJlcG9ydGVyXCIsIFwiX1wiXSwgYm9vbGVhbjogW1wiZGV2XCIsIFwiZG9jXCIsIFwiaGVscFwiXSwgZGVmYXVsdDogeyByZXBvcnRlcjogXCJkb3RcIiwgY292ZXJhZ2U6IDgwIH0gfSlcbmlmIChhcmdzLmN3ZClcbiAgRGVuby5jaGRpcihhcmdzLmN3ZClcbmlmIChhcmdzLmhlbHApIHtcbiAgY29uc29sZS5lcnJvcihgVXNhZ2U6IGRlbm8gcnVuIC1BIGpzcjpAbGlicy90b29sYm94L2NvZGUtcXVhbGl0eSA8ZmlsZV90ZXN0LnRzPi4uLmApXG4gIGNvbnNvbGUuZXJyb3IoYGApXG4gIGNvbnNvbGUuZXJyb3IoYE9wdGlvbnM6YClcbiAgY29uc29sZS5lcnJvcihgICAtLWN3ZD1ESVIgICAgICAgIENoYW5nZSB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgcnVubmluZyB0ZXN0cyAodXNlICRJTklUX0NXRCBpbiBkZW5vIHRhc2spYClcbiAgY29uc29sZS5lcnJvcihgICAtLWRldiAgICAgICAgICAgIE9ubHkgcnVuIGRlbm8gdGVzdCBhbmQgZGVubyBjb3ZlcmFnZWApXG4gIGNvbnNvbGUuZXJyb3IoYCAgLS1kb2MgICAgICAgICAgICBSdW4gZG9jdW1lbnRhdGlvbiBjaGVja3MgKGRlZmF1bHQ6IGZhbHNlKWApXG4gIGNvbnNvbGUuZXJyb3IoYCAgLS1yZXBvcnRlcj1UWVBFICBUZXN0IHJlcG9ydGVyIHR5cGUgKGRlZmF1bHQ6IGRvdClgKVxuICBjb25zb2xlLmVycm9yKGAgIC0tY292ZXJhZ2U9TlVNICAgTWluaW11bSBjb3ZlcmFnZSB0aHJlc2hvbGQgcGVyY2VudGFnZSAoZGVmYXVsdDogODAsIHNldCB0byAwIHRvIGRpc2FibGUpYClcbiAgY29uc29sZS5lcnJvcihgICAtLWhlbHAgICAgICAgICAgIFNob3cgdGhpcyBoZWxwIG1lc3NhZ2VgKVxuICBjb25zb2xlLmVycm9yKGBgKVxuICBEZW5vLmV4aXQoMilcbn1cblxubGV0IHN1Y2Nlc3MgPSB0cnVlXG5mb3IgKGNvbnN0IG1vZF9wYXRoIG9mIGFyZ3MuXykge1xuICBpZiAoIW1vZF9wYXRoLmVuZHNXaXRoKFwiX3Rlc3QudHNcIikpXG4gICAgY29udGludWVcbiAgY29uc3QgbW9kX3Rlc3QgPSBqb2luKERlbm8uY3dkKCksIG1vZF9wYXRoKVxuICBjb25zdCBtb2QgPSBtb2RfdGVzdC5yZXBsYWNlKC9fdGVzdFxcLnRzJC8sIFwiLnRzXCIpXG4gIGNvbnNvbGUuZXJyb3IoY3lhbihcIuKUgFwiLnJlcGVhdCg4MCkpKVxuICBjb25zb2xlLmVycm9yKGN5YW4oYCR7bW9kfWApKVxuICBjb25zb2xlLmVycm9yKGN5YW4oXCLilIBcIi5yZXBlYXQoODApKSlcbiAgaWYgKCFhd2FpdCBleGlzdHMobW9kX3Rlc3QpKSB7XG4gICAgY29uc29sZS5lcnJvcihyZWQoYOKclyBGaWxlIG5vdCBmb3VuZDogJHttb2RfdGVzdH1gKSlcbiAgICBzdWNjZXNzID0gZmFsc2VcbiAgICBjb250aW51ZVxuICB9XG5cbiAgLy8gZGVubyBjaGVja1xuICBpZiAoYXJncy5kZXYpXG4gICAgY29uc29sZS5lcnJvcihncmF5KGDiiIUgZGVubyBjaGVja2ApKVxuICBlbHNlIHtcbiAgICBjb25zdCBjaGVjayA9IGF3YWl0IG5ldyBEZW5vLkNvbW1hbmQoRGVuby5leGVjUGF0aCgpLCB7IGFyZ3M6IFtcImNoZWNrXCIsIFwiLS1xdWlldFwiLCBtb2QsIG1vZF90ZXN0XSwgc3Rkb3V0OiBcImluaGVyaXRcIiwgc3RkZXJyOiBcImluaGVyaXRcIiB9KS5vdXRwdXQoKVxuICAgIHN1Y2Nlc3MgJiY9IGNoZWNrLnN1Y2Nlc3NcbiAgICBjb25zb2xlLmVycm9yKChjaGVjay5zdWNjZXNzID8gZ3JlZW4gOiByZWQpKGAke2NoZWNrLnN1Y2Nlc3MgPyBcIuKck1wiIDogXCLinJdcIn0gZGVubyBjaGVja2ApKVxuICB9XG4gIC8vIGRlbm8gbGludFxuICBpZiAoYXJncy5kZXYpXG4gICAgY29uc29sZS5lcnJvcihncmF5KGDiiIUgZGVubyBsaW50YCkpXG4gIGVsc2Uge1xuICAgIGNvbnN0IGxpbnQgPSBhd2FpdCBuZXcgRGVuby5Db21tYW5kKERlbm8uZXhlY1BhdGgoKSwgeyBhcmdzOiBbXCJsaW50XCIsIFwiLS1xdWlldFwiLCBtb2QsIG1vZF90ZXN0XSwgc3Rkb3V0OiBcImluaGVyaXRcIiwgc3RkZXJyOiBcImluaGVyaXRcIiB9KS5vdXRwdXQoKVxuICAgIHN1Y2Nlc3MgJiY9IGxpbnQuc3VjY2Vzc1xuICAgIGNvbnNvbGUuZXJyb3IoKGxpbnQuc3VjY2VzcyA/IGdyZWVuIDogcmVkKShgJHtsaW50LnN1Y2Nlc3MgPyBcIuKck1wiIDogXCLinJdcIn0gZGVubyBsaW50YCkpXG4gIH1cbiAgLy8gZGVubyBmbXRcbiAgaWYgKGFyZ3MuZGV2KVxuICAgIGNvbnNvbGUuZXJyb3IoZ3JheShg4oiFIGRlbm8gZm10IC0tY2hlY2tgKSlcbiAgZWxzZSB7XG4gICAgY29uc3QgZm10ID0gYXdhaXQgbmV3IERlbm8uQ29tbWFuZChEZW5vLmV4ZWNQYXRoKCksIHsgYXJnczogW1wiZm10XCIsIFwiLS1xdWlldFwiLCBcIi0tY2hlY2tcIiwgbW9kLCBtb2RfdGVzdF0sIHN0ZG91dDogXCJpbmhlcml0XCIsIHN0ZGVycjogXCJpbmhlcml0XCIgfSkub3V0cHV0KClcbiAgICBzdWNjZXNzICYmPSBmbXQuc3VjY2Vzc1xuICAgIGNvbnNvbGUuZXJyb3IoKGZtdC5zdWNjZXNzID8gZ3JlZW4gOiByZWQpKGAke2ZtdC5zdWNjZXNzID8gXCLinJNcIiA6IFwi4pyXXCJ9IGRlbm8gZm10IC0tY2hlY2tgKSlcbiAgfVxuICAvLyBkZW5vIHRlc3RcbiAgY29uc3QgdGVzdCA9IGF3YWl0IG5ldyBEZW5vLkNvbW1hbmQoRGVuby5leGVjUGF0aCgpLCB7XG4gICAgYXJnczogW1widGVzdFwiLCBcIi0tbm8tY2hlY2tcIiwgXCItLWNsZWFuXCIsIFwiLS1jb3ZlcmFnZVwiLCBcIi0tY292ZXJhZ2UtcmF3LWRhdGEtb25seVwiLCBcIi0tc2VlZD0wXCIsIGAtLXJlcG9ydGVyPSR7YXJncy5yZXBvcnRlcn1gLCBcIi0tc2FuaXRpemUtb3BzXCIsIFwiLS1zYW5pdGl6ZS1yZXNvdXJjZXNcIiwgXCItLXRyYWNlLWxlYWtzXCIsIFwiLS1hbGxvdy1hbGxcIiwgbW9kX3Rlc3RdLFxuICAgIHN0ZG91dDogXCJpbmhlcml0XCIsXG4gICAgc3RkZXJyOiBcImluaGVyaXRcIixcbiAgfSkub3V0cHV0KClcbiAgc3VjY2VzcyAmJj0gdGVzdC5zdWNjZXNzXG4gIGNvbnNvbGUuZXJyb3IoKHRlc3Quc3VjY2VzcyA/IGdyZWVuIDogcmVkKShgJHt0ZXN0LnN1Y2Nlc3MgPyBcIuKck1wiIDogXCLinJdcIn0gZGVubyB0ZXN0YCkpXG4gIC8vIGRlbm8gY292ZXJhZ2VcbiAgaWYgKHRlc3Quc3VjY2Vzcykge1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlci5wYXJzZUZsb2F0KGAke2FyZ3MuY292ZXJhZ2V9YClcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IDgwXG4gICAgY29uc3QgY292ZXJhZ2UgPSBhd2FpdCBuZXcgRGVuby5Db21tYW5kKERlbm8uZXhlY1BhdGgoKSwgeyBhcmdzOiBbXCJjb3ZlcmFnZVwiLCBgLS1pbmNsdWRlPSR7bW9kfWBdLCBzdGRvdXQ6IFwicGlwZWRcIiwgc3RkZXJyOiBcImluaGVyaXRcIiB9KS5vdXRwdXQoKVxuICAgIGNvbnN0IHJlc3VsdCA9IHN0cmlwQW5zaUNvZGUoZGVjb2Rlci5kZWNvZGUoY292ZXJhZ2Uuc3Rkb3V0KSkudHJpbSgpLm1hdGNoKC9eXFx8XFxzKkFsbCBmaWxlc1xccypcXHxcXHMqKD88YnJhbmNoPlxcZCsoPzpcXC5cXGQrKT8pXFxzKlxcfFxccyooPzxmdW5jPlxcZCsoPzpcXC5cXGQrKT8pXFxzKlxcfFxccyooPzxsaW5lPlxcZCsoPzpcXC5cXGQrKT8pXFxzKlxcfCQvbSk/Lmdyb3VwcyA/PyB7fVxuICAgIGNvbnN0IGJyYW5jaCA9IE51bWJlci5wYXJzZUZsb2F0KHJlc3VsdC5icmFuY2gpIHx8IDBcbiAgICBjb25zdCBmdW5jID0gTnVtYmVyLnBhcnNlRmxvYXQocmVzdWx0LmZ1bmMpIHx8IDBcbiAgICBjb25zdCBsaW5lID0gTnVtYmVyLnBhcnNlRmxvYXQocmVzdWx0LmxpbmUpIHx8IDBcbiAgICBjb25zdCBwYXNzID0gbGluZSA+PSB0aHJlc2hvbGQgJiYgYnJhbmNoID49IHRocmVzaG9sZCAmJiBmdW5jID49IHRocmVzaG9sZFxuICAgIGNvbnNvbGUuZXJyb3IoKGJyYW5jaCA9PT0gMTAwICYmIGZ1bmMgPT09IDEwMCAmJiBsaW5lID09PSAxMDAgPyBncmVlbiA6IHBhc3MgPyB5ZWxsb3cgOiByZWQpKGAke3Bhc3MgPyBcIuKck1wiIDogXCLinJdcIn0gZGVubyBjb3ZlcmFnZSAtLXRocmVzaG9sZD0ke3RocmVzaG9sZH0lYCkpXG4gICAgY29uc29sZS5lcnJvcigoYnJhbmNoID09PSAxMDAgPyBncmVlbiA6IGJyYW5jaCA+PSB0aHJlc2hvbGQgPyB5ZWxsb3cgOiByZWQpKGAgIOKUnOKUgCBicmFuY2g6ICR7YnJhbmNoLnRvRml4ZWQoMSl9JWApKVxuICAgIGNvbnNvbGUuZXJyb3IoKGZ1bmMgPT09IDEwMCA/IGdyZWVuIDogZnVuYyA+PSB0aHJlc2hvbGQgPyB5ZWxsb3cgOiByZWQpKGAgIOKUnOKUgCBmdW5jdGlvbjogJHtmdW5jLnRvRml4ZWQoMSl9JWApKVxuICAgIGNvbnNvbGUuZXJyb3IoKGxpbmUgPT09IDEwMCA/IGdyZWVuIDogbGluZSA+PSB0aHJlc2hvbGQgPyB5ZWxsb3cgOiByZWQpKGAgIOKUlOKUgCBsaW5lOiAke2xpbmUudG9GaXhlZCgxKX0lYCkpXG4gICAgaWYgKChicmFuY2ggPCAxMDApIHx8IChmdW5jIDwgMTAwKSB8fCAobGluZSA8IDEwMCkpXG4gICAgICBhd2FpdCBuZXcgRGVuby5Db21tYW5kKERlbm8uZXhlY1BhdGgoKSwgeyBhcmdzOiBbXCJjb3ZlcmFnZVwiLCBcIi0tZGV0YWlsZWRcIiwgYC0taW5jbHVkZT0ke21vZH1gXSwgc3Rkb3V0OiBcImluaGVyaXRcIiwgc3RkZXJyOiBcImluaGVyaXRcIiB9KS5vdXRwdXQoKVxuICB9XG5cbiAgLy8gRG9jdW1lbnRhdGlvbiBjaGVja3NcbiAgaWYgKGFyZ3MuZG9jKSB7XG4gICAgY29uc29sZS5lcnJvcihncmF5KFwi4pSEXCIucmVwZWF0KDgwKSkpXG4gICAgLy8gZGVubyBkb2NcbiAgICBpZiAoYmFzZW5hbWUobW9kKSA9PT0gXCJtb2QudHNcIikge1xuICAgICAgY29uc3QgZG9jID0gYXdhaXQgbmV3IERlbm8uQ29tbWFuZChEZW5vLmV4ZWNQYXRoKCksIHsgYXJnczogW1wiZG9jXCIsIFwiLS1xdWlldFwiLCBcIi0tbGludFwiLCBtb2RdLCBzdGRvdXQ6IFwiaW5oZXJpdFwiLCBzdGRlcnI6IFwiaW5oZXJpdFwiIH0pLm91dHB1dCgpXG4gICAgICBzdWNjZXNzICYmPSBkb2Muc3VjY2Vzc1xuICAgICAgY29uc29sZS5lcnJvcigoZG9jLnN1Y2Nlc3MgPyBncmVlbiA6IHJlZCkoYCR7ZG9jLnN1Y2Nlc3MgPyBcIuKck1wiIDogXCLinJdcIn0gZGVubyBkb2MgLS1saW50YCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZ3JheShg4oiFIGRlbm8gZG9jIC0tbGludGApKVxuICAgIH1cbiAgICAvLyBkZW5vIGNoZWNrIC0tZG9jXG4gICAgY29uc3QgY2hlY2sgPSBhd2FpdCBuZXcgRGVuby5Db21tYW5kKERlbm8uZXhlY1BhdGgoKSwgeyBhcmdzOiBbXCJjaGVja1wiLCBcIi0tcXVpZXRcIiwgXCItLWRvYy1vbmx5XCIsIG1vZCwgbW9kX3Rlc3RdLCBzdGRvdXQ6IFwiaW5oZXJpdFwiLCBzdGRlcnI6IFwiaW5oZXJpdFwiIH0pLm91dHB1dCgpXG4gICAgc3VjY2VzcyAmJj0gY2hlY2suc3VjY2Vzc1xuICAgIGNvbnNvbGUuZXJyb3IoKGNoZWNrLnN1Y2Nlc3MgPyBncmVlbiA6IHJlZCkoYCR7Y2hlY2suc3VjY2VzcyA/IFwi4pyTXCIgOiBcIuKcl1wifSBkZW5vIGNoZWNrIC0tZG9jYCkpXG4gICAgLy8gZGVubyB0ZXN0IC0tZG9jXG4gICAgY29uc3QgdGVzdCA9IGF3YWl0IG5ldyBEZW5vLkNvbW1hbmQoRGVuby5leGVjUGF0aCgpLCB7IGFyZ3M6IFtcInRlc3RcIiwgXCItLW5vLWNoZWNrXCIsIFwiLS1zZWVkPTBcIiwgYC0tcmVwb3J0ZXI9JHthcmdzLnJlcG9ydGVyfWAsIFwiLS1kb2NcIiwgbW9kXSwgc3Rkb3V0OiBcImluaGVyaXRcIiwgc3RkZXJyOiBcImluaGVyaXRcIiB9KS5vdXRwdXQoKVxuICAgIHN1Y2Nlc3MgJiY9IHRlc3Quc3VjY2Vzc1xuICAgIGNvbnNvbGUuZXJyb3IoKHRlc3Quc3VjY2VzcyA/IGdyZWVuIDogcmVkKShgJHt0ZXN0LnN1Y2Nlc3MgPyBcIuKck1wiIDogXCLinJdcIn0gZGVubyB0ZXN0IC0tZG9jYCkpXG4gIH1cbn1cblxuaWYgKHN1Y2Nlc3MpIHtcbiAgY29uc29sZS5lcnJvcihncmVlbihcIuKUgFwiLnJlcGVhdCg4MCkpKVxuICBjb25zb2xlLmVycm9yKGdyZWVuKGDinJMgU3VjY2Vzc2ApKVxufSBlbHNlIHtcbiAgY29uc29sZS5lcnJvcihyZWQoXCLilIBcIi5yZXBlYXQoODApKSlcbiAgY29uc29sZS5lcnJvcihyZWQoYOKclyBGYWlsdXJlYCkpXG4gIERlbm8uZXhpdCgxKVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUFtQztBQUNuQyxTQUFTLFNBQVMsUUFBUSxXQUFVO0FBQ3BDLFNBQVMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxNQUFNLFFBQVEsa0JBQWlCO0FBQy9FLFNBQVMsUUFBUSxFQUFFLElBQUksUUFBUSxZQUFXO0FBQzFDLFNBQVMsTUFBTSxRQUFRLFVBQVM7QUFFaEMsTUFBTSxVQUFVLElBQUk7QUFDcEIsTUFBTSxPQUFPLFVBQVUsS0FBSyxJQUFJLEVBQUU7RUFBRSxRQUFRO0lBQUM7SUFBTztJQUFZO0dBQUk7RUFBRSxTQUFTO0lBQUM7SUFBTztJQUFPO0dBQU87RUFBRSxTQUFTO0lBQUUsVUFBVTtJQUFPLFVBQVU7RUFBRztBQUFFO0FBQ2xKLElBQUksS0FBSyxHQUFHLEVBQ1YsS0FBSyxLQUFLLENBQUMsS0FBSyxHQUFHO0FBQ3JCLElBQUksS0FBSyxJQUFJLEVBQUU7RUFDYixRQUFRLEtBQUssQ0FBQyxDQUFDLG1FQUFtRSxDQUFDO0VBQ25GLFFBQVEsS0FBSyxDQUFDLEVBQUU7RUFDaEIsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUM7RUFDeEIsUUFBUSxLQUFLLENBQUMsQ0FBQyw2RkFBNkYsQ0FBQztFQUM3RyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVEQUF1RCxDQUFDO0VBQ3ZFLFFBQVEsS0FBSyxDQUFDLENBQUMsNERBQTRELENBQUM7RUFDNUUsUUFBUSxLQUFLLENBQUMsQ0FBQyxvREFBb0QsQ0FBQztFQUNwRSxRQUFRLEtBQUssQ0FBQyxDQUFDLDJGQUEyRixDQUFDO0VBQzNHLFFBQVEsS0FBSyxDQUFDLENBQUMseUNBQXlDLENBQUM7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
@@ -0,0 +1,10 @@
1
+ /** Chromium download options. */ export type ChromiumOptions = {
2
+ /** Chromium version. Default is `141.0.0`. */ version?: string;
3
+ /** Path to save Chromium binary. Default is `/tmp/chromium`. */ path?: string;
4
+ /** System architecture. Default is current architecture. */ arch?: typeof Deno.build.arch;
5
+ /** Download URL. */ url?: string;
6
+ /** Force download even if file exists. */ force?: boolean;
7
+ /** Set environment variables for `FONTCONFIG_PATH` and `LD_LIBRARY_PATH` (requires --allow-env). Default is `true`. */ env?: boolean;
8
+ /** Enable debugging. */ debug?: boolean;
9
+ };
10
+ /** Download Chromium binary for AWS Lambda environment. */ export declare function chromium({}?: ChromiumOptions): Promise<string>;