@kirrosh/zond 0.22.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +811 -0
- package/README.md +59 -6
- package/package.json +9 -7
- package/src/CLAUDE.md +112 -0
- package/src/cli/argv.ts +122 -0
- package/src/cli/commands/add-api.ts +146 -0
- package/src/cli/commands/api/annotate/idempotency.ts +59 -0
- package/src/cli/commands/api/annotate/index.ts +880 -0
- package/src/cli/commands/api/annotate/lifecycle.ts +74 -0
- package/src/cli/commands/api/annotate/overlay.ts +206 -0
- package/src/cli/commands/api/annotate/pagination.ts +64 -0
- package/src/cli/commands/api/annotate/prompts.ts +220 -0
- package/src/cli/commands/api/annotate/readback.ts +58 -0
- package/src/cli/commands/api/annotate/resources.ts +91 -0
- package/src/cli/commands/api/annotate/seed-bodies.ts +61 -0
- package/src/cli/commands/audit.ts +786 -0
- package/src/cli/commands/catalog.ts +35 -0
- package/src/cli/commands/check.ts +361 -0
- package/src/cli/commands/checks.ts +1072 -0
- package/src/cli/commands/ci-init.ts +43 -0
- package/src/cli/commands/clean.ts +212 -0
- package/src/cli/commands/cleanup.ts +236 -0
- package/src/cli/commands/completions.ts +16 -0
- package/src/cli/commands/coverage.ts +823 -132
- package/src/cli/commands/db.ts +486 -12
- package/src/cli/commands/describe.ts +37 -2
- package/src/cli/commands/discover.ts +1356 -0
- package/src/cli/commands/doctor.ts +661 -0
- package/src/cli/commands/fixtures.ts +402 -0
- package/src/cli/commands/generate.ts +438 -47
- package/src/cli/commands/init/bootstrap.ts +34 -2
- package/src/cli/commands/{init.ts → init/index.ts} +99 -5
- package/src/cli/commands/init/skills.ts +99 -3
- package/src/cli/commands/init/templates/agents.md +77 -64
- package/src/cli/commands/init/templates/skills/warm-up-target.md +122 -0
- package/src/cli/commands/init/templates/skills/zond-checks.md +621 -0
- package/src/cli/commands/init/templates/skills/zond-seed.md +114 -0
- package/src/cli/commands/init/templates/skills/zond-triage.md +272 -0
- package/src/cli/commands/init/templates/skills/zond.md +802 -125
- package/src/cli/commands/init/templates/zond-config.yml +8 -9
- package/src/cli/commands/prepare-fixtures.ts +97 -0
- package/src/cli/commands/probe/_seed-bodies.ts +52 -0
- package/src/cli/commands/probe/mass-assignment.ts +594 -0
- package/src/cli/commands/probe/security.ts +537 -0
- package/src/cli/commands/probe/static.ts +255 -0
- package/src/cli/commands/probe/webhooks.ts +163 -0
- package/src/cli/commands/probe.ts +535 -0
- package/src/cli/commands/reference.ts +87 -0
- package/src/cli/commands/refresh-api.ts +227 -0
- package/src/cli/commands/remove-api.ts +150 -0
- package/src/cli/commands/report-bundle.ts +310 -0
- package/src/cli/commands/report.ts +241 -0
- package/src/cli/commands/request.ts +495 -4
- package/src/cli/commands/run.ts +870 -53
- package/src/cli/commands/schema-from-runs.ts +128 -0
- package/src/cli/commands/secrets.ts +133 -0
- package/src/cli/commands/session.ts +244 -0
- package/src/cli/commands/use.ts +18 -1
- package/src/cli/index.ts +20 -3
- package/src/cli/json-envelope.ts +92 -3
- package/src/cli/json-schemas.ts +314 -0
- package/src/cli/output.ts +17 -1
- package/src/cli/program.ts +199 -635
- package/src/cli/resolve.ts +105 -0
- package/src/cli/safe-live.ts +24 -0
- package/src/cli/status-filter.ts +114 -0
- package/src/cli/util/api-context.ts +85 -0
- package/src/cli/version.ts +5 -0
- package/src/core/audit/persist.ts +183 -0
- package/src/core/checks/budget.ts +59 -0
- package/src/core/checks/checks/_crud-helpers.ts +133 -0
- package/src/core/checks/checks/_negative_mutator.ts +133 -0
- package/src/core/checks/checks/_readback-helpers.ts +133 -0
- package/src/core/checks/checks/content_type_conformance.ts +39 -0
- package/src/core/checks/checks/cross_call_references.ts +147 -0
- package/src/core/checks/checks/cursor_boundary_fuzzing.ts +219 -0
- package/src/core/checks/checks/ensure_resource_availability.ts +62 -0
- package/src/core/checks/checks/idempotency_replay.ts +242 -0
- package/src/core/checks/checks/ignored_auth.ts +254 -0
- package/src/core/checks/checks/index.ts +68 -0
- package/src/core/checks/checks/lifecycle_transitions.ts +416 -0
- package/src/core/checks/checks/missing_required_header.ts +40 -0
- package/src/core/checks/checks/negative_data_rejection.ts +148 -0
- package/src/core/checks/checks/not_a_server_error.ts +35 -0
- package/src/core/checks/checks/open_cors_on_sensitive.ts +160 -0
- package/src/core/checks/checks/pagination_invariants.ts +419 -0
- package/src/core/checks/checks/positive_data_acceptance.ts +33 -0
- package/src/core/checks/checks/rate_limit_headers_absent.ts +77 -0
- package/src/core/checks/checks/response_headers_conformance.ts +74 -0
- package/src/core/checks/checks/response_schema_conformance.ts +30 -0
- package/src/core/checks/checks/status_code_conformance.ts +132 -0
- package/src/core/checks/checks/unsupported_method.ts +63 -0
- package/src/core/checks/checks/use_after_free.ts +78 -0
- package/src/core/checks/index.ts +30 -0
- package/src/core/checks/mode.ts +82 -0
- package/src/core/checks/recommended-action.ts +68 -0
- package/src/core/checks/registry.ts +78 -0
- package/src/core/checks/runner.ts +1461 -0
- package/src/core/checks/sarif.ts +230 -0
- package/src/core/checks/spec-findings.ts +308 -0
- package/src/core/checks/stateful.ts +121 -0
- package/src/core/checks/types.ts +305 -0
- package/src/core/checks/zond-extensions.ts +73 -0
- package/src/core/classifier/recommended-action.ts +251 -0
- package/src/core/context/current.ts +22 -6
- package/src/core/context/session.ts +78 -0
- package/src/core/coverage/loader.ts +216 -0
- package/src/core/coverage/reasons.ts +300 -0
- package/src/core/diagnostics/db-analysis.ts +293 -59
- package/src/core/diagnostics/failure-class.ts +140 -0
- package/src/core/diagnostics/failure-hints.ts +88 -89
- package/src/core/diagnostics/spec-pointer.ts +99 -0
- package/src/core/diagnostics/suggested-fixes.ts +155 -0
- package/src/core/exporter/case-study/index.ts +270 -0
- package/src/core/exporter/curl.ts +40 -0
- package/src/core/exporter/exporter.ts +48 -0
- package/src/core/exporter/html-report/escape.ts +24 -0
- package/src/core/exporter/html-report/index.ts +479 -0
- package/src/core/exporter/html-report/script.ts +100 -0
- package/src/core/exporter/html-report/styles.ts +408 -0
- package/src/core/generator/chunker.ts +38 -19
- package/src/core/generator/coverage-phase.ts +0 -0
- package/src/core/generator/data-factory.ts +586 -22
- package/src/core/generator/describe.ts +1 -1
- package/src/core/generator/fixtures-builder.ts +332 -0
- package/src/core/generator/index.ts +5 -5
- package/src/core/generator/openapi-reader.ts +135 -7
- package/src/core/generator/path-param-disambig.ts +140 -0
- package/src/core/generator/resources-builder.ts +898 -0
- package/src/core/generator/schema-utils.ts +33 -3
- package/src/core/generator/serializer.ts +103 -13
- package/src/core/generator/suite-generator.ts +583 -122
- package/src/core/generator/types.ts +14 -0
- package/src/core/identity/identity-file.ts +0 -0
- package/src/core/lint/affects.ts +28 -0
- package/src/core/lint/config.ts +96 -0
- package/src/core/lint/format.ts +42 -0
- package/src/core/lint/index.ts +94 -0
- package/src/core/lint/reporter.ts +128 -0
- package/src/core/lint/rules/consistency.ts +158 -0
- package/src/core/lint/rules/heuristics.ts +97 -0
- package/src/core/lint/rules/strictness.ts +109 -0
- package/src/core/lint/types.ts +96 -0
- package/src/core/lint/walker.ts +248 -0
- package/src/core/meta/meta-store.ts +6 -73
- package/src/core/output/README.md +73 -0
- package/src/core/output/index.ts +13 -0
- package/src/core/output/run.ts +91 -0
- package/src/core/output/types.ts +122 -0
- package/src/core/parser/dynamic-values.ts +160 -0
- package/src/core/parser/env-interpolation.ts +104 -0
- package/src/core/parser/filter.ts +57 -0
- package/src/core/parser/schema.ts +129 -4
- package/src/core/parser/types.ts +19 -1
- package/src/core/parser/variables.ts +0 -0
- package/src/core/parser/yaml-parser.ts +58 -12
- package/src/core/probe/bootstrap.ts +34 -0
- package/src/core/probe/dry-run-envelope.ts +61 -0
- package/src/core/probe/mass-assignment/classify.ts +175 -0
- package/src/core/probe/mass-assignment/cleanup.ts +52 -0
- package/src/core/probe/mass-assignment/digest.ts +114 -0
- package/src/core/probe/mass-assignment/orchestrator.ts +459 -0
- package/src/core/probe/mass-assignment/regression.ts +141 -0
- package/src/core/probe/mass-assignment/suspects.ts +92 -0
- package/src/core/probe/mass-assignment/types.ts +135 -0
- package/src/core/probe/mass-assignment-probe-class.ts +198 -0
- package/src/core/probe/mass-assignment-probe.ts +27 -0
- package/src/core/probe/mass-assignment-template.ts +240 -0
- package/src/core/probe/method-probe.ts +43 -76
- package/src/core/probe/method-shared.ts +69 -0
- package/src/core/probe/negative-probe.ts +183 -149
- package/src/core/probe/orphan-tracker.ts +188 -0
- package/src/core/probe/path-discovery.ts +439 -0
- package/src/core/probe/probe-harness.ts +119 -0
- package/src/core/probe/registry.ts +89 -0
- package/src/core/probe/runner.ts +136 -0
- package/src/core/probe/security/baseline.ts +174 -0
- package/src/core/probe/security/classify.ts +341 -0
- package/src/core/probe/security/cleanup.ts +125 -0
- package/src/core/probe/security/detectors.ts +71 -0
- package/src/core/probe/security/digest.ts +104 -0
- package/src/core/probe/security/orchestrator.ts +398 -0
- package/src/core/probe/security/regression.ts +103 -0
- package/src/core/probe/security/types.ts +151 -0
- package/src/core/probe/security-probe-class.ts +207 -0
- package/src/core/probe/security-probe.ts +32 -0
- package/src/core/probe/shared.ts +531 -0
- package/src/core/probe/static-probe-class.ts +125 -0
- package/src/core/probe/types.ts +165 -0
- package/src/core/probe/verdict-aggregator.ts +33 -0
- package/src/core/probe/webhooks-probe.ts +282 -0
- package/src/core/reporter/console.ts +41 -2
- package/src/core/reporter/index.ts +2 -3
- package/src/core/reporter/json.ts +11 -1
- package/src/core/reporter/junit.ts +27 -12
- package/src/core/reporter/ndjson.ts +37 -0
- package/src/core/reporter/types.ts +3 -0
- package/src/core/runner/assertions.ts +59 -2
- package/src/core/runner/async-pool.ts +108 -0
- package/src/core/runner/auth-path.ts +8 -0
- package/src/core/runner/ci-context.ts +72 -0
- package/src/core/runner/executor.ts +265 -36
- package/src/core/runner/form-encode.ts +41 -0
- package/src/core/runner/http-client.ts +112 -2
- package/src/core/runner/learn-drift.ts +293 -0
- package/src/core/runner/preflight-vars.ts +153 -0
- package/src/core/runner/progress-tracker.ts +73 -0
- package/src/core/runner/rate-limiter.ts +87 -33
- package/src/core/runner/run-kind.ts +45 -0
- package/src/core/runner/schema-validator.ts +308 -0
- package/src/core/runner/send-request.ts +158 -20
- package/src/core/runner/types.ts +44 -0
- package/src/core/secrets/registry.ts +164 -0
- package/src/core/secrets/secrets-file.ts +115 -0
- package/src/core/selectors/operation-filter.ts +144 -0
- package/src/core/setup-api.ts +457 -20
- package/src/core/severity/category.ts +94 -0
- package/src/core/severity/index.ts +58 -0
- package/src/core/spec/infer-schema.ts +102 -0
- package/src/core/spec/layers.ts +154 -0
- package/src/core/spec/merge-specs.ts +156 -0
- package/src/core/spec/schema-from-runs.ts +117 -0
- package/src/core/spec/schema-overlay.ts +130 -0
- package/src/core/util/ajv.ts +13 -0
- package/src/core/util/format-eta.ts +21 -0
- package/src/core/util/headers.ts +9 -0
- package/src/core/util/url.ts +24 -0
- package/src/core/utils.ts +5 -1
- package/src/core/workspace/config.ts +129 -0
- package/src/core/workspace/fixture-gap-report.ts +84 -0
- package/src/core/workspace/fixture-gaps.ts +71 -0
- package/src/core/workspace/manifest.ts +283 -0
- package/src/core/workspace/output-rotation.ts +62 -0
- package/src/core/workspace/root.ts +13 -11
- package/src/core/workspace/triage-path.ts +87 -0
- package/src/db/lint-runs.ts +47 -0
- package/src/db/migrate.ts +128 -0
- package/src/db/migrations/0001_run_kind.sql +25 -0
- package/src/db/migrations/0002_run_kind_request.sql +59 -0
- package/src/db/migrations/sql.d.ts +4 -0
- package/src/db/queries/collections.ts +133 -0
- package/src/db/queries/coverage.ts +9 -0
- package/src/db/queries/dashboard.ts +59 -0
- package/src/db/queries/results.ts +216 -0
- package/src/db/queries/runs.ts +289 -0
- package/src/db/queries/sessions.ts +42 -0
- package/src/db/queries/settings.ts +28 -0
- package/src/db/queries/types.ts +172 -0
- package/src/db/queries.ts +75 -802
- package/src/db/schema.ts +178 -50
- package/src/cli/commands/export.ts +0 -144
- package/src/cli/commands/guide.ts +0 -127
- package/src/cli/commands/init/templates/skills/scenarios.md +0 -97
- package/src/cli/commands/probe-methods.ts +0 -108
- package/src/cli/commands/probe-validation.ts +0 -124
- package/src/cli/commands/serve.ts +0 -114
- package/src/cli/commands/sync.ts +0 -268
- package/src/cli/commands/update.ts +0 -189
- package/src/cli/commands/validate.ts +0 -34
- package/src/core/diagnostics/render-md.ts +0 -112
- package/src/core/exporter/postman.ts +0 -963
- package/src/core/generator/guide-builder.ts +0 -253
- package/src/core/meta/types.ts +0 -19
- package/src/core/parser/index.ts +0 -21
- package/src/core/runner/execute-run.ts +0 -132
- package/src/core/runner/index.ts +0 -12
- package/src/core/sync/spec-differ.ts +0 -38
- package/src/web/data/collection-state.ts +0 -362
- package/src/web/routes/api.ts +0 -314
- package/src/web/routes/dashboard.ts +0 -350
- package/src/web/routes/runs.ts +0 -64
- package/src/web/schemas.ts +0 -121
- package/src/web/server.ts +0 -134
- package/src/web/static/htmx.min.cjs +0 -1
- package/src/web/static/style.css +0 -1148
- package/src/web/views/endpoints-tab.ts +0 -174
- package/src/web/views/explorer-tab.ts +0 -402
- package/src/web/views/health-strip.ts +0 -92
- package/src/web/views/layout.ts +0 -48
- package/src/web/views/results.ts +0 -210
- package/src/web/views/runs-tab.ts +0 -126
- package/src/web/views/suites-tab.ts +0 -181
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disambiguate generic path-parameter names that collide across resources.
|
|
3
|
+
*
|
|
4
|
+
* Some OpenAPI specs declare item paths as `/<resource>/{id}` instead of
|
|
5
|
+
* `/<resource>/{<resource>_id}` — fine
|
|
6
|
+
* within one resource, catastrophic across many: the manifest derives one
|
|
7
|
+
* global `id` var, `.env.yaml` stores one value, and N>1 CRUD suites end up
|
|
8
|
+
* pointing at the same uuid (false 404 at best; false 200 against a stranger's
|
|
9
|
+
* object at worst — the GET returns a real object so the test "passes" while
|
|
10
|
+
* having tested nothing of the target resource).
|
|
11
|
+
*
|
|
12
|
+
* ARV-40 fix: when a generic param name (`id`, `slug`, `uuid`, `key`,
|
|
13
|
+
* `identifier`) appears under more than one distinct parent collection in the
|
|
14
|
+
* spec, rewrite each occurrence to `<parent_singular>_<param>` in
|
|
15
|
+
* EndpointInfo.path AND the matching parameter entry. All downstream code
|
|
16
|
+
* (resource map, fixture manifest, suite generator, mass-assignment probe)
|
|
17
|
+
* then sees per-resource var names without any extra plumbing.
|
|
18
|
+
*
|
|
19
|
+
* The on-disk OpenAPI spec.json is untouched — this is an in-memory
|
|
20
|
+
* normalisation. Coverage matches by structural shape (`{x}` is `{x}`), and
|
|
21
|
+
* the runner substitutes `{{var}}` after path templating, so renaming
|
|
22
|
+
* `{id}` → `{template_id}` only affects how zond *names* the variable.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { EndpointInfo } from "./types.ts";
|
|
26
|
+
|
|
27
|
+
const GENERIC_PARAM_NAMES = new Set(["id", "slug", "uuid", "key", "name", "identifier", "code"]);
|
|
28
|
+
|
|
29
|
+
// ARV-376: read-by-id accessor markers. `/business-segment20/byid/{id}` names
|
|
30
|
+
// the resource `business-segment20`, not `byid` — the `byid` (or `by-id`)
|
|
31
|
+
// segment is a "get by id" verb, not the owning collection. Without skipping
|
|
32
|
+
// it, every `/*/byid/{id}` across the spec collapses to one global `byid_id`
|
|
33
|
+
// var with no owner resource, so prepare-fixtures reports `miss-no-list`.
|
|
34
|
+
const ACCESSOR_MARKER_SEGS = new Set(["byid", "by-id", "by_id"]);
|
|
35
|
+
|
|
36
|
+
// ARV-381: version segments (`v30`, `v2`) sit between the collection and its
|
|
37
|
+
// id/code param (`/api/macros/v30/{code}`). owningCollectionForPathParam +
|
|
38
|
+
// CRUD resource-name derivation ALREADY strip these via
|
|
39
|
+
// stripTrailingVersionSegments; the disambig parent-walk must skip them too,
|
|
40
|
+
// or `macros_v30_code` (scoped past the version) has no matching resource in
|
|
41
|
+
// the graph → miss-no-list. Same regex as stripTrailingVersionSegments.
|
|
42
|
+
function isVersionSeg(seg: string): boolean {
|
|
43
|
+
return /^v(ersion)?\d+$/i.test(seg);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function isParamSeg(seg: string | undefined): boolean {
|
|
47
|
+
return !!seg && /^\{[^}]+\}$/.test(seg);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Segments the parent-walk steps over to reach the owning collection:
|
|
51
|
+
* read-by-id accessor markers and version segments. */
|
|
52
|
+
function isSkippableSeg(seg: string): boolean {
|
|
53
|
+
return ACCESSOR_MARKER_SEGS.has(seg.toLowerCase()) || isVersionSeg(seg);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** English singularization sufficient for resource-collection nouns. */
|
|
57
|
+
function singularize(word: string): string {
|
|
58
|
+
if (word.length > 3 && /ies$/i.test(word)) return word.slice(0, -3) + "y";
|
|
59
|
+
if (word.length > 3 && /(ch|sh|x|ss|z)es$/i.test(word)) return word.slice(0, -2);
|
|
60
|
+
if (word.length > 1 && /[^s]s$/i.test(word)) return word.slice(0, -1);
|
|
61
|
+
return word;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Turn a path segment (`contact-properties`) into an identifier stem (`contact_property`). */
|
|
65
|
+
function segToStem(seg: string): string {
|
|
66
|
+
return singularize(seg).replace(/[^a-zA-Z0-9]+/g, "_").toLowerCase();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface Occurrence {
|
|
70
|
+
ep: EndpointInfo;
|
|
71
|
+
/** Index of the {param} segment in the path. */
|
|
72
|
+
segIdx: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Mutates endpoints in place; returns the same array for chaining. */
|
|
76
|
+
export function disambiguateGenericPathParams(endpoints: EndpointInfo[]): EndpointInfo[] {
|
|
77
|
+
// param-name → parent-seg → occurrences
|
|
78
|
+
const byParamParent = new Map<string, Map<string, Occurrence[]>>();
|
|
79
|
+
|
|
80
|
+
for (const ep of endpoints) {
|
|
81
|
+
const segs = ep.path.split("/");
|
|
82
|
+
for (let i = 0; i < segs.length; i++) {
|
|
83
|
+
const m = /^\{([^}]+)\}$/.exec(segs[i]!);
|
|
84
|
+
if (!m) continue;
|
|
85
|
+
const paramName = m[1]!;
|
|
86
|
+
if (!GENERIC_PARAM_NAMES.has(paramName.toLowerCase())) continue;
|
|
87
|
+
// Walk back to nearest non-param non-empty segment as "parent",
|
|
88
|
+
// skipping read-by-id accessor markers (`byid`, ARV-376) and version
|
|
89
|
+
// segments (`v30`, ARV-381) so the owning collection — not an accessor
|
|
90
|
+
// verb or version marker — names the param.
|
|
91
|
+
let parent: string | undefined;
|
|
92
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
93
|
+
const s = segs[j]!;
|
|
94
|
+
if (s && !isParamSeg(s) && !isSkippableSeg(s)) {
|
|
95
|
+
parent = s;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!parent) continue;
|
|
100
|
+
let perParent = byParamParent.get(paramName);
|
|
101
|
+
if (!perParent) {
|
|
102
|
+
perParent = new Map();
|
|
103
|
+
byParamParent.set(paramName, perParent);
|
|
104
|
+
}
|
|
105
|
+
const arr = perParent.get(parent) ?? [];
|
|
106
|
+
arr.push({ ep, segIdx: i });
|
|
107
|
+
perParent.set(parent, arr);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
for (const [paramName, perParent] of byParamParent) {
|
|
112
|
+
// Only rename when the param collides across ≥2 parents — single-resource
|
|
113
|
+
// use of `{id}` stays as-is to avoid churning user .env.yaml entries on
|
|
114
|
+
// APIs where the convention isn't a problem.
|
|
115
|
+
if (perParent.size < 2) continue;
|
|
116
|
+
const lowerParam = paramName.toLowerCase();
|
|
117
|
+
for (const [parent, occs] of perParent) {
|
|
118
|
+
const stem = segToStem(parent);
|
|
119
|
+
if (!stem) continue;
|
|
120
|
+
const newName = lowerParam === "id" ? `${stem}_id` : `${stem}_${lowerParam}`;
|
|
121
|
+
// Skip rename if newName collides with an unrelated existing name
|
|
122
|
+
// for the same endpoint (would corrupt parameters[]). Cheap guard.
|
|
123
|
+
for (const occ of occs) {
|
|
124
|
+
// ARV-183: preserve the original spec path before mutating, so
|
|
125
|
+
// downstream checks (status_code_conformance, response_headers_conformance)
|
|
126
|
+
// can still look up `doc.paths[...]` by string equality. Set only
|
|
127
|
+
// on first rename — subsequent renames of the same endpoint keep
|
|
128
|
+
// the truly original path.
|
|
129
|
+
if (occ.ep.originalPath === undefined) occ.ep.originalPath = occ.ep.path;
|
|
130
|
+
const segs = occ.ep.path.split("/");
|
|
131
|
+
segs[occ.segIdx] = `{${newName}}`;
|
|
132
|
+
occ.ep.path = segs.join("/");
|
|
133
|
+
const param = occ.ep.parameters.find(p => p.name === paramName && p.in === "path");
|
|
134
|
+
if (param) (param as { name: string }).name = newName;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return endpoints;
|
|
140
|
+
}
|