@azure-tools/typespec-azure-examples 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/schema/dist/ExamplesYaml.json +111 -0
  4. package/dist/src/cli.d.ts +3 -0
  5. package/dist/src/cli.d.ts.map +1 -0
  6. package/dist/src/cli.js +23 -0
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/commands/validate.d.ts +9 -0
  9. package/dist/src/commands/validate.d.ts.map +1 -0
  10. package/dist/src/commands/validate.js +37 -0
  11. package/dist/src/commands/validate.js.map +1 -0
  12. package/dist/src/discover.d.ts +20 -0
  13. package/dist/src/discover.d.ts.map +1 -0
  14. package/dist/src/discover.js +73 -0
  15. package/dist/src/discover.js.map +1 -0
  16. package/dist/src/index.d.ts +14 -0
  17. package/dist/src/index.d.ts.map +1 -0
  18. package/dist/src/index.js +13 -0
  19. package/dist/src/index.js.map +1 -0
  20. package/dist/src/loader.d.ts +41 -0
  21. package/dist/src/loader.d.ts.map +1 -0
  22. package/dist/src/loader.js +70 -0
  23. package/dist/src/loader.js.map +1 -0
  24. package/dist/src/naming.d.ts +17 -0
  25. package/dist/src/naming.d.ts.map +1 -0
  26. package/dist/src/naming.js +26 -0
  27. package/dist/src/naming.js.map +1 -0
  28. package/dist/src/reporter.d.ts +6 -0
  29. package/dist/src/reporter.d.ts.map +1 -0
  30. package/dist/src/reporter.js +27 -0
  31. package/dist/src/reporter.js.map +1 -0
  32. package/dist/src/rules.d.ts +18 -0
  33. package/dist/src/rules.d.ts.map +1 -0
  34. package/dist/src/rules.js +188 -0
  35. package/dist/src/rules.js.map +1 -0
  36. package/dist/src/schema.d.ts +3 -0
  37. package/dist/src/schema.d.ts.map +1 -0
  38. package/dist/src/schema.js +5 -0
  39. package/dist/src/schema.js.map +1 -0
  40. package/dist/src/types.d.ts +49 -0
  41. package/dist/src/types.d.ts.map +1 -0
  42. package/dist/src/types.js +6 -0
  43. package/dist/src/types.js.map +1 -0
  44. package/dist/src/validate.d.ts +11 -0
  45. package/dist/src/validate.d.ts.map +1 -0
  46. package/dist/src/validate.js +66 -0
  47. package/dist/src/validate.js.map +1 -0
  48. package/dist/tsconfig.build.tsbuildinfo +1 -0
  49. package/package.json +69 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,SAAS,iBAAiB,EAAE,EACzC,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CASR;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAQ/E"}
@@ -0,0 +1,27 @@
1
+ import { relative } from "path";
2
+ import pc from "picocolors";
3
+ /** Format a set of diagnostics for terminal output, grouped by file. */
4
+ export function formatDiagnostics(diagnostics, baseDir) {
5
+ const lines = [];
6
+ for (const d of diagnostics) {
7
+ const file = baseDir ? relative(baseDir, d.file) : d.file;
8
+ const location = d.line !== undefined ? `${file}:${d.line}:${d.col ?? 1}` : file;
9
+ const label = d.severity === "error" ? pc.red("error") : pc.yellow("warning");
10
+ lines.push(`${pc.cyan(location)} - ${label} ${pc.gray(d.code)}: ${d.message}`);
11
+ }
12
+ return lines.join("\n");
13
+ }
14
+ /** Format a one-line summary of the diagnostics. */
15
+ export function formatSummary(diagnostics) {
16
+ const errors = diagnostics.filter((d) => d.severity === "error").length;
17
+ const warnings = diagnostics.filter((d) => d.severity === "warning").length;
18
+ if (errors === 0 && warnings === 0)
19
+ return pc.green("✔ Examples are valid");
20
+ const parts = [];
21
+ if (errors > 0)
22
+ parts.push(pc.red(`${errors} error${errors === 1 ? "" : "s"}`));
23
+ if (warnings > 0)
24
+ parts.push(pc.yellow(`${warnings} warning${warnings === 1 ? "" : "s"}`));
25
+ return `Found ${parts.join(" and ")}`;
26
+ }
27
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAC/B,WAAyC,EACzC,OAAgB;IAEhB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,aAAa,CAAC,WAAyC;IACrE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC5E,IAAI,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChF,IAAI,QAAQ,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,QAAQ,WAAW,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3F,OAAO,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type LoadedExampleFile } from "./loader.js";
2
+ import type { ExampleDiagnostic } from "./types.js";
3
+ /** Context available to the semantic rules. */
4
+ export interface SemanticContext {
5
+ /**
6
+ * API versions declared in the service's `service.yaml`. When `undefined`, the
7
+ * `since ∈ service.yaml` check is skipped (e.g. no `service.yaml` was found).
8
+ */
9
+ readonly serviceVersions?: readonly string[];
10
+ }
11
+ /** Run all per-file semantic rules (RFC §3) against a single loaded file. */
12
+ export declare function checkSemantics(file: LoadedExampleFile, ctx: SemanticContext): ExampleDiagnostic[];
13
+ /**
14
+ * Cross-file placement rules (RFC §3.1): an operation's full example set lives in a single
15
+ * file, and an interface appears in exactly one file.
16
+ */
17
+ export declare function checkFilePlacement(files: LoadedExampleFile[]): ExampleDiagnostic[];
18
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKpD,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,EAAE,CA2CjG;AA2ND;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAkDlF"}
@@ -0,0 +1,188 @@
1
+ import { isQuotedScalar, locationAt } from "./loader.js";
2
+ /** File-level metadata keys allowed to be `$`-prefixed. */
3
+ const METADATA_KEYS = new Set(["$schema", "$namespace"]);
4
+ /** Run all per-file semantic rules (RFC §3) against a single loaded file. */
5
+ export function checkSemantics(file, ctx) {
6
+ const diagnostics = [];
7
+ const data = file.data;
8
+ if (data === null || typeof data !== "object" || Array.isArray(data)) {
9
+ return diagnostics;
10
+ }
11
+ for (const [key, value] of Object.entries(data)) {
12
+ if (key.startsWith("$")) {
13
+ if (!METADATA_KEYS.has(key)) {
14
+ diagnostics.push(diag(file, [key], "error", "unknown-metadata-key", () => `Unknown file metadata key '${key}'. Only '$schema' and '$namespace' are allowed; bare keys are operations.`));
15
+ }
16
+ continue;
17
+ }
18
+ // Bare top-level key => operation.
19
+ if (!Array.isArray(value)) {
20
+ diagnostics.push(diag(file, [key], "error", "operation-not-a-list", () => `Operation '${key}' must be a list of examples.`, key));
21
+ continue;
22
+ }
23
+ checkOperation(file, ctx, key, value, diagnostics);
24
+ }
25
+ return diagnostics;
26
+ }
27
+ function checkOperation(file, ctx, operation, variants, diagnostics) {
28
+ const lineages = new Map();
29
+ variants.forEach((variant, i) => {
30
+ if (variant === null || typeof variant !== "object" || Array.isArray(variant)) {
31
+ return;
32
+ }
33
+ const v = variant;
34
+ checkResponses(file, operation, i, v.responses, diagnostics);
35
+ checkSince(file, ctx, operation, i, v, diagnostics);
36
+ checkExplicitApiVersion(file, operation, i, v.request, diagnostics);
37
+ checkPlaceholders(file, operation, i, v, diagnostics);
38
+ const title = typeof v.title === "string" ? v.title : "";
39
+ const hasSince = typeof v.since === "string";
40
+ const entry = { index: i, since: hasSince ? v.since : undefined, hasSince };
41
+ const group = lineages.get(title);
42
+ if (group)
43
+ group.push(entry);
44
+ else
45
+ lineages.set(title, [entry]);
46
+ });
47
+ checkLineages(file, operation, lineages, diagnostics);
48
+ }
49
+ function checkResponses(file, operation, index, responses, diagnostics) {
50
+ if (responses === null || typeof responses !== "object" || Array.isArray(responses)) {
51
+ return;
52
+ }
53
+ for (const code of Object.keys(responses)) {
54
+ if (!/^\d+$/.test(code) || Number(code) < 100 || Number(code) > 599) {
55
+ diagnostics.push(diag(file, [operation, index, "responses"], "error", "invalid-status-code", () => `Response key '${code}' is not a valid integer status code. Range keys ('2XX') and 'default' are not permitted; use a concrete numeric status code.`, operation));
56
+ }
57
+ }
58
+ }
59
+ function checkSince(file, ctx, operation, index, variant, diagnostics) {
60
+ if (!("since" in variant))
61
+ return;
62
+ const since = variant.since;
63
+ if (typeof since !== "string") {
64
+ diagnostics.push(diag(file, [operation, index, "since"], "error", "unquoted-since", () => `'since' must be a quoted version string (e.g. since: "2024-06-01").`, operation));
65
+ return;
66
+ }
67
+ if (!isQuotedScalar(file, [operation, index, "since"])) {
68
+ diagnostics.push(diag(file, [operation, index, "since"], "error", "unquoted-since", () => `'since' must be quoted (since: "${since}") so YAML does not parse it as a date.`, operation));
69
+ }
70
+ if (ctx.serviceVersions !== undefined && !ctx.serviceVersions.includes(since)) {
71
+ diagnostics.push(diag(file, [operation, index, "since"], "error", "unknown-since-version", () => `'since' value "${since}" is not a version listed in service.yaml.`, operation));
72
+ }
73
+ }
74
+ function checkExplicitApiVersion(file, operation, index, request, diagnostics) {
75
+ if (request === null || typeof request !== "object" || Array.isArray(request))
76
+ return;
77
+ const req = request;
78
+ for (const location of ["path", "query"]) {
79
+ const params = req[location];
80
+ if (params === null || typeof params !== "object" || Array.isArray(params))
81
+ continue;
82
+ for (const paramName of Object.keys(params)) {
83
+ if (paramName.toLowerCase() === "api-version") {
84
+ diagnostics.push(diag(file, [operation, index, "request", location], "error", "explicit-api-version", () => `'api-version' must not be written as a request ${location} parameter; it is implicit and resolved from the version context.`, operation));
85
+ }
86
+ }
87
+ }
88
+ }
89
+ const PLACEHOLDER_RE = /\{([A-Za-z0-9._-]+)\}/g;
90
+ function checkPlaceholders(file, operation, index, variant, diagnostics) {
91
+ const offenders = new Set();
92
+ collectStrings(variant, (value) => {
93
+ let match;
94
+ PLACEHOLDER_RE.lastIndex = 0;
95
+ while ((match = PLACEHOLDER_RE.exec(value)) !== null) {
96
+ if (match[1] !== "api-version")
97
+ offenders.add(match[0]);
98
+ }
99
+ });
100
+ if (offenders.size > 0) {
101
+ diagnostics.push(diag(file, [operation, index], "error", "unsupported-placeholder", () => `Unsupported placeholder(s) ${[...offenders].map((o) => `'${o}'`).join(", ")}. '{api-version}' is the only supported placeholder.`, operation));
102
+ }
103
+ }
104
+ function checkLineages(file, operation, lineages, diagnostics) {
105
+ for (const [title, entries] of lineages) {
106
+ const label = title === "" ? "the default lineage" : `lineage '${title}'`;
107
+ const baseEntries = entries.filter((e) => !e.hasSince);
108
+ if (baseEntries.length > 1) {
109
+ for (const extra of baseEntries.slice(1)) {
110
+ diagnostics.push(diag(file, [operation, extra.index], "error", "multiple-base-variants", () => `${capitalize(label)} of operation '${operation}' has more than one entry without 'since'; only one base entry is allowed.`, operation));
111
+ }
112
+ }
113
+ const seen = new Map();
114
+ for (const entry of entries) {
115
+ if (entry.since === undefined)
116
+ continue;
117
+ if (seen.has(entry.since)) {
118
+ diagnostics.push(diag(file, [operation, entry.index, "since"], "error", "duplicate-since", () => `Duplicate 'since' value "${entry.since}" in ${label} of operation '${operation}'.`, operation));
119
+ }
120
+ else {
121
+ seen.set(entry.since, entry.index);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ /**
127
+ * Cross-file placement rules (RFC §3.1): an operation's full example set lives in a single
128
+ * file, and an interface appears in exactly one file.
129
+ */
130
+ export function checkFilePlacement(files) {
131
+ const diagnostics = [];
132
+ const operationFiles = new Map();
133
+ const interfaceFiles = new Map();
134
+ for (const file of files) {
135
+ const data = file.data;
136
+ if (data === null || typeof data !== "object" || Array.isArray(data))
137
+ continue;
138
+ for (const key of Object.keys(data)) {
139
+ if (key.startsWith("$"))
140
+ continue;
141
+ const firstFile = operationFiles.get(key);
142
+ if (firstFile !== undefined && firstFile !== file.path) {
143
+ diagnostics.push(diag(file, [key], "error", "operation-in-multiple-files", () => `Operation '${key}' also appears in '${firstFile}'. An operation's full example set must live in a single file.`, key));
144
+ }
145
+ else if (firstFile === undefined) {
146
+ operationFiles.set(key, file.path);
147
+ }
148
+ const interfaceName = key.includes(".") ? key.slice(0, key.indexOf(".")) : key;
149
+ const firstInterfaceFile = interfaceFiles.get(interfaceName);
150
+ if (firstInterfaceFile !== undefined && firstInterfaceFile !== file.path) {
151
+ diagnostics.push(diag(file, [key], "error", "interface-split-across-files", () => `Interface '${interfaceName}' is split across files ('${firstInterfaceFile}' and '${file.path}'). Each interface must appear in exactly one file.`, key));
152
+ }
153
+ else if (firstInterfaceFile === undefined) {
154
+ interfaceFiles.set(interfaceName, file.path);
155
+ }
156
+ }
157
+ }
158
+ return diagnostics;
159
+ }
160
+ function collectStrings(value, visit) {
161
+ if (typeof value === "string") {
162
+ visit(value);
163
+ }
164
+ else if (Array.isArray(value)) {
165
+ for (const item of value)
166
+ collectStrings(item, visit);
167
+ }
168
+ else if (value !== null && typeof value === "object") {
169
+ for (const item of Object.values(value))
170
+ collectStrings(item, visit);
171
+ }
172
+ }
173
+ function diag(file, path, severity, code, message, operation) {
174
+ const loc = locationAt(file, path);
175
+ return {
176
+ code,
177
+ message: message(),
178
+ severity,
179
+ file: file.path,
180
+ line: loc?.line,
181
+ col: loc?.col,
182
+ operation,
183
+ };
184
+ }
185
+ function capitalize(value) {
186
+ return value.charAt(0).toUpperCase() + value.slice(1);
187
+ }
188
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import ExamplesYamlSchema from "../schema/dist/ExamplesYaml.json";
2
+ export { ExamplesYamlSchema };
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,MAAM,kCAAkC,CAAuB;AAExF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ // The JSON Schema is generated from `schema/examples-yaml.tsp` at build time by
2
+ // `regen-examples-yaml-schema`.
3
+ import ExamplesYamlSchema from "../schema/dist/ExamplesYaml.json" with { type: "json" };
4
+ export { ExamplesYamlSchema };
5
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gCAAgC;AAChC,OAAO,kBAAkB,MAAM,kCAAkC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Public types for the unified examples format (`examples.yaml`) and the `tsp-examples validate`
3
+ * diagnostics. These mirror the schema in `schema/examples-yaml.tsp`.
4
+ */
5
+ /** Severity of an {@link ExampleDiagnostic}. */
6
+ export type DiagnosticSeverity = "error" | "warning";
7
+ /** A single validation diagnostic produced by {@link validateExampleFiles}. */
8
+ export interface ExampleDiagnostic {
9
+ /** Machine-readable code (e.g. `invalid-status-code`). */
10
+ readonly code: string;
11
+ /** Human-readable message. */
12
+ readonly message: string;
13
+ /** Severity. Any `error` fails validation. */
14
+ readonly severity: DiagnosticSeverity;
15
+ /** Absolute or repo-relative path of the file the diagnostic applies to. */
16
+ readonly file: string;
17
+ /** 1-based line number, when a precise location is available. */
18
+ readonly line?: number;
19
+ /** 1-based column number, when a precise location is available. */
20
+ readonly col?: number;
21
+ /** The operation key the diagnostic relates to, when applicable. */
22
+ readonly operation?: string;
23
+ }
24
+ /** A single example variant (`Example` in the schema). */
25
+ export interface ExampleVariant {
26
+ readonly title?: string;
27
+ readonly description?: string;
28
+ /** Legacy `x-ms-examples` file name this variant was migrated from, when preserved. */
29
+ readonly legacyFilename?: string;
30
+ readonly since?: string;
31
+ readonly request?: ExampleRequest;
32
+ readonly responses?: Record<string, ExampleResponse>;
33
+ }
34
+ export interface ExampleRequest {
35
+ readonly path?: Record<string, unknown>;
36
+ readonly query?: Record<string, unknown>;
37
+ readonly headers?: Record<string, unknown>;
38
+ readonly body?: unknown;
39
+ }
40
+ export interface ExampleResponse {
41
+ readonly headers?: Record<string, unknown>;
42
+ readonly body?: unknown;
43
+ }
44
+ /** Parsed representation of a service's `service.yaml` version metadata. */
45
+ export interface ServiceVersions {
46
+ /** The set of API version strings declared in `service.yaml`, in file order. */
47
+ readonly versions: string[];
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,gDAAgD;AAChD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,uFAAuF;IACvF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;CAC7B"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Public types for the unified examples format (`examples.yaml`) and the `tsp-examples validate`
3
+ * diagnostics. These mirror the schema in `schema/examples-yaml.tsp`.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,11 @@
1
+ import { type LoadedExampleFile } from "./loader.js";
2
+ import { type SemanticContext } from "./rules.js";
3
+ import type { ExampleDiagnostic } from "./types.js";
4
+ /** Run JSON Schema (structural) validation of a single file against the generated schema. */
5
+ export declare function checkStructure(file: LoadedExampleFile): ExampleDiagnostic[];
6
+ /**
7
+ * Validate a set of loaded example files. Runs, per file: fatal parse errors, JSON Schema
8
+ * (structural) validation, and the RFC §3 semantic rules; then the cross-file placement rules.
9
+ */
10
+ export declare function validateExampleFiles(files: LoadedExampleFile[], ctx?: SemanticContext): ExampleDiagnostic[];
11
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,iBAAiB,EAAc,MAAM,aAAa,CAAC;AACjE,OAAO,EAAsC,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAYpD,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,CAM3E;AAyBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EAAE,EAC1B,GAAG,GAAE,eAAoB,GACxB,iBAAiB,EAAE,CAoBrB"}
@@ -0,0 +1,66 @@
1
+ import { Ajv2020 } from "ajv/dist/2020.js";
2
+ import { positionAt } from "./loader.js";
3
+ import { checkFilePlacement, checkSemantics } from "./rules.js";
4
+ import { ExamplesYamlSchema } from "./schema.js";
5
+ let cachedValidator;
6
+ function getValidator() {
7
+ if (cachedValidator === undefined) {
8
+ const ajv = new Ajv2020({ allErrors: true, strict: false });
9
+ cachedValidator = ajv.compile(ExamplesYamlSchema);
10
+ }
11
+ return cachedValidator;
12
+ }
13
+ /** Run JSON Schema (structural) validation of a single file against the generated schema. */
14
+ export function checkStructure(file) {
15
+ if (file.data === undefined)
16
+ return [];
17
+ const validate = getValidator();
18
+ const valid = validate(file.data);
19
+ if (valid || !validate.errors)
20
+ return [];
21
+ return validate.errors.map((error) => structuralDiagnostic(file, error));
22
+ }
23
+ function structuralDiagnostic(file, error) {
24
+ const instancePath = error.instancePath;
25
+ const path = instancePath
26
+ .split("/")
27
+ .slice(1)
28
+ .map((segment) => segment.replace(/~1/g, "/").replace(/~0/g, "~"))
29
+ .map((segment) => (/^\d+$/.test(segment) ? Number(segment) : segment));
30
+ const node = path.length > 0
31
+ ? file.document.getIn(path, true)
32
+ : undefined;
33
+ const loc = positionAt(file, node?.range?.[0]);
34
+ const location = instancePath === "" ? "<root>" : instancePath;
35
+ return {
36
+ code: "schema-validation",
37
+ message: `${location} ${error.message ?? "is invalid"}`,
38
+ severity: "error",
39
+ file: file.path,
40
+ line: loc?.line,
41
+ col: loc?.col,
42
+ };
43
+ }
44
+ /**
45
+ * Validate a set of loaded example files. Runs, per file: fatal parse errors, JSON Schema
46
+ * (structural) validation, and the RFC §3 semantic rules; then the cross-file placement rules.
47
+ */
48
+ export function validateExampleFiles(files, ctx = {}) {
49
+ const diagnostics = [];
50
+ for (const file of files) {
51
+ if (file.parseError !== undefined) {
52
+ diagnostics.push({
53
+ code: "yaml-parse-error",
54
+ message: `Failed to parse YAML: ${file.parseError}`,
55
+ severity: "error",
56
+ file: file.path,
57
+ });
58
+ continue;
59
+ }
60
+ diagnostics.push(...checkStructure(file));
61
+ diagnostics.push(...checkSemantics(file, ctx));
62
+ }
63
+ diagnostics.push(...checkFilePlacement(files));
64
+ return diagnostics;
65
+ }
66
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}