dlintr 0.1.1 → 0.2.0
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 +82 -22
- package/ghc_wasm_jsffi.js +114 -0
- package/hadolint.wasm +0 -0
- package/lib/api.d.ts +4 -4
- package/lib/api.js +29 -30
- package/lib/api.js.map +1 -1
- package/lib/browser.d.ts +3 -4
- package/lib/browser.js +22 -3
- package/lib/browser.js.map +1 -1
- package/lib/index.cjs +212 -172
- package/lib/index.d.ts +3 -4
- package/lib/index.js +21 -3
- package/lib/index.js.map +1 -1
- package/lib/memoize.d.ts +1 -0
- package/lib/memoize.js +14 -0
- package/lib/memoize.js.map +1 -0
- package/lib/reactor.d.ts +6 -0
- package/lib/reactor.js +21 -0
- package/lib/reactor.js.map +1 -0
- package/lib/types.d.ts +0 -10
- package/lib/wasi.d.ts +11 -0
- package/lib/wasi.js +88 -0
- package/lib/wasi.js.map +1 -0
- package/package.json +7 -15
- package/lib/runtime.d.ts +0 -6
- package/lib/runtime.js +0 -3
- package/lib/runtime.js.map +0 -1
- package/lib/wasi-browser.d.ts +0 -2
- package/lib/wasi-browser.js +0 -48
- package/lib/wasi-browser.js.map +0 -1
- package/lib/wasi-node.d.ts +0 -2
- package/lib/wasi-node.js +0 -127
- package/lib/wasi-node.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dlintr",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Dockerfile linter, validate inline bash, powered by hadolint with WASM",
|
|
6
6
|
"repository": {
|
|
@@ -23,18 +23,11 @@
|
|
|
23
23
|
"./package.json": "./package.json"
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
|
+
"ghc_wasm_jsffi.js",
|
|
26
27
|
"hadolint.wasm",
|
|
27
28
|
"lib",
|
|
28
29
|
"!**/*.tsbuildinfo"
|
|
29
30
|
],
|
|
30
|
-
"peerDependencies": {
|
|
31
|
-
"@bjorn3/browser_wasi_shim": "^0.4.2"
|
|
32
|
-
},
|
|
33
|
-
"peerDependenciesMeta": {
|
|
34
|
-
"@bjorn3/browser_wasi_shim": {
|
|
35
|
-
"optional": true
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
31
|
"dependencies": {
|
|
39
32
|
"tslib": "^2.4.0"
|
|
40
33
|
},
|
|
@@ -50,7 +43,6 @@
|
|
|
50
43
|
"@1stg/simple-git-hooks": "^2.0.0",
|
|
51
44
|
"@1stg/stylelint-config": "^6.2.0",
|
|
52
45
|
"@1stg/tsconfig": "^4.0.0",
|
|
53
|
-
"@bjorn3/browser_wasi_shim": "^0.4.2",
|
|
54
46
|
"@changesets/changelog-github": "^1.0.0",
|
|
55
47
|
"@changesets/cli": "^3.0.0",
|
|
56
48
|
"@commitlint/cli": "^21.2.3",
|
|
@@ -72,7 +64,7 @@
|
|
|
72
64
|
"eslint-plugin-react-hooks": ">=5.0.0",
|
|
73
65
|
"github-markdown-css": "^5.1.0",
|
|
74
66
|
"nano-staged": "^1.0.2",
|
|
75
|
-
"npm-run-
|
|
67
|
+
"npm-run-all2": "^5.0.0",
|
|
76
68
|
"prettier": "^3.0.0",
|
|
77
69
|
"react": "^19.0.0",
|
|
78
70
|
"react-dom": "^19.0.0",
|
|
@@ -102,13 +94,12 @@
|
|
|
102
94
|
"ignoreNonNullAssertion": true,
|
|
103
95
|
"showRelativePath": true,
|
|
104
96
|
"strict": true,
|
|
105
|
-
"update":
|
|
97
|
+
"update": false
|
|
106
98
|
},
|
|
107
99
|
"scripts": {
|
|
108
100
|
"build": "run-p build:*",
|
|
109
101
|
"build:r": "r -f cjs",
|
|
110
102
|
"build:tsc": "tsc -p src",
|
|
111
|
-
"build:wasm": "node scripts/hadolint-wasm.mjs",
|
|
112
103
|
"dev": "vitest",
|
|
113
104
|
"docs:build": "vite build docs",
|
|
114
105
|
"docs:dev": "vite docs",
|
|
@@ -116,14 +107,15 @@
|
|
|
116
107
|
"lint:es": "eslint . --cache -f friendly --max-warnings 10",
|
|
117
108
|
"lint:style": "stylelint . --cache",
|
|
118
109
|
"lint:tsc": "tsc --noEmit && tsc -p docs --noEmit",
|
|
110
|
+
"lint:typecov": "type-coverage",
|
|
119
111
|
"prerelease": "pnpm build",
|
|
120
112
|
"release": "changeset publish",
|
|
121
113
|
"serve": "sirv dist -s",
|
|
122
|
-
"pretest": "node scripts/hadolint-wasm.mjs",
|
|
123
114
|
"test": "vitest run --coverage",
|
|
124
115
|
"typecov": "type-coverage",
|
|
125
116
|
"version": "changeset version",
|
|
126
|
-
"postversion": "pnpm i --no-frozen-lockfile"
|
|
117
|
+
"postversion": "pnpm i --no-frozen-lockfile",
|
|
118
|
+
"wasm:build": "bash wasm/build-reactor.sh"
|
|
127
119
|
},
|
|
128
120
|
"main": "./lib/index.cjs",
|
|
129
121
|
"module": "./lib/index.js",
|
package/lib/runtime.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { RunOptions, RunResult } from './types.js';
|
|
2
|
-
export interface WasiRuntime {
|
|
3
|
-
run: (args: string[], options?: RunOptions) => Promise<RunResult>;
|
|
4
|
-
}
|
|
5
|
-
export declare const HADOLINT = "hadolint";
|
|
6
|
-
export declare const DEFAULT_ENV: Readonly<Record<string, string>>;
|
package/lib/runtime.js
DELETED
package/lib/runtime.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAA;AAQlC,MAAM,CAAC,MAAM,WAAW,GAAqC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA"}
|
package/lib/wasi-browser.d.ts
DELETED
package/lib/wasi-browser.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { ConsoleStdout, File, OpenFile, WASI } from '@bjorn3/browser_wasi_shim';
|
|
2
|
-
import { DEFAULT_ENV, HADOLINT } from './runtime.js';
|
|
3
|
-
const WASM_URL = new URL('../hadolint.wasm', import.meta.url);
|
|
4
|
-
const encoder = new TextEncoder();
|
|
5
|
-
let compiled;
|
|
6
|
-
const load = () => {
|
|
7
|
-
compiled ??= fetch(WASM_URL)
|
|
8
|
-
.then(response => {
|
|
9
|
-
if (!response.ok) {
|
|
10
|
-
throw new Error(`failed to fetch ${WASM_URL.pathname}: ${response.status} ${response.statusText}`);
|
|
11
|
-
}
|
|
12
|
-
return response.arrayBuffer();
|
|
13
|
-
})
|
|
14
|
-
.then(buffer => WebAssembly.compile(buffer))
|
|
15
|
-
.catch((error) => {
|
|
16
|
-
compiled = undefined;
|
|
17
|
-
throw error;
|
|
18
|
-
});
|
|
19
|
-
return compiled;
|
|
20
|
-
};
|
|
21
|
-
export const createBrowserRuntime = () => ({
|
|
22
|
-
run: async (args, options = {}) => {
|
|
23
|
-
const module = await load();
|
|
24
|
-
let stdout = '';
|
|
25
|
-
let stderr = '';
|
|
26
|
-
const outDecoder = new TextDecoder();
|
|
27
|
-
const errDecoder = new TextDecoder();
|
|
28
|
-
const fds = [
|
|
29
|
-
new OpenFile(new File(encoder.encode(options.stdin ?? ''))),
|
|
30
|
-
new ConsoleStdout(buffer => {
|
|
31
|
-
stdout += outDecoder.decode(buffer, { stream: true });
|
|
32
|
-
}),
|
|
33
|
-
new ConsoleStdout(buffer => {
|
|
34
|
-
stderr += errDecoder.decode(buffer, { stream: true });
|
|
35
|
-
}),
|
|
36
|
-
];
|
|
37
|
-
const env = Object.entries({ ...DEFAULT_ENV, ...options.env }).map(([key, value]) => `${key}=${value}`);
|
|
38
|
-
const wasi = new WASI([HADOLINT, ...args], env, fds, { debug: false });
|
|
39
|
-
const instance = (await WebAssembly.instantiate(module, {
|
|
40
|
-
wasi_snapshot_preview1: wasi.wasiImport,
|
|
41
|
-
}));
|
|
42
|
-
const exitCode = wasi.start(instance);
|
|
43
|
-
stdout += outDecoder.decode();
|
|
44
|
-
stderr += errDecoder.decode();
|
|
45
|
-
return { exitCode, stdout, stderr };
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
//# sourceMappingURL=wasi-browser.js.map
|
package/lib/wasi-browser.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasi-browser.js","sourceRoot":"","sources":["../src/wasi-browser.ts"],"names":[],"mappings":"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"}
|
package/lib/wasi-node.d.ts
DELETED
package/lib/wasi-node.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { openSync, closeSync } from 'node:fs';
|
|
2
|
-
import { readFile } from 'node:fs/promises';
|
|
3
|
-
import { devNull } from 'node:os';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { fileURLToPath } from 'node:url';
|
|
6
|
-
import { WASI } from 'node:wasi';
|
|
7
|
-
import { DEFAULT_ENV, HADOLINT } from './runtime.js';
|
|
8
|
-
const packageRoot = () => typeof __dirname === 'string'
|
|
9
|
-
? path.join(__dirname, '..')
|
|
10
|
-
: fileURLToPath(new URL('..', import.meta.url));
|
|
11
|
-
const wasmPath = () => path.join(packageRoot(), 'hadolint.wasm');
|
|
12
|
-
const encoder = new TextEncoder();
|
|
13
|
-
const decoder = new TextDecoder();
|
|
14
|
-
let compiled;
|
|
15
|
-
const load = () => {
|
|
16
|
-
compiled ??= readFile(wasmPath())
|
|
17
|
-
.then(bytes => WebAssembly.compile(bytes))
|
|
18
|
-
.catch((error) => {
|
|
19
|
-
compiled = undefined;
|
|
20
|
-
throw error;
|
|
21
|
-
});
|
|
22
|
-
return compiled;
|
|
23
|
-
};
|
|
24
|
-
const IOVEC_SIZE = 8;
|
|
25
|
-
const IOVEC_LENGTH_OFFSET = 4;
|
|
26
|
-
const intercept = (imports, memory, stdin) => {
|
|
27
|
-
const state = { stdout: '', stderr: '' };
|
|
28
|
-
let offset = 0;
|
|
29
|
-
const views = () => {
|
|
30
|
-
const buffer = memory();
|
|
31
|
-
return { view: new DataView(buffer), bytes: new Uint8Array(buffer) };
|
|
32
|
-
};
|
|
33
|
-
const iovecs = (iovs, iovsLen) => {
|
|
34
|
-
const { view } = views();
|
|
35
|
-
const result = [];
|
|
36
|
-
for (let index = 0; index < iovsLen; index++) {
|
|
37
|
-
result.push({
|
|
38
|
-
offset: view.getUint32(iovs + index * IOVEC_SIZE, true),
|
|
39
|
-
length: view.getUint32(iovs + index * IOVEC_SIZE + IOVEC_LENGTH_OFFSET, true),
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return result;
|
|
43
|
-
};
|
|
44
|
-
imports.fd_read = (_fd, iovs, iovsLen, nreadPtr) => {
|
|
45
|
-
const { view, bytes } = views();
|
|
46
|
-
let read = 0;
|
|
47
|
-
for (const { offset: target, length } of iovecs(iovs, iovsLen)) {
|
|
48
|
-
const size = Math.min(length, stdin.length - offset);
|
|
49
|
-
if (size <= 0) {
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
bytes.set(stdin.subarray(offset, offset + size), target);
|
|
53
|
-
offset += size;
|
|
54
|
-
read += size;
|
|
55
|
-
}
|
|
56
|
-
view.setUint32(nreadPtr, read, true);
|
|
57
|
-
return 0;
|
|
58
|
-
};
|
|
59
|
-
imports.fd_write = (fd, iovs, iovsLen, nwrittenPtr) => {
|
|
60
|
-
const { view, bytes } = views();
|
|
61
|
-
let written = 0;
|
|
62
|
-
for (const { offset: source, length } of iovecs(iovs, iovsLen)) {
|
|
63
|
-
const chunk = decoder.decode(bytes.subarray(source, source + length));
|
|
64
|
-
if (fd === 1) {
|
|
65
|
-
state.stdout += chunk;
|
|
66
|
-
}
|
|
67
|
-
else if (fd === 2) {
|
|
68
|
-
state.stderr += chunk;
|
|
69
|
-
}
|
|
70
|
-
written += length;
|
|
71
|
-
}
|
|
72
|
-
view.setUint32(nwrittenPtr, written, true);
|
|
73
|
-
return 0;
|
|
74
|
-
};
|
|
75
|
-
return state;
|
|
76
|
-
};
|
|
77
|
-
const memoryOf = (instance) => instance.exports.memory.buffer;
|
|
78
|
-
const openStdio = () => ({
|
|
79
|
-
stdin: openSync(devNull, 'r'),
|
|
80
|
-
stdout: openSync(devNull, 'w'),
|
|
81
|
-
stderr: openSync(devNull, 'w'),
|
|
82
|
-
});
|
|
83
|
-
const closeQuietly = (fd) => {
|
|
84
|
-
try {
|
|
85
|
-
closeSync(fd);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
const closeStdio = (stdio) => {
|
|
91
|
-
closeQuietly(stdio.stdin);
|
|
92
|
-
closeQuietly(stdio.stdout);
|
|
93
|
-
closeQuietly(stdio.stderr);
|
|
94
|
-
};
|
|
95
|
-
export const createNodeRuntime = () => ({
|
|
96
|
-
run: async (args, options = {}) => {
|
|
97
|
-
const module = await load();
|
|
98
|
-
const stdio = openStdio();
|
|
99
|
-
let instance;
|
|
100
|
-
try {
|
|
101
|
-
const wasi = new WASI({
|
|
102
|
-
version: 'preview1',
|
|
103
|
-
args: [HADOLINT, ...args],
|
|
104
|
-
env: { ...DEFAULT_ENV, ...options.env },
|
|
105
|
-
stdin: stdio.stdin,
|
|
106
|
-
stdout: stdio.stdout,
|
|
107
|
-
stderr: stdio.stderr,
|
|
108
|
-
});
|
|
109
|
-
const nodeWasi = wasi;
|
|
110
|
-
const intercepted = intercept(nodeWasi.wasiImport, () => {
|
|
111
|
-
if (!instance) {
|
|
112
|
-
throw new Error('dlintr: hadolint touched stdio before it was instantiated');
|
|
113
|
-
}
|
|
114
|
-
return memoryOf(instance);
|
|
115
|
-
}, encoder.encode(options.stdin ?? ''));
|
|
116
|
-
instance = await WebAssembly.instantiate(module, {
|
|
117
|
-
wasi_snapshot_preview1: nodeWasi.wasiImport,
|
|
118
|
-
});
|
|
119
|
-
const exitCode = nodeWasi.start(instance);
|
|
120
|
-
return { exitCode: exitCode ?? 0, ...intercepted };
|
|
121
|
-
}
|
|
122
|
-
finally {
|
|
123
|
-
closeStdio(stdio);
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
//# sourceMappingURL=wasi-node.js.map
|
package/lib/wasi-node.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasi-node.js","sourceRoot":"","sources":["../src/wasi-node.ts"],"names":[],"mappings":"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"}
|