sourcey 2.0.2

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 (191) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +254 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +197 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client/copy.js +21 -0
  8. package/dist/client/index.d.ts +7 -0
  9. package/dist/client/index.d.ts.map +1 -0
  10. package/dist/client/index.js +8 -0
  11. package/dist/client/index.js.map +1 -0
  12. package/dist/client/scroll-tracker.js +88 -0
  13. package/dist/client/search.js +164 -0
  14. package/dist/client/sidebar.js +54 -0
  15. package/dist/client/tabs.js +51 -0
  16. package/dist/client/theme-toggle.js +36 -0
  17. package/dist/components/App.d.ts +15 -0
  18. package/dist/components/App.d.ts.map +1 -0
  19. package/dist/components/App.js +13 -0
  20. package/dist/components/App.js.map +1 -0
  21. package/dist/components/layout/Head.d.ts +2 -0
  22. package/dist/components/layout/Head.d.ts.map +1 -0
  23. package/dist/components/layout/Head.js +29 -0
  24. package/dist/components/layout/Head.js.map +1 -0
  25. package/dist/components/layout/Header.d.ts +13 -0
  26. package/dist/components/layout/Header.d.ts.map +1 -0
  27. package/dist/components/layout/Header.js +38 -0
  28. package/dist/components/layout/Header.js.map +1 -0
  29. package/dist/components/layout/Page.d.ts +2 -0
  30. package/dist/components/layout/Page.d.ts.map +1 -0
  31. package/dist/components/layout/Page.js +29 -0
  32. package/dist/components/layout/Page.js.map +1 -0
  33. package/dist/components/layout/Sidebar.d.ts +9 -0
  34. package/dist/components/layout/Sidebar.d.ts.map +1 -0
  35. package/dist/components/layout/Sidebar.js +41 -0
  36. package/dist/components/layout/Sidebar.js.map +1 -0
  37. package/dist/components/layout/TableOfContents.d.ts +10 -0
  38. package/dist/components/layout/TableOfContents.d.ts.map +1 -0
  39. package/dist/components/layout/TableOfContents.js +12 -0
  40. package/dist/components/layout/TableOfContents.js.map +1 -0
  41. package/dist/components/openapi/CodeSamples.d.ts +11 -0
  42. package/dist/components/openapi/CodeSamples.d.ts.map +1 -0
  43. package/dist/components/openapi/CodeSamples.js +16 -0
  44. package/dist/components/openapi/CodeSamples.js.map +1 -0
  45. package/dist/components/openapi/Definition.d.ts +11 -0
  46. package/dist/components/openapi/Definition.d.ts.map +1 -0
  47. package/dist/components/openapi/Definition.js +12 -0
  48. package/dist/components/openapi/Definition.js.map +1 -0
  49. package/dist/components/openapi/EndpointBar.d.ts +12 -0
  50. package/dist/components/openapi/EndpointBar.d.ts.map +1 -0
  51. package/dist/components/openapi/EndpointBar.js +22 -0
  52. package/dist/components/openapi/EndpointBar.js.map +1 -0
  53. package/dist/components/openapi/Introduction.d.ts +6 -0
  54. package/dist/components/openapi/Introduction.d.ts.map +1 -0
  55. package/dist/components/openapi/Introduction.js +14 -0
  56. package/dist/components/openapi/Introduction.js.map +1 -0
  57. package/dist/components/openapi/Operation.d.ts +13 -0
  58. package/dist/components/openapi/Operation.d.ts.map +1 -0
  59. package/dist/components/openapi/Operation.js +23 -0
  60. package/dist/components/openapi/Operation.js.map +1 -0
  61. package/dist/components/openapi/Parameters.d.ts +7 -0
  62. package/dist/components/openapi/Parameters.d.ts.map +1 -0
  63. package/dist/components/openapi/Parameters.js +10 -0
  64. package/dist/components/openapi/Parameters.js.map +1 -0
  65. package/dist/components/openapi/RequestBody.d.ts +17 -0
  66. package/dist/components/openapi/RequestBody.d.ts.map +1 -0
  67. package/dist/components/openapi/RequestBody.js +27 -0
  68. package/dist/components/openapi/RequestBody.js.map +1 -0
  69. package/dist/components/openapi/Responses.d.ts +14 -0
  70. package/dist/components/openapi/Responses.d.ts.map +1 -0
  71. package/dist/components/openapi/Responses.js +60 -0
  72. package/dist/components/openapi/Responses.js.map +1 -0
  73. package/dist/components/openapi/Security.d.ts +14 -0
  74. package/dist/components/openapi/Security.d.ts.map +1 -0
  75. package/dist/components/openapi/Security.js +32 -0
  76. package/dist/components/openapi/Security.js.map +1 -0
  77. package/dist/components/openapi/Tags.d.ts +8 -0
  78. package/dist/components/openapi/Tags.d.ts.map +1 -0
  79. package/dist/components/openapi/Tags.js +10 -0
  80. package/dist/components/openapi/Tags.js.map +1 -0
  81. package/dist/components/schema/ExampleView.d.ts +11 -0
  82. package/dist/components/schema/ExampleView.d.ts.map +1 -0
  83. package/dist/components/schema/ExampleView.js +15 -0
  84. package/dist/components/schema/ExampleView.js.map +1 -0
  85. package/dist/components/schema/SchemaDatatype.d.ts +11 -0
  86. package/dist/components/schema/SchemaDatatype.d.ts.map +1 -0
  87. package/dist/components/schema/SchemaDatatype.js +36 -0
  88. package/dist/components/schema/SchemaDatatype.js.map +1 -0
  89. package/dist/components/schema/SchemaView.d.ts +14 -0
  90. package/dist/components/schema/SchemaView.d.ts.map +1 -0
  91. package/dist/components/schema/SchemaView.js +44 -0
  92. package/dist/components/schema/SchemaView.js.map +1 -0
  93. package/dist/components/ui/Badge.d.ts +11 -0
  94. package/dist/components/ui/Badge.d.ts.map +1 -0
  95. package/dist/components/ui/Badge.js +14 -0
  96. package/dist/components/ui/Badge.js.map +1 -0
  97. package/dist/components/ui/Markdown.d.ts +8 -0
  98. package/dist/components/ui/Markdown.d.ts.map +1 -0
  99. package/dist/components/ui/Markdown.js +13 -0
  100. package/dist/components/ui/Markdown.js.map +1 -0
  101. package/dist/components/ui/SectionLabel.d.ts +10 -0
  102. package/dist/components/ui/SectionLabel.d.ts.map +1 -0
  103. package/dist/components/ui/SectionLabel.js +9 -0
  104. package/dist/components/ui/SectionLabel.js.map +1 -0
  105. package/dist/config.d.ts +46 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +102 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/core/converter.d.ts +9 -0
  110. package/dist/core/converter.d.ts.map +1 -0
  111. package/dist/core/converter.js +29 -0
  112. package/dist/core/converter.js.map +1 -0
  113. package/dist/core/loader.d.ts +7 -0
  114. package/dist/core/loader.d.ts.map +1 -0
  115. package/dist/core/loader.js +92 -0
  116. package/dist/core/loader.js.map +1 -0
  117. package/dist/core/markdown-loader.d.ts +29 -0
  118. package/dist/core/markdown-loader.d.ts.map +1 -0
  119. package/dist/core/markdown-loader.js +65 -0
  120. package/dist/core/markdown-loader.js.map +1 -0
  121. package/dist/core/navigation.d.ts +51 -0
  122. package/dist/core/navigation.d.ts.map +1 -0
  123. package/dist/core/navigation.js +108 -0
  124. package/dist/core/navigation.js.map +1 -0
  125. package/dist/core/normalizer.d.ts +7 -0
  126. package/dist/core/normalizer.d.ts.map +1 -0
  127. package/dist/core/normalizer.js +472 -0
  128. package/dist/core/normalizer.js.map +1 -0
  129. package/dist/core/parser.d.ts +10 -0
  130. package/dist/core/parser.d.ts.map +1 -0
  131. package/dist/core/parser.js +34 -0
  132. package/dist/core/parser.js.map +1 -0
  133. package/dist/core/search-indexer.d.ts +25 -0
  134. package/dist/core/search-indexer.d.ts.map +1 -0
  135. package/dist/core/search-indexer.js +72 -0
  136. package/dist/core/search-indexer.js.map +1 -0
  137. package/dist/core/types.d.ts +236 -0
  138. package/dist/core/types.d.ts.map +1 -0
  139. package/dist/core/types.js +7 -0
  140. package/dist/core/types.js.map +1 -0
  141. package/dist/dev-server.d.ts +17 -0
  142. package/dist/dev-server.d.ts.map +1 -0
  143. package/dist/dev-server.js +202 -0
  144. package/dist/dev-server.js.map +1 -0
  145. package/dist/index.d.ts +62 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +166 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/renderer/context.d.ts +46 -0
  150. package/dist/renderer/context.d.ts.map +1 -0
  151. package/dist/renderer/context.js +22 -0
  152. package/dist/renderer/context.js.map +1 -0
  153. package/dist/renderer/html-builder.d.ts +37 -0
  154. package/dist/renderer/html-builder.d.ts.map +1 -0
  155. package/dist/renderer/html-builder.js +87 -0
  156. package/dist/renderer/html-builder.js.map +1 -0
  157. package/dist/renderer/static-renderer.d.ts +10 -0
  158. package/dist/renderer/static-renderer.d.ts.map +1 -0
  159. package/dist/renderer/static-renderer.js +17 -0
  160. package/dist/renderer/static-renderer.js.map +1 -0
  161. package/dist/themes/default/main.css +61 -0
  162. package/dist/themes/default/sourcey.css +425 -0
  163. package/dist/utils/code-samples.d.ts +8 -0
  164. package/dist/utils/code-samples.d.ts.map +1 -0
  165. package/dist/utils/code-samples.js +84 -0
  166. package/dist/utils/code-samples.js.map +1 -0
  167. package/dist/utils/example-generator.d.ts +12 -0
  168. package/dist/utils/example-generator.d.ts.map +1 -0
  169. package/dist/utils/example-generator.js +123 -0
  170. package/dist/utils/example-generator.js.map +1 -0
  171. package/dist/utils/highlighter.d.ts +10 -0
  172. package/dist/utils/highlighter.d.ts.map +1 -0
  173. package/dist/utils/highlighter.js +51 -0
  174. package/dist/utils/highlighter.js.map +1 -0
  175. package/dist/utils/html-id.d.ts +6 -0
  176. package/dist/utils/html-id.d.ts.map +1 -0
  177. package/dist/utils/html-id.js +11 -0
  178. package/dist/utils/html-id.js.map +1 -0
  179. package/dist/utils/http.d.ts +14 -0
  180. package/dist/utils/http.d.ts.map +1 -0
  181. package/dist/utils/http.js +97 -0
  182. package/dist/utils/http.js.map +1 -0
  183. package/dist/utils/markdown.d.ts +9 -0
  184. package/dist/utils/markdown.d.ts.map +1 -0
  185. package/dist/utils/markdown.js +18 -0
  186. package/dist/utils/markdown.js.map +1 -0
  187. package/dist/vite-plugin.d.ts +16 -0
  188. package/dist/vite-plugin.d.ts.map +1 -0
  189. package/dist/vite-plugin.js +92 -0
  190. package/dist/vite-plugin.js.map +1 -0
  191. package/package.json +78 -0
@@ -0,0 +1,84 @@
1
+ import { generateExample } from "./example-generator.js";
2
+ /**
3
+ * Auto-generate code samples (curl, JavaScript fetch, Python requests)
4
+ * from an operation's spec when no custom x-code-samples are provided.
5
+ */
6
+ export function generateCodeSamples(op, serverUrl) {
7
+ if (op.codeSamples?.length)
8
+ return op.codeSamples;
9
+ const url = `${serverUrl.replace(/\/$/, "")}${op.path}`;
10
+ const method = op.method.toUpperCase();
11
+ const hasBody = !!op.requestBody;
12
+ const contentType = hasBody
13
+ ? Object.keys(op.requestBody.content)[0] ?? "application/json"
14
+ : undefined;
15
+ const bodyExample = hasBody ? getRequestBodyExample(op) : undefined;
16
+ const bodyJson = bodyExample ? JSON.stringify(bodyExample, null, 2) : undefined;
17
+ return [
18
+ generateCurl(url, method, contentType, bodyJson),
19
+ generateJavaScript(url, method, contentType, bodyJson),
20
+ generatePython(url, method, contentType, bodyJson),
21
+ ];
22
+ }
23
+ function getRequestBodyExample(op) {
24
+ const content = op.requestBody?.content;
25
+ if (!content)
26
+ return undefined;
27
+ const mediaType = Object.values(content)[0];
28
+ if (!mediaType)
29
+ return undefined;
30
+ if (mediaType.example !== undefined)
31
+ return mediaType.example;
32
+ if (mediaType.schema)
33
+ return generateExample(mediaType.schema);
34
+ return undefined;
35
+ }
36
+ function generateCurl(url, method, contentType, body) {
37
+ const parts = [`curl -X ${method} '${url}'`];
38
+ if (contentType) {
39
+ parts.push(` -H 'Content-Type: ${contentType}'`);
40
+ }
41
+ if (body) {
42
+ parts.push(` -d '${body}'`);
43
+ }
44
+ return { lang: "bash", label: "cURL", source: parts.join(" \\\n") };
45
+ }
46
+ function generateJavaScript(url, method, contentType, body) {
47
+ const lines = [`const response = await fetch('${url}', {`];
48
+ lines.push(` method: '${method}',`);
49
+ if (contentType) {
50
+ lines.push(` headers: {`);
51
+ lines.push(` 'Content-Type': '${contentType}',`);
52
+ lines.push(` },`);
53
+ }
54
+ if (body) {
55
+ lines.push(` body: JSON.stringify(${body}),`);
56
+ }
57
+ lines.push(`});`);
58
+ lines.push(``);
59
+ lines.push(`const data = await response.json();`);
60
+ return { lang: "javascript", label: "JavaScript", source: lines.join("\n") };
61
+ }
62
+ function generatePython(url, method, contentType, body) {
63
+ const lines = ["import requests", ""];
64
+ const args = [`'${url}'`];
65
+ if (body) {
66
+ lines.push(`payload = ${pythonDict(body)}`);
67
+ lines.push("");
68
+ args.push("json=payload");
69
+ }
70
+ if (contentType && !body) {
71
+ args.push(`headers={'Content-Type': '${contentType}'}`);
72
+ }
73
+ lines.push(`response = requests.${method.toLowerCase()}(${args.join(", ")})`);
74
+ lines.push(`data = response.json()`);
75
+ return { lang: "python", label: "Python", source: lines.join("\n") };
76
+ }
77
+ function pythonDict(jsonStr) {
78
+ // Simple conversion of JSON to Python dict syntax
79
+ return jsonStr
80
+ .replace(/: true/g, ": True")
81
+ .replace(/: false/g, ": False")
82
+ .replace(/: null/g, ": None");
83
+ }
84
+ //# sourceMappingURL=code-samples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-samples.js","sourceRoot":"","sources":["../../src/utils/code-samples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { NormalizedSchema } from "../core/types.js";
2
+ /**
3
+ * Generate an example value from a JSON Schema definition.
4
+ *
5
+ * Improvements over legacy:
6
+ * - Handles anyOf/oneOf (picks first option)
7
+ * - Uses default values and first enum value
8
+ * - Returns "[circular]" instead of raw $ref string on cycles
9
+ * - Cycle detection via Set<string> instead of array linear scan
10
+ */
11
+ export declare function generateExample(schema: NormalizedSchema, seen?: Set<string>): unknown;
12
+ //# sourceMappingURL=example-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-generator.d.ts","sourceRoot":"","sources":["../../src/utils/example-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAC5B,OAAO,CAqDT"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Generate an example value from a JSON Schema definition.
3
+ *
4
+ * Improvements over legacy:
5
+ * - Handles anyOf/oneOf (picks first option)
6
+ * - Uses default values and first enum value
7
+ * - Returns "[circular]" instead of raw $ref string on cycles
8
+ * - Cycle detection via Set<string> instead of array linear scan
9
+ */
10
+ export function generateExample(schema, seen = new Set()) {
11
+ // Cycle detection using schema name
12
+ if (schema.name) {
13
+ if (seen.has(schema.name))
14
+ return "[circular]";
15
+ seen = new Set(seen);
16
+ seen.add(schema.name);
17
+ }
18
+ // Use explicit example first
19
+ if (schema.example !== undefined)
20
+ return schema.example;
21
+ // Use default value
22
+ if (schema.default !== undefined)
23
+ return schema.default;
24
+ // Use first enum value
25
+ if (schema.enum?.length)
26
+ return schema.enum[0];
27
+ // Use const
28
+ if (schema.const !== undefined)
29
+ return schema.const;
30
+ // Handle composition — pick first option
31
+ if (schema.allOf?.length) {
32
+ return mergeAllOfExamples(schema.allOf, seen);
33
+ }
34
+ if (schema.oneOf?.length) {
35
+ return generateExample(schema.oneOf[0], seen);
36
+ }
37
+ if (schema.anyOf?.length) {
38
+ return generateExample(schema.anyOf[0], seen);
39
+ }
40
+ const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;
41
+ switch (type) {
42
+ case "object":
43
+ return generateObjectExample(schema, seen);
44
+ case "array":
45
+ return generateArrayExample(schema, seen);
46
+ case "string":
47
+ return generateStringExample(schema);
48
+ case "integer":
49
+ return schema.minimum ?? 0;
50
+ case "number":
51
+ return schema.minimum ?? 0.0;
52
+ case "boolean":
53
+ return true;
54
+ case "null":
55
+ return null;
56
+ default:
57
+ // If it has properties, treat as object
58
+ if (schema.properties)
59
+ return generateObjectExample(schema, seen);
60
+ return undefined;
61
+ }
62
+ }
63
+ function generateObjectExample(schema, seen) {
64
+ const obj = {};
65
+ if (schema.properties) {
66
+ for (const [key, prop] of Object.entries(schema.properties)) {
67
+ const val = generateExample(prop, seen);
68
+ if (val !== undefined) {
69
+ obj[key] = val;
70
+ }
71
+ }
72
+ }
73
+ return obj;
74
+ }
75
+ function generateArrayExample(schema, seen) {
76
+ if (schema.items) {
77
+ const item = generateExample(schema.items, seen);
78
+ return item !== undefined ? [item] : [];
79
+ }
80
+ return [];
81
+ }
82
+ function generateStringExample(schema) {
83
+ switch (schema.format) {
84
+ case "date-time":
85
+ return "2024-01-15T09:30:00Z";
86
+ case "date":
87
+ return "2024-01-15";
88
+ case "time":
89
+ return "09:30:00Z";
90
+ case "email":
91
+ return "user@example.com";
92
+ case "uri":
93
+ case "url":
94
+ return "https://example.com";
95
+ case "uuid":
96
+ return "550e8400-e29b-41d4-a716-446655440000";
97
+ case "ipv4":
98
+ return "192.168.1.1";
99
+ case "ipv6":
100
+ return "::1";
101
+ case "hostname":
102
+ return "example.com";
103
+ case "binary":
104
+ return "<binary>";
105
+ case "byte":
106
+ return "dGVzdA==";
107
+ case "password":
108
+ return "********";
109
+ default:
110
+ return "string";
111
+ }
112
+ }
113
+ function mergeAllOfExamples(schemas, seen) {
114
+ const merged = {};
115
+ for (const sub of schemas) {
116
+ const example = generateExample(sub, seen);
117
+ if (example && typeof example === "object" && !Array.isArray(example)) {
118
+ Object.assign(merged, example);
119
+ }
120
+ }
121
+ return Object.keys(merged).length > 0 ? merged : undefined;
122
+ }
123
+ //# sourceMappingURL=example-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-generator.js","sourceRoot":"","sources":["../../src/utils/example-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Highlight code with Shiki (synchronous, build-time).
3
+ * Uses dual-theme output: light theme inline + dark theme via CSS vars.
4
+ * Switch themes with `.dark` class on a parent element.
5
+ *
6
+ * The HTML uses `--shiki-dark` CSS custom properties so dark mode
7
+ * works via CSS (no JS theme switching needed at runtime).
8
+ */
9
+ export declare function highlightCode(code: string, lang?: string): string;
10
+ //# sourceMappingURL=highlighter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlighter.d.ts","sourceRoot":"","sources":["../../src/utils/highlighter.ts"],"names":[],"mappings":"AA6BA;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBjE"}
@@ -0,0 +1,51 @@
1
+ import { createHighlighterCoreSync, createJavaScriptRegexEngine, } from "shiki";
2
+ import js from "shiki/langs/javascript.mjs";
3
+ import ts from "shiki/langs/typescript.mjs";
4
+ import bash from "shiki/langs/bash.mjs";
5
+ import python from "shiki/langs/python.mjs";
6
+ import json from "shiki/langs/json.mjs";
7
+ import cpp from "shiki/langs/cpp.mjs";
8
+ import c from "shiki/langs/c.mjs";
9
+ import yaml from "shiki/langs/yaml.mjs";
10
+ import html from "shiki/langs/html.mjs";
11
+ import css from "shiki/langs/css.mjs";
12
+ import go from "shiki/langs/go.mjs";
13
+ import rust from "shiki/langs/rust.mjs";
14
+ import cmake from "shiki/langs/cmake.mjs";
15
+ import sql from "shiki/langs/sql.mjs";
16
+ import xml from "shiki/langs/xml.mjs";
17
+ import docker from "shiki/langs/docker.mjs";
18
+ import githubLight from "shiki/themes/github-light-default.mjs";
19
+ import darkPlus from "shiki/themes/dark-plus.mjs";
20
+ const highlighter = createHighlighterCoreSync({
21
+ themes: [githubLight, darkPlus],
22
+ langs: [js, ts, bash, python, json, cpp, c, yaml, html, css, go, rust, cmake, sql, xml, docker],
23
+ engine: createJavaScriptRegexEngine(),
24
+ });
25
+ /**
26
+ * Highlight code with Shiki (synchronous, build-time).
27
+ * Uses dual-theme output: light theme inline + dark theme via CSS vars.
28
+ * Switch themes with `.dark` class on a parent element.
29
+ *
30
+ * The HTML uses `--shiki-dark` CSS custom properties so dark mode
31
+ * works via CSS (no JS theme switching needed at runtime).
32
+ */
33
+ export function highlightCode(code, lang) {
34
+ const resolved = lang && highlighter.getLoadedLanguages().includes(lang) ? lang : "text";
35
+ if (resolved === "text") {
36
+ // No highlighting — return escaped HTML in our standard structure
37
+ const escaped = code
38
+ .replace(/&/g, "&amp;")
39
+ .replace(/</g, "&lt;")
40
+ .replace(/>/g, "&gt;");
41
+ return `<pre class="shiki"><code>${escaped}</code></pre>`;
42
+ }
43
+ return highlighter.codeToHtml(code, {
44
+ lang: resolved,
45
+ themes: {
46
+ light: "github-light-default",
47
+ dark: "dark-plus",
48
+ },
49
+ });
50
+ }
51
+ //# sourceMappingURL=highlighter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlighter.js","sourceRoot":"","sources":["../../src/utils/highlighter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC5C,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC5C,OAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,OAAO,MAAM,MAAM,wBAAwB,CAAC;AAC5C,OAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,CAAC,MAAM,mBAAmB,CAAC;AAClC,OAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,OAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpC,OAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,OAAO,KAAK,MAAM,uBAAuB,CAAC;AAC1C,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,MAAM,MAAM,wBAAwB,CAAC;AAC5C,OAAO,WAAW,MAAM,uCAAuC,CAAC;AAChE,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAElD,MAAM,WAAW,GAAG,yBAAyB,CAAC;IAC5C,MAAM,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC;IAC/F,MAAM,EAAE,2BAA2B,EAAE;CACtC,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,IAAa;IACvD,MAAM,QAAQ,GAAG,IAAI,IAAI,WAAW,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAEzF,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,kEAAkE;QAClE,MAAM,OAAO,GAAG,IAAI;aACjB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzB,OAAO,4BAA4B,OAAO,eAAe,CAAC;IAC5D,CAAC;IAED,OAAO,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE;QAClC,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE;YACN,KAAK,EAAE,sBAAsB;YAC7B,IAAI,EAAE,WAAW;SAClB;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Convert a string into a URL-safe HTML id attribute value.
3
+ * Matches the legacy htmlId Handlebars helper behavior.
4
+ */
5
+ export declare function htmlId(value: string): string;
6
+ //# sourceMappingURL=html-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-id.d.ts","sourceRoot":"","sources":["../../src/utils/html-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK5C"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Convert a string into a URL-safe HTML id attribute value.
3
+ * Matches the legacy htmlId Handlebars helper behavior.
4
+ */
5
+ export function htmlId(value) {
6
+ return value
7
+ .toLowerCase()
8
+ .replace(/[^a-z0-9]+/g, "-")
9
+ .replace(/^-+|-+$/g, "");
10
+ }
11
+ //# sourceMappingURL=html-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-id.js","sourceRoot":"","sources":["../../src/utils/html-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare function httpStatusText(code: string): string;
2
+ /**
3
+ * Format a schema's numeric range constraints for display.
4
+ * Fixes legacy bug where maximumExclusive was checked with minimumExclusive.
5
+ */
6
+ export declare function schemaRange(schema: {
7
+ minimum?: number;
8
+ maximum?: number;
9
+ exclusiveMinimum?: number | boolean;
10
+ exclusiveMaximum?: number | boolean;
11
+ }): string | undefined;
12
+ /** HTTP method color classes for badges */
13
+ export declare function methodColor(method: string): string;
14
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAiDA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC,GAAG,MAAM,GAAG,SAAS,CA0BrB;AAED,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmBlD"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * HTTP response status code descriptions.
3
+ */
4
+ const HTTP_STATUS_CODES = {
5
+ "100": "Continue",
6
+ "101": "Switching Protocols",
7
+ "200": "OK",
8
+ "201": "Created",
9
+ "202": "Accepted",
10
+ "203": "Non-Authoritative Information",
11
+ "204": "No Content",
12
+ "205": "Reset Content",
13
+ "206": "Partial Content",
14
+ "300": "Multiple Choices",
15
+ "301": "Moved Permanently",
16
+ "302": "Found",
17
+ "303": "See Other",
18
+ "304": "Not Modified",
19
+ "307": "Temporary Redirect",
20
+ "308": "Permanent Redirect",
21
+ "400": "Bad Request",
22
+ "401": "Unauthorized",
23
+ "402": "Payment Required",
24
+ "403": "Forbidden",
25
+ "404": "Not Found",
26
+ "405": "Method Not Allowed",
27
+ "406": "Not Acceptable",
28
+ "407": "Proxy Authentication Required",
29
+ "408": "Request Timeout",
30
+ "409": "Conflict",
31
+ "410": "Gone",
32
+ "411": "Length Required",
33
+ "412": "Precondition Failed",
34
+ "413": "Payload Too Large",
35
+ "414": "URI Too Long",
36
+ "415": "Unsupported Media Type",
37
+ "416": "Range Not Satisfiable",
38
+ "417": "Expectation Failed",
39
+ "418": "I'm a Teapot",
40
+ "422": "Unprocessable Entity",
41
+ "429": "Too Many Requests",
42
+ "500": "Internal Server Error",
43
+ "501": "Not Implemented",
44
+ "502": "Bad Gateway",
45
+ "503": "Service Unavailable",
46
+ "504": "Gateway Timeout",
47
+ default: "",
48
+ };
49
+ export function httpStatusText(code) {
50
+ return HTTP_STATUS_CODES[code] ?? HTTP_STATUS_CODES["default"];
51
+ }
52
+ /**
53
+ * Format a schema's numeric range constraints for display.
54
+ * Fixes legacy bug where maximumExclusive was checked with minimumExclusive.
55
+ */
56
+ export function schemaRange(schema) {
57
+ const parts = [];
58
+ if (schema.minimum !== undefined) {
59
+ const exclusive = schema.exclusiveMinimum === true ||
60
+ typeof schema.exclusiveMinimum === "number";
61
+ const min = typeof schema.exclusiveMinimum === "number"
62
+ ? schema.exclusiveMinimum
63
+ : schema.minimum;
64
+ parts.push(`${exclusive ? "(" : "["}${min}`);
65
+ }
66
+ if (schema.maximum !== undefined) {
67
+ const exclusive = schema.exclusiveMaximum === true ||
68
+ typeof schema.exclusiveMaximum === "number";
69
+ const max = typeof schema.exclusiveMaximum === "number"
70
+ ? schema.exclusiveMaximum
71
+ : schema.maximum;
72
+ parts.push(`${max}${exclusive ? ")" : "]"}`);
73
+ }
74
+ return parts.length === 2 ? parts.join(", ") : undefined;
75
+ }
76
+ /** HTTP method color classes for badges */
77
+ export function methodColor(method) {
78
+ switch (method.toLowerCase()) {
79
+ case "get":
80
+ return "bg-emerald-600";
81
+ case "post":
82
+ return "bg-blue-600";
83
+ case "put":
84
+ return "bg-amber-600";
85
+ case "delete":
86
+ return "bg-red-600";
87
+ case "patch":
88
+ return "bg-purple-600";
89
+ case "options":
90
+ return "bg-gray-500";
91
+ case "head":
92
+ return "bg-gray-600";
93
+ default:
94
+ return "bg-gray-500";
95
+ }
96
+ }
97
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Render Markdown to HTML. Used for spec descriptions.
3
+ */
4
+ export declare function renderMarkdown(input?: string): string;
5
+ /**
6
+ * Render Markdown to inline HTML (strip wrapping <p> tags).
7
+ */
8
+ export declare function renderMarkdownInline(input?: string): string;
9
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3D"}
@@ -0,0 +1,18 @@
1
+ import { marked } from "marked";
2
+ /**
3
+ * Render Markdown to HTML. Used for spec descriptions.
4
+ */
5
+ export function renderMarkdown(input) {
6
+ if (!input)
7
+ return "";
8
+ return marked.parse(input, { async: false });
9
+ }
10
+ /**
11
+ * Render Markdown to inline HTML (strip wrapping <p> tags).
12
+ */
13
+ export function renderMarkdownInline(input) {
14
+ if (!input)
15
+ return "";
16
+ return marked.parseInline(input, { async: false });
17
+ }
18
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAW,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAW,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Plugin } from "vite";
2
+ export interface SourceyPluginOptions {
3
+ /** Additional file paths to watch (specs, markdown) */
4
+ watchPaths: string[];
5
+ /** SSR render function: given a URL path, return HTML or null */
6
+ render: (url: string) => Promise<string | null>;
7
+ /** Optional: generate search index JSON on demand */
8
+ searchIndex?: () => Promise<string>;
9
+ }
10
+ /**
11
+ * Vite plugin for Sourcey.
12
+ * - Injects SSR middleware that renders pages on the fly
13
+ * - Watches spec and markdown files; triggers full reload on change
14
+ */
15
+ export declare function sourceyPlugin(options: SourceyPluginOptions): Plugin;
16
+ //# sourceMappingURL=vite-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAIlD,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iEAAiE;IACjE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChD,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAiGnE"}
@@ -0,0 +1,92 @@
1
+ import { resolve, extname } from "node:path";
2
+ /**
3
+ * Vite plugin for Sourcey.
4
+ * - Injects SSR middleware that renders pages on the fly
5
+ * - Watches spec and markdown files; triggers full reload on change
6
+ */
7
+ export function sourceyPlugin(options) {
8
+ const { watchPaths, render, searchIndex } = options;
9
+ const watchSet = new Set(watchPaths.map((p) => resolve(p)));
10
+ return {
11
+ name: "sourcey",
12
+ configureServer(server) {
13
+ // Add spec/markdown files to Vite's watcher
14
+ for (const p of watchPaths) {
15
+ server.watcher.add(resolve(p));
16
+ }
17
+ // Trigger full reload when watched files or source components change
18
+ server.watcher.on("change", (file) => {
19
+ const ext = extname(file);
20
+ if (watchSet.has(file) ||
21
+ ext === ".md" ||
22
+ ext === ".yml" ||
23
+ ext === ".yaml" ||
24
+ ext === ".tsx" ||
25
+ ext === ".ts") {
26
+ // Invalidate SSR module cache so next render uses fresh source
27
+ const mods = server.moduleGraph.getModulesByFile(file);
28
+ if (mods) {
29
+ for (const mod of mods) {
30
+ server.moduleGraph.invalidateModule(mod);
31
+ }
32
+ }
33
+ const timestamp = new Date().toLocaleTimeString();
34
+ console.log(` [${timestamp}] ${file} changed, reloading…`);
35
+ server.ws.send({ type: "full-reload" });
36
+ }
37
+ });
38
+ // Return a post middleware (runs after Vite internals)
39
+ // We use pre-middleware instead by calling server.middlewares.use directly
40
+ // This runs BEFORE Vite's static file handler
41
+ server.middlewares.use(async (req, res, next) => {
42
+ const url = req.url ?? "/";
43
+ // Let Vite handle its own requests
44
+ if (url.startsWith("/@") ||
45
+ url.startsWith("/__vite") ||
46
+ url.startsWith("/node_modules/") ||
47
+ url === "/favicon.ico") {
48
+ return next();
49
+ }
50
+ // Serve search index on demand
51
+ if (url === "/search-index.json" && searchIndex) {
52
+ try {
53
+ const json = await searchIndex();
54
+ res.writeHead(200, {
55
+ "Content-Type": "application/json",
56
+ "Cache-Control": "no-cache",
57
+ });
58
+ res.end(json);
59
+ return;
60
+ }
61
+ catch {
62
+ return next();
63
+ }
64
+ }
65
+ // Only handle HTML page requests (no extension, or .html)
66
+ const ext = extname(url);
67
+ if (ext && ext !== ".html") {
68
+ return next();
69
+ }
70
+ try {
71
+ let html = await render(url);
72
+ if (!html) {
73
+ return next();
74
+ }
75
+ // Let Vite transform the HTML (injects HMR client script)
76
+ html = await server.transformIndexHtml(url, html);
77
+ res.writeHead(200, {
78
+ "Content-Type": "text/html; charset=utf-8",
79
+ "Cache-Control": "no-cache",
80
+ });
81
+ res.end(html);
82
+ }
83
+ catch (e) {
84
+ server.ssrFixStacktrace(e);
85
+ console.error(` SSR error for ${url}:`, e.message);
86
+ return next();
87
+ }
88
+ });
89
+ },
90
+ };
91
+ }
92
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"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"}