@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.
- package/README.md +14 -0
- package/clone.d.ts +9 -0
- package/clone.js +37 -0
- package/deno.lock +53 -0
- package/env.d.ts +28 -0
- package/env.js +28 -0
- package/evaluate.d.ts +49 -0
- package/evaluate.js +90 -0
- package/events.d.ts +8 -0
- package/events.js +28 -0
- package/filesystem.d.ts +19 -0
- package/filesystem.js +40 -0
- package/fixtures/filesystem/a/b/foo.txt +1 -0
- package/fixtures/filesystem/a/c/bar.txt +1 -0
- package/fixtures/filesystem/a/c/baz.txt +1 -0
- package/fixtures/filesystem/a/d/qux.ts +1 -0
- package/format.d.ts +9 -0
- package/format.js +21 -0
- package/identicon.d.ts +6 -0
- package/identicon.js +32 -0
- package/imgb64.d.ts +1 -0
- package/imgb64.js +15 -0
- package/mod.ts +1 -0
- package/noop.d.ts +1 -0
- package/noop.js +2 -0
- package/package.json +116 -0
- package/permissions.d.ts +1 -0
- package/permissions.js +31 -0
- package/pluralize.d.ts +6 -0
- package/pluralize.js +44 -0
- package/promises.d.ts +1 -0
- package/promises.js +12 -0
- package/resolve.d.ts +5 -0
- package/resolve.js +18 -0
- package/scripts/code_quality.d.ts +0 -0
- package/scripts/code_quality.js +210 -0
- package/scripts/download_lambda_chromium.d.ts +10 -0
- package/scripts/download_lambda_chromium.js +133 -0
- package/scripts/highlight_coverage.d.ts +0 -0
- package/scripts/highlight_coverage.js +62 -0
- package/scripts/publish/_utils.js +95 -0
- package/scripts/publish/npm.d.ts +11 -0
- package/scripts/publish/npm.js +130 -0
- package/scripts/publish/x.d.ts +20 -0
- package/scripts/publish/x.js +303 -0
- package/timezone.d.ts +2 -0
- 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
|
+
}
|
package/permissions.d.ts
ADDED
|
@@ -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>;
|