@frida/injest 0.1.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.
@@ -0,0 +1,180 @@
1
+ /// <reference types="frida-gum" />
2
+ import { AssertionError } from "./expect.js";
3
+ export { expect } from "./expect.js";
4
+ class SkipSignal {
5
+ reason;
6
+ constructor(reason) {
7
+ this.reason = reason;
8
+ }
9
+ }
10
+ function skip(reason) {
11
+ throw new SkipSignal(reason);
12
+ }
13
+ const registry = [];
14
+ const suiteStack = [];
15
+ const rootSuite = { parent: null, beforeEach: [], afterEach: [] };
16
+ let currentSuite = rootSuite;
17
+ function add(name, fn, mode, opts) {
18
+ const qualifiedName = [...suiteStack, name].join(" › ");
19
+ registry.push({
20
+ name: qualifiedName,
21
+ fn,
22
+ mode,
23
+ launch: opts?.launch ?? "shared",
24
+ suite: currentSuite,
25
+ timeout: opts?.timeout,
26
+ });
27
+ }
28
+ export function describe(label, fn) {
29
+ suiteStack.push(label);
30
+ const parent = currentSuite;
31
+ currentSuite = { parent, beforeEach: [], afterEach: [] };
32
+ try {
33
+ fn();
34
+ }
35
+ finally {
36
+ currentSuite = parent;
37
+ suiteStack.pop();
38
+ }
39
+ }
40
+ export function beforeEach(fn) {
41
+ currentSuite.beforeEach.push(fn);
42
+ }
43
+ export function afterEach(fn) {
44
+ currentSuite.afterEach.push(fn);
45
+ }
46
+ function hooksFor(suite) {
47
+ const outerToInner = [];
48
+ for (let s = suite; s; s = s.parent)
49
+ outerToInner.unshift(s);
50
+ const innerToOuter = [...outerToInner].reverse();
51
+ return {
52
+ runBefore: outerToInner.flatMap((s) => s.beforeEach),
53
+ runAfter: innerToOuter.flatMap((s) => s.afterEach),
54
+ };
55
+ }
56
+ const baseContext = { skip };
57
+ const suspendedContext = { skip, resume };
58
+ export const test = Object.assign((name, fn, opts) => add(name, () => fn(baseContext), "run", opts), {
59
+ skip: (name, fn, opts) => add(name, () => fn(baseContext), "skip", opts),
60
+ isolated: (name, fn, opts) => add(name, () => fn(baseContext), "run", { ...opts, launch: "isolated" }),
61
+ suspended: (name, fn, opts) => add(name, () => fn(suspendedContext), "run", { ...opts, launch: "suspended" }),
62
+ });
63
+ function resume() {
64
+ return new Promise((resolve) => {
65
+ recv("ft:resume-ack", () => resolve());
66
+ send({ ft: "resume" });
67
+ });
68
+ }
69
+ export async function run(options = {}) {
70
+ const indexed = registry.map((test, testIndex) => ({ test, testIndex }));
71
+ let selected;
72
+ if (options.only) {
73
+ const want = new Set(options.only);
74
+ selected = indexed.filter((e) => want.has(e.testIndex));
75
+ }
76
+ else {
77
+ const matches = makeMatcher(options.grep);
78
+ selected = indexed.filter((e) => matches(e.test.name));
79
+ }
80
+ send({
81
+ ft: "plan",
82
+ total: selected.length,
83
+ names: selected.map((e) => e.test.name),
84
+ indices: selected.map((e) => e.testIndex),
85
+ });
86
+ for (let i = 0; i < selected.length; i++) {
87
+ const { test: t, testIndex } = selected[i];
88
+ send({ ft: "start", index: i, testIndex, name: t.name, timeout: t.timeout });
89
+ if (t.mode === "skip") {
90
+ send({
91
+ ft: "result",
92
+ index: i,
93
+ testIndex,
94
+ name: t.name,
95
+ passed: true,
96
+ skipped: true,
97
+ durationMs: 0,
98
+ });
99
+ continue;
100
+ }
101
+ const { runBefore, runAfter } = hooksFor(t.suite);
102
+ const start = Date.now();
103
+ let failure;
104
+ let skipSignal;
105
+ try {
106
+ for (const hook of runBefore)
107
+ await hook();
108
+ await t.fn();
109
+ }
110
+ catch (e) {
111
+ if (e instanceof SkipSignal)
112
+ skipSignal = e;
113
+ else
114
+ failure = e;
115
+ }
116
+ for (const hook of runAfter) {
117
+ try {
118
+ await hook();
119
+ }
120
+ catch (e) {
121
+ failure ??= e;
122
+ }
123
+ }
124
+ const durationMs = Date.now() - start;
125
+ if (failure !== undefined) {
126
+ send({
127
+ ft: "result",
128
+ index: i,
129
+ testIndex,
130
+ name: t.name,
131
+ passed: false,
132
+ durationMs,
133
+ error: serializeError(failure),
134
+ });
135
+ }
136
+ else if (skipSignal) {
137
+ send({
138
+ ft: "result",
139
+ index: i,
140
+ testIndex,
141
+ name: t.name,
142
+ passed: true,
143
+ skipped: true,
144
+ durationMs,
145
+ error: skipSignal.reason ? { name: "Skipped", message: skipSignal.reason } : undefined,
146
+ });
147
+ }
148
+ else {
149
+ send({ ft: "result", index: i, testIndex, name: t.name, passed: true, durationMs });
150
+ }
151
+ }
152
+ send({ ft: "done", total: selected.length });
153
+ }
154
+ function makeMatcher(grep) {
155
+ if (!grep)
156
+ return () => true;
157
+ try {
158
+ const re = new RegExp(grep);
159
+ return (name) => re.test(name);
160
+ }
161
+ catch {
162
+ return (name) => name.includes(grep);
163
+ }
164
+ }
165
+ function serializeError(e) {
166
+ if (e instanceof AssertionError) {
167
+ return {
168
+ name: e.name,
169
+ message: e.message,
170
+ stack: e.stack,
171
+ expected: e.expected,
172
+ actual: e.actual,
173
+ };
174
+ }
175
+ if (e instanceof Error) {
176
+ return { name: e.name || "Error", message: e.message, stack: e.stack };
177
+ }
178
+ return { name: "Error", message: String(e) };
179
+ }
180
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/agent/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const DEFAULT_INCLUDE: string[];
2
+ export interface DiscoverOptions {
3
+ include: string[];
4
+ exclude?: string[];
5
+ cwd?: string;
6
+ }
7
+ export declare function discoverTests(opts: DiscoverOptions): string[];
8
+ export declare function compileTests(testFiles: string[]): Promise<string>;
9
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/host/bundle.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,UAA8B,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE,CAuB7D;AAkCD,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvE"}
@@ -0,0 +1,95 @@
1
+ import { mkdirSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
2
+ import { join, relative, resolve, sep } from "node:path";
3
+ import * as frida from "frida";
4
+ export const DEFAULT_INCLUDE = ["tests/**/*.test.{ts,js}"];
5
+ export function discoverTests(opts) {
6
+ const root = resolve(opts.cwd ?? process.cwd());
7
+ const included = opts.include.map(globToRegExp);
8
+ const excluded = (opts.exclude ?? []).map(globToRegExp);
9
+ const matched = [];
10
+ const walkDir = (dir) => {
11
+ for (const name of readdirSync(dir)) {
12
+ if (name === "node_modules" || name.startsWith("."))
13
+ continue;
14
+ const fullPath = join(dir, name);
15
+ if (statSync(fullPath).isDirectory()) {
16
+ walkDir(fullPath);
17
+ continue;
18
+ }
19
+ const relativePath = relative(root, fullPath).split(sep).join("/");
20
+ const isTestFile = included.some((re) => re.test(relativePath)) &&
21
+ !excluded.some((re) => re.test(relativePath));
22
+ if (isTestFile)
23
+ matched.push(fullPath);
24
+ }
25
+ };
26
+ walkDir(root);
27
+ return matched.sort();
28
+ }
29
+ const NESTED_DIRS = "(?:[^/]+/)*";
30
+ const ACROSS_SEGMENTS = ".*";
31
+ const WITHIN_SEGMENT = "[^/]*";
32
+ const ONE_NON_SLASH = "[^/]";
33
+ const GLOB_TOKEN = /\*\*\/|\*\*|\*|\?|\{[^}]*\}|[^*?{]+|\{/g;
34
+ function globToRegExp(glob) {
35
+ const normalized = glob.replace(/\\/g, "/").replace(/^\.\//, "");
36
+ const source = normalized.replace(GLOB_TOKEN, (token) => {
37
+ switch (token) {
38
+ case "**/":
39
+ return NESTED_DIRS;
40
+ case "**":
41
+ return ACROSS_SEGMENTS;
42
+ case "*":
43
+ return WITHIN_SEGMENT;
44
+ case "?":
45
+ return ONE_NON_SLASH;
46
+ }
47
+ if (token.length > 1 && token.startsWith("{") && token.endsWith("}")) {
48
+ const alternatives = token.slice(1, -1).split(",").map(escapeRegExp);
49
+ return `(?:${alternatives.join("|")})`;
50
+ }
51
+ return escapeRegExp(token);
52
+ });
53
+ return new RegExp(`^${source}$`);
54
+ }
55
+ function escapeRegExp(literal) {
56
+ return literal.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
57
+ }
58
+ export async function compileTests(testFiles) {
59
+ const buildDir = resolve(`.injest-${process.pid}-${Date.now()}`);
60
+ mkdirSync(buildDir, { recursive: true });
61
+ const entry = join(buildDir, "entry.ts");
62
+ writeFileSync(entry, entrySource(testFiles, buildDir));
63
+ const compiler = new frida.Compiler();
64
+ compiler.diagnostics.connect((diagnostics) => {
65
+ for (const d of diagnostics) {
66
+ const where = d.file ? ` ${d.file.path}:${d.file.line}:${d.file.character}` : "";
67
+ console.error(`[injest] ${d.category}${where}: ${d.text}`);
68
+ }
69
+ });
70
+ try {
71
+ return await compiler.build(entry, {
72
+ projectRoot: process.cwd(),
73
+ sourceMaps: frida.SourceMaps.Included,
74
+ });
75
+ }
76
+ finally {
77
+ rmSync(buildDir, { recursive: true, force: true });
78
+ }
79
+ }
80
+ function entrySource(testFiles, entryDir) {
81
+ const imports = testFiles.map((f) => {
82
+ let rel = relative(entryDir, f).replace(/\\/g, "/");
83
+ if (!rel.startsWith("."))
84
+ rel = "./" + rel;
85
+ return `import ${JSON.stringify(rel)};`;
86
+ });
87
+ return [
88
+ '/// <reference types="frida-gum" />',
89
+ 'import { run } from "@frida/injest/agent";',
90
+ ...imports,
91
+ "rpc.exports = { run };",
92
+ "",
93
+ ].join("\n");
94
+ }
95
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/host/bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/host/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "node:util";
3
+ import { compileTests, discoverTests, DEFAULT_INCLUDE } from "./bundle.js";
4
+ import { loadConfig, resolveTarget, } from "./config.js";
5
+ import { reportResult, runSuite, summarize, toProjectRelative, } from "./run.js";
6
+ import { getDevice, openSession, runtimeOption } from "./session.js";
7
+ import { discoverTestInfo, matchTestName } from "./source.js";
8
+ const DEFAULT_TIMEOUT_MS = 10000;
9
+ const EXIT_TEST_FAILURE = 1;
10
+ const EXIT_HARNESS_FAILURE = 2;
11
+ function metaByIndex(tests) {
12
+ return new Map(tests.map((t) => [
13
+ t.index,
14
+ { id: t.id, name: t.name, file: toProjectRelative(t.file), line: t.line },
15
+ ]));
16
+ }
17
+ function tryLoadConfig(path, required) {
18
+ try {
19
+ return loadConfig(path);
20
+ }
21
+ catch (err) {
22
+ if (required)
23
+ throw err;
24
+ return undefined;
25
+ }
26
+ }
27
+ function discoveryGlobs(config) {
28
+ return {
29
+ include: config?.include?.length ? config.include : DEFAULT_INCLUDE,
30
+ exclude: config?.exclude ?? [],
31
+ };
32
+ }
33
+ function printHelp() {
34
+ console.log(`injest — run tests inside a Frida GumJS target
35
+
36
+ Usage:
37
+ injest [file-filters...] [options]
38
+
39
+ Test files match the "include" globs in injest.config.json
40
+ (default: tests/**/*.test.{ts,js}). Positional args filter those by path substring.
41
+
42
+ Options:
43
+ --target <name> target profile from injest.config.json (else "default")
44
+ -c, --config <path> config file (default: ./injest.config.json)
45
+ -t, --testNamePattern <re> run only tests whose name matches the regex
46
+ --only <id> run only the test(s) with this stable id (repeatable)
47
+ --reporter <pretty|json> output format; json emits NDJSON on stdout (default: pretty)
48
+ --list list discovered tests (id, location) without running
49
+ -h, --help show this help
50
+
51
+ In code:
52
+ test(name, fn, { timeout }) test.skip(name, fn) describe(label, fn)
53
+ beforeEach(fn) / afterEach(fn) run around each test in the enclosing describe
54
+ test.isolated(name, fn) own fresh process, killed after (spawn targets)
55
+ test.suspended(name, async ({ resume }) => …) spawn suspended; resume() releases it
56
+
57
+ Examples:
58
+ injest --target local run all tests on the local system session
59
+ injest foo -t bar files matching "foo", tests matching /bar/
60
+ injest --target <name> run against a configured target
61
+ injest --list list tests without running
62
+ injest --reporter json > results.ndjson
63
+
64
+ Runtime (qjs|v8) and per-test timeout (ms, default 10000) are set per target in
65
+ injest.config.json.`);
66
+ }
67
+ function describeSession(session) {
68
+ return session === "system" ? "system" : `spawn(${session.spawn})`;
69
+ }
70
+ async function main() {
71
+ const { values, positionals } = parseArgs({
72
+ allowPositionals: true,
73
+ options: {
74
+ target: { type: "string" },
75
+ config: { type: "string", short: "c" },
76
+ testNamePattern: { type: "string", short: "t" },
77
+ only: { type: "string", multiple: true },
78
+ reporter: { type: "string" },
79
+ list: { type: "boolean" },
80
+ help: { type: "boolean", short: "h" },
81
+ },
82
+ });
83
+ if (values.help) {
84
+ printHelp();
85
+ return;
86
+ }
87
+ const reporter = values.reporter === "json" ? "json" : "pretty";
88
+ const configRequired = !values.list;
89
+ const config = tryLoadConfig(values.config, configRequired);
90
+ const { include, exclude } = discoveryGlobs(config);
91
+ let files = discoverTests({ include, exclude });
92
+ if (positionals.length > 0) {
93
+ files = files.filter((f) => positionals.some((p) => f.includes(p)));
94
+ }
95
+ if (files.length === 0) {
96
+ const where = positionals.length ? ` matching ${positionals.join(", ")}` : "";
97
+ throw new Error(`no test files found${where} (include: ${include.join(", ")})`);
98
+ }
99
+ const matches = matchTestName(values.testNamePattern);
100
+ let tests = discoverTestInfo(files).filter((t) => matches(t.name));
101
+ if (values.only) {
102
+ const want = new Set(values.only);
103
+ tests = tests.filter((t) => want.has(t.id));
104
+ }
105
+ if (values.list) {
106
+ printList(tests, reporter);
107
+ return;
108
+ }
109
+ const { name, target } = resolveTarget(config, values.target);
110
+ console.error(`[injest] running ${files.length} test file(s)`);
111
+ const source = await compileTests(files);
112
+ const deviceLabel = typeof target.device === "object" ? `id(${target.device.id})` : target.device;
113
+ console.error(`[injest] target "${name}" -> device=${deviceLabel} session=${describeSession(target.session)}`);
114
+ const device = await getDevice(target);
115
+ const runtime = target.runtime ?? "qjs";
116
+ const timeoutMs = target.timeout ?? DEFAULT_TIMEOUT_MS;
117
+ const failed = await runOnce(device, target, source, runtime, { timeoutMs, reporter, tests });
118
+ if (failed > 0)
119
+ process.exitCode = EXIT_TEST_FAILURE;
120
+ }
121
+ async function runOnce(device, target, source, runtime, opts) {
122
+ const reporter = opts.reporter;
123
+ const spawnable = typeof target.session === "object" && "spawn" in target.session;
124
+ const primary = await openSession(device, target);
125
+ let primaryScript;
126
+ try {
127
+ primaryScript = await primary.session.createScript(source, {
128
+ runtime: runtimeOption(runtime),
129
+ });
130
+ await primaryScript.load();
131
+ }
132
+ catch (e) {
133
+ await closeCapped(primary);
134
+ const msg = e instanceof Error ? e.message : String(e);
135
+ console.error(`[injest] runtime ${runtime} unavailable on this target: ${msg}`);
136
+ return 0; // a runtime the target lacks is a skip, not a failure
137
+ }
138
+ console.error(`[injest] runtime=${runtime}`);
139
+ const all = opts.tests;
140
+ const isolated = all.filter((t) => (t.launch === "isolated" || t.launch === "suspended") && t.mode !== "skip");
141
+ const isolatedIndices = new Set(isolated.map((t) => t.index));
142
+ const sharedIndices = all.filter((t) => !isolatedIndices.has(t.index)).map((t) => t.index);
143
+ if (reporter === "json") {
144
+ process.stdout.write(JSON.stringify({ type: "start", total: all.length }) + "\n");
145
+ }
146
+ const subOpts = {
147
+ timeoutMs: opts.timeoutMs,
148
+ reporter,
149
+ metaByIndex: metaByIndex(all),
150
+ };
151
+ const results = [];
152
+ if (spawnable)
153
+ await primary.resume();
154
+ results.push(...(await runSuite(primaryScript, primary.session, {
155
+ ...subOpts,
156
+ only: sharedIndices,
157
+ onResume: primary.resume,
158
+ })));
159
+ await closeCapped(primary);
160
+ for (const t of isolated) {
161
+ if (!spawnable) {
162
+ const r = {
163
+ index: results.length,
164
+ id: t.id,
165
+ name: t.name,
166
+ durationMs: 0,
167
+ status: "skipped",
168
+ file: toProjectRelative(t.file),
169
+ line: t.line,
170
+ error: { name: "Skipped", message: `requires a spawnable target (launch: ${t.launch})` },
171
+ };
172
+ reportResult(r, reporter ?? "pretty");
173
+ results.push(r);
174
+ continue;
175
+ }
176
+ const iso = await openSession(device, target);
177
+ const script = await iso.session.createScript(source, { runtime: runtimeOption(runtime) });
178
+ await script.load();
179
+ // isolated resumes now; suspended stays gated and resumes itself mid-test via ctx.resume()
180
+ if (t.launch === "isolated")
181
+ await iso.resume();
182
+ results.push(...(await runSuite(script, iso.session, {
183
+ ...subOpts,
184
+ only: [t.index],
185
+ onResume: iso.resume,
186
+ })));
187
+ await closeCapped(iso);
188
+ }
189
+ const { failed } = summarize(results, reporter ?? "pretty");
190
+ return failed;
191
+ }
192
+ /** Best-effort teardown, capped: a wedged session can make close() block forever. */
193
+ async function closeCapped(opened) {
194
+ await Promise.race([opened.close().catch(() => { }), new Promise((r) => setTimeout(r, 500))]);
195
+ }
196
+ function printList(tests, reporter) {
197
+ const located = tests.map((t) => ({ ...t, file: toProjectRelative(t.file) }));
198
+ if (reporter === "json") {
199
+ process.stdout.write(JSON.stringify({ type: "list", tests: located }) + "\n");
200
+ return;
201
+ }
202
+ for (const t of located) {
203
+ const loc = t.file ? ` (${t.file}:${t.line ?? "?"})` : "";
204
+ const tags = (t.mode === "run" ? "" : ` [${t.mode}]`) + (t.launch === "shared" ? "" : ` [${t.launch}]`);
205
+ console.log(` ${t.id}${loc}${tags}`);
206
+ }
207
+ console.log(`\n${tests.length} test(s)`);
208
+ }
209
+ main().then(() => process.exit(process.exitCode ?? 0), (err) => {
210
+ const message = err instanceof Error ? err.message : String(err);
211
+ console.error("[injest] error:", message);
212
+ process.exit(EXIT_HARNESS_FAILURE);
213
+ });
214
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/host/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type Runtime = "qjs" | "v8";
2
+ export type SessionSpec = "system" | {
3
+ spawn: string;
4
+ args?: string[];
5
+ };
6
+ export type DeviceSpec = "local" | "usb" | {
7
+ id: string;
8
+ };
9
+ export interface TargetConfig {
10
+ device: DeviceSpec;
11
+ session: SessionSpec;
12
+ runtime?: Runtime;
13
+ timeout?: number;
14
+ }
15
+ export interface Config {
16
+ default?: string;
17
+ targets: Record<string, TargetConfig>;
18
+ include?: string[];
19
+ exclude?: string[];
20
+ }
21
+ export declare function validateConfig(value: unknown, file?: string): Config;
22
+ export declare function loadConfig(path?: string): Config;
23
+ export declare function resolveTarget(config: Config, name?: string): {
24
+ name: string;
25
+ target: TargetConfig;
26
+ };
27
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/host/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC;AAEnC,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAOD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAuB,GAAG,MAAM,CAIlF;AAED,wBAAgB,UAAU,CAAC,IAAI,SAAuB,GAAG,MAAM,CAS9D;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAWxC"}
@@ -0,0 +1,35 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { Ajv } from "ajv";
4
+ const schema = JSON.parse(readFileSync(new URL("../../schema/injest.config.schema.json", import.meta.url), "utf8"));
5
+ const validate = new Ajv({ allErrors: true }).compile(schema);
6
+ export function validateConfig(value, file = "injest.config.json") {
7
+ if (validate(value))
8
+ return value;
9
+ const issues = (validate.errors ?? []).map((e) => `${e.instancePath || "(root)"} ${e.message}`);
10
+ throw new Error(`invalid config in ${file}:\n - ${issues.join("\n - ")}`);
11
+ }
12
+ export function loadConfig(path = "injest.config.json") {
13
+ const file = resolve(process.cwd(), path);
14
+ let raw;
15
+ try {
16
+ raw = readFileSync(file, "utf8");
17
+ }
18
+ catch {
19
+ throw new Error(`config not found: ${file}`);
20
+ }
21
+ return validateConfig(JSON.parse(raw), file);
22
+ }
23
+ export function resolveTarget(config, name) {
24
+ const chosen = name ?? config.default;
25
+ if (!chosen) {
26
+ throw new Error('no --target given and no "default" in config');
27
+ }
28
+ const target = config.targets[chosen];
29
+ if (!target) {
30
+ const available = Object.keys(config.targets).join(", ");
31
+ throw new Error(`unknown target "${chosen}". available: ${available}`);
32
+ }
33
+ return { name: chosen, target };
34
+ }
35
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/host/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAsB1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,YAAY,CAAC,IAAI,GAAG,CAAC,wCAAwC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CACzF,CAAC;AACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAS,MAAM,CAAC,CAAC;AAEtE,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAI,GAAG,oBAAoB;IACxE,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,UAAU,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAI,GAAG,oBAAoB;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,IAAa;IAEb,MAAM,MAAM,GAAG,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,iBAAiB,SAAS,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { loadConfig, resolveTarget } from "./config.js";
2
+ export type { Config, TargetConfig, SessionSpec, Runtime } from "./config.js";
3
+ export { getDevice, openSession, runtimeOption } from "./session.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { loadConfig, resolveTarget } from "./config.js";
2
+ export { getDevice, openSession, runtimeOption } from "./session.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}