@orygn/opa-mcp 0.3.0 → 0.5.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/CHANGELOG.md +396 -3
- package/README.md +132 -98
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +15 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +74 -14
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/lib/bundle-signatures.d.ts +23 -0
- package/dist/lib/bundle-signatures.d.ts.map +1 -0
- package/dist/lib/bundle-signatures.js +152 -0
- package/dist/lib/bundle-signatures.js.map +1 -0
- package/dist/lib/child-env.d.ts +41 -0
- package/dist/lib/child-env.d.ts.map +1 -0
- package/dist/lib/child-env.js +176 -0
- package/dist/lib/child-env.js.map +1 -0
- package/dist/lib/conftest-cli.d.ts +25 -10
- package/dist/lib/conftest-cli.d.ts.map +1 -1
- package/dist/lib/conftest-cli.js +153 -33
- package/dist/lib/conftest-cli.js.map +1 -1
- package/dist/lib/install-id.d.ts.map +1 -1
- package/dist/lib/install-id.js +18 -3
- package/dist/lib/install-id.js.map +1 -1
- package/dist/lib/json-stream.d.ts +26 -0
- package/dist/lib/json-stream.d.ts.map +1 -0
- package/dist/lib/json-stream.js +69 -0
- package/dist/lib/json-stream.js.map +1 -0
- package/dist/lib/opa-cli.d.ts +64 -16
- package/dist/lib/opa-cli.d.ts.map +1 -1
- package/dist/lib/opa-cli.js +99 -28
- package/dist/lib/opa-cli.js.map +1 -1
- package/dist/lib/opa-paths.d.ts +24 -0
- package/dist/lib/opa-paths.d.ts.map +1 -0
- package/dist/lib/opa-paths.js +97 -0
- package/dist/lib/opa-paths.js.map +1 -0
- package/dist/lib/regal-cli.d.ts +16 -1
- package/dist/lib/regal-cli.d.ts.map +1 -1
- package/dist/lib/regal-cli.js +41 -6
- package/dist/lib/regal-cli.js.map +1 -1
- package/dist/lib/rego-ast-walker.d.ts.map +1 -1
- package/dist/lib/rego-ast-walker.js +141 -17
- package/dist/lib/rego-ast-walker.js.map +1 -1
- package/dist/lib/rego-counterexample.d.ts +1 -1
- package/dist/lib/rego-counterexample.d.ts.map +1 -1
- package/dist/lib/rego-counterexample.js +23 -5
- package/dist/lib/rego-counterexample.js.map +1 -1
- package/dist/lib/rego-ir.d.ts +32 -2
- package/dist/lib/rego-ir.d.ts.map +1 -1
- package/dist/lib/rego-smt-encoder.d.ts +53 -5
- package/dist/lib/rego-smt-encoder.d.ts.map +1 -1
- package/dist/lib/rego-smt-encoder.js +192 -26
- package/dist/lib/rego-smt-encoder.js.map +1 -1
- package/dist/lib/rego-type-inferencer.d.ts +1 -1
- package/dist/lib/rego-type-inferencer.d.ts.map +1 -1
- package/dist/lib/rego-type-inferencer.js +3 -3
- package/dist/lib/rego-type-inferencer.js.map +1 -1
- package/dist/lib/rego-verify-engine.d.ts.map +1 -1
- package/dist/lib/rego-verify-engine.js +109 -77
- package/dist/lib/rego-verify-engine.js.map +1 -1
- package/dist/lib/rego-z3.d.ts +10 -0
- package/dist/lib/rego-z3.d.ts.map +1 -1
- package/dist/lib/rego-z3.js +38 -0
- package/dist/lib/rego-z3.js.map +1 -1
- package/dist/lib/security.d.ts +8 -0
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +130 -54
- package/dist/lib/security.js.map +1 -1
- package/dist/lib/subprocess.d.ts +36 -3
- package/dist/lib/subprocess.d.ts.map +1 -1
- package/dist/lib/subprocess.js +121 -20
- package/dist/lib/subprocess.js.map +1 -1
- package/dist/lib/tool-helpers.d.ts.map +1 -1
- package/dist/lib/tool-helpers.js +10 -0
- package/dist/lib/tool-helpers.js.map +1 -1
- package/dist/resources/patterns.d.ts +1 -1
- package/dist/resources/patterns.d.ts.map +1 -1
- package/dist/resources/patterns.js +40 -12
- package/dist/resources/patterns.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/authoring/check-schema.js +1 -1
- package/dist/tools/authoring/check-schema.js.map +1 -1
- package/dist/tools/bundles/build.d.ts.map +1 -1
- package/dist/tools/bundles/build.js +12 -4
- package/dist/tools/bundles/build.js.map +1 -1
- package/dist/tools/bundles/sign.d.ts +9 -2
- package/dist/tools/bundles/sign.d.ts.map +1 -1
- package/dist/tools/bundles/sign.js +145 -19
- package/dist/tools/bundles/sign.js.map +1 -1
- package/dist/tools/bundles/verify.d.ts +1 -1
- package/dist/tools/bundles/verify.d.ts.map +1 -1
- package/dist/tools/bundles/verify.js +58 -19
- package/dist/tools/bundles/verify.js.map +1 -1
- package/dist/tools/conftest/pull.d.ts.map +1 -1
- package/dist/tools/conftest/pull.js +24 -10
- package/dist/tools/conftest/pull.js.map +1 -1
- package/dist/tools/conftest/push.d.ts.map +1 -1
- package/dist/tools/conftest/push.js +17 -7
- package/dist/tools/conftest/push.js.map +1 -1
- package/dist/tools/conftest/test.d.ts +10 -6
- package/dist/tools/conftest/test.d.ts.map +1 -1
- package/dist/tools/conftest/test.js +47 -24
- package/dist/tools/conftest/test.js.map +1 -1
- package/dist/tools/conftest/verify.d.ts +10 -6
- package/dist/tools/conftest/verify.d.ts.map +1 -1
- package/dist/tools/conftest/verify.js +30 -18
- package/dist/tools/conftest/verify.js.map +1 -1
- package/dist/tools/evaluation/bench.d.ts +16 -0
- package/dist/tools/evaluation/bench.d.ts.map +1 -1
- package/dist/tools/evaluation/bench.js +30 -5
- package/dist/tools/evaluation/bench.js.map +1 -1
- package/dist/tools/evaluation/exec.d.ts +16 -0
- package/dist/tools/evaluation/exec.d.ts.map +1 -1
- package/dist/tools/evaluation/exec.js +35 -2
- package/dist/tools/evaluation/exec.js.map +1 -1
- package/dist/tools/evaluation/test-multiroot.d.ts +4 -0
- package/dist/tools/evaluation/test-multiroot.d.ts.map +1 -1
- package/dist/tools/evaluation/test-multiroot.js +21 -14
- package/dist/tools/evaluation/test-multiroot.js.map +1 -1
- package/dist/tools/evaluation/test.d.ts +45 -0
- package/dist/tools/evaluation/test.d.ts.map +1 -1
- package/dist/tools/evaluation/test.js +146 -27
- package/dist/tools/evaluation/test.js.map +1 -1
- package/dist/tools/helpers/coverage-gaps.d.ts +11 -3
- package/dist/tools/helpers/coverage-gaps.d.ts.map +1 -1
- package/dist/tools/helpers/coverage-gaps.js +4 -3
- package/dist/tools/helpers/coverage-gaps.js.map +1 -1
- package/dist/tools/helpers/explain-undefined.d.ts +9 -3
- package/dist/tools/helpers/explain-undefined.d.ts.map +1 -1
- package/dist/tools/helpers/explain-undefined.js +83 -51
- package/dist/tools/helpers/explain-undefined.js.map +1 -1
- package/dist/tools/helpers/verify.d.ts.map +1 -1
- package/dist/tools/helpers/verify.js +5 -1
- package/dist/tools/helpers/verify.js.map +1 -1
- package/dist/tools/server-management/_shared.d.ts +15 -4
- package/dist/tools/server-management/_shared.d.ts.map +1 -1
- package/dist/tools/server-management/_shared.js +73 -12
- package/dist/tools/server-management/_shared.js.map +1 -1
- package/dist/tools/server-management/data.d.ts.map +1 -1
- package/dist/tools/server-management/data.js +88 -23
- package/dist/tools/server-management/data.js.map +1 -1
- package/dist/tools/server-management/decisions.d.ts.map +1 -1
- package/dist/tools/server-management/decisions.js +16 -3
- package/dist/tools/server-management/decisions.js.map +1 -1
- package/dist/tools/server-management/policies.d.ts.map +1 -1
- package/dist/tools/server-management/policies.js +44 -7
- package/dist/tools/server-management/policies.js.map +1 -1
- package/dist/tools/server-management/status.d.ts.map +1 -1
- package/dist/tools/server-management/status.js +80 -13
- package/dist/tools/server-management/status.js.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -20,8 +20,20 @@ export interface ConftestFileResult {
|
|
|
20
20
|
failures: ConftestMessage[];
|
|
21
21
|
warnings: ConftestMessage[];
|
|
22
22
|
skipped: ConftestMessage[];
|
|
23
|
-
exceptions:
|
|
23
|
+
exceptions: ConftestMessage[];
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse `--output=json` from `conftest test` or `conftest verify` into
|
|
27
|
+
* results whose array fields are always present.
|
|
28
|
+
*
|
|
29
|
+
* conftest marks every array `omitempty`, so a file that passes cleanly
|
|
30
|
+
* arrives as `{filename, namespace, successes}` with no `failures` key at
|
|
31
|
+
* all, and `verify` with no test rules prints the literal `null`. Reading
|
|
32
|
+
* `.failures.length` off that threw on every clean run. Returns null when
|
|
33
|
+
* stdout is not a JSON array (or `null`), which is what a command-level
|
|
34
|
+
* failure looks like.
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseConftestResults(stdout: string): ConftestFileResult[] | null;
|
|
25
37
|
/** Input for `conftest test`. */
|
|
26
38
|
export interface ConftestTestInput {
|
|
27
39
|
/** Absolute paths to configuration files to evaluate. */
|
|
@@ -30,10 +42,10 @@ export interface ConftestTestInput {
|
|
|
30
42
|
inlineConfig?: string;
|
|
31
43
|
/**
|
|
32
44
|
* Parser used for inline config content. Determines the temp file
|
|
33
|
-
*
|
|
45
|
+
* name (yaml -> config.yaml, dockerfile -> Dockerfile, and so on).
|
|
34
46
|
* Defaults to `yaml` when not specified.
|
|
35
47
|
*/
|
|
36
|
-
inlineConfigParser?:
|
|
48
|
+
inlineConfigParser?: ConftestParser;
|
|
37
49
|
/**
|
|
38
50
|
* Absolute path to a directory or file containing Rego policies.
|
|
39
51
|
* Defaults to `./policy` (conftest's convention). Mutually exclusive
|
|
@@ -60,7 +72,7 @@ export interface ConftestTestInput {
|
|
|
60
72
|
* flag, overriding extension-based detection. Use it to parse files whose
|
|
61
73
|
* extension does not match their format (e.g. a `.tfstate` file as `json`).
|
|
62
74
|
*/
|
|
63
|
-
parser?:
|
|
75
|
+
parser?: ConftestParser;
|
|
64
76
|
}
|
|
65
77
|
/** Input for `conftest verify`. */
|
|
66
78
|
export interface ConftestVerifyInput {
|
|
@@ -86,12 +98,15 @@ export interface ConftestPushInput {
|
|
|
86
98
|
policy?: string;
|
|
87
99
|
}
|
|
88
100
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
101
|
+
* The parsers conftest 0.69 accepts for `--parser`, and the only values a
|
|
102
|
+
* caller may pass. The name also chooses the temp file name for inline
|
|
103
|
+
* config, so it must never be free text: a value carrying path separators
|
|
104
|
+
* used to be joined straight into the temp path, and `../` sequences in it
|
|
105
|
+
* walked out of the temp directory to wherever the caller pointed.
|
|
94
106
|
*/
|
|
107
|
+
export declare const CONFTEST_PARSERS: readonly ["cue", "dockerfile", "dotenv", "edn", "hcl1", "hcl2", "hocon", "ignore", "ini", "json", "jsonnet", "nginx", "properties", "spdx", "textproto", "toml", "vcl", "xml", "yaml"];
|
|
108
|
+
export type ConftestParser = (typeof CONFTEST_PARSERS)[number];
|
|
109
|
+
export declare function isConftestParser(value: string): value is ConftestParser;
|
|
95
110
|
export declare class ConftestCli {
|
|
96
111
|
private readonly config;
|
|
97
112
|
constructor(config: Config);
|
|
@@ -129,7 +144,7 @@ export declare class ConftestCli {
|
|
|
129
144
|
* Run `conftest` with the given argv. Tools should prefer the typed
|
|
130
145
|
* methods above; this is the escape hatch for unusual invocations.
|
|
131
146
|
*/
|
|
132
|
-
run(args: string[], signal?: AbortSignal): Promise<SpawnResult>;
|
|
147
|
+
run(args: string[], signal?: AbortSignal, cwd?: string): Promise<SpawnResult>;
|
|
133
148
|
/**
|
|
134
149
|
* Create temp assets for inline inputs, run `fn`, then clean up.
|
|
135
150
|
* Returns whatever `fn` returns.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conftest-cli.d.ts","sourceRoot":"","sources":["../../src/lib/conftest-cli.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"conftest-cli.d.ts","sourceRoot":"","sources":["../../src/lib/conftest-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/conftest-cli.js
CHANGED
|
@@ -16,28 +16,120 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
18
18
|
import { tmpdir } from 'node:os';
|
|
19
|
-
import { join } from 'node:path';
|
|
19
|
+
import { basename, dirname, join } from 'node:path';
|
|
20
20
|
import { runBinary } from './subprocess.js';
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Parse `--output=json` from `conftest test` or `conftest verify` into
|
|
23
|
+
* results whose array fields are always present.
|
|
24
|
+
*
|
|
25
|
+
* conftest marks every array `omitempty`, so a file that passes cleanly
|
|
26
|
+
* arrives as `{filename, namespace, successes}` with no `failures` key at
|
|
27
|
+
* all, and `verify` with no test rules prints the literal `null`. Reading
|
|
28
|
+
* `.failures.length` off that threw on every clean run. Returns null when
|
|
29
|
+
* stdout is not a JSON array (or `null`), which is what a command-level
|
|
30
|
+
* failure looks like.
|
|
31
|
+
*/
|
|
32
|
+
export function parseConftestResults(stdout) {
|
|
33
|
+
const text = stdout.trim();
|
|
34
|
+
if (text === '')
|
|
35
|
+
return null;
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = JSON.parse(text);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
if (parsed === null)
|
|
44
|
+
return [];
|
|
45
|
+
if (!Array.isArray(parsed))
|
|
46
|
+
return null;
|
|
47
|
+
const messages = (v) => Array.isArray(v)
|
|
48
|
+
? v.map((m) => m !== null && typeof m === 'object' ? m : { msg: String(m) })
|
|
49
|
+
: [];
|
|
50
|
+
return parsed.map((item) => {
|
|
51
|
+
const r = (item !== null && typeof item === 'object' ? item : {});
|
|
52
|
+
return {
|
|
53
|
+
...r,
|
|
54
|
+
filename: typeof r['filename'] === 'string' ? r['filename'] : '',
|
|
55
|
+
namespace: typeof r['namespace'] === 'string' ? r['namespace'] : '',
|
|
56
|
+
successes: typeof r['successes'] === 'number' ? r['successes'] : 0,
|
|
57
|
+
failures: messages(r['failures']),
|
|
58
|
+
warnings: messages(r['warnings']),
|
|
59
|
+
skipped: messages(r['skipped']),
|
|
60
|
+
exceptions: messages(r['exceptions']),
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// ─── Parser names ─────────────────────────────────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* The parsers conftest 0.69 accepts for `--parser`, and the only values a
|
|
67
|
+
* caller may pass. The name also chooses the temp file name for inline
|
|
68
|
+
* config, so it must never be free text: a value carrying path separators
|
|
69
|
+
* used to be joined straight into the temp path, and `../` sequences in it
|
|
70
|
+
* walked out of the temp directory to wherever the caller pointed.
|
|
71
|
+
*/
|
|
72
|
+
export const CONFTEST_PARSERS = [
|
|
73
|
+
'cue',
|
|
74
|
+
'dockerfile',
|
|
75
|
+
'dotenv',
|
|
76
|
+
'edn',
|
|
77
|
+
'hcl1',
|
|
78
|
+
'hcl2',
|
|
79
|
+
'hocon',
|
|
80
|
+
'ignore',
|
|
81
|
+
'ini',
|
|
82
|
+
'json',
|
|
83
|
+
'jsonnet',
|
|
84
|
+
'nginx',
|
|
85
|
+
'properties',
|
|
86
|
+
'spdx',
|
|
87
|
+
'textproto',
|
|
88
|
+
'toml',
|
|
89
|
+
'vcl',
|
|
90
|
+
'xml',
|
|
91
|
+
'yaml',
|
|
92
|
+
];
|
|
93
|
+
export function isConftestParser(value) {
|
|
94
|
+
return CONFTEST_PARSERS.includes(value);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Temp file names for inline config. The parser is passed to conftest
|
|
98
|
+
* explicitly, so the name only has to be plausible for a reader of the
|
|
99
|
+
* output; conftest also recognises a Dockerfile by name.
|
|
100
|
+
*/
|
|
101
|
+
const INLINE_CONFIG_FILENAME = {
|
|
102
|
+
cue: 'config.cue',
|
|
103
|
+
dockerfile: 'Dockerfile',
|
|
104
|
+
dotenv: 'config.env',
|
|
105
|
+
edn: 'config.edn',
|
|
106
|
+
hcl1: 'config.hcl',
|
|
107
|
+
hcl2: 'config.hcl',
|
|
108
|
+
hocon: 'config.conf',
|
|
109
|
+
ignore: '.gitignore',
|
|
110
|
+
ini: 'config.ini',
|
|
111
|
+
json: 'config.json',
|
|
112
|
+
jsonnet: 'config.jsonnet',
|
|
113
|
+
nginx: 'nginx.conf',
|
|
114
|
+
properties: 'config.properties',
|
|
115
|
+
spdx: 'config.spdx',
|
|
116
|
+
textproto: 'config.textproto',
|
|
117
|
+
toml: 'config.toml',
|
|
118
|
+
vcl: 'config.vcl',
|
|
119
|
+
xml: 'config.xml',
|
|
120
|
+
yaml: 'config.yaml',
|
|
38
121
|
};
|
|
39
|
-
|
|
40
|
-
|
|
122
|
+
/**
|
|
123
|
+
* Temp file name for inline config. Throws on anything outside the closed
|
|
124
|
+
* set; the tool layer rejects such input first, so this is the backstop for
|
|
125
|
+
* any other caller.
|
|
126
|
+
*/
|
|
127
|
+
function inlineConfigFilename(parser) {
|
|
128
|
+
const name = parser ?? 'yaml';
|
|
129
|
+
if (!isConftestParser(name)) {
|
|
130
|
+
throw new Error(`unsupported conftest parser: ${name}`);
|
|
131
|
+
}
|
|
132
|
+
return INLINE_CONFIG_FILENAME[name];
|
|
41
133
|
}
|
|
42
134
|
// ─── ConftestCli ──────────────────────────────────────────────────────────────
|
|
43
135
|
/**
|
|
@@ -47,6 +139,28 @@ function parserToExt(parser) {
|
|
|
47
139
|
* returned `SpawnResult` is the signal. Inline source is written to temp
|
|
48
140
|
* files/directories because conftest does not read from stdin.
|
|
49
141
|
*/
|
|
142
|
+
/**
|
|
143
|
+
* Split a policy directory into the directory to run from and the name to pass.
|
|
144
|
+
*
|
|
145
|
+
* `conftest pull` and `conftest push` resolve `--policy` against the working
|
|
146
|
+
* directory rather than treating an absolute path as absolute. On Windows pull
|
|
147
|
+
* fails outright, reporting a path of the form `.\\C:\\...`, and push drops the
|
|
148
|
+
* volume and reads from the same path on whichever drive it was started on. The
|
|
149
|
+
* tools resolve the caller's path against the allow-list before handing it over,
|
|
150
|
+
* so it is always absolute and neither command ever addressed the directory
|
|
151
|
+
* asked for. Running from the parent and passing the final component is
|
|
152
|
+
* unambiguous on every platform.
|
|
153
|
+
*/
|
|
154
|
+
function relativeToParent(policy) {
|
|
155
|
+
if (!policy)
|
|
156
|
+
return undefined;
|
|
157
|
+
const parent = dirname(policy);
|
|
158
|
+
const name = basename(policy);
|
|
159
|
+
// A root such as `C:\\` or `/` has nothing to descend into.
|
|
160
|
+
if (name.length === 0 || parent === policy)
|
|
161
|
+
return undefined;
|
|
162
|
+
return { parent, name };
|
|
163
|
+
}
|
|
50
164
|
export class ConftestCli {
|
|
51
165
|
config;
|
|
52
166
|
constructor(config) {
|
|
@@ -100,8 +214,12 @@ export class ConftestCli {
|
|
|
100
214
|
args.push('--combine');
|
|
101
215
|
if (input.failOnWarn)
|
|
102
216
|
args.push('--fail-on-warn');
|
|
103
|
-
|
|
104
|
-
|
|
217
|
+
// conftest's --parser overrides extension detection, so inline
|
|
218
|
+
// config names its parser explicitly rather than trusting the temp
|
|
219
|
+
// file's extension. A global `parser` wins when both are given.
|
|
220
|
+
const parser = input.parser ?? (configPath ? (input.inlineConfigParser ?? 'yaml') : undefined);
|
|
221
|
+
if (parser)
|
|
222
|
+
args.push('--parser', parser);
|
|
105
223
|
// Config files (positional args, must come last)
|
|
106
224
|
const effectiveFiles = configPath ? [configPath] : (input.files ?? []);
|
|
107
225
|
args.push(...effectiveFiles);
|
|
@@ -129,9 +247,10 @@ export class ConftestCli {
|
|
|
129
247
|
*/
|
|
130
248
|
async pull(input, signal) {
|
|
131
249
|
const args = ['pull', input.url];
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
250
|
+
const target = relativeToParent(input.policy);
|
|
251
|
+
if (target)
|
|
252
|
+
args.push('--policy', target.name);
|
|
253
|
+
return this.run(args, signal, target?.parent);
|
|
135
254
|
}
|
|
136
255
|
/**
|
|
137
256
|
* Push the local policy bundle to a remote OCI registry. Uses
|
|
@@ -139,21 +258,25 @@ export class ConftestCli {
|
|
|
139
258
|
*/
|
|
140
259
|
async push(input, signal) {
|
|
141
260
|
const args = ['push', input.repository];
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
261
|
+
const target = relativeToParent(input.policy);
|
|
262
|
+
if (target)
|
|
263
|
+
args.push('--policy', target.name);
|
|
264
|
+
return this.run(args, signal, target?.parent);
|
|
145
265
|
}
|
|
146
266
|
/**
|
|
147
267
|
* Run `conftest` with the given argv. Tools should prefer the typed
|
|
148
268
|
* methods above; this is the escape hatch for unusual invocations.
|
|
149
269
|
*/
|
|
150
|
-
async run(args, signal) {
|
|
270
|
+
async run(args, signal, cwd) {
|
|
151
271
|
const opts = {
|
|
152
272
|
args,
|
|
153
273
|
timeoutMs: this.config.subprocessTimeoutMs,
|
|
274
|
+
maxOutputBytes: this.config.maxSubprocessBytes,
|
|
154
275
|
};
|
|
155
276
|
if (signal !== undefined)
|
|
156
277
|
opts.signal = signal;
|
|
278
|
+
if (cwd !== undefined)
|
|
279
|
+
opts.cwd = cwd;
|
|
157
280
|
return runBinary(this.config.conftestBinary, opts);
|
|
158
281
|
}
|
|
159
282
|
// ─── Internal: temp file / directory management ──────────────────────────
|
|
@@ -166,10 +289,7 @@ export class ConftestCli {
|
|
|
166
289
|
const paths = {};
|
|
167
290
|
try {
|
|
168
291
|
if (opts.inlineConfig !== undefined) {
|
|
169
|
-
const
|
|
170
|
-
? ''
|
|
171
|
-
: parserToExt(opts.inlineConfigParser ?? 'yaml');
|
|
172
|
-
const basename = opts.inlineConfigParser === 'dockerfile' ? 'Dockerfile' : `config${ext}`;
|
|
292
|
+
const basename = inlineConfigFilename(opts.inlineConfigParser);
|
|
173
293
|
// mkdtemp creates the directory atomically (O_CREAT|O_EXCL) -- safe temp file pattern.
|
|
174
294
|
const tmpDir = await mkdtemp(join(tmpdir(), 'orygn-conftest-'));
|
|
175
295
|
temps.push(tmpDir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conftest-cli.js","sourceRoot":"","sources":["../../src/lib/conftest-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"conftest-cli.js","sourceRoot":"","sources":["../../src/lib/conftest-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-id.d.ts","sourceRoot":"","sources":["../../src/lib/install-id.ts"],"names":[],"mappings":"AA2CA;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"install-id.d.ts","sourceRoot":"","sources":["../../src/lib/install-id.ts"],"names":[],"mappings":"AA2CA;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0C3D"}
|
package/dist/lib/install-id.js
CHANGED
|
@@ -43,21 +43,36 @@ function parseId(content) {
|
|
|
43
43
|
*/
|
|
44
44
|
export async function getInstallId() {
|
|
45
45
|
// Try reading an existing file first.
|
|
46
|
+
let unusableFileExists = false;
|
|
46
47
|
try {
|
|
47
48
|
const content = await readFile(INSTALL_ID_FILE, 'utf8');
|
|
48
49
|
const id = parseId(content);
|
|
49
50
|
if (id)
|
|
50
51
|
return id;
|
|
52
|
+
// The file is there but holds no id: truncated by a crash or a full
|
|
53
|
+
// disk, or a first run interrupted between create and write.
|
|
54
|
+
unusableFileExists = true;
|
|
51
55
|
}
|
|
52
56
|
catch {
|
|
53
57
|
// File not found yet -- fall through to create.
|
|
54
58
|
}
|
|
55
|
-
// Generate a new UUID and write it exclusively (wx = fail if exists,
|
|
56
|
-
// handles two processes starting simultaneously without a lock).
|
|
57
59
|
const id = randomUUID();
|
|
58
60
|
try {
|
|
59
61
|
await mkdir(INSTALL_ID_DIR, { recursive: true });
|
|
60
|
-
|
|
62
|
+
// `wx` (fail if exists) when the file is absent, so two processes
|
|
63
|
+
// starting at once cannot both claim to have created it.
|
|
64
|
+
//
|
|
65
|
+
// `w` when the file exists but is unusable, so it can be repaired. With
|
|
66
|
+
// `wx` unconditionally a zero-byte file was permanent: the read found no
|
|
67
|
+
// id, the exclusive write failed because the file existed, the fallback
|
|
68
|
+
// read found no id again, and every later run repeated that. The install
|
|
69
|
+
// then pinged without an id forever, was never counted as an install, and
|
|
70
|
+
// cost the collector six writes per start instead of one read. Two
|
|
71
|
+
// processes repairing at once may write different ids and one wins, which
|
|
72
|
+
// over-counts a single install once; that is the cheaper failure.
|
|
73
|
+
await writeFile(INSTALL_ID_FILE, FILE_HEADER + id + '\n', {
|
|
74
|
+
flag: unusableFileExists ? 'w' : 'wx',
|
|
75
|
+
});
|
|
61
76
|
return id;
|
|
62
77
|
}
|
|
63
78
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-id.js","sourceRoot":"","sources":["../../src/lib/install-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AAE3D,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF,MAAM,WAAW,GAAG;IAClB,sBAAsB;IACtB,GAAG;IACH,yDAAyD;IACzD,wEAAwE;IACxE,uEAAuE;IACvE,qEAAqE;IACrE,GAAG;IACH,2DAA2D;IAC3D,GAAG;IACH,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,OAAO,CAAC,OAAe;IAC9B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,sCAAsC;IACtC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"install-id.js","sourceRoot":"","sources":["../../src/lib/install-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AAE3D,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF,MAAM,WAAW,GAAG;IAClB,sBAAsB;IACtB,GAAG;IACH,yDAAyD;IACzD,wEAAwE;IACxE,uEAAuE;IACvE,qEAAqE;IACrE,GAAG;IACH,2DAA2D;IAC3D,GAAG;IACH,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,OAAO,CAAC,OAAe;IAC9B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,sCAAsC;IACtC,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAClB,oEAAoE;QACpE,6DAA6D;QAC7D,kBAAkB,GAAG,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,kEAAkE;QAClE,yDAAyD;QACzD,EAAE;QACF,wEAAwE;QACxE,yEAAyE;QACzE,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,mEAAmE;QACnE,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,SAAS,CAAC,eAAe,EAAE,WAAW,GAAG,EAAE,GAAG,IAAI,EAAE;YACxD,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;SACtC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,iDAAiD;QACjD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a stream of concatenated JSON values.
|
|
3
|
+
*
|
|
4
|
+
* `opa test --count N` prints one pretty-printed JSON array per repetition,
|
|
5
|
+
* back to back, so the whole output is neither a single JSON value nor NDJSON:
|
|
6
|
+
*
|
|
7
|
+
* [
|
|
8
|
+
* { "name": "test_a" }
|
|
9
|
+
* ]
|
|
10
|
+
* [
|
|
11
|
+
* { "name": "test_a" }
|
|
12
|
+
* ]
|
|
13
|
+
*
|
|
14
|
+
* `JSON.parse` rejects that, and parsing line by line finds no complete value
|
|
15
|
+
* on any line. Splitting into top-level values is the only way to read it.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Split `text` into its top-level JSON values, in order.
|
|
19
|
+
*
|
|
20
|
+
* Scans for balanced brackets while tracking string state, so a bracket or a
|
|
21
|
+
* brace inside a string literal cannot end a value early. Returns an empty
|
|
22
|
+
* array when nothing parses, so a caller can treat that exactly as it treats
|
|
23
|
+
* unparseable output.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseJsonValues<T = unknown>(text: string): T[];
|
|
26
|
+
//# sourceMappingURL=json-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-stream.d.ts","sourceRoot":"","sources":["../../src/lib/json-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,CA2C9D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a stream of concatenated JSON values.
|
|
3
|
+
*
|
|
4
|
+
* `opa test --count N` prints one pretty-printed JSON array per repetition,
|
|
5
|
+
* back to back, so the whole output is neither a single JSON value nor NDJSON:
|
|
6
|
+
*
|
|
7
|
+
* [
|
|
8
|
+
* { "name": "test_a" }
|
|
9
|
+
* ]
|
|
10
|
+
* [
|
|
11
|
+
* { "name": "test_a" }
|
|
12
|
+
* ]
|
|
13
|
+
*
|
|
14
|
+
* `JSON.parse` rejects that, and parsing line by line finds no complete value
|
|
15
|
+
* on any line. Splitting into top-level values is the only way to read it.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Split `text` into its top-level JSON values, in order.
|
|
19
|
+
*
|
|
20
|
+
* Scans for balanced brackets while tracking string state, so a bracket or a
|
|
21
|
+
* brace inside a string literal cannot end a value early. Returns an empty
|
|
22
|
+
* array when nothing parses, so a caller can treat that exactly as it treats
|
|
23
|
+
* unparseable output.
|
|
24
|
+
*/
|
|
25
|
+
export function parseJsonValues(text) {
|
|
26
|
+
const values = [];
|
|
27
|
+
let depth = 0;
|
|
28
|
+
let start = -1;
|
|
29
|
+
let inString = false;
|
|
30
|
+
let escaped = false;
|
|
31
|
+
for (let i = 0; i < text.length; i++) {
|
|
32
|
+
const ch = text[i];
|
|
33
|
+
if (inString) {
|
|
34
|
+
if (escaped)
|
|
35
|
+
escaped = false;
|
|
36
|
+
else if (ch === '\\')
|
|
37
|
+
escaped = true;
|
|
38
|
+
else if (ch === '"')
|
|
39
|
+
inString = false;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (ch === '"') {
|
|
43
|
+
inString = true;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (ch === '[' || ch === '{') {
|
|
47
|
+
if (depth === 0)
|
|
48
|
+
start = i;
|
|
49
|
+
depth++;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (ch === ']' || ch === '}') {
|
|
53
|
+
if (depth === 0)
|
|
54
|
+
continue; // stray closer; nothing is open
|
|
55
|
+
depth--;
|
|
56
|
+
if (depth === 0 && start !== -1) {
|
|
57
|
+
try {
|
|
58
|
+
values.push(JSON.parse(text.slice(start, i + 1)));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// A malformed value is skipped rather than discarding the rest.
|
|
62
|
+
}
|
|
63
|
+
start = -1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return values;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=json-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-stream.js","sourceRoot":"","sources":["../../src/lib/json-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAc,IAAY;IACvD,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAEpB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,OAAO;gBAAE,OAAO,GAAG,KAAK,CAAC;iBACxB,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,GAAG,IAAI,CAAC;iBAChC,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACtC,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,KAAK,KAAK,CAAC;gBAAE,KAAK,GAAG,CAAC,CAAC;YAC3B,KAAK,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,KAAK,KAAK,CAAC;gBAAE,SAAS,CAAC,gCAAgC;YAC3D,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAM,CAAC,CAAC;gBACzD,CAAC;gBAAC,MAAM,CAAC;oBACP,gEAAgE;gBAClE,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|