usedesign 0.2.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/LICENSE +201 -0
- package/README.md +85 -0
- package/dist/checks.d.ts +29 -0
- package/dist/checks.js +0 -0
- package/dist/checks.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +131 -0
- package/dist/cli.js.map +1 -0
- package/dist/conformance.d.ts +8 -0
- package/dist/conformance.js +92 -0
- package/dist/conformance.js.map +1 -0
- package/dist/core.d.ts +52 -0
- package/dist/core.js +133 -0
- package/dist/core.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/schema/config.schema.json +61 -0
- package/dist/schema/operation-card.schema.json +984 -0
- package/dist/schema/route-inventory.schema.json +51 -0
- package/dist/validate.d.ts +18 -0
- package/dist/validate.js +259 -0
- package/dist/validate.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/nistoc/usedesign/schema/route-inventory.schema.json",
|
|
4
|
+
"title": "usedesign route inventory",
|
|
5
|
+
"description": "What the code actually registers, as an explicit artifact. Produced by the checked repository — usedesign consumes this, it does not extract routes. See design/route-conformance.md §3.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["usedesign_inventory", "produced_by", "routes"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"usedesign_inventory": {
|
|
11
|
+
"const": 1,
|
|
12
|
+
"description": "Format version."
|
|
13
|
+
},
|
|
14
|
+
"produced_by": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"minLength": 1,
|
|
17
|
+
"$comment": "Required. An inventory whose origin is unknown cannot be judged: a runtime dump and a hand-written list carry very different weight, and check 1 is only as trustworthy as its input.",
|
|
18
|
+
"description": "How this list was produced — e.g. 'runtime dump, express 4.19' or 'static extraction, scripts/routes.py'."
|
|
19
|
+
},
|
|
20
|
+
"produced_at": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"format": "date-time",
|
|
23
|
+
"description": "Optional. A stale inventory is a silent lie; recording when it was taken lets a checker warn."
|
|
24
|
+
},
|
|
25
|
+
"routes": {
|
|
26
|
+
"type": "array",
|
|
27
|
+
"minItems": 1,
|
|
28
|
+
"$comment": "An empty inventory is almost always a failed dump rather than an application with no routes — and silently passing check 1 on a failed dump is the worst outcome the check can produce.",
|
|
29
|
+
"items": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"required": ["method", "path"],
|
|
32
|
+
"additionalProperties": false,
|
|
33
|
+
"properties": {
|
|
34
|
+
"method": {
|
|
35
|
+
"enum": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"],
|
|
36
|
+
"description": "One entry per method. A handler registered for two methods produces two entries."
|
|
37
|
+
},
|
|
38
|
+
"path": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"pattern": "^/",
|
|
41
|
+
"description": "The final path as served, including any mount prefix. Parameter syntax is whatever the framework uses — the checker normalises it."
|
|
42
|
+
},
|
|
43
|
+
"source": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "Optional, for humans reading a diff. Never used for matching."
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Card, Finding } from "./core.js";
|
|
2
|
+
export declare const REPO: string;
|
|
3
|
+
export declare const MATURITY: string[];
|
|
4
|
+
/**
|
|
5
|
+
* Where the published schema is. In the repository it is `schema/` at the root; in a published
|
|
6
|
+
* package it is copied next to the compiled code at build time. Both are the *same file* — the
|
|
7
|
+
* tool never carries a private variant of the schema it claims to implement, because that is how
|
|
8
|
+
* a schema and its implementation quietly start to disagree.
|
|
9
|
+
*/
|
|
10
|
+
export declare function schemaPathFor(name?: string): string;
|
|
11
|
+
/** Validate a card's *form* against the published JSON Schema. */
|
|
12
|
+
export declare function validateSchema(fm: Card): Finding[];
|
|
13
|
+
/**
|
|
14
|
+
* Validate one card's *meaning*. `knownIds` enables the cross-card reference warnings; pass null
|
|
15
|
+
* when validating a card on its own, so that pointing at a card outside the set is not reported
|
|
16
|
+
* as if it were missing.
|
|
17
|
+
*/
|
|
18
|
+
export declare function validate(fm: Card, filename?: string, knownIds?: Set<string> | null): Finding[];
|
package/dist/validate.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card validation: the JSON Schema for form, and the cross-reference rules for meaning.
|
|
3
|
+
*
|
|
4
|
+
* SPEC §7 draws the line — the schema says whether a card is *shaped* like a card, and this file
|
|
5
|
+
* says whether it *means* anything. A schema cannot know that a test covers a step that does not
|
|
6
|
+
* exist, and a hand-written rule should not be re-checking that `maturity` is a string.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { dirname, join, basename } from "node:path";
|
|
11
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
12
|
+
import addFormats from "ajv-formats";
|
|
13
|
+
import { Finding } from "./core.js";
|
|
14
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
export const REPO = join(HERE, "..", "..", "..");
|
|
16
|
+
const REQUIRED = ["id", "title", "actors", "maturity", "steps", "concurrency", "interfaces", "data", "provenance", "reversibility"];
|
|
17
|
+
export const MATURITY = ["conceived", "designed", "implemented", "tested", "in_production", "deprecated"];
|
|
18
|
+
const CONCURRENCY_MODES = ["etag_required", "idempotency_by_header", "idempotency_by_formula", "none_by_design"];
|
|
19
|
+
const TRANSPORTS = ["http_rest", "json_rpc", "in_process", "ui"];
|
|
20
|
+
const TEST_LEVELS = ["unit", "integration", "ui", "contract"];
|
|
21
|
+
const OPERATION_ID = /^[a-z0-9]+(\.[a-z0-9-]+){2,}$/;
|
|
22
|
+
const STEP_ID = /^s[0-9]+-[a-z0-9-]+$/;
|
|
23
|
+
/** maturity level → the evidence key it must carry */
|
|
24
|
+
const EVIDENCE_FOR = {
|
|
25
|
+
implemented: "implemented",
|
|
26
|
+
tested: "tested",
|
|
27
|
+
in_production: "deployed",
|
|
28
|
+
};
|
|
29
|
+
let compiled = null;
|
|
30
|
+
/**
|
|
31
|
+
* Where the published schema is. In the repository it is `schema/` at the root; in a published
|
|
32
|
+
* package it is copied next to the compiled code at build time. Both are the *same file* — the
|
|
33
|
+
* tool never carries a private variant of the schema it claims to implement, because that is how
|
|
34
|
+
* a schema and its implementation quietly start to disagree.
|
|
35
|
+
*/
|
|
36
|
+
export function schemaPathFor(name = "operation-card.schema.json") {
|
|
37
|
+
const packaged = join(HERE, "schema", name);
|
|
38
|
+
return existsSync(packaged) ? packaged : join(REPO, "schema", name);
|
|
39
|
+
}
|
|
40
|
+
/** Compile the published schema once. */
|
|
41
|
+
function schemaValidator(schemaPath = schemaPathFor()) {
|
|
42
|
+
if (compiled)
|
|
43
|
+
return compiled;
|
|
44
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
45
|
+
addFormats.default ? addFormats.default(ajv) : addFormats(ajv);
|
|
46
|
+
compiled = ajv.compile(JSON.parse(readFileSync(schemaPath, "utf8")));
|
|
47
|
+
return compiled;
|
|
48
|
+
}
|
|
49
|
+
/** Validate a card's *form* against the published JSON Schema. */
|
|
50
|
+
export function validateSchema(fm) {
|
|
51
|
+
const validator = schemaValidator();
|
|
52
|
+
if (validator(fm))
|
|
53
|
+
return [];
|
|
54
|
+
return (validator.errors ?? []).map((error) => new Finding("schema_violation", `${error.instancePath || "/"} ${error.message}`.trim()));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate one card's *meaning*. `knownIds` enables the cross-card reference warnings; pass null
|
|
58
|
+
* when validating a card on its own, so that pointing at a card outside the set is not reported
|
|
59
|
+
* as if it were missing.
|
|
60
|
+
*/
|
|
61
|
+
export function validate(fm, filename = "", knownIds = null) {
|
|
62
|
+
const out = [];
|
|
63
|
+
const err = (code, detail) => out.push(new Finding(code, detail));
|
|
64
|
+
const warn = (code, detail) => out.push(new Finding(code, detail, "warning"));
|
|
65
|
+
for (const field of REQUIRED) {
|
|
66
|
+
if (!(field in fm))
|
|
67
|
+
err("missing_required_field", `\`${field}\` is absent`);
|
|
68
|
+
}
|
|
69
|
+
const cardId = fm["id"] ?? "";
|
|
70
|
+
if (cardId && !OPERATION_ID.test(cardId)) {
|
|
71
|
+
err("malformed_operation_id", `\`${cardId}\` is not <area>.<object>.<action>`);
|
|
72
|
+
}
|
|
73
|
+
if (filename && cardId && basename(filename).replace(/\.md$/, "") !== `${cardId}.op`) {
|
|
74
|
+
warn("filename_mismatch", `file name does not match id \`${cardId}\``);
|
|
75
|
+
}
|
|
76
|
+
if (!("scenario" in fm) && !("serves_step" in fm)) {
|
|
77
|
+
err("no_owner", "neither `scenario` nor `serves_step` is present");
|
|
78
|
+
}
|
|
79
|
+
const maturity = fm["maturity"];
|
|
80
|
+
if (maturity !== undefined && !MATURITY.includes(maturity)) {
|
|
81
|
+
err("invalid_enum_value", `maturity \`${maturity}\` is not one of ${MATURITY}`);
|
|
82
|
+
}
|
|
83
|
+
// ── steps ──────────────────────────────────────────────────────────────────────────────────
|
|
84
|
+
const steps = fm["steps"] ?? [];
|
|
85
|
+
const stepIds = new Set();
|
|
86
|
+
for (const step of steps) {
|
|
87
|
+
const sid = step?.id ?? "";
|
|
88
|
+
if (!STEP_ID.test(sid))
|
|
89
|
+
err("malformed_step_id", `\`${sid}\` is not s<N>-<name>`);
|
|
90
|
+
else if (stepIds.has(sid))
|
|
91
|
+
err("duplicate_step_id", `\`${sid}\` appears more than once`);
|
|
92
|
+
stepIds.add(sid);
|
|
93
|
+
}
|
|
94
|
+
// ── maturity vs evidence ───────────────────────────────────────────────────────────────────
|
|
95
|
+
const evidence = fm["maturity_evidence"] ?? {};
|
|
96
|
+
const tests = fm["tests"] ?? [];
|
|
97
|
+
if (maturity && maturity in EVIDENCE_FOR) {
|
|
98
|
+
// Every level implies the ones below it.
|
|
99
|
+
for (const level of ["implemented", "tested", "in_production"]) {
|
|
100
|
+
if (MATURITY.indexOf(maturity) >= MATURITY.indexOf(level)) {
|
|
101
|
+
const key = EVIDENCE_FOR[level];
|
|
102
|
+
if (!(key in evidence)) {
|
|
103
|
+
err("maturity_without_evidence", `\`${maturity}\` claimed without \`maturity_evidence.${key}\``);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (maturity && ["tested", "in_production"].includes(maturity) && tests.length === 0) {
|
|
109
|
+
err("maturity_without_tests", `\`${maturity}\` claimed with an empty \`tests[]\``);
|
|
110
|
+
}
|
|
111
|
+
// ── concurrency ────────────────────────────────────────────────────────────────────────────
|
|
112
|
+
const concurrency = fm["concurrency"] ?? {};
|
|
113
|
+
const mode = concurrency["mode"];
|
|
114
|
+
if (mode !== undefined && !CONCURRENCY_MODES.includes(mode)) {
|
|
115
|
+
err("invalid_enum_value", `concurrency.mode \`${mode}\` is not one of ${CONCURRENCY_MODES}`);
|
|
116
|
+
}
|
|
117
|
+
if (mode && mode !== "etag_required" && !concurrency["rationale"]) {
|
|
118
|
+
err("relaxation_without_rationale", `mode \`${mode}\` weakens protection without a rationale`);
|
|
119
|
+
}
|
|
120
|
+
if (mode === "idempotency_by_formula" && !concurrency["formula"]) {
|
|
121
|
+
err("missing_required_field", "idempotency_by_formula without `formula`");
|
|
122
|
+
}
|
|
123
|
+
// ── interfaces ─────────────────────────────────────────────────────────────────────────────
|
|
124
|
+
const interfaces = fm["interfaces"] ?? {};
|
|
125
|
+
if (Object.keys(interfaces).length === 0) {
|
|
126
|
+
err("missing_required_field", "at least one interface is required");
|
|
127
|
+
}
|
|
128
|
+
for (const [name, iface] of Object.entries(interfaces)) {
|
|
129
|
+
const transport = iface?.transport;
|
|
130
|
+
if (!transport)
|
|
131
|
+
err("missing_transport", `interface \`${name}\` does not declare a transport`);
|
|
132
|
+
else if (!TRANSPORTS.includes(transport)) {
|
|
133
|
+
err("invalid_enum_value", `interface \`${name}\`: transport \`${transport}\` is unknown`);
|
|
134
|
+
}
|
|
135
|
+
for (const ref of iface?.covers_steps ?? []) {
|
|
136
|
+
if (!stepIds.has(ref))
|
|
137
|
+
err("unknown_step_reference", `interface \`${name}\` covers unknown step \`${ref}\``);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ── tests ──────────────────────────────────────────────────────────────────────────────────
|
|
141
|
+
const covered = new Set();
|
|
142
|
+
for (const test of tests) {
|
|
143
|
+
const refs = Array.isArray(test?.covers) ? test.covers : [test?.covers];
|
|
144
|
+
for (const ref of refs) {
|
|
145
|
+
if (!stepIds.has(ref))
|
|
146
|
+
err("unknown_step_reference", `test \`${test?.id}\` covers unknown step \`${ref}\``);
|
|
147
|
+
covered.add(ref);
|
|
148
|
+
}
|
|
149
|
+
if (!TEST_LEVELS.includes(test?.level)) {
|
|
150
|
+
err("invalid_enum_value", `test \`${test?.id}\`: level \`${test?.level}\` is unknown`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const gaps = new Set((fm["coverage_gaps"] ?? []).map((gap) => gap?.step));
|
|
154
|
+
for (const gap of gaps) {
|
|
155
|
+
if (!stepIds.has(gap))
|
|
156
|
+
err("unknown_step_reference", `coverage_gaps names unknown step \`${gap}\``);
|
|
157
|
+
}
|
|
158
|
+
for (const sid of stepIds) {
|
|
159
|
+
if (!covered.has(sid) && !gaps.has(sid)) {
|
|
160
|
+
warn("step_unproven", `step \`${sid}\` has no test and no declared gap`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// ── outcomes, continuation, parameters ─────────────────────────────────────────────────────
|
|
164
|
+
//
|
|
165
|
+
// Three rules that need nothing but the card itself. Each one exists because the field it
|
|
166
|
+
// guards is otherwise a claim nobody can be wrong about — and a claim nobody can be wrong
|
|
167
|
+
// about is a claim nobody maintains.
|
|
168
|
+
const outcomes = fm["outcomes"] ?? [];
|
|
169
|
+
const outcomeIds = new Set(outcomes.map((o) => o?.id));
|
|
170
|
+
for (const [name, iface] of Object.entries(interfaces)) {
|
|
171
|
+
const declared = iface?.responses ?? [];
|
|
172
|
+
if (declared.length === 0)
|
|
173
|
+
continue; // the field is optional; absent is not a claim
|
|
174
|
+
const returned = new Map();
|
|
175
|
+
for (const step of steps) {
|
|
176
|
+
const code = step?.on_violation?.http;
|
|
177
|
+
if (typeof code === "number")
|
|
178
|
+
returned.set(code, `step \`${step.id}\``);
|
|
179
|
+
}
|
|
180
|
+
for (const outcome of outcomes) {
|
|
181
|
+
if (typeof outcome?.http === "number")
|
|
182
|
+
returned.set(outcome.http, `outcome \`${outcome.id}\``);
|
|
183
|
+
}
|
|
184
|
+
for (const [code, who] of returned) {
|
|
185
|
+
if (!declared.includes(code)) {
|
|
186
|
+
err("undeclared_response", `interface \`${name}\`: ${who} returns ${code}, absent from \`responses\``);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// A violated step that answers with success is either a typo or not a violation at all. The
|
|
191
|
+
// second case is real: a bulk operation reports per-item failures inside a 200, and the whole
|
|
192
|
+
// shape of `steps[]` — violated, therefore stopped, therefore an error code — does not fit it.
|
|
193
|
+
// A warning, not an error, because the honest bulk card would otherwise be unwritable.
|
|
194
|
+
const perItem = fm["per_item"];
|
|
195
|
+
for (const step of steps) {
|
|
196
|
+
const code = step?.on_violation?.http;
|
|
197
|
+
if (typeof code === "number" && code >= 200 && code < 300) {
|
|
198
|
+
if (perItem) {
|
|
199
|
+
// With `per_item` declared there is a true place to write this, so writing it falsely
|
|
200
|
+
// is a mistake rather than a shortage of vocabulary.
|
|
201
|
+
err("per_item_failure_as_violation", `step \`${step.id}\` answers ${code}; this card declares \`per_item\`, so a per-item failure belongs there and carries no status`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
warn("violation_with_success_status", `step \`${step.id}\` is violated yet answers ${code} — either a typo, or this is a per-item failure and belongs in \`per_item\``);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// `after` may name an outcome or a job state. Axis F was designed with one example in hand —
|
|
209
|
+
// an operation answering immediately and suspending on an outcome — and the rule was fitted to
|
|
210
|
+
// it. A request thread suspends on `done`, a *job state*, and waits there for a person. The
|
|
211
|
+
// axis survived that; its check did not.
|
|
212
|
+
const continuation = fm["continuation"];
|
|
213
|
+
if (continuation && typeof continuation === "object") {
|
|
214
|
+
const jobStates = fm["async_execution"]?.job_states ?? [];
|
|
215
|
+
if (!outcomeIds.has(continuation.after) && !jobStates.includes(continuation.after)) {
|
|
216
|
+
err("continuation_without_outcome", `\`continuation.after\` names \`${continuation.after}\`, which is neither a declared outcome nor a job state`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
for (const [name, iface] of Object.entries(interfaces)) {
|
|
220
|
+
for (const parameter of iface?.parameters ?? []) {
|
|
221
|
+
if (parameter?.handling !== "decorative")
|
|
222
|
+
continue;
|
|
223
|
+
const path = iface?.path ?? "";
|
|
224
|
+
if (!path.includes(`{${parameter.name}}`)) {
|
|
225
|
+
err("decorative_parameter_not_in_path", `interface \`${name}\`: \`${parameter.name}\` is declared decorative but does not appear in \`${path || "(no path)"}\``);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// An operation that produces no effect has nothing to reverse. Saying `reversible` there
|
|
230
|
+
// answers a different question than the one asked, and both read-only cards in this project
|
|
231
|
+
// said it — because the field is required and, until round 7, had no honest value for them.
|
|
232
|
+
// A warning, not an error: the reading is a judgement about the card's own claims, and a
|
|
233
|
+
// checker that hard-fails on judgement gets switched off.
|
|
234
|
+
if (fm["data_transition"] === null && fm["provenance"] === "none" && fm["reversibility"] === "reversible") {
|
|
235
|
+
warn("reversibility_overstated", "read-only operation claims `reversible`; nothing was done, so nothing can be undone");
|
|
236
|
+
}
|
|
237
|
+
// ── effect of a write ──────────────────────────────────────────────────────────────────────
|
|
238
|
+
if ("data_transition" in fm && fm["data_transition"] === null) {
|
|
239
|
+
if (!fm["mutates"] && fm["provenance"] !== "none") {
|
|
240
|
+
err("write_without_effect", "`data_transition: null` with neither `mutates` nor `provenance: none`");
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// ── cross-card references ──────────────────────────────────────────────────────────────────
|
|
244
|
+
if (knownIds !== null) {
|
|
245
|
+
const reversibility = fm["reversibility"];
|
|
246
|
+
if (reversibility && typeof reversibility === "object") {
|
|
247
|
+
const target = reversibility.reversible_via;
|
|
248
|
+
if (target && !knownIds.has(target)) {
|
|
249
|
+
warn("undescribed_counterpart", `\`reversible_via\` points at undescribed \`${target}\``);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const serves = fm["serves_step"];
|
|
253
|
+
if (serves && !knownIds.has(serves.operation)) {
|
|
254
|
+
warn("undescribed_counterpart", `\`serves_step\` points at undescribed \`${serves.operation}\``);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return out;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "usedesign",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Validate and check Operation Cards: no wild endpoints, no unproven steps, no maturity beyond its evidence.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/nistoc/usedesign.git",
|
|
9
|
+
"directory": "impl/typescript"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://nistoc.github.io/usedesign/",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"bin": {
|
|
14
|
+
"usedesign": "dist/cli.js"
|
|
15
|
+
},
|
|
16
|
+
"exports": {
|
|
17
|
+
".": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=20"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc -p tsconfig.json && node scripts/copy-schema.mjs",
|
|
29
|
+
"conformance": "npm run build && node dist/cli.js conformance",
|
|
30
|
+
"test": "npm run conformance"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"ajv": "^8.17.1",
|
|
34
|
+
"ajv-formats": "^3.0.1",
|
|
35
|
+
"fast-xml-parser": "^4.5.0",
|
|
36
|
+
"yaml": "^2.6.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^22.10.0",
|
|
40
|
+
"typescript": "^5.7.0"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"operation-card",
|
|
44
|
+
"traceability",
|
|
45
|
+
"specification",
|
|
46
|
+
"openapi",
|
|
47
|
+
"documentation"
|
|
48
|
+
]
|
|
49
|
+
}
|