@dogsbay/format-openapi 0.2.0-beta.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/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { FormatPlugin } from "@dogsbay/types";
2
+ export declare const plugin: FormatPlugin;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AAGxE,eAAO,MAAM,MAAM,EAAE,YAiBpB,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,16 @@
1
+ import { detectOpenApiSource, parseOpenApiSpec } from "./parse.js";
2
+ export const plugin = {
3
+ name: "openapi",
4
+ canImport: true,
5
+ canExport: false,
6
+ detectSource: (path) => detectOpenApiSource(path),
7
+ importOptions: [],
8
+ exportOptions: [],
9
+ async import(source, opts) {
10
+ return parseOpenApiSpec(source, {
11
+ hrefPrefix: typeof opts.hrefPrefix === "string" ? opts.hrefPrefix : undefined,
12
+ section: typeof opts.section === "string" ? opts.section : undefined,
13
+ });
14
+ },
15
+ };
16
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAiB;IAClC,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,KAAK;IAChB,YAAY,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;IACzD,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IAEjB,KAAK,CAAC,MAAM,CACV,MAAc,EACd,IAA6B;QAE7B,OAAO,gBAAgB,CAAC,MAAM,EAAE;YAC9B,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YAC7E,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SACrE,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CodeSample } from "./types.js";
2
+ /**
3
+ * Code-sample resolution.
4
+ *
5
+ * Order of preference per `(method, path)`:
6
+ * 1. Vendor extension `x-codeSamples` / `x-code-samples` on the
7
+ * operation (Redoc convention). Hand-curated by the spec author;
8
+ * assumed strictly better than anything we'd generate.
9
+ * 2. Auto-generated curl + Python + TypeScript samples derived from
10
+ * `(method, path, baseUrl)`.
11
+ *
12
+ * The Redoc spec uses `x-codeSamples` (camelCase). Some older specs
13
+ * use `x-code-samples` (kebab). Honour both.
14
+ */
15
+ export declare function resolveCodeSamples(operation: any, method: string, path: string, baseUrl: string): CodeSample[];
16
+ //# sourceMappingURL=code-samples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-samples.d.ts","sourceRoot":"","sources":["../src/code-samples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;;;;GAYG;AAEH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,GAAG,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,UAAU,EAAE,CAId"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Code-sample resolution.
3
+ *
4
+ * Order of preference per `(method, path)`:
5
+ * 1. Vendor extension `x-codeSamples` / `x-code-samples` on the
6
+ * operation (Redoc convention). Hand-curated by the spec author;
7
+ * assumed strictly better than anything we'd generate.
8
+ * 2. Auto-generated curl + Python + TypeScript samples derived from
9
+ * `(method, path, baseUrl)`.
10
+ *
11
+ * The Redoc spec uses `x-codeSamples` (camelCase). Some older specs
12
+ * use `x-code-samples` (kebab). Honour both.
13
+ */
14
+ export function resolveCodeSamples(operation, method, path, baseUrl) {
15
+ const vendor = readVendorSamples(operation);
16
+ if (vendor.length > 0)
17
+ return vendor;
18
+ return generateCodeSamples(method, path, baseUrl);
19
+ }
20
+ function readVendorSamples(operation) {
21
+ const raw = (operation && (operation["x-codeSamples"] || operation["x-code-samples"])) ||
22
+ [];
23
+ if (!Array.isArray(raw))
24
+ return [];
25
+ const samples = [];
26
+ for (const entry of raw) {
27
+ if (!entry || typeof entry !== "object")
28
+ continue;
29
+ const language = typeof entry.lang === "string" && entry.lang
30
+ ? entry.lang
31
+ : typeof entry.language === "string" && entry.language
32
+ ? entry.language
33
+ : undefined;
34
+ const code = typeof entry.source === "string" ? entry.source : undefined;
35
+ if (!language || !code)
36
+ continue;
37
+ const sample = { language, code };
38
+ if (typeof entry.label === "string" && entry.label)
39
+ sample.label = entry.label;
40
+ samples.push(sample);
41
+ }
42
+ return samples;
43
+ }
44
+ function generateCodeSamples(method, path, baseUrl) {
45
+ const url = `${baseUrl}${path}`;
46
+ const upper = method.toUpperCase();
47
+ return [
48
+ {
49
+ language: "curl",
50
+ code: upper === "GET"
51
+ ? `curl "${url}" \\\n -H "Accept: application/json"`
52
+ : `curl -X ${upper} "${url}" \\\n -H "Content-Type: application/json" \\\n -H "Accept: application/json"`,
53
+ },
54
+ {
55
+ language: "python",
56
+ code: upper === "GET"
57
+ ? `import requests\n\nresponse = requests.get("${url}")\ndata = response.json()`
58
+ : `import requests\n\nresponse = requests.${method}(\n "${url}",\n json={}\n)\ndata = response.json()`,
59
+ },
60
+ {
61
+ language: "typescript",
62
+ code: upper === "GET"
63
+ ? `const response = await fetch("${url}");\nconst data = await response.json();`
64
+ : `const response = await fetch("${url}", {\n method: "${upper}",\n headers: { "Content-Type": "application/json" },\n body: JSON.stringify({}),\n});\nconst data = await response.json();`,
65
+ },
66
+ ];
67
+ }
68
+ //# sourceMappingURL=code-samples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-samples.js","sourceRoot":"","sources":["../src/code-samples.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,MAAM,UAAU,kBAAkB,CAChC,SAAc,EACd,MAAc,EACd,IAAY,EACZ,OAAe;IAEf,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAc;IACvC,MAAM,GAAG,GACP,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1E,EAAE,CAAC;IACL,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,QAAQ,GACZ,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI;YAC1C,CAAC,CAAC,KAAK,CAAC,IAAI;YACZ,CAAC,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ;gBACpD,CAAC,CAAC,KAAK,CAAC,QAAQ;gBAChB,CAAC,CAAC,SAAS,CAAC;QAClB,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI;YAAE,SAAS;QACjC,MAAM,MAAM,GAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC9C,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAc,EACd,IAAY,EACZ,OAAe;IAEf,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEnC,OAAO;QACL;YACE,QAAQ,EAAE,MAAM;YAChB,IAAI,EACF,KAAK,KAAK,KAAK;gBACb,CAAC,CAAC,SAAS,GAAG,uCAAuC;gBACrD,CAAC,CAAC,WAAW,KAAK,KAAK,GAAG,iFAAiF;SAChH;QACD;YACE,QAAQ,EAAE,QAAQ;YAClB,IAAI,EACF,KAAK,KAAK,KAAK;gBACb,CAAC,CAAC,+CAA+C,GAAG,4BAA4B;gBAChF,CAAC,CAAC,0CAA0C,MAAM,WAAW,GAAG,4CAA4C;SACjH;QACD;YACE,QAAQ,EAAE,YAAY;YACtB,IAAI,EACF,KAAK,KAAK,KAAK;gBACb,CAAC,CAAC,iCAAiC,GAAG,0CAA0C;gBAChF,CAAC,CAAC,iCAAiC,GAAG,oBAAoB,KAAK,+HAA+H;SACnM;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type { SchemaProperty, Parameter, ResponseDef, CodeSample, EndpointProps, } from "./types.js";
2
+ export { parseOpenApiSpec, detectOpenApiSource, detectSpecPath } from "./parse.js";
3
+ export type { ParseOpenApiOptions } from "./parse.js";
4
+ export { operationToSlug, slugifyTag } from "./slug.js";
5
+ export { resolveCodeSamples } from "./code-samples.js";
6
+ export { plugin } from "./cli.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnF,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { parseOpenApiSpec, detectOpenApiSource, detectSpecPath } from "./parse.js";
2
+ export { operationToSlug, slugifyTag } from "./slug.js";
3
+ export { resolveCodeSamples } from "./code-samples.js";
4
+ export { plugin } from "./cli.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGnF,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ExportPage, NavItem } from "@dogsbay/types";
2
+ /** Auto-detect spec location given the configured source path. */
3
+ export declare function detectSpecPath(sourcePath: string): string | null;
4
+ /**
5
+ * detectSource: returns true if the path looks like an OpenAPI source
6
+ * (a directory containing openapi.{yaml,yml,json} or a file with that
7
+ * extension whose contents declare `openapi:`).
8
+ */
9
+ export declare function detectOpenApiSource(path: string): boolean;
10
+ export interface ParseOpenApiOptions {
11
+ /** When the importer wants nav hrefs to start with this prefix. */
12
+ hrefPrefix?: string;
13
+ /** Sub-path within the namespace for emitted pages, e.g. "api". */
14
+ section?: string;
15
+ }
16
+ export declare function parseOpenApiSpec(sourcePath: string, options?: ParseOpenApiOptions): Promise<{
17
+ pages: ExportPage[];
18
+ nav: NavItem[];
19
+ }>;
20
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACV,UAAU,EAEV,OAAO,EAER,MAAM,gBAAgB,CAAC;AAqBxB,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmChE;AAWD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAazD;AAED,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CA4HlD"}
package/dist/parse.js ADDED
@@ -0,0 +1,513 @@
1
+ /**
2
+ * Parse an OpenAPI spec into ExportPage[] + NavItem[].
3
+ *
4
+ * Mirrors the demo loader's extraction logic
5
+ * (`apps/demo/src/lib/openapi-loader.ts`), but emits the Dogsbay
6
+ * universal shape: ExportPage where `tree` carries an `endpoint`
7
+ * TreeNode with all operation data in props. format-astro's
8
+ * serializer renders that node by emitting `<ApiLayout>` + friends.
9
+ *
10
+ * Inputs come in three forms:
11
+ * - A directory containing `openapi.{yaml,yml,json}` (auto-detect).
12
+ * - A direct path to a spec file.
13
+ * - An HTTP(S) URL.
14
+ *
15
+ * Tag overview pages and a root info page are emitted alongside the
16
+ * per-operation pages so the namespace renders as a self-contained
17
+ * mini-site.
18
+ */
19
+ import { existsSync, readFileSync } from "node:fs";
20
+ import { readFile } from "node:fs/promises";
21
+ import { resolve, join, isAbsolute } from "node:path";
22
+ import { dereference } from "@scalar/openapi-parser";
23
+ import { parse as parseYaml } from "yaml";
24
+ import { operationToSlug, slugifyTag } from "./slug.js";
25
+ import { resolveCodeSamples } from "./code-samples.js";
26
+ const HTTP_METHODS = [
27
+ "get",
28
+ "post",
29
+ "put",
30
+ "patch",
31
+ "delete",
32
+ "head",
33
+ "options",
34
+ ];
35
+ /** Auto-detect spec location given the configured source path. */
36
+ export function detectSpecPath(sourcePath) {
37
+ if (sourcePath.startsWith("http://") || sourcePath.startsWith("https://")) {
38
+ return sourcePath;
39
+ }
40
+ if (existsSync(sourcePath)) {
41
+ const stat = (() => {
42
+ try {
43
+ return readFileSync(sourcePath);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ })();
49
+ // If it's a file, return as-is. If it's a directory, look inside.
50
+ try {
51
+ const isFile = existsSync(sourcePath) && stat !== null;
52
+ if (isFile && !isDirectory(sourcePath))
53
+ return sourcePath;
54
+ }
55
+ catch {
56
+ // fall through to directory probe
57
+ }
58
+ if (isDirectory(sourcePath)) {
59
+ const candidates = [
60
+ "openapi.yaml",
61
+ "openapi.yml",
62
+ "openapi.json",
63
+ "spec.yaml",
64
+ "spec.yml",
65
+ "spec.json",
66
+ ];
67
+ for (const name of candidates) {
68
+ const p = join(sourcePath, name);
69
+ if (existsSync(p))
70
+ return p;
71
+ }
72
+ }
73
+ }
74
+ return null;
75
+ }
76
+ function isDirectory(p) {
77
+ try {
78
+ const { statSync } = require("node:fs");
79
+ return statSync(p).isDirectory();
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ /**
86
+ * detectSource: returns true if the path looks like an OpenAPI source
87
+ * (a directory containing openapi.{yaml,yml,json} or a file with that
88
+ * extension whose contents declare `openapi:`).
89
+ */
90
+ export function detectOpenApiSource(path) {
91
+ const detected = detectSpecPath(path);
92
+ if (!detected)
93
+ return false;
94
+ if (detected.startsWith("http"))
95
+ return true;
96
+ // Sanity-check the file content briefly to avoid false-positives on
97
+ // arbitrary YAML/JSON sitting in a sibling directory.
98
+ try {
99
+ const head = readFileSync(detected, "utf-8").slice(0, 2048);
100
+ return /^\s*"?openapi"?\s*[:=]/m.test(head) ||
101
+ /^\s*"?swagger"?\s*[:=]/m.test(head);
102
+ }
103
+ catch {
104
+ return false;
105
+ }
106
+ }
107
+ export async function parseOpenApiSpec(sourcePath, options = {}) {
108
+ const specPath = detectSpecPath(sourcePath);
109
+ if (!specPath) {
110
+ throw new Error(`OpenAPI spec not found at ${sourcePath}. Looked for openapi.{yaml,yml,json} ` +
111
+ `and spec.{yaml,yml,json} (or expected a direct file path / URL).`);
112
+ }
113
+ const raw = await readSpecText(specPath);
114
+ let parsed;
115
+ try {
116
+ parsed = JSON.parse(raw);
117
+ }
118
+ catch {
119
+ parsed = parseYaml(raw);
120
+ }
121
+ const { schema: spec } = await dereference(parsed);
122
+ if (!spec) {
123
+ throw new Error(`Failed to dereference OpenAPI spec at ${specPath}`);
124
+ }
125
+ const baseUrl = spec.servers?.[0]?.url || "";
126
+ const hrefPrefix = normalisePrefix(options.hrefPrefix);
127
+ const pages = [];
128
+ // Collect tag descriptions (from spec.tags[]) for tag overview pages.
129
+ const tagDescriptions = new Map();
130
+ for (const t of spec.tags || []) {
131
+ if (t?.name)
132
+ tagDescriptions.set(t.name, t.description || "");
133
+ }
134
+ // Walk operations.
135
+ const paths = spec.paths || {};
136
+ const tagToOps = new Map();
137
+ const untagged = [];
138
+ for (const [path, pathItem] of Object.entries(paths)) {
139
+ if (!pathItem)
140
+ continue;
141
+ for (const method of HTTP_METHODS) {
142
+ const operation = pathItem[method];
143
+ if (!operation)
144
+ continue;
145
+ const opTags = Array.isArray(operation.tags)
146
+ ? operation.tags
147
+ : [];
148
+ const primaryTag = opTags[0];
149
+ const tagSlug = primaryTag ? slugifyTag(primaryTag) : "";
150
+ const opSlug = operationToSlug(method, path, operation.operationId);
151
+ const slug = tagSlug ? `${tagSlug}/${opSlug}` : opSlug;
152
+ const props = {
153
+ method,
154
+ path,
155
+ baseUrl,
156
+ summary: operation.summary || undefined,
157
+ description: operation.description || undefined,
158
+ operationId: operation.operationId || undefined,
159
+ tags: opTags.length > 0 ? opTags : undefined,
160
+ deprecated: operation.deprecated === true ? true : undefined,
161
+ parameters: extractParameters(operation, pathItem),
162
+ ...extractRequestBody(operation),
163
+ responses: extractResponses(operation),
164
+ codeSamples: resolveCodeSamples(operation, method, path, baseUrl),
165
+ };
166
+ const title = operation.summary || `${method.toUpperCase()} ${path}`;
167
+ const tree = [
168
+ {
169
+ type: "endpoint",
170
+ props: props,
171
+ },
172
+ ];
173
+ const headings = [{ depth: 1, slug: opSlug, text: title }];
174
+ pages.push({
175
+ slug,
176
+ title,
177
+ tree,
178
+ headings,
179
+ });
180
+ const summary = {
181
+ slug,
182
+ title,
183
+ method,
184
+ path,
185
+ deprecated: operation.deprecated === true,
186
+ };
187
+ if (primaryTag) {
188
+ const arr = tagToOps.get(primaryTag) || [];
189
+ arr.push(summary);
190
+ tagToOps.set(primaryTag, arr);
191
+ }
192
+ else {
193
+ untagged.push(summary);
194
+ }
195
+ }
196
+ }
197
+ // Tag overview pages.
198
+ for (const [tagName, ops] of tagToOps) {
199
+ const tagSlug = slugifyTag(tagName);
200
+ const description = tagDescriptions.get(tagName) || "";
201
+ pages.push(buildTagPage(tagName, tagSlug, description, ops));
202
+ }
203
+ // Root info page.
204
+ const info = spec.info || {};
205
+ pages.push(buildInfoPage(info.title || "API Reference", info.description || "", info.version || ""));
206
+ // Build nav: tag groups in declaration order, with operations as
207
+ // children. Untagged operations land under a synthetic "Other" group
208
+ // so they're discoverable but visually separated.
209
+ const nav = buildNav(spec, pages, tagToOps, untagged, hrefPrefix);
210
+ return { pages, nav };
211
+ }
212
+ async function readSpecText(specPath) {
213
+ if (specPath.startsWith("http://") || specPath.startsWith("https://")) {
214
+ const r = await fetch(specPath);
215
+ return await r.text();
216
+ }
217
+ const abs = isAbsolute(specPath) ? specPath : resolve(specPath);
218
+ return await readFile(abs, "utf-8");
219
+ }
220
+ function normalisePrefix(p) {
221
+ if (!p)
222
+ return "";
223
+ return p.replace(/\/+$/, "");
224
+ }
225
+ function schemaToType(schema) {
226
+ if (!schema)
227
+ return "any";
228
+ if (schema.type === "array") {
229
+ const itemType = schema.items ? schemaToType(schema.items) : "any";
230
+ return `${itemType}[]`;
231
+ }
232
+ return schema.type || "any";
233
+ }
234
+ function extractSchemaProperties(schema, requiredFields) {
235
+ if (!schema?.properties)
236
+ return [];
237
+ const required = requiredFields || schema.required || [];
238
+ return Object.entries(schema.properties).map(([name, prop]) => {
239
+ const result = {
240
+ name,
241
+ type: schemaToType(prop),
242
+ required: required.includes(name),
243
+ };
244
+ if (prop.description)
245
+ result.description = prop.description;
246
+ if (prop.nullable)
247
+ result.nullable = true;
248
+ if (prop.format)
249
+ result.format = prop.format;
250
+ if (prop.enum)
251
+ result.enum = prop.enum;
252
+ if (prop.default !== undefined)
253
+ result.default = prop.default;
254
+ if (prop.example !== undefined)
255
+ result.example = prop.example;
256
+ if (prop.type === "object" && prop.properties) {
257
+ result.properties = extractSchemaProperties(prop);
258
+ }
259
+ if (prop.type === "array" && prop.items) {
260
+ if (prop.items.type === "object" && prop.items.properties) {
261
+ result.items = extractSchemaProperties(prop.items);
262
+ }
263
+ }
264
+ return result;
265
+ });
266
+ }
267
+ function extractParameters(operation, pathItem) {
268
+ const params = [];
269
+ const allParams = [
270
+ ...(pathItem.parameters || []),
271
+ ...(operation.parameters || []),
272
+ ];
273
+ // Operation-level wins over path-level on (name, in) collision.
274
+ const seen = new Map();
275
+ for (const p of allParams) {
276
+ if (!p?.name || !p?.in)
277
+ continue;
278
+ seen.set(`${p.name}:${p.in}`, p);
279
+ }
280
+ for (const p of seen.values()) {
281
+ const param = {
282
+ name: p.name,
283
+ in: p.in,
284
+ type: schemaToType(p.schema),
285
+ required: p.required || false,
286
+ };
287
+ if (p.description)
288
+ param.description = p.description;
289
+ if (p.schema?.default !== undefined) {
290
+ param.default = String(p.schema.default);
291
+ }
292
+ if (p.schema?.enum)
293
+ param.enum = p.schema.enum;
294
+ if (p.deprecated)
295
+ param.deprecated = true;
296
+ params.push(param);
297
+ }
298
+ return params;
299
+ }
300
+ function extractRequestBody(operation) {
301
+ const body = operation.requestBody;
302
+ if (!body?.content)
303
+ return {};
304
+ const mediaType = body.content["application/json"] ||
305
+ Object.values(body.content)[0];
306
+ if (!mediaType?.schema)
307
+ return {};
308
+ return {
309
+ requestBody: extractSchemaProperties(mediaType.schema),
310
+ requestBodyExample: generateExampleFromSchema(mediaType.schema),
311
+ };
312
+ }
313
+ function extractResponses(operation) {
314
+ if (!operation.responses)
315
+ return [];
316
+ return Object.entries(operation.responses)
317
+ .filter(([status]) => status !== "default")
318
+ .map(([status, resp]) => {
319
+ const result = {
320
+ status,
321
+ description: resp.description,
322
+ };
323
+ if (resp.content) {
324
+ const contentTypeKey = resp.content["application/json"]
325
+ ? "application/json"
326
+ : Object.keys(resp.content)[0];
327
+ const mediaType = resp.content[contentTypeKey];
328
+ if (contentTypeKey)
329
+ result.contentType = contentTypeKey;
330
+ if (mediaType?.schema) {
331
+ const rawSchema = mediaType.schema;
332
+ const schema = rawSchema.type === "array" && rawSchema.items
333
+ ? rawSchema.items
334
+ : rawSchema;
335
+ result.schema = extractSchemaProperties(schema);
336
+ result.example = generateExampleFromSchema(rawSchema);
337
+ }
338
+ }
339
+ return result;
340
+ })
341
+ .sort((a, b) => a.status.localeCompare(b.status));
342
+ }
343
+ function generateExampleFromSchema(schema) {
344
+ if (!schema)
345
+ return undefined;
346
+ if (schema.example !== undefined)
347
+ return schema.example;
348
+ switch (schema.type) {
349
+ case "object": {
350
+ if (!schema.properties)
351
+ return {};
352
+ const obj = {};
353
+ for (const [name, prop] of Object.entries(schema.properties)) {
354
+ obj[name] = generateExampleFromSchema(prop);
355
+ }
356
+ return obj;
357
+ }
358
+ case "array":
359
+ return schema.items ? [generateExampleFromSchema(schema.items)] : [];
360
+ case "string": {
361
+ if (schema.enum)
362
+ return schema.enum[0];
363
+ if (schema.format === "date-time")
364
+ return "2024-01-01T00:00:00Z";
365
+ if (schema.format === "email")
366
+ return "user@example.com";
367
+ if (schema.format === "uri" || schema.format === "url") {
368
+ return "https://example.com";
369
+ }
370
+ if (schema.format === "uuid") {
371
+ return "550e8400-e29b-41d4-a716-446655440000";
372
+ }
373
+ if (schema.default !== undefined)
374
+ return schema.default;
375
+ return "string";
376
+ }
377
+ case "integer":
378
+ return schema.example ?? schema.default ?? 0;
379
+ case "number":
380
+ return schema.example ?? schema.default ?? 0.0;
381
+ case "boolean":
382
+ return schema.example ?? schema.default ?? true;
383
+ default:
384
+ return null;
385
+ }
386
+ }
387
+ function buildTagPage(tagName, tagSlug, description, ops) {
388
+ const tree = [
389
+ {
390
+ type: "heading",
391
+ props: { level: 1, id: tagSlug },
392
+ children: [{ type: "prose", html: escapeHtml(tagName) }],
393
+ },
394
+ ];
395
+ if (description) {
396
+ tree.push({ type: "prose", html: paragraphHtml(description) });
397
+ }
398
+ const items = ops.map((op) => ({
399
+ type: "list-item",
400
+ children: [
401
+ {
402
+ type: "prose",
403
+ html: `<a href="${escapeAttr(op.slug)}"><code>${op.method.toUpperCase()}</code> ${escapeHtml(op.path)}</a>${op.deprecated ? ' <span class="text-muted-foreground">(deprecated)</span>' : ""}`,
404
+ },
405
+ ],
406
+ }));
407
+ tree.push({ type: "unordered-list", children: items });
408
+ return {
409
+ slug: tagSlug,
410
+ title: tagName,
411
+ tree,
412
+ headings: [{ depth: 1, slug: tagSlug, text: tagName }],
413
+ };
414
+ }
415
+ function buildInfoPage(title, description, version) {
416
+ const tree = [
417
+ {
418
+ type: "heading",
419
+ props: { level: 1, id: "api-reference" },
420
+ children: [{ type: "prose", html: escapeHtml(title) }],
421
+ },
422
+ ];
423
+ if (version) {
424
+ tree.push({
425
+ type: "prose",
426
+ html: `<p class="text-sm text-muted-foreground">Version ${escapeHtml(version)}</p>`,
427
+ });
428
+ }
429
+ if (description) {
430
+ tree.push({ type: "prose", html: paragraphHtml(description) });
431
+ }
432
+ return {
433
+ slug: "index",
434
+ title,
435
+ tree,
436
+ headings: [{ depth: 1, slug: "api-reference", text: title }],
437
+ };
438
+ }
439
+ function buildNav(spec, pages, tagToOps, untagged, hrefPrefix) {
440
+ const nav = [];
441
+ const root = {
442
+ label: (spec.info && spec.info.title) || "API Reference",
443
+ href: hrefHref(hrefPrefix, "index"),
444
+ };
445
+ nav.push(root);
446
+ // Use spec.tags[] order when present so authors control nav order.
447
+ const declaredTagOrder = Array.isArray(spec.tags)
448
+ ? spec.tags.map((t) => t?.name).filter(Boolean)
449
+ : [];
450
+ const seenTags = new Set();
451
+ const tagOrder = [];
452
+ for (const t of declaredTagOrder) {
453
+ if (tagToOps.has(t)) {
454
+ tagOrder.push(t);
455
+ seenTags.add(t);
456
+ }
457
+ }
458
+ for (const t of tagToOps.keys()) {
459
+ if (!seenTags.has(t))
460
+ tagOrder.push(t);
461
+ }
462
+ for (const tagName of tagOrder) {
463
+ const ops = tagToOps.get(tagName) || [];
464
+ const tagSlug = slugifyTag(tagName);
465
+ nav.push({
466
+ label: tagName,
467
+ href: hrefHref(hrefPrefix, tagSlug),
468
+ children: ops
469
+ .slice()
470
+ .sort(byMethodThenPath)
471
+ .map((op) => ({
472
+ label: op.title,
473
+ href: hrefHref(hrefPrefix, op.slug),
474
+ })),
475
+ });
476
+ }
477
+ if (untagged.length > 0) {
478
+ nav.push({
479
+ label: "Other",
480
+ children: untagged
481
+ .slice()
482
+ .sort(byMethodThenPath)
483
+ .map((op) => ({
484
+ label: op.title,
485
+ href: hrefHref(hrefPrefix, op.slug),
486
+ })),
487
+ });
488
+ }
489
+ return nav;
490
+ }
491
+ function byMethodThenPath(a, b) {
492
+ const m = a.method.localeCompare(b.method);
493
+ if (m !== 0)
494
+ return m;
495
+ return a.path.localeCompare(b.path);
496
+ }
497
+ function hrefHref(prefix, slug) {
498
+ const p = prefix ? `${prefix}/` : "/";
499
+ return slug === "index" ? p : `${p}${slug}`;
500
+ }
501
+ function escapeHtml(s) {
502
+ return s
503
+ .replace(/&/g, "&amp;")
504
+ .replace(/</g, "&lt;")
505
+ .replace(/>/g, "&gt;");
506
+ }
507
+ function escapeAttr(s) {
508
+ return s.replace(/&/g, "&amp;").replace(/"/g, "&quot;");
509
+ }
510
+ function paragraphHtml(text) {
511
+ return `<p>${escapeHtml(text)}</p>`;
512
+ }
513
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
package/dist/slug.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Operation slug derivation.
3
+ *
4
+ * Decision: prefer `operationId` when the spec author has set one
5
+ * (~70% of public specs do). It's the spec-declared stable handle —
6
+ * paths drift (refactors, parameter additions), operationId doesn't,
7
+ * so bookmarks and deep links survive. Fall back to `{method}-{path}`
8
+ * when operationId is absent.
9
+ */
10
+ export declare function operationToSlug(method: string, path: string, operationId?: string): string;
11
+ /**
12
+ * Slugify a tag name for use in URLs and nav grouping.
13
+ * Tag "Pet Store" → "pet-store".
14
+ */
15
+ export declare function slugifyTag(tag: string): string;
16
+ //# sourceMappingURL=slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAWR;AAYD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK9C"}
package/dist/slug.js ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Operation slug derivation.
3
+ *
4
+ * Decision: prefer `operationId` when the spec author has set one
5
+ * (~70% of public specs do). It's the spec-declared stable handle —
6
+ * paths drift (refactors, parameter additions), operationId doesn't,
7
+ * so bookmarks and deep links survive. Fall back to `{method}-{path}`
8
+ * when operationId is absent.
9
+ */
10
+ export function operationToSlug(method, path, operationId) {
11
+ if (operationId) {
12
+ return slugifyOperationId(operationId);
13
+ }
14
+ return `${method}-${path}`
15
+ .replace(/[{}]/g, "")
16
+ .replace(/\//g, "-")
17
+ .replace(/^-+/, "")
18
+ .replace(/-+$/, "")
19
+ .replace(/-+/g, "-")
20
+ .toLowerCase();
21
+ }
22
+ function slugifyOperationId(id) {
23
+ return id
24
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
25
+ .replace(/_/g, "-")
26
+ .toLowerCase()
27
+ .replace(/[^a-z0-9-]/g, "-")
28
+ .replace(/-+/g, "-")
29
+ .replace(/^-+|-+$/g, "");
30
+ }
31
+ /**
32
+ * Slugify a tag name for use in URLs and nav grouping.
33
+ * Tag "Pet Store" → "pet-store".
34
+ */
35
+ export function slugifyTag(tag) {
36
+ return tag
37
+ .toLowerCase()
38
+ .replace(/[^a-z0-9]+/g, "-")
39
+ .replace(/^-+|-+$/g, "");
40
+ }
41
+ //# sourceMappingURL=slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,IAAY,EACZ,WAAoB;IAEpB,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE;SACvB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAU;IACpC,OAAO,EAAE;SACN,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG;SACP,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Internal types matching the API component prop shapes.
3
+ *
4
+ * These flow into the `endpoint` TreeNode's props verbatim, so any
5
+ * change here must be matched in the format-astro `endpointToAstro`
6
+ * serializer case.
7
+ */
8
+ export interface SchemaProperty {
9
+ name: string;
10
+ type: string;
11
+ description?: string;
12
+ required?: boolean;
13
+ nullable?: boolean;
14
+ format?: string;
15
+ enum?: string[];
16
+ default?: unknown;
17
+ example?: unknown;
18
+ /** Nested object properties. */
19
+ properties?: SchemaProperty[];
20
+ /** Item shape for arrays of objects. */
21
+ items?: SchemaProperty[];
22
+ }
23
+ export interface Parameter {
24
+ name: string;
25
+ in: "path" | "query" | "header" | "cookie";
26
+ type: string;
27
+ required?: boolean;
28
+ description?: string;
29
+ default?: string;
30
+ enum?: string[];
31
+ deprecated?: boolean;
32
+ }
33
+ export interface ResponseDef {
34
+ status: string;
35
+ description?: string;
36
+ schema?: SchemaProperty[];
37
+ example?: unknown;
38
+ contentType?: string;
39
+ }
40
+ export interface CodeSample {
41
+ language: string;
42
+ label?: string;
43
+ code: string;
44
+ }
45
+ /**
46
+ * Props for the `endpoint` TreeNode. format-astro's serializer reads
47
+ * these to render an `<ApiLayout>` + friends.
48
+ */
49
+ export interface EndpointProps {
50
+ method: string;
51
+ path: string;
52
+ baseUrl: string;
53
+ summary?: string;
54
+ description?: string;
55
+ operationId?: string;
56
+ tags?: string[];
57
+ deprecated?: boolean;
58
+ parameters?: Parameter[];
59
+ requestBody?: SchemaProperty[];
60
+ requestBodyExample?: unknown;
61
+ responses?: ResponseDef[];
62
+ codeSamples?: CodeSample[];
63
+ }
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,wCAAwC;IACxC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B"}
package/dist/types.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Internal types matching the API component prop shapes.
3
+ *
4
+ * These flow into the `endpoint` TreeNode's props verbatim, so any
5
+ * change here must be matched in the format-astro `endpointToAstro`
6
+ * serializer case.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@dogsbay/format-openapi",
3
+ "version": "0.2.0-beta.0",
4
+ "description": "OpenAPI format plugin for Dogsbay — parse OpenAPI 3.x specs into ExportPage[] for the SSG pipeline",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./cli": {
14
+ "types": "./dist/cli.d.ts",
15
+ "import": "./dist/cli.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md"
21
+ ],
22
+ "dependencies": {
23
+ "@scalar/openapi-parser": "^0.10.0",
24
+ "yaml": "^2.8.3",
25
+ "@dogsbay/types": "0.2.0-beta.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^25.5.0",
29
+ "typescript": "^5.7.0",
30
+ "vitest": "^3.0.0",
31
+ "@dogsbay/format-astro": "0.2.0-beta.0"
32
+ },
33
+ "license": "MIT",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/dogsbay/dogsbay.git",
37
+ "directory": "packages/format-openapi"
38
+ },
39
+ "homepage": "https://github.com/dogsbay/dogsbay/tree/main/packages/format-openapi",
40
+ "bugs": {
41
+ "url": "https://github.com/dogsbay/dogsbay/issues"
42
+ },
43
+ "scripts": {
44
+ "build": "tsc",
45
+ "test": "vitest run",
46
+ "test:watch": "vitest"
47
+ }
48
+ }