@untestutils/perf 0.6.0 → 0.6.3

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/dist/index.d.mts CHANGED
@@ -5,8 +5,9 @@ export { measureBundle } from "./bundle.mjs";
5
5
  export { startTarget, isPortFree } from "./start.mjs";
6
6
  export type { StartedTarget } from "./start.mjs";
7
7
  export { runLoadPhase } from "./load/index.mjs";
8
- export { runAutocannon } from "./load/autocannon.mjs";
9
- export { runArtillery } from "./load/artillery.mjs";
8
+ export { runArtillery, packArtilleryReport, ARTILLERY_PINNED_VERSION } from "./load/artillery.mjs";
9
+ export type { RunArtilleryOpts } from "./load/artillery.mjs";
10
+ export { runAutocannon, AUTOCANNON_PINNED_VERSION } from "./load/autocannon.mjs";
10
11
  export { parseAutocannonJson, parseArtilleryJson } from "./load/parse.mjs";
11
12
  export { averageTargetResults, averageBuildMetrics, averageLoadMetrics } from "./average.mjs";
12
13
  export { checkThresholds } from "./thresholds.mjs";
package/dist/index.d.ts CHANGED
@@ -5,8 +5,9 @@ export { measureBundle } from './bundle';
5
5
  export { startTarget, isPortFree } from './start';
6
6
  export type { StartedTarget } from './start';
7
7
  export { runLoadPhase } from './load';
8
- export { runAutocannon } from './load/autocannon';
9
- export { runArtillery } from './load/artillery';
8
+ export { runArtillery, packArtilleryReport, ARTILLERY_PINNED_VERSION } from './load/artillery';
9
+ export type { RunArtilleryOpts } from './load/artillery';
10
+ export { runAutocannon, AUTOCANNON_PINNED_VERSION } from './load/autocannon';
10
11
  export { parseAutocannonJson, parseArtilleryJson } from './load/parse';
11
12
  export { averageTargetResults, averageBuildMetrics, averageLoadMetrics } from './average';
12
13
  export { checkThresholds } from './thresholds';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,mBAAmB,SAAS,CAAC"}
package/dist/index.mjs CHANGED
@@ -4,8 +4,8 @@ export { measureBuild } from "./build.mjs";
4
4
  export { measureBundle } from "./bundle.mjs";
5
5
  export { startTarget, isPortFree } from "./start.mjs";
6
6
  export { runLoadPhase } from "./load/index.mjs";
7
- export { runAutocannon } from "./load/autocannon.mjs";
8
- export { runArtillery } from "./load/artillery.mjs";
7
+ export { runArtillery, packArtilleryReport, ARTILLERY_PINNED_VERSION } from "./load/artillery.mjs";
8
+ export { runAutocannon, AUTOCANNON_PINNED_VERSION } from "./load/autocannon.mjs";
9
9
  export { parseAutocannonJson, parseArtilleryJson } from "./load/parse.mjs";
10
10
  export { averageTargetResults, averageBuildMetrics, averageLoadMetrics } from "./average.mjs";
11
11
  export { checkThresholds } from "./thresholds.mjs";
@@ -1,10 +1,41 @@
1
- import type { ArtilleryResult } from "../types.mjs";
2
- /** Prefer local artillery bin; fall back to `npx artillery`. */
3
- export declare function runArtillery(opts: {
4
- configPath: string;
1
+ import type { ArtilleryResult, ArtilleryScript, ArtillerySummary } from "../types.mjs";
2
+ export type { ArtilleryScript };
3
+ /** Pinned private runner surface — bump only with intentional adapter rewrite. */
4
+ export declare const ARTILLERY_PINNED_VERSION = "2.0.34";
5
+ export type RunArtilleryOpts = {
5
6
  artifactsDir: string;
6
7
  name: string;
7
8
  cwd?: string;
8
9
  /** Overrides `config.target` (needed when the suite picks a free port). */
9
10
  targetUrl?: string;
10
- }): Promise<ArtilleryResult>;
11
+ } & ({
12
+ configPath: string;
13
+ script?: undefined;
14
+ } | {
15
+ script: ArtilleryScript;
16
+ configPath?: undefined;
17
+ });
18
+ type HistogramSketch = {
19
+ min: number;
20
+ max: number;
21
+ count: number;
22
+ sum: number;
23
+ getValueAtQuantile: (q: number) => number;
24
+ };
25
+ type PeriodMetrics = {
26
+ period?: string | number;
27
+ counters?: Record<string, number>;
28
+ rates?: Record<string, number | null | undefined>;
29
+ histograms?: Record<string, HistogramSketch>;
30
+ summaries?: Record<string, ArtillerySummary>;
31
+ firstMetricAt?: number;
32
+ lastMetricAt?: number;
33
+ };
34
+ type SummarizeHistogram = (h: HistogramSketch) => ArtillerySummary;
35
+ /** Build ArtilleryResult from in-process runner `done` + `stats` payloads. */
36
+ export declare function packArtilleryReport(aggregateRaw: PeriodMetrics, intermediatesRaw: PeriodMetrics[], summarizeHistogram: SummarizeHistogram): ArtilleryResult;
37
+ /**
38
+ * Run an Artillery script in-process via the pinned private core runner
39
+ * (`artillery@2.0.34` `dist/lib/core/runner.js`). No CLI / spawn.
40
+ */
41
+ export declare function runArtillery(opts: RunArtilleryOpts): Promise<ArtilleryResult>;
@@ -1,11 +1,42 @@
1
- import type { ArtilleryResult } from '../types';
2
- /** Prefer local artillery bin; fall back to `npx artillery`. */
3
- export declare function runArtillery(opts: {
4
- configPath: string;
1
+ import type { ArtilleryResult, ArtilleryScript, ArtillerySummary } from '../types';
2
+ export type { ArtilleryScript };
3
+ /** Pinned private runner surface — bump only with intentional adapter rewrite. */
4
+ export declare const ARTILLERY_PINNED_VERSION = "2.0.34";
5
+ export type RunArtilleryOpts = {
5
6
  artifactsDir: string;
6
7
  name: string;
7
8
  cwd?: string;
8
9
  /** Overrides `config.target` (needed when the suite picks a free port). */
9
10
  targetUrl?: string;
10
- }): Promise<ArtilleryResult>;
11
+ } & ({
12
+ configPath: string;
13
+ script?: undefined;
14
+ } | {
15
+ script: ArtilleryScript;
16
+ configPath?: undefined;
17
+ });
18
+ type HistogramSketch = {
19
+ min: number;
20
+ max: number;
21
+ count: number;
22
+ sum: number;
23
+ getValueAtQuantile: (q: number) => number;
24
+ };
25
+ type PeriodMetrics = {
26
+ period?: string | number;
27
+ counters?: Record<string, number>;
28
+ rates?: Record<string, number | null | undefined>;
29
+ histograms?: Record<string, HistogramSketch>;
30
+ summaries?: Record<string, ArtillerySummary>;
31
+ firstMetricAt?: number;
32
+ lastMetricAt?: number;
33
+ };
34
+ type SummarizeHistogram = (h: HistogramSketch) => ArtillerySummary;
35
+ /** Build ArtilleryResult from in-process runner `done` + `stats` payloads. */
36
+ export declare function packArtilleryReport(aggregateRaw: PeriodMetrics, intermediatesRaw: PeriodMetrics[], summarizeHistogram: SummarizeHistogram): ArtilleryResult;
37
+ /**
38
+ * Run an Artillery script in-process via the pinned private core runner
39
+ * (`artillery@2.0.34` `dist/lib/core/runner.js`). No CLI / spawn.
40
+ */
41
+ export declare function runArtillery(opts: RunArtilleryOpts): Promise<ArtilleryResult>;
11
42
  //# sourceMappingURL=artillery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"artillery.d.ts","sourceRoot":"","sources":["../../src/load/artillery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAoDhD,gEAAgE;AAChE,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CAW3B"}
1
+ {"version":3,"file":"artillery.d.ts","sourceRoot":"","sources":["../../src/load/artillery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnF,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,CACA;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAA;CAAE,CACtD,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAQF,KAAK,kBAAkB,GAAG,CAAC,CAAC,EAAE,eAAe,KAAK,gBAAgB,CAAC;AAgGnE,8EAA8E;AAC9E,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,aAAa,EAC3B,gBAAgB,EAAE,aAAa,EAAE,EACjC,kBAAkB,EAAE,kBAAkB,GACrC,eAAe,CAsBjB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgEnF"}
@@ -1,77 +1,138 @@
1
- import { spawn } from "node:child_process";
2
1
  import { createRequire } from "node:module";
3
- import { existsSync, mkdirSync, readFileSync } from "node:fs";
2
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
3
  import { dirname, join, resolve } from "pathe";
5
- function resolveArtilleryBin() {
4
+ import { pathToFileURL } from "node:url";
5
+
6
+ export const ARTILLERY_PINNED_VERSION = "2.0.34";
7
+ function requireArtilleryPkg() {
6
8
  try {
7
- const pkg = createRequire(import.meta.url).resolve("artillery/package.json");
8
- const bin = join(dirname(pkg), "bin", "run");
9
- return existsSync(bin) ? bin : null;
9
+ const req = createRequire(import.meta.url);
10
+ const pkgPath = req.resolve("artillery/package.json");
11
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
12
+ return {
13
+ root: dirname(pkgPath),
14
+ version: pkg.version
15
+ };
10
16
  } catch {
11
- return null;
17
+ throw new Error(`@untestutils/perf: artillery@${ARTILLERY_PINNED_VERSION} is required for load.artillery (optional peer). Install it in the project.`);
12
18
  }
13
19
  }
14
- function spawnArtillery(args, opts) {
15
- return new Promise((resolvePromise, reject) => {
16
- const child = spawn(args[0], args.slice(1), {
17
- cwd: opts.cwd,
18
- stdio: [
19
- "ignore",
20
- "pipe",
21
- "pipe"
22
- ]
23
- });
24
- child.stdout?.on("data", (chunk) => {
25
- const line = chunk.toString().trim();
26
- if (line.includes("Phase started") || line.includes("Summary report") || line.includes("All VUs finished")) {
27
- console.log(` [artillery] ${line.split("\n")[0]}`);
28
- }
29
- });
30
- child.stderr?.on("data", (chunk) => {
31
- const line = chunk.toString().trim();
32
- if (line) console.error(` [artillery stderr] ${line.slice(0, 200)}`);
33
- });
34
- child.on("error", reject);
35
- child.on("close", (code) => {
36
- if (code !== 0) {
37
- reject(new Error(`Artillery exited with code ${code}`));
38
- return;
39
- }
40
- try {
41
- resolvePromise(JSON.parse(readFileSync(opts.outputFile, "utf8")));
42
- } catch (err) {
43
- reject(err);
44
- }
45
- });
46
- });
20
+ function assertPinnedVersion(version) {
21
+ if (version !== ARTILLERY_PINNED_VERSION) {
22
+ throw new Error(`@untestutils/perf: artillery@${ARTILLERY_PINNED_VERSION} required (private runner lock); found ${version}`);
23
+ }
24
+ }
25
+ async function importArtilleryCore(root) {
26
+ const core = (rel) => pathToFileURL(join(root, rel)).href;
27
+ const [{ runner }, { summarizeHistogram }, { updateGlobalObject }, util] = await Promise.all([
28
+ import(core("dist/lib/core/runner.js")),
29
+ import(core("dist/lib/core/ssms.js")),
30
+ import(core("dist/lib/core/update-global-object.js")),
31
+ import(core("dist/lib/util.js"))
32
+ ]);
33
+ return {
34
+ runner,
35
+ summarizeHistogram,
36
+ updateGlobalObject,
37
+ readScript: util.readScript,
38
+ parseScript: util.parseScript,
39
+ checkConfig: util.checkConfig
40
+ };
41
+ }
42
+ function applySummaries(period, summarizeHistogram) {
43
+ const summaries = { ...period.summaries ?? {} };
44
+ for (const [name, sketch] of Object.entries(period.histograms ?? {})) {
45
+ if (sketch && typeof sketch.getValueAtQuantile === "function") {
46
+ summaries[name] = summarizeHistogram(sketch);
47
+ }
48
+ }
49
+ return {
50
+ counters: period.counters ?? {},
51
+ rates: period.rates ?? {},
52
+ summaries,
53
+
54
+ histograms: summaries,
55
+ period: period.period !== undefined && period.period !== null ? String(period.period) : undefined,
56
+ firstMetricAt: period.firstMetricAt,
57
+ lastMetricAt: period.lastMetricAt
58
+ };
59
+ }
60
+
61
+ export function packArtilleryReport(aggregateRaw, intermediatesRaw, summarizeHistogram) {
62
+ const aggregate = applySummaries(aggregateRaw, summarizeHistogram);
63
+ return {
64
+ aggregate: {
65
+ counters: aggregate.counters,
66
+ rates: aggregate.rates,
67
+ firstMetricAt: aggregate.firstMetricAt ?? 0,
68
+ lastMetricAt: aggregate.lastMetricAt ?? 0,
69
+ summaries: aggregate.summaries,
70
+ histograms: aggregate.histograms
71
+ },
72
+ intermediate: intermediatesRaw.map((ix) => {
73
+ const packed = applySummaries(ix, summarizeHistogram);
74
+ return {
75
+ counters: packed.counters,
76
+ rates: packed.rates,
77
+ period: packed.period,
78
+ summaries: packed.summaries,
79
+ histograms: packed.histograms
80
+ };
81
+ })
82
+ };
47
83
  }
48
84
 
49
85
  export async function runArtillery(opts) {
86
+ const { root, version } = requireArtilleryPkg();
87
+ assertPinnedVersion(version);
50
88
  mkdirSync(opts.artifactsDir, { recursive: true });
51
89
  const outputFile = join(opts.artifactsDir, `artillery-${opts.name}.json`);
52
- const config = resolve(opts.configPath);
53
- const bin = resolveArtilleryBin();
54
- const targetArgs = opts.targetUrl ? ["--target", opts.targetUrl.replace(/\/$/, "")] : [];
55
- const args = bin ? [
56
- process.execPath,
57
- bin,
58
- "run",
59
- ...targetArgs,
60
- config,
61
- "--output",
62
- outputFile
63
- ] : [
64
- "npx",
65
- "--yes",
66
- "artillery",
67
- "run",
68
- ...targetArgs,
69
- config,
70
- "--output",
71
- outputFile
72
- ];
73
- return spawnArtillery(args, {
74
- cwd: opts.cwd,
75
- outputFile
90
+ const { runner, summarizeHistogram, updateGlobalObject, readScript, parseScript, checkConfig } = await importArtilleryCore(root);
91
+ const target = opts.targetUrl?.replace(/\/$/, "");
92
+ let script;
93
+ if (opts.script) {
94
+ script = {
95
+ ...opts.script,
96
+ config: {
97
+ ...opts.script.config,
98
+ ...target ? { target } : {}
99
+ }
100
+ };
101
+ } else {
102
+ const configPath = resolve(opts.configPath);
103
+ const raw = await readScript(configPath);
104
+ const parsed = await parseScript(raw);
105
+ script = await checkConfig(parsed, configPath, target ? { target } : {});
106
+ }
107
+ await updateGlobalObject({ version });
108
+ const intermediates = [];
109
+ const ee = await runner(script);
110
+ const aggregateRaw = await new Promise((resolvePromise, reject) => {
111
+ ee.on("stats", (stats) => {
112
+ intermediates.push(stats);
113
+ const line = String(stats.period ?? "");
114
+ if (line) console.log(` [artillery] period ${line}`);
115
+ });
116
+ ee.on("phaseStarted", (spec) => {
117
+ const name = spec?.name;
118
+ console.log(` [artillery] Phase started${name ? `: ${name}` : ""}`);
119
+ });
120
+ ee.on("done", (stats) => {
121
+ resolvePromise(stats);
122
+ });
123
+ ee.on("error", (err) => {
124
+ reject(err instanceof Error ? err : new Error(String(err)));
125
+ });
126
+ try {
127
+ ee.run();
128
+ } catch (err) {
129
+ reject(err);
130
+ }
76
131
  });
132
+ try {
133
+ await ee.stop();
134
+ } catch {}
135
+ const result = packArtilleryReport(aggregateRaw, intermediates, summarizeHistogram);
136
+ writeFileSync(outputFile, JSON.stringify(result, null, 2));
137
+ return result;
77
138
  }
@@ -1,5 +1,6 @@
1
1
  import type { AutocannonResult } from "../types.mjs";
2
- /** Prefer programmatic peer; fall back to `npx autocannon`. */
2
+ export declare const AUTOCANNON_PINNED_VERSION = "8.0.0";
3
+ /** Programmatic peer only (`autocannon()`). No CLI / npx. */
3
4
  export declare function runAutocannon(opts: {
4
5
  url: string;
5
6
  connections?: number;
@@ -1,5 +1,6 @@
1
1
  import type { AutocannonResult } from '../types';
2
- /** Prefer programmatic peer; fall back to `npx autocannon`. */
2
+ export declare const AUTOCANNON_PINNED_VERSION = "8.0.0";
3
+ /** Programmatic peer only (`autocannon()`). No CLI / npx. */
3
4
  export declare function runAutocannon(opts: {
4
5
  url: string;
5
6
  connections?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"autocannon.d.ts","sourceRoot":"","sources":["../../src/load/autocannon.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAiHjD,+DAA+D;AAC/D,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAc5B"}
1
+ {"version":3,"file":"autocannon.d.ts","sourceRoot":"","sources":["../../src/load/autocannon.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,eAAO,MAAM,yBAAyB,UAAU,CAAC;AAuBjD,6DAA6D;AAC7D,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+B5B"}
@@ -1,12 +1,12 @@
1
- import { spawn } from "node:child_process";
2
1
  import { mkdirSync, writeFileSync } from "node:fs";
3
2
  import { join } from "pathe";
3
+ export const AUTOCANNON_PINNED_VERSION = "8.0.0";
4
4
  function normalize(raw) {
5
5
  return {
6
6
  requests: {
7
7
  average: raw.requests.average,
8
8
  mean: raw.requests.mean ?? raw.requests.average,
9
- total: raw.requests.total ?? raw.totalCompletedRequests ?? raw.totalRequests ?? 0
9
+ total: raw.requests.total ?? raw.requests.sent ?? 0
10
10
  },
11
11
  latency: {
12
12
  average: raw.latency.average,
@@ -21,76 +21,24 @@ function normalize(raw) {
21
21
  errors: raw.errors ?? 0
22
22
  };
23
23
  }
24
- async function viaApi(opts) {
25
- try {
26
- // @ts-expect-error optional peer
27
- const mod = await import("autocannon");
28
- const run = mod.default ?? mod;
29
- const raw = await run({
30
- url: opts.url,
31
- connections: opts.connections,
32
- duration: opts.duration,
33
- renderProgressBar: false,
34
- renderResultsTable: false,
35
- renderLatencyTable: false
36
- });
37
- return normalize(raw);
38
- } catch {
39
- return null;
40
- }
41
- }
42
- function viaNpx(opts) {
43
- return new Promise((resolve, reject) => {
44
- const child = spawn("npx", [
45
- "--yes",
46
- "autocannon",
47
- "-c",
48
- String(opts.connections),
49
- "-d",
50
- String(opts.duration),
51
- "-j",
52
- opts.url
53
- ], { stdio: [
54
- "ignore",
55
- "pipe",
56
- "pipe"
57
- ] });
58
- let stdout = "";
59
- let stderr = "";
60
- child.stdout?.on("data", (c) => {
61
- stdout += c.toString();
62
- });
63
- child.stderr?.on("data", (c) => {
64
- stderr += c.toString();
65
- });
66
- child.on("error", reject);
67
- child.on("close", (code) => {
68
- if (code !== 0 && !stdout) {
69
- reject(new Error(`autocannon exited ${code}: ${stderr.slice(0, 400)}`));
70
- return;
71
- }
72
- try {
73
- resolve(normalize(JSON.parse(stdout)));
74
- } catch (e) {
75
- reject(e);
76
- }
77
- });
78
- });
79
- }
80
24
 
81
25
  export async function runAutocannon(opts) {
82
26
  const connections = opts.connections ?? 10;
83
27
  const duration = opts.durationSec ?? 10;
84
28
  mkdirSync(opts.artifactsDir, { recursive: true });
85
- const result = await viaApi({
86
- url: opts.url,
87
- connections,
88
- duration
89
- }) ?? await viaNpx({
29
+ let run;
30
+ try {
31
+ const mod = await import("autocannon");
32
+ run = mod.default;
33
+ } catch {
34
+ throw new Error(`@untestutils/perf: autocannon@${AUTOCANNON_PINNED_VERSION} is required for load.autocannon (optional peer). Install it in the project.`);
35
+ }
36
+ const raw = await run({
90
37
  url: opts.url,
91
38
  connections,
92
39
  duration
93
40
  });
41
+ const result = normalize(raw);
94
42
  writeFileSync(join(opts.artifactsDir, `autocannon-${opts.name}.json`), JSON.stringify(result, null, 2));
95
43
  return result;
96
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/load/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIxD,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,WAAW,CAAC,CA0DvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/load/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAqC,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI3F,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuEvB"}
@@ -3,8 +3,7 @@ import { runAutocannon } from "./autocannon.mjs";
3
3
  export async function runLoadPhase(opts) {
4
4
  const { target, started, artifactsDir } = opts;
5
5
  const load = target.load;
6
- const base = started.takeProcessMetrics();
7
- if (!load) return base;
6
+ if (!load) return started.takeProcessMetrics();
8
7
  let autocannon;
9
8
  if (load.autocannon) {
10
9
  const ac = load.autocannon === true ? {} : load.autocannon;
@@ -18,21 +17,34 @@ export async function runLoadPhase(opts) {
18
17
  });
19
18
  }
20
19
  let artillery;
21
- if (load.artillery?.config) {
22
- console.log(` → artillery ${load.artillery.config}`);
23
- artillery = await runArtillery({
24
- configPath: load.artillery.config,
25
- artifactsDir,
26
- name: target.id,
27
- cwd: target.root,
28
- targetUrl: started.url
29
- });
20
+ if (load.artillery) {
21
+ if ("script" in load.artillery) {
22
+ console.log(" → artillery inline script");
23
+ artillery = await runArtillery({
24
+ script: load.artillery.script,
25
+ artifactsDir,
26
+ name: target.id,
27
+ cwd: target.root,
28
+ targetUrl: started.url
29
+ });
30
+ } else {
31
+ console.log(` → artillery ${load.artillery.config}`);
32
+ artillery = await runArtillery({
33
+ configPath: load.artillery.config,
34
+ artifactsDir,
35
+ name: target.id,
36
+ cwd: target.root,
37
+ targetUrl: started.url
38
+ });
39
+ }
30
40
  }
41
+
42
+ const processMetrics = started.takeProcessMetrics();
31
43
  const summary = artillery?.aggregate;
32
44
  const durationSec = summary ? (summary.lastMetricAt - summary.firstMetricAt) / 1e3 : undefined;
33
45
  const rt = summary?.summaries["http.response_time"];
34
46
  return {
35
- ...base,
47
+ ...processMetrics,
36
48
  durationSec,
37
49
  responseTimeAvg: rt?.mean ?? autocannon?.latency.average,
38
50
  responseTimeMin: rt?.min ?? autocannon?.latency.min,
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,kBAAkB,EAAE,MAAM,cAAc,CAAC;CAC1C,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvF;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAyF5E"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,kBAAkB,EAAE,MAAM,cAAc,CAAC;CAC1C,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvF;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CA2F5E"}
package/dist/start.mjs CHANGED
@@ -51,11 +51,6 @@ export async function startTarget(target) {
51
51
  });
52
52
  let monitorAcc;
53
53
  let stopMonitor;
54
- if (child.pid) {
55
- const m = startProcessMonitor(child.pid);
56
- monitorAcc = m.acc;
57
- stopMonitor = m.stop;
58
- }
59
54
  const empty = {
60
55
  maxMemoryMb: 0,
61
56
  minMemoryMb: 0,
@@ -82,10 +77,16 @@ export async function startTarget(target) {
82
77
  });
83
78
  });
84
79
  } catch (err) {
85
- stopMonitor?.();
86
80
  await killChild(child);
87
81
  throw err;
88
82
  }
83
+
84
+
85
+ if (child.pid) {
86
+ const m = startProcessMonitor(child.pid);
87
+ monitorAcc = m.acc;
88
+ stopMonitor = m.stop;
89
+ }
89
90
  return {
90
91
  url,
91
92
  port,
package/dist/types.d.mts CHANGED
@@ -48,6 +48,7 @@ export type ArtillerySummary = {
48
48
  p99: number;
49
49
  p999: number;
50
50
  };
51
+ /** Artillery report JSON (same shape as CLI `--output`; filled from in-process SSMS). */
51
52
  export type ArtilleryResult = {
52
53
  aggregate: {
53
54
  counters: Record<string, number | undefined>;
@@ -65,6 +66,22 @@ export type ArtilleryResult = {
65
66
  histograms?: Record<string, ArtillerySummary>;
66
67
  }>;
67
68
  };
69
+ /**
70
+ * Inline Artillery test script.
71
+ * Prefer `import type { TestScript } from 'artillery'` at call sites when the
72
+ * optional peer is installed — assignability holds for normal scripts.
73
+ */
74
+ export type ArtilleryScript = {
75
+ config?: {
76
+ target?: string;
77
+ phases?: Array<Record<string, unknown>>;
78
+ [key: string]: unknown;
79
+ };
80
+ scenarios?: Array<Record<string, unknown>>;
81
+ before?: Record<string, unknown>;
82
+ after?: Record<string, unknown>;
83
+ [key: string]: unknown;
84
+ };
68
85
  export type BuildMetrics = ProcessMetrics & {
69
86
  buildTimeSec: number;
70
87
  bundle?: BundleSize;
@@ -112,8 +129,14 @@ export type PerfTargetLoad = {
112
129
  connections?: number;
113
130
  durationSec?: number;
114
131
  };
132
+ /**
133
+ * Artillery load. Prefer a file path, or pass an inline script object
134
+ * (type as `import('artillery').TestScript` when the peer is installed).
135
+ */
115
136
  artillery?: {
116
137
  config: string;
138
+ } | {
139
+ script: ArtilleryScript;
117
140
  };
118
141
  };
119
142
  export type PerfTargetBundle = {
package/dist/types.d.ts CHANGED
@@ -48,6 +48,7 @@ export type ArtillerySummary = {
48
48
  p99: number;
49
49
  p999: number;
50
50
  };
51
+ /** Artillery report JSON (same shape as CLI `--output`; filled from in-process SSMS). */
51
52
  export type ArtilleryResult = {
52
53
  aggregate: {
53
54
  counters: Record<string, number | undefined>;
@@ -65,6 +66,22 @@ export type ArtilleryResult = {
65
66
  histograms?: Record<string, ArtillerySummary>;
66
67
  }>;
67
68
  };
69
+ /**
70
+ * Inline Artillery test script.
71
+ * Prefer `import type { TestScript } from 'artillery'` at call sites when the
72
+ * optional peer is installed — assignability holds for normal scripts.
73
+ */
74
+ export type ArtilleryScript = {
75
+ config?: {
76
+ target?: string;
77
+ phases?: Array<Record<string, unknown>>;
78
+ [key: string]: unknown;
79
+ };
80
+ scenarios?: Array<Record<string, unknown>>;
81
+ before?: Record<string, unknown>;
82
+ after?: Record<string, unknown>;
83
+ [key: string]: unknown;
84
+ };
68
85
  export type BuildMetrics = ProcessMetrics & {
69
86
  buildTimeSec: number;
70
87
  bundle?: BundleSize;
@@ -112,8 +129,14 @@ export type PerfTargetLoad = {
112
129
  connections?: number;
113
130
  durationSec?: number;
114
131
  };
132
+ /**
133
+ * Artillery load. Prefer a file path, or pass an inline script object
134
+ * (type as `import('artillery').TestScript` when the peer is installed).
135
+ */
115
136
  artillery?: {
116
137
  config: string;
138
+ } | {
139
+ script: ArtilleryScript;
117
140
  };
118
141
  };
119
142
  export type PerfTargetBundle = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QAC7C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QAC1C,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;KAC9C,CAAC;IACF,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC7C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;KAC/C,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG;IACxC,6DAA6D;IAC7D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,GAAG;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,SAAS,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,yDAAyD;IACzD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@untestutils/perf",
3
- "version": "0.6.0",
3
+ "version": "0.6.3",
4
4
  "description": "Build + load performance harness for recipe/fixture targets",
5
5
  "homepage": "https://s00d.github.io/untestutils/",
6
6
  "license": "MIT",
@@ -29,17 +29,20 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "pathe": "^2.0.3",
32
- "@untestutils/core": "0.6.0"
32
+ "@untestutils/core": "0.6.3"
33
33
  },
34
34
  "devDependencies": {
35
+ "@types/autocannon": "7.12.7",
35
36
  "@types/node": "^26.6.1",
37
+ "artillery": "2.0.34",
38
+ "autocannon": "8.0.0",
36
39
  "obuild": "^0.4.40",
37
40
  "publint": "^0.3.24",
38
41
  "typescript": "^6.0.3"
39
42
  },
40
43
  "peerDependencies": {
41
- "artillery": "*",
42
- "autocannon": "*"
44
+ "artillery": "2.0.34",
45
+ "autocannon": "8.0.0"
43
46
  },
44
47
  "peerDependenciesMeta": {
45
48
  "autocannon": {