@thymian/plugin-sampler 0.1.12-canary.20260716-58cd802 → 0.1.12
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/cli/commands/sampler/validate.d.ts +15 -0
- package/dist/cli/commands/sampler/validate.d.ts.map +1 -0
- package/dist/cli/commands/sampler/validate.js +147 -0
- package/dist/cli/commands/sampler/validate.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +15 -4
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -4
- package/dist/index.js.map +1 -1
- package/dist/samples-structure/write-samples-to-dir.d.ts +12 -0
- package/dist/samples-structure/write-samples-to-dir.d.ts.map +1 -1
- package/dist/samples-structure/write-samples-to-dir.js +22 -12
- package/dist/samples-structure/write-samples-to-dir.js.map +1 -1
- package/dist/validation/validate-sampler-output.d.ts +38 -0
- package/dist/validation/validate-sampler-output.d.ts.map +1 -0
- package/dist/validation/validate-sampler-output.js +288 -0
- package/dist/validation/validate-sampler-output.js.map +1 -0
- package/package.json +6 -5
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseCliRunCommand, oclif } from '@thymian/common-cli';
|
|
2
|
+
import type { SamplerValidationReport } from '../../../validation/validate-sampler-output.js';
|
|
3
|
+
export default class Validate extends BaseCliRunCommand<typeof Validate> {
|
|
4
|
+
static enableJsonFlag: boolean;
|
|
5
|
+
static description: string;
|
|
6
|
+
static flags: {
|
|
7
|
+
"full-diffs": oclif.Interfaces.BooleanFlag<boolean>;
|
|
8
|
+
"for-path": oclif.Interfaces.OptionFlag<string | undefined, oclif.Interfaces.CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<SamplerValidationReport>;
|
|
11
|
+
private logFailure;
|
|
12
|
+
private logJsonChanges;
|
|
13
|
+
private logContentField;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/sampler/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQ/D,OAAO,KAAK,EAIV,uBAAuB,EACxB,MAAM,gDAAgD,CAAC;AAiBxD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,iBAAiB,CAAC,OAAO,QAAQ,CAAC;IACtE,OAAgB,cAAc,UAAQ;IAEtC,OAAgB,WAAW,SACiD;IAE5E,OAAgB,KAAK;;;MAUnB;IAEI,GAAG,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAoH7C,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,eAAe;CAcxB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { BaseCliRunCommand, oclif } from '@thymian/common-cli';
|
|
2
|
+
import { SEVERITY_COLORS, SEVERITY_SYMBOLS, successSymbol, } from '@thymian/core';
|
|
3
|
+
const { colorize } = oclif.ux;
|
|
4
|
+
// Map each finding to a core report severity so the command reuses the exact
|
|
5
|
+
// colors and symbols of the Thymian report renderer (see report-style.ts)
|
|
6
|
+
// without constructing a Report. A missing/changed artifact is an error; an
|
|
7
|
+
// unexpected extra file is a warning.
|
|
8
|
+
const FINDING_SEVERITY = {
|
|
9
|
+
'missing-artifact': 'error',
|
|
10
|
+
'changed-artifact': 'error',
|
|
11
|
+
'stale-root-metadata': 'error',
|
|
12
|
+
'metadata-out-of-sync': 'error',
|
|
13
|
+
'invalid-json': 'error',
|
|
14
|
+
'unexpected-artifact': 'warn',
|
|
15
|
+
};
|
|
16
|
+
export default class Validate extends BaseCliRunCommand {
|
|
17
|
+
static enableJsonFlag = true;
|
|
18
|
+
static description = 'Validate generated sampler artifacts for the current API specification.';
|
|
19
|
+
static flags = {
|
|
20
|
+
['full-diffs']: oclif.Flags.boolean({
|
|
21
|
+
default: false,
|
|
22
|
+
description: 'Show the full diff for every out-of-sync artifact instead of a summary.',
|
|
23
|
+
}),
|
|
24
|
+
['for-path']: oclif.Flags.string({
|
|
25
|
+
description: 'Validate a single generated artifact by its relative path (e.g. meta.json) and show its full diff. Note: the full artifact set is still regenerated internally, so this scopes the output, not the work.',
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
async run() {
|
|
29
|
+
return this.thymian.run(async (emitter) => {
|
|
30
|
+
if (!this.thymian.plugins.find((p) => p.plugin.name === '@thymian/plugin-sampler')) {
|
|
31
|
+
this.error('Cannot validate sampler if sampler plugin is not registered.', {
|
|
32
|
+
exit: 1,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const format = await this.thymian.loadFormat({
|
|
36
|
+
inputs: this.thymianConfig.specifications ?? [],
|
|
37
|
+
validateSpecs: this.flags['validate-specs'],
|
|
38
|
+
}, {
|
|
39
|
+
emitFormat: false,
|
|
40
|
+
});
|
|
41
|
+
const forPath = this.flags['for-path'];
|
|
42
|
+
const report = await emitter.emitAction('sampler.validate', {
|
|
43
|
+
format: format.export(),
|
|
44
|
+
...(forPath !== undefined ? { forPath } : {}),
|
|
45
|
+
}, {
|
|
46
|
+
strategy: 'first',
|
|
47
|
+
});
|
|
48
|
+
// A scoped run reports 0 checked artifacts only when the path is not a
|
|
49
|
+
// known generated artifact — surface that as an error in every mode.
|
|
50
|
+
if (forPath !== undefined && report.checkedArtifacts === 0) {
|
|
51
|
+
if (this.jsonEnabled()) {
|
|
52
|
+
// Keep machine output consistent: emit the (empty) report as JSON and
|
|
53
|
+
// signal the usage error through the exit code instead of throwing,
|
|
54
|
+
// which would abort before any JSON is printed.
|
|
55
|
+
process.exitCode = 2;
|
|
56
|
+
return report;
|
|
57
|
+
}
|
|
58
|
+
this.error(`No generated sampler artifact found at path "${forPath}".`, {
|
|
59
|
+
exit: 2,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (this.jsonEnabled()) {
|
|
63
|
+
// oclif serializes the returned value as JSON and suppresses `this.log`.
|
|
64
|
+
// Signal failure through the exit code without throwing, because a throw
|
|
65
|
+
// would abort before the JSON is printed.
|
|
66
|
+
if (report.failures.length > 0) {
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
}
|
|
69
|
+
return report;
|
|
70
|
+
}
|
|
71
|
+
if (report.failures.length === 0) {
|
|
72
|
+
this.log(`${colorize(SEVERITY_COLORS.info, successSymbol)} ${forPath !== undefined
|
|
73
|
+
? `Generated sampler artifact "${forPath}" is in sync.`
|
|
74
|
+
: `Sampler validation passed: ${report.checkedArtifacts} generated artifacts are in sync.`}`);
|
|
75
|
+
return report;
|
|
76
|
+
}
|
|
77
|
+
// `--for-path` targets one artifact, so its diff is always shown;
|
|
78
|
+
// otherwise details are opt-in via `--full-diffs`.
|
|
79
|
+
const showDiffs = this.flags['full-diffs'] || forPath !== undefined;
|
|
80
|
+
for (const failure of report.failures) {
|
|
81
|
+
this.logFailure(failure, showDiffs);
|
|
82
|
+
}
|
|
83
|
+
const checked = report.checkedArtifacts;
|
|
84
|
+
// `checkedArtifacts` counts only expected (generated) artifacts, so keep
|
|
85
|
+
// unexpected extras in their own tally — otherwise "N failed" against
|
|
86
|
+
// "Checked M" reads as "N of M generated artifacts failed" when the extras
|
|
87
|
+
// were never part of that set.
|
|
88
|
+
const unexpected = report.failures.filter((failure) => failure.type === 'unexpected-artifact').length;
|
|
89
|
+
const outOfSync = report.failures.length - unexpected;
|
|
90
|
+
const summaryParts = [];
|
|
91
|
+
if (outOfSync > 0) {
|
|
92
|
+
summaryParts.push(`${outOfSync} out of sync`);
|
|
93
|
+
}
|
|
94
|
+
if (unexpected > 0) {
|
|
95
|
+
summaryParts.push(`${unexpected} unexpected`);
|
|
96
|
+
}
|
|
97
|
+
this.log();
|
|
98
|
+
this.log(`Checked ${checked} generated ${checked === 1 ? 'artifact' : 'artifacts'} in ${report.samplePath}. ${colorize(SEVERITY_COLORS.error, `${summaryParts.join(', ')}.`)}`);
|
|
99
|
+
this.exit(1);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
logFailure(failure, showDiffs) {
|
|
103
|
+
const severity = FINDING_SEVERITY[failure.type];
|
|
104
|
+
const color = SEVERITY_COLORS[severity];
|
|
105
|
+
const symbol = SEVERITY_SYMBOLS[severity];
|
|
106
|
+
this.log(`${colorize(color, `${symbol} ${failure.type}`)}: ${failure.path}`);
|
|
107
|
+
if (!showDiffs) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.log(colorize(SEVERITY_COLORS.info, ` ${failure.message}`));
|
|
111
|
+
if (failure.changes && failure.changes.length > 0) {
|
|
112
|
+
this.logJsonChanges(failure.changes);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
this.logContentField('expected', failure.expected);
|
|
116
|
+
this.logContentField('actual', failure.actual);
|
|
117
|
+
}
|
|
118
|
+
this.log();
|
|
119
|
+
}
|
|
120
|
+
logJsonChanges(changes) {
|
|
121
|
+
this.log(colorize(SEVERITY_COLORS.info, ' JSON changes:'));
|
|
122
|
+
for (const change of changes) {
|
|
123
|
+
const pointer = change.pointer || '/';
|
|
124
|
+
let detail;
|
|
125
|
+
if (change.type === 'add') {
|
|
126
|
+
detail = `[add] ${pointer} → ${JSON.stringify(change.actual)}`;
|
|
127
|
+
}
|
|
128
|
+
else if (change.type === 'delete') {
|
|
129
|
+
detail = `[delete] ${pointer} (was ${JSON.stringify(change.expected)})`;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
detail = `[update] ${pointer}: ${JSON.stringify(change.expected)} → ${JSON.stringify(change.actual)}`;
|
|
133
|
+
}
|
|
134
|
+
this.log(colorize(SEVERITY_COLORS.info, ` ${detail}`));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
logContentField(label, value) {
|
|
138
|
+
if (value === undefined) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.log(colorize(SEVERITY_COLORS.info, ` ${label}:`));
|
|
142
|
+
for (const line of value.split('\n')) {
|
|
143
|
+
this.log(colorize(SEVERITY_COLORS.info, ` ${line}`));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/cli/commands/sampler/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -2,4 +2,11 @@ export declare const SAMPLE_FILE: RegExp;
|
|
|
2
2
|
export declare const BEFORE_EACH_HOOK: RegExp;
|
|
3
3
|
export declare const AFTER_EACH_HOOK: RegExp;
|
|
4
4
|
export declare const AUTHORIZE_HOOK: RegExp;
|
|
5
|
+
/**
|
|
6
|
+
* Whether a file name is a sampler hook file. This must mirror how hooks are
|
|
7
|
+
* actually discovered when reading samples (see `extractHooksFromDir` in
|
|
8
|
+
* read-samples-from-dir.ts), so that `sampler validate` never flags a file the
|
|
9
|
+
* sampler loads as a hook — the matching lives here to keep the two in sync.
|
|
10
|
+
*/
|
|
11
|
+
export declare function isHookFileName(fileName: string): boolean;
|
|
5
12
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QAAmB,CAAC;AAC5C,eAAO,MAAM,gBAAgB,QAAwC,CAAC;AACtE,eAAO,MAAM,eAAe,QAAuC,CAAC;AACpE,eAAO,MAAM,cAAc,QAAuC,CAAC;AAEnE;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMxD"}
|
package/dist/constants.js
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
|
-
export const SAMPLE_FILE =
|
|
2
|
-
export const BEFORE_EACH_HOOK = /(
|
|
3
|
-
export const AFTER_EACH_HOOK = /(
|
|
4
|
-
export const AUTHORIZE_HOOK = /(
|
|
1
|
+
export const SAMPLE_FILE = /request\.json$/;
|
|
2
|
+
export const BEFORE_EACH_HOOK = /(?:^|[/\\.])beforeEach\.[cm]?[jt]s$/;
|
|
3
|
+
export const AFTER_EACH_HOOK = /(?:^|[/\\.])afterEach\.[cm]?[jt]s$/;
|
|
4
|
+
export const AUTHORIZE_HOOK = /(?:^|[/\\.])authorize\.[cm]?[jt]s$/;
|
|
5
|
+
/**
|
|
6
|
+
* Whether a file name is a sampler hook file. This must mirror how hooks are
|
|
7
|
+
* actually discovered when reading samples (see `extractHooksFromDir` in
|
|
8
|
+
* read-samples-from-dir.ts), so that `sampler validate` never flags a file the
|
|
9
|
+
* sampler loads as a hook — the matching lives here to keep the two in sync.
|
|
10
|
+
*/
|
|
11
|
+
export function isHookFileName(fileName) {
|
|
12
|
+
return (BEFORE_EACH_HOOK.test(fileName) ||
|
|
13
|
+
AFTER_EACH_HOOK.test(fileName) ||
|
|
14
|
+
AUTHORIZE_HOOK.test(fileName));
|
|
15
|
+
}
|
|
5
16
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,oCAAoC,CAAC;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,CACL,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/B,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9B,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC9B,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type HttpRequestTemplate, type SerializedThymianFormat, type ThymianHttpTransaction, type ThymianPlugin, type ThymianSchema } from '@thymian/core';
|
|
2
|
+
import { type SamplerValidationReport } from './validation/validate-sampler-output.js';
|
|
2
3
|
declare module '@thymian/core' {
|
|
3
4
|
interface ThymianActions {
|
|
4
5
|
'sampler.init': {
|
|
@@ -8,6 +9,13 @@ declare module '@thymian/core' {
|
|
|
8
9
|
};
|
|
9
10
|
response: void;
|
|
10
11
|
};
|
|
12
|
+
'sampler.validate': {
|
|
13
|
+
event: {
|
|
14
|
+
format: SerializedThymianFormat;
|
|
15
|
+
forPath?: string;
|
|
16
|
+
};
|
|
17
|
+
response: SamplerValidationReport;
|
|
18
|
+
};
|
|
11
19
|
'core.request.sample': {
|
|
12
20
|
event: {
|
|
13
21
|
transaction: ThymianHttpTransaction;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAG5B,KAAK,sBAAsB,EAE3B,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAgBvB,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,cAAc;QACtB,cAAc,EAAE;YACd,KAAK,EAAE;gBACL,MAAM,EAAE,uBAAuB,CAAC;gBAChC,SAAS,CAAC,EAAE,OAAO,CAAC;aACrB,CAAC;YACF,QAAQ,EAAE,IAAI,CAAC;SAChB,CAAC;QAEF,kBAAkB,EAAE;YAClB,KAAK,EAAE;gBACL,MAAM,EAAE,uBAAuB,CAAC;gBAChC,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,QAAQ,EAAE,uBAAuB,CAAC;SACnC,CAAC;QAEF,qBAAqB,EAAE;YACrB,KAAK,EAAE;gBACL,WAAW,EAAE,sBAAsB,CAAC;gBACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;aACnC,CAAC;YACF,QAAQ,EAAE,mBAAmB,CAAC;SAC/B,CAAC;QAEF,sBAAsB,EAAE;YACtB,KAAK,EAAE;gBACL,WAAW,EAAE,MAAM,CAAC;gBACpB,MAAM,EAAE,aAAa,CAAC;aACvB,CAAC;YACF,QAAQ,EAAE;gBAAE,QAAQ,EAAE,OAAO,CAAC;gBAAC,SAAS,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACrD,CAAC;QAEF,+BAA+B,EAAE;YAC/B,KAAK,EAAE;gBACL,aAAa,EAAE,MAAM,CAAC;aACvB,CAAC;YACF,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;SAC9B,CAAC;KACH;CACF;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AA8CF,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,CA8MrE,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,58 @@
|
|
|
1
|
-
import { writeFile } from 'node:fs/promises';
|
|
2
1
|
import { isAbsolute, join } from 'node:path';
|
|
3
2
|
import { ThymianBaseError, ThymianFormat, thymianHttpTransactionToString, } from '@thymian/core';
|
|
4
3
|
import { generateSamplesForThymianFormat } from './generation/generate-samples-for-thymian-format.js';
|
|
5
4
|
import { generatedTypesToString, generateTypesForThymianFormat, } from './hooks/generate-request-types.js';
|
|
6
5
|
import { HookRunner } from './hooks/hook-runner.js';
|
|
7
|
-
import { tsConfig } from './hooks/ts-config.js';
|
|
8
6
|
import { requestSampleToRequestTemplate } from './request-sample-to-request-template.js';
|
|
9
7
|
import { RequestSampler } from './request-sampler.js';
|
|
10
8
|
import { getPathTransactionId } from './samples-structure/get-path-transaction-id.js';
|
|
11
9
|
import { readSamplesFromDir } from './samples-structure/read-samples-from-dir.js';
|
|
12
10
|
import { writeSamplesToDir } from './samples-structure/write-samples-to-dir.js';
|
|
13
11
|
import { entryExists } from './utils.js';
|
|
12
|
+
import { validateSamplerOutput, } from './validation/validate-sampler-output.js';
|
|
13
|
+
const samplerValidateActionSchema = {
|
|
14
|
+
event: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
required: ['format'],
|
|
17
|
+
properties: {
|
|
18
|
+
format: {},
|
|
19
|
+
forPath: { type: 'string' },
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
response: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
required: ['samplePath', 'checkedArtifacts', 'failures'],
|
|
25
|
+
properties: {
|
|
26
|
+
samplePath: { type: 'string' },
|
|
27
|
+
checkedArtifacts: { type: 'integer' },
|
|
28
|
+
failures: {
|
|
29
|
+
type: 'array',
|
|
30
|
+
items: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
required: ['type', 'path', 'message'],
|
|
33
|
+
properties: {
|
|
34
|
+
type: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
enum: [
|
|
37
|
+
'missing-artifact',
|
|
38
|
+
'changed-artifact',
|
|
39
|
+
'stale-root-metadata',
|
|
40
|
+
'metadata-out-of-sync',
|
|
41
|
+
'unexpected-artifact',
|
|
42
|
+
'invalid-json',
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
path: { type: 'string' },
|
|
46
|
+
message: { type: 'string' },
|
|
47
|
+
expected: { type: 'string' },
|
|
48
|
+
actual: { type: 'string' },
|
|
49
|
+
changes: { type: 'array' },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
14
56
|
export const samplePlugin = {
|
|
15
57
|
name: '@thymian/plugin-sampler',
|
|
16
58
|
version: '0.x',
|
|
@@ -51,6 +93,13 @@ export const samplePlugin = {
|
|
|
51
93
|
},
|
|
52
94
|
},
|
|
53
95
|
},
|
|
96
|
+
// The strict `JSONSchemaType<T>` target can't be satisfied by this
|
|
97
|
+
// hand-written `as const` schema (readonly literals + a deliberately
|
|
98
|
+
// loose `format: {}`, which ajv validates at runtime). Suppress the
|
|
99
|
+
// structural check the same way `sampler.init` does above, for parity.
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
101
|
+
// @ts-expect-error
|
|
102
|
+
'sampler.validate': samplerValidateActionSchema,
|
|
54
103
|
},
|
|
55
104
|
},
|
|
56
105
|
plugin: async (emitter, logger, options) => {
|
|
@@ -100,12 +149,22 @@ export const samplePlugin = {
|
|
|
100
149
|
await writeSamplesToDir(samples, generatedTypes.keyToTransactionId, {
|
|
101
150
|
path: basePath,
|
|
102
151
|
mode: typeof overwrite === 'boolean' ? 'overwrite' : 'failIfExist',
|
|
152
|
+
typeArtifacts: {
|
|
153
|
+
typesContent: generatedTypesToString(generatedTypes),
|
|
154
|
+
},
|
|
103
155
|
});
|
|
104
156
|
logger.debug(`Wrote samples at ${basePath}`);
|
|
105
|
-
await writeFile(join(basePath, 'types.d.ts'), generatedTypesToString(generatedTypes));
|
|
106
|
-
await writeFile(join(basePath, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));
|
|
107
157
|
ctx.reply();
|
|
108
158
|
});
|
|
159
|
+
emitter.onAction('sampler.validate', async ({ format, forPath }, ctx) => {
|
|
160
|
+
const parsedFormat = ThymianFormat.import(format);
|
|
161
|
+
ctx.reply(await validateSamplerOutput({
|
|
162
|
+
format: parsedFormat,
|
|
163
|
+
emitter,
|
|
164
|
+
samplePath: basePath,
|
|
165
|
+
forPath,
|
|
166
|
+
}));
|
|
167
|
+
});
|
|
109
168
|
emitter.onAction('core.request.sample', async ({ transaction }, ctx) => {
|
|
110
169
|
if (!format) {
|
|
111
170
|
throw new ThymianBaseError('Format is not loaded.', {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { type ContentSource, type HttpRequestSample } from '../http-request-samp
|
|
|
2
2
|
import type { Value } from './file-request-sample.js';
|
|
3
3
|
import { type BaseNode, type SamplesStructure } from './samples-tree-structure.js';
|
|
4
4
|
import type { PathToNodeType } from './structure-meta-on-disc.js';
|
|
5
|
+
export type CreateDir = (path: string) => Promise<void>;
|
|
5
6
|
export type WriteToFile = (path: string, content: string | Buffer, encoding?: string) => Promise<void>;
|
|
6
7
|
export declare function getTreeStructureMeta(tree: SamplesStructure): PathToNodeType;
|
|
7
8
|
export declare function getFolderNameFromNode(node: BaseNode): string;
|
|
@@ -20,6 +21,17 @@ export declare function transformParameters({ parameters, dir, baseName, writeTo
|
|
|
20
21
|
export type WriteOptions = {
|
|
21
22
|
path: string;
|
|
22
23
|
mode?: 'failIfExist' | 'overwrite';
|
|
24
|
+
mkdir?: CreateDir;
|
|
25
|
+
writeToFile?: WriteToFile;
|
|
26
|
+
/**
|
|
27
|
+
* When provided, the generated `types.d.ts` and `tsconfig.json` hook
|
|
28
|
+
* artifacts are emitted through the same `writeToFile` seam as the rest of
|
|
29
|
+
* the samples. Keeping these writes here guarantees `sampler.init` (on disk)
|
|
30
|
+
* and the validation flow (in memory) can never drift in how they emit them.
|
|
31
|
+
*/
|
|
32
|
+
typeArtifacts?: {
|
|
33
|
+
typesContent: string;
|
|
34
|
+
};
|
|
23
35
|
};
|
|
24
36
|
export declare function writeSamplesToDir(samples: SamplesStructure, keyToTransactionId: Record<string, string>, options: WriteOptions): Promise<void>;
|
|
25
37
|
//# sourceMappingURL=write-samples-to-dir.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-samples-to-dir.d.ts","sourceRoot":"","sources":["../../src/samples-structure/write-samples-to-dir.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"write-samples-to-dir.d.ts","sourceRoot":"","sources":["../../src/samples-structure/write-samples-to-dir.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAGvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAqB,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EACL,KAAK,QAAQ,EAKb,KAAK,gBAAgB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAoB3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAqC5D;AAED,wBAAsB,WAAW,CAAC,EAChC,MAAM,EACN,IAAI,EACJ,GAAG,EACH,WAAW,GACZ,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,WAAW,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDhB;AAmCD,wBAAsB,mBAAmB,CAAC,EACxC,UAAU,EACV,GAAG,EACH,QAAQ,EACR,WAAW,GACZ,EAAE;IACD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,WAAW,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAajC;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,aAAa,GAAG,WAAW,CAAC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE;QACd,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,gBAAgB,EACzB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CA2Ef"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { basename, format, join } from 'node:path';
|
|
3
3
|
import { ThymianBaseError } from '@thymian/core';
|
|
4
|
+
import { tsConfig } from '../hooks/ts-config.js';
|
|
4
5
|
import { isFileContentSource, isInlineContentSource, } from '../http-request-sample.js';
|
|
5
6
|
import { checkForSafePath, entryExists, sanitize } from '../utils.js';
|
|
6
7
|
import { isKnownNodeType, isValidNodeType, nodeIsType, } from './samples-tree-structure.js';
|
|
@@ -133,16 +134,21 @@ export async function transformParameters({ parameters, dir, baseName, writeToFi
|
|
|
133
134
|
}
|
|
134
135
|
export async function writeSamplesToDir(samples, keyToTransactionId, options) {
|
|
135
136
|
const mode = options.mode ?? 'failIfExist';
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
137
|
+
const mkdirDir = options.mkdir ??
|
|
138
|
+
(async (path) => {
|
|
139
|
+
await mkdir(path, { recursive: true });
|
|
140
|
+
});
|
|
141
|
+
const writeToFile = options.writeToFile ??
|
|
142
|
+
(async (path, content, encoding) => {
|
|
143
|
+
if (mode === 'failIfExist' && (await entryExists(path))) {
|
|
144
|
+
throw new ThymianBaseError(`File/Directory at path "${path}" already exists. Use "overwrite" mode to overwrite it.`, {
|
|
145
|
+
name: 'PathAlreadyExistsError',
|
|
146
|
+
ref: 'https://thymian.dev/references/errors/path-already-exists-error/',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
await writeFile(path, content, encoding);
|
|
150
|
+
});
|
|
151
|
+
await mkdirDir(options.path);
|
|
146
152
|
await writeToFile(join(options.path, 'meta.json'), JSON.stringify({
|
|
147
153
|
'//': 'This file contains metadata about the structure of the samples. It is generated by @thymian/plugin-sampler and is not meant to be edited by humans.',
|
|
148
154
|
types: getTreeStructureMeta(samples),
|
|
@@ -156,12 +162,12 @@ export async function writeSamplesToDir(samples, keyToTransactionId, options) {
|
|
|
156
162
|
const folderName = getFolderNameFromNode(node);
|
|
157
163
|
const dirPath = join(currentPath, folderName);
|
|
158
164
|
if (nodeIsType(node, 'samples')) {
|
|
159
|
-
await
|
|
165
|
+
await mkdirDir(dirPath);
|
|
160
166
|
const metaPath = join(dirPath, 'meta.json');
|
|
161
167
|
await writeToFile(metaPath, JSON.stringify(node.meta, null, 2));
|
|
162
168
|
}
|
|
163
169
|
else if (nodeIsType(node, 'requests')) {
|
|
164
|
-
await
|
|
170
|
+
await mkdirDir(dirPath);
|
|
165
171
|
for (const [idx, sample] of node.value.entries()) {
|
|
166
172
|
const name = `${idx}-request`;
|
|
167
173
|
await writeSample({ sample, name, dir: dirPath, writeToFile });
|
|
@@ -169,5 +175,9 @@ export async function writeSamplesToDir(samples, keyToTransactionId, options) {
|
|
|
169
175
|
}
|
|
170
176
|
return dirPath;
|
|
171
177
|
});
|
|
178
|
+
if (options.typeArtifacts) {
|
|
179
|
+
await writeToFile(join(options.path, 'types.d.ts'), options.typeArtifacts.typesContent);
|
|
180
|
+
await writeToFile(join(options.path, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));
|
|
181
|
+
}
|
|
172
182
|
}
|
|
173
183
|
//# sourceMappingURL=write-samples-to-dir.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-samples-to-dir.js","sourceRoot":"","sources":["../../src/samples-structure/write-samples-to-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAGL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAEL,eAAe,EACf,eAAe,EAEf,UAAU,GAEX,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"write-samples-to-dir.js","sourceRoot":"","sources":["../../src/samples-structure/write-samples-to-dir.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ThymianEmitter, ThymianFormat } from '@thymian/core';
|
|
2
|
+
export type SamplerValidationFindingType = 'missing-artifact' | 'unexpected-artifact' | 'changed-artifact' | 'stale-root-metadata' | 'metadata-out-of-sync' | 'invalid-json';
|
|
3
|
+
export type SamplerValidationContentChangeType = 'add' | 'update' | 'delete';
|
|
4
|
+
export type SamplerValidationContentChange = {
|
|
5
|
+
type: SamplerValidationContentChangeType;
|
|
6
|
+
pointer: string;
|
|
7
|
+
expected?: unknown;
|
|
8
|
+
actual?: unknown;
|
|
9
|
+
};
|
|
10
|
+
export type SamplerValidationFinding = {
|
|
11
|
+
type: SamplerValidationFindingType;
|
|
12
|
+
path: string;
|
|
13
|
+
message: string;
|
|
14
|
+
expected?: string;
|
|
15
|
+
actual?: string;
|
|
16
|
+
changes?: SamplerValidationContentChange[];
|
|
17
|
+
};
|
|
18
|
+
export type SamplerValidationReport = {
|
|
19
|
+
samplePath: string;
|
|
20
|
+
checkedArtifacts: number;
|
|
21
|
+
failures: SamplerValidationFinding[];
|
|
22
|
+
};
|
|
23
|
+
type ValidateSamplerOutputOptions = {
|
|
24
|
+
format: ThymianFormat;
|
|
25
|
+
emitter: ThymianEmitter;
|
|
26
|
+
samplePath: string;
|
|
27
|
+
/**
|
|
28
|
+
* Restrict the report to a single generated artifact, identified by its
|
|
29
|
+
* relative path (e.g. `meta.json`). `checkedArtifacts` is then 1 when the
|
|
30
|
+
* path is a known artifact and 0 when it is not, which the CLI uses to tell
|
|
31
|
+
* an in-sync artifact apart from an unknown one.
|
|
32
|
+
*/
|
|
33
|
+
forPath?: string;
|
|
34
|
+
};
|
|
35
|
+
export declare function createExpectedSamplerFiles({ format, emitter, }: Omit<ValidateSamplerOutputOptions, 'samplePath'>): Promise<Map<string, Buffer>>;
|
|
36
|
+
export declare function validateSamplerOutput({ format, emitter, samplePath, forPath, }: ValidateSamplerOutputOptions): Promise<SamplerValidationReport>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=validate-sampler-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-sampler-output.d.ts","sourceRoot":"","sources":["../../src/validation/validate-sampler-output.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAUnE,MAAM,MAAM,4BAA4B,GACpC,kBAAkB,GAClB,qBAAqB,GACrB,kBAAkB,GAClB,qBAAqB,GACrB,sBAAsB,GACtB,cAAc,CAAC;AAEnB,MAAM,MAAM,kCAAkC,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7E,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,kCAAkC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,4BAA4B,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,8BAA8B,EAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACtC,CAAC;AAEF,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAsB,0BAA0B,CAAC,EAC/C,MAAM,EACN,OAAO,GACR,EAAE,IAAI,CAAC,4BAA4B,EAAE,YAAY,CAAC,GAAG,OAAO,CAC3D,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CACpB,CAwBA;AAED,wBAAsB,qBAAqB,CAAC,EAC1C,MAAM,EACN,OAAO,EACP,UAAU,EACV,OAAO,GACR,EAAE,4BAA4B,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAuEjE"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, relative, sep } from 'node:path';
|
|
3
|
+
import { diff as diffJson } from '@scalar/json-magic/diff';
|
|
4
|
+
import { isHookFileName } from '../constants.js';
|
|
5
|
+
import { generateSamplesForThymianFormat } from '../generation/generate-samples-for-thymian-format.js';
|
|
6
|
+
import { generatedTypesToString, generateTypesForThymianFormat, } from '../hooks/generate-request-types.js';
|
|
7
|
+
import { writeSamplesToDir } from '../samples-structure/write-samples-to-dir.js';
|
|
8
|
+
export async function createExpectedSamplerFiles({ format, emitter, }) {
|
|
9
|
+
const samples = await generateSamplesForThymianFormat(format, emitter);
|
|
10
|
+
const generatedTypes = await generateTypesForThymianFormat(format);
|
|
11
|
+
const expectedFiles = new Map();
|
|
12
|
+
await writeSamplesToDir(samples, generatedTypes.keyToTransactionId, {
|
|
13
|
+
path: '',
|
|
14
|
+
mkdir: async (path) => {
|
|
15
|
+
void path;
|
|
16
|
+
},
|
|
17
|
+
writeToFile: async (path, content, encoding) => {
|
|
18
|
+
expectedFiles.set(normalizeRelativePath(path), Buffer.isBuffer(content)
|
|
19
|
+
? content
|
|
20
|
+
: Buffer.from(content, encoding));
|
|
21
|
+
},
|
|
22
|
+
typeArtifacts: {
|
|
23
|
+
typesContent: generatedTypesToString(generatedTypes),
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
return expectedFiles;
|
|
27
|
+
}
|
|
28
|
+
export async function validateSamplerOutput({ format, emitter, samplePath, forPath, }) {
|
|
29
|
+
const expectedFiles = await createExpectedSamplerFiles({ format, emitter });
|
|
30
|
+
const actualFiles = await collectActualSamplerFiles(samplePath);
|
|
31
|
+
const failures = [];
|
|
32
|
+
preserveRootMetadataTimestamp(expectedFiles, actualFiles);
|
|
33
|
+
for (const [path, expected] of expectedFiles) {
|
|
34
|
+
const actual = actualFiles.get(path);
|
|
35
|
+
if (!actual) {
|
|
36
|
+
failures.push({
|
|
37
|
+
type: 'missing-artifact',
|
|
38
|
+
path,
|
|
39
|
+
message: 'Expected generated sampler artifact is missing.',
|
|
40
|
+
expected: bufferToText(expected),
|
|
41
|
+
});
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (expected.equals(actual)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const type = mismatchTypeForChangedPath(path, expected, actual);
|
|
48
|
+
const changes = createJsonDiffDetails(expected, actual);
|
|
49
|
+
failures.push({
|
|
50
|
+
type,
|
|
51
|
+
path,
|
|
52
|
+
message: messageForChangedPath(type),
|
|
53
|
+
expected: bufferToText(expected),
|
|
54
|
+
actual: bufferToText(actual),
|
|
55
|
+
...(changes ? { changes } : {}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
for (const [path, actual] of actualFiles) {
|
|
59
|
+
if (!expectedFiles.has(path)) {
|
|
60
|
+
failures.push({
|
|
61
|
+
type: 'unexpected-artifact',
|
|
62
|
+
path,
|
|
63
|
+
message: 'Unexpected non-hook file exists under the sampler directory.',
|
|
64
|
+
actual: bufferToText(actual),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (forPath !== undefined) {
|
|
69
|
+
// Normalize so a platform-native argument (e.g. `a\b.json` on Windows)
|
|
70
|
+
// matches the `/`-joined keys used throughout the report.
|
|
71
|
+
const normalizedForPath = normalizeRelativePath(forPath);
|
|
72
|
+
// Only a generated (expected) artifact counts as "known" — pointing
|
|
73
|
+
// `--for-path` at an on-disk-only file must surface as an unknown-path
|
|
74
|
+
// usage error, not silently scope to that extra file.
|
|
75
|
+
const known = expectedFiles.has(normalizedForPath);
|
|
76
|
+
return {
|
|
77
|
+
samplePath,
|
|
78
|
+
checkedArtifacts: known ? 1 : 0,
|
|
79
|
+
failures: failures.filter((failure) => failure.path === normalizedForPath),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
samplePath,
|
|
84
|
+
checkedArtifacts: expectedFiles.size,
|
|
85
|
+
failures,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async function collectActualSamplerFiles(samplePath) {
|
|
89
|
+
const actualFiles = new Map();
|
|
90
|
+
// A missing path — or a non-directory sitting where the samples directory is
|
|
91
|
+
// expected — means nothing generated is present. Treat both as an empty
|
|
92
|
+
// actual set so drift is reported instead of `readdir` crashing on ENOTDIR.
|
|
93
|
+
let stats;
|
|
94
|
+
try {
|
|
95
|
+
stats = await stat(samplePath);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return actualFiles;
|
|
99
|
+
}
|
|
100
|
+
if (!stats.isDirectory()) {
|
|
101
|
+
return actualFiles;
|
|
102
|
+
}
|
|
103
|
+
await collectActualFilesRecursive(samplePath, samplePath, actualFiles);
|
|
104
|
+
return actualFiles;
|
|
105
|
+
}
|
|
106
|
+
async function collectActualFilesRecursive(rootPath, currentPath, actualFiles) {
|
|
107
|
+
const entries = await readdir(currentPath, { withFileTypes: true });
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
const entryPath = join(currentPath, entry.name);
|
|
110
|
+
if (entry.isDirectory()) {
|
|
111
|
+
await collectActualFilesRecursive(rootPath, entryPath, actualFiles);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (!entry.isFile()) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const relativePath = normalizeRelativePath(relative(rootPath, entryPath));
|
|
118
|
+
if (isHookFile(relativePath)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
actualFiles.set(relativePath, await readFile(entryPath));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function normalizeRelativePath(path) {
|
|
125
|
+
return path.split(sep).join('/');
|
|
126
|
+
}
|
|
127
|
+
function isHookFile(path) {
|
|
128
|
+
const fileName = path.split('/').at(-1) ?? path;
|
|
129
|
+
return isHookFileName(fileName);
|
|
130
|
+
}
|
|
131
|
+
function mismatchTypeForChangedPath(path, expected, actual) {
|
|
132
|
+
if (isInvalidJsonChange(expected, actual)) {
|
|
133
|
+
return 'invalid-json';
|
|
134
|
+
}
|
|
135
|
+
if (path === 'meta.json') {
|
|
136
|
+
return rootMetadataMismatchType(expected, actual);
|
|
137
|
+
}
|
|
138
|
+
if (path.endsWith('/meta.json')) {
|
|
139
|
+
return 'metadata-out-of-sync';
|
|
140
|
+
}
|
|
141
|
+
return 'changed-artifact';
|
|
142
|
+
}
|
|
143
|
+
// The root `meta.json` is only "stale" when the format hash (`/version/version`)
|
|
144
|
+
// differs — that means the artifacts were generated against a different API
|
|
145
|
+
// format. Drift in other root fields (e.g. `types`, `transactions`) is an
|
|
146
|
+
// ordinary content change and should not claim the metadata is out of date.
|
|
147
|
+
function rootMetadataMismatchType(expected, actual) {
|
|
148
|
+
const expectedObject = parseJsonObject(expected);
|
|
149
|
+
const actualObject = parseJsonObject(actual);
|
|
150
|
+
if (!expectedObject || !actualObject) {
|
|
151
|
+
return 'stale-root-metadata';
|
|
152
|
+
}
|
|
153
|
+
return readVersionHash(expectedObject) !== readVersionHash(actualObject)
|
|
154
|
+
? 'stale-root-metadata'
|
|
155
|
+
: 'changed-artifact';
|
|
156
|
+
}
|
|
157
|
+
function messageForChangedPath(type) {
|
|
158
|
+
if (type === 'invalid-json') {
|
|
159
|
+
return 'Generated JSON artifact is not valid JSON.';
|
|
160
|
+
}
|
|
161
|
+
if (type === 'stale-root-metadata') {
|
|
162
|
+
return 'Root sampler metadata does not match the current API format.';
|
|
163
|
+
}
|
|
164
|
+
if (type === 'metadata-out-of-sync') {
|
|
165
|
+
return 'Nested sampler metadata does not match the expected generated output.';
|
|
166
|
+
}
|
|
167
|
+
return 'Generated sampler artifact content differs from expected output.';
|
|
168
|
+
}
|
|
169
|
+
function isInvalidJsonChange(expected, actual) {
|
|
170
|
+
const expectedJson = parseJsonValue(expected);
|
|
171
|
+
const actualJson = parseJsonValue(actual);
|
|
172
|
+
return (expectedJson.valid && isJsonObject(expectedJson.value) && !actualJson.valid);
|
|
173
|
+
}
|
|
174
|
+
function createJsonDiffDetails(expected, actual) {
|
|
175
|
+
const expectedJson = parseJsonValue(expected);
|
|
176
|
+
const actualJson = parseJsonValue(actual);
|
|
177
|
+
if (!expectedJson.valid || !actualJson.valid) {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
if (!isJsonObject(expectedJson.value) || !isJsonObject(actualJson.value)) {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const expectedValue = expectedJson.value;
|
|
184
|
+
const actualValue = actualJson.value;
|
|
185
|
+
return diffJson(expectedValue, actualValue).map((change) => mapJsonMagicChange(change, expectedValue, actualValue));
|
|
186
|
+
}
|
|
187
|
+
function mapJsonMagicChange(change, expected, actual) {
|
|
188
|
+
const pointer = jsonPointerFromPath(change.path);
|
|
189
|
+
if (change.type === 'add') {
|
|
190
|
+
return {
|
|
191
|
+
type: change.type,
|
|
192
|
+
pointer,
|
|
193
|
+
actual: readJsonPath(actual, change.path),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
if (change.type === 'delete') {
|
|
197
|
+
return {
|
|
198
|
+
type: change.type,
|
|
199
|
+
pointer,
|
|
200
|
+
expected: readJsonPath(expected, change.path),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
type: change.type,
|
|
205
|
+
pointer,
|
|
206
|
+
expected: readJsonPath(expected, change.path),
|
|
207
|
+
actual: readJsonPath(actual, change.path),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function preserveRootMetadataTimestamp(expectedFiles, actualFiles) {
|
|
211
|
+
const expected = expectedFiles.get('meta.json');
|
|
212
|
+
const actual = actualFiles.get('meta.json');
|
|
213
|
+
if (!expected || !actual) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const expectedJson = parseJsonObject(expected);
|
|
217
|
+
const actualJson = parseJsonObject(actual);
|
|
218
|
+
if (!expectedJson || !actualJson) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const expectedVersion = readVersionHash(expectedJson);
|
|
222
|
+
const actualVersion = readVersionHash(actualJson);
|
|
223
|
+
if (!expectedVersion || expectedVersion !== actualVersion) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const expectedVersionObject = expectedJson.version;
|
|
227
|
+
const actualVersionObject = actualJson.version;
|
|
228
|
+
if (!isJsonObject(expectedVersionObject) ||
|
|
229
|
+
!isJsonObject(actualVersionObject)) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
// Only the timestamp is allowed to differ run-to-run; copy just that field so
|
|
233
|
+
// drift in any other `version.*` field (added later) is still validated.
|
|
234
|
+
expectedVersionObject.timestamp = actualVersionObject.timestamp;
|
|
235
|
+
expectedFiles.set('meta.json', Buffer.from(JSON.stringify(expectedJson)));
|
|
236
|
+
}
|
|
237
|
+
function readVersionHash(value) {
|
|
238
|
+
const version = value.version;
|
|
239
|
+
if (!version || typeof version !== 'object' || Array.isArray(version)) {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
const hash = version.version;
|
|
243
|
+
return typeof hash === 'string' ? hash : undefined;
|
|
244
|
+
}
|
|
245
|
+
function parseJsonObject(buffer) {
|
|
246
|
+
const parsed = parseJsonValue(buffer);
|
|
247
|
+
if (!parsed.valid || !isJsonObject(parsed.value)) {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
return parsed.value;
|
|
251
|
+
}
|
|
252
|
+
function parseJsonValue(buffer) {
|
|
253
|
+
try {
|
|
254
|
+
return {
|
|
255
|
+
valid: true,
|
|
256
|
+
value: JSON.parse(buffer.toString('utf8')),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return { valid: false };
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function isJsonObject(value) {
|
|
264
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
265
|
+
}
|
|
266
|
+
function readJsonPath(value, path) {
|
|
267
|
+
let current = value;
|
|
268
|
+
for (const segment of path) {
|
|
269
|
+
if (!current || typeof current !== 'object') {
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
current = current[segment];
|
|
273
|
+
}
|
|
274
|
+
return current;
|
|
275
|
+
}
|
|
276
|
+
function jsonPointerFromPath(path) {
|
|
277
|
+
if (path.length === 0) {
|
|
278
|
+
return '';
|
|
279
|
+
}
|
|
280
|
+
return `/${path.map(escapeJsonPointerSegment).join('/')}`;
|
|
281
|
+
}
|
|
282
|
+
function escapeJsonPointerSegment(segment) {
|
|
283
|
+
return segment.replaceAll('~', '~0').replaceAll('/', '~1');
|
|
284
|
+
}
|
|
285
|
+
function bufferToText(buffer) {
|
|
286
|
+
return buffer.toString('utf8');
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=validate-sampler-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-sampler-output.js","sourceRoot":"","sources":["../../src/validation/validate-sampler-output.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thymian/plugin-sampler",
|
|
3
|
-
"version": "0.1.12
|
|
3
|
+
"version": "0.1.12",
|
|
4
4
|
"description": "Thymian plugin for generating HTTP request samples from API descriptions",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"bugs": {
|
|
@@ -41,9 +41,10 @@
|
|
|
41
41
|
"!**/*.tsbuildinfo"
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@
|
|
45
|
-
"@thymian/
|
|
46
|
-
"@thymian/
|
|
44
|
+
"@scalar/json-magic": "^0.9.0",
|
|
45
|
+
"@thymian/common-cli": "0.1.12",
|
|
46
|
+
"@thymian/core": "0.1.12",
|
|
47
|
+
"@thymian/plugin-request-dispatcher": "0.1.12",
|
|
47
48
|
"code-block-writer": "^13.0.3",
|
|
48
49
|
"jiti": "^2.6.1",
|
|
49
50
|
"json-schema-to-typescript": "^15.0.4",
|
|
@@ -63,7 +64,7 @@
|
|
|
63
64
|
}
|
|
64
65
|
},
|
|
65
66
|
"devDependencies": {
|
|
66
|
-
"@thymian/core-testing": "0.1.12
|
|
67
|
+
"@thymian/core-testing": "0.1.12",
|
|
67
68
|
"fast-json-stable-stringify": "^2.1.0",
|
|
68
69
|
"ts-morph": "^27.0.2"
|
|
69
70
|
}
|