irgen 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/LICENSE +21 -0
  3. package/README.md +161 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +312 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/dsl/aggregator.d.ts +8 -0
  9. package/dist/dsl/aggregator.d.ts.map +1 -0
  10. package/dist/dsl/aggregator.js +64 -0
  11. package/dist/dsl/aggregator.js.map +1 -0
  12. package/dist/dsl/frontend-runtime.d.ts +486 -0
  13. package/dist/dsl/frontend-runtime.d.ts.map +1 -0
  14. package/dist/dsl/frontend-runtime.js +232 -0
  15. package/dist/dsl/frontend-runtime.js.map +1 -0
  16. package/dist/dsl/runtime.d.ts +33 -0
  17. package/dist/dsl/runtime.d.ts.map +1 -0
  18. package/dist/dsl/runtime.js +120 -0
  19. package/dist/dsl/runtime.js.map +1 -0
  20. package/dist/emit/backend/adapters.d.ts +11 -0
  21. package/dist/emit/backend/adapters.d.ts.map +1 -0
  22. package/dist/emit/backend/adapters.js +374 -0
  23. package/dist/emit/backend/adapters.js.map +1 -0
  24. package/dist/emit/backend/backend-tsmorph.d.ts +5 -0
  25. package/dist/emit/backend/backend-tsmorph.d.ts.map +1 -0
  26. package/dist/emit/backend/backend-tsmorph.js +858 -0
  27. package/dist/emit/backend/backend-tsmorph.js.map +1 -0
  28. package/dist/emit/backend/fake-backend.d.ts +2 -0
  29. package/dist/emit/backend/fake-backend.d.ts.map +1 -0
  30. package/dist/emit/backend/fake-backend.js +19 -0
  31. package/dist/emit/backend/fake-backend.js.map +1 -0
  32. package/dist/emit/backend/packaging.d.ts +3 -0
  33. package/dist/emit/backend/packaging.d.ts.map +1 -0
  34. package/dist/emit/backend/packaging.js +71 -0
  35. package/dist/emit/backend/packaging.js.map +1 -0
  36. package/dist/emit/backend/server.d.ts +4 -0
  37. package/dist/emit/backend/server.d.ts.map +1 -0
  38. package/dist/emit/backend/server.js +169 -0
  39. package/dist/emit/backend/server.js.map +1 -0
  40. package/dist/emit/cli/cli-fake.d.ts +2 -0
  41. package/dist/emit/cli/cli-fake.d.ts.map +1 -0
  42. package/dist/emit/cli/cli-fake.js +33 -0
  43. package/dist/emit/cli/cli-fake.js.map +1 -0
  44. package/dist/emit/electron/electron-shell.d.ts +3 -0
  45. package/dist/emit/electron/electron-shell.d.ts.map +1 -0
  46. package/dist/emit/electron/electron-shell.js +454 -0
  47. package/dist/emit/electron/electron-shell.js.map +1 -0
  48. package/dist/emit/engine.d.ts +14 -0
  49. package/dist/emit/engine.d.ts.map +1 -0
  50. package/dist/emit/engine.js +25 -0
  51. package/dist/emit/engine.js.map +1 -0
  52. package/dist/emit/format.d.ts +2 -0
  53. package/dist/emit/format.d.ts.map +1 -0
  54. package/dist/emit/format.js +23 -0
  55. package/dist/emit/format.js.map +1 -0
  56. package/dist/emit/frontend/frontend-react.d.ts +4 -0
  57. package/dist/emit/frontend/frontend-react.d.ts.map +1 -0
  58. package/dist/emit/frontend/frontend-react.js +2021 -0
  59. package/dist/emit/frontend/frontend-react.js.map +1 -0
  60. package/dist/emit/frontend/registry.d.ts +20 -0
  61. package/dist/emit/frontend/registry.d.ts.map +1 -0
  62. package/dist/emit/frontend/registry.js +46 -0
  63. package/dist/emit/frontend/registry.js.map +1 -0
  64. package/dist/emit/frontend/runtime-emitter.d.ts +4 -0
  65. package/dist/emit/frontend/runtime-emitter.d.ts.map +1 -0
  66. package/dist/emit/frontend/runtime-emitter.js +435 -0
  67. package/dist/emit/frontend/runtime-emitter.js.map +1 -0
  68. package/dist/emit/frontend/runtime-template.d.ts +28 -0
  69. package/dist/emit/frontend/runtime-template.d.ts.map +1 -0
  70. package/dist/emit/frontend/runtime-template.js +218 -0
  71. package/dist/emit/frontend/runtime-template.js.map +1 -0
  72. package/dist/emit/frontend/ssg.d.ts +8 -0
  73. package/dist/emit/frontend/ssg.d.ts.map +1 -0
  74. package/dist/emit/frontend/ssg.js +219 -0
  75. package/dist/emit/frontend/ssg.js.map +1 -0
  76. package/dist/emit/registry.d.ts +17 -0
  77. package/dist/emit/registry.d.ts.map +1 -0
  78. package/dist/emit/registry.js +38 -0
  79. package/dist/emit/registry.js.map +1 -0
  80. package/dist/emit/static-site/css.d.ts +5 -0
  81. package/dist/emit/static-site/css.d.ts.map +1 -0
  82. package/dist/emit/static-site/css.js +872 -0
  83. package/dist/emit/static-site/css.js.map +1 -0
  84. package/dist/emit/static-site/enhancements.d.ts +11 -0
  85. package/dist/emit/static-site/enhancements.d.ts.map +1 -0
  86. package/dist/emit/static-site/enhancements.js +266 -0
  87. package/dist/emit/static-site/enhancements.js.map +1 -0
  88. package/dist/emit/static-site/static-site-html.d.ts +3 -0
  89. package/dist/emit/static-site/static-site-html.d.ts.map +1 -0
  90. package/dist/emit/static-site/static-site-html.js +1172 -0
  91. package/dist/emit/static-site/static-site-html.js.map +1 -0
  92. package/dist/emit/utils/sdk.d.ts +15 -0
  93. package/dist/emit/utils/sdk.d.ts.map +1 -0
  94. package/dist/emit/utils/sdk.js +34 -0
  95. package/dist/emit/utils/sdk.js.map +1 -0
  96. package/dist/extensions/context.d.ts +23 -0
  97. package/dist/extensions/context.d.ts.map +1 -0
  98. package/dist/extensions/context.js +43 -0
  99. package/dist/extensions/context.js.map +1 -0
  100. package/dist/index.d.ts +32 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +135 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/ir/decl/backend.raw.schema.d.ts +128 -0
  105. package/dist/ir/decl/backend.raw.schema.d.ts.map +1 -0
  106. package/dist/ir/decl/backend.raw.schema.js +24 -0
  107. package/dist/ir/decl/backend.raw.schema.js.map +1 -0
  108. package/dist/ir/decl/bundle.d.ts +15 -0
  109. package/dist/ir/decl/bundle.d.ts.map +1 -0
  110. package/dist/ir/decl/bundle.js +8 -0
  111. package/dist/ir/decl/bundle.js.map +1 -0
  112. package/dist/ir/decl/cli.raw.schema.d.ts +133 -0
  113. package/dist/ir/decl/cli.raw.schema.d.ts.map +1 -0
  114. package/dist/ir/decl/cli.raw.schema.js +20 -0
  115. package/dist/ir/decl/cli.raw.schema.js.map +1 -0
  116. package/dist/ir/decl/frontend.raw.schema.d.ts +6631 -0
  117. package/dist/ir/decl/frontend.raw.schema.d.ts.map +1 -0
  118. package/dist/ir/decl/frontend.raw.schema.js +272 -0
  119. package/dist/ir/decl/frontend.raw.schema.js.map +1 -0
  120. package/dist/ir/decl/index.d.ts +6 -0
  121. package/dist/ir/decl/index.d.ts.map +1 -0
  122. package/dist/ir/decl/index.js +6 -0
  123. package/dist/ir/decl/index.js.map +1 -0
  124. package/dist/ir/decl/normalize.schema.d.ts +9154 -0
  125. package/dist/ir/decl/normalize.schema.d.ts.map +1 -0
  126. package/dist/ir/decl/normalize.schema.js +71 -0
  127. package/dist/ir/decl/normalize.schema.js.map +1 -0
  128. package/dist/ir/domain/backend.d.ts +19 -0
  129. package/dist/ir/domain/backend.d.ts.map +1 -0
  130. package/dist/ir/domain/backend.js +3 -0
  131. package/dist/ir/domain/backend.js.map +1 -0
  132. package/dist/ir/domain/cli.d.ts +18 -0
  133. package/dist/ir/domain/cli.d.ts.map +1 -0
  134. package/dist/ir/domain/cli.js +2 -0
  135. package/dist/ir/domain/cli.js.map +1 -0
  136. package/dist/ir/domain/frontend/index.d.ts +190 -0
  137. package/dist/ir/domain/frontend/index.d.ts.map +1 -0
  138. package/dist/ir/domain/frontend/index.js +2 -0
  139. package/dist/ir/domain/frontend/index.js.map +1 -0
  140. package/dist/ir/domain/frontend.d.ts +2 -0
  141. package/dist/ir/domain/frontend.d.ts.map +1 -0
  142. package/dist/ir/domain/frontend.js +3 -0
  143. package/dist/ir/domain/frontend.js.map +1 -0
  144. package/dist/ir/frontend-contract.d.ts +187 -0
  145. package/dist/ir/frontend-contract.d.ts.map +1 -0
  146. package/dist/ir/frontend-contract.js +6 -0
  147. package/dist/ir/frontend-contract.js.map +1 -0
  148. package/dist/ir/target/backend.d.ts +11 -0
  149. package/dist/ir/target/backend.d.ts.map +1 -0
  150. package/dist/ir/target/backend.js +2 -0
  151. package/dist/ir/target/backend.js.map +1 -0
  152. package/dist/ir/target/backend.policy.d.ts +896 -0
  153. package/dist/ir/target/backend.policy.d.ts.map +1 -0
  154. package/dist/ir/target/backend.policy.js +106 -0
  155. package/dist/ir/target/backend.policy.js.map +1 -0
  156. package/dist/ir/target/cli.d.ts +3 -0
  157. package/dist/ir/target/cli.d.ts.map +1 -0
  158. package/dist/ir/target/cli.js +2 -0
  159. package/dist/ir/target/cli.js.map +1 -0
  160. package/dist/ir/target/electron.d.ts +99 -0
  161. package/dist/ir/target/electron.d.ts.map +1 -0
  162. package/dist/ir/target/electron.js +2 -0
  163. package/dist/ir/target/electron.js.map +1 -0
  164. package/dist/ir/target/electron.policy.d.ts +7015 -0
  165. package/dist/ir/target/electron.policy.d.ts.map +1 -0
  166. package/dist/ir/target/electron.policy.js +119 -0
  167. package/dist/ir/target/electron.policy.js.map +1 -0
  168. package/dist/ir/target/frontend.d.ts +12 -0
  169. package/dist/ir/target/frontend.d.ts.map +1 -0
  170. package/dist/ir/target/frontend.js +2 -0
  171. package/dist/ir/target/frontend.js.map +1 -0
  172. package/dist/ir/target/frontend.policy.d.ts +268 -0
  173. package/dist/ir/target/frontend.policy.d.ts.map +1 -0
  174. package/dist/ir/target/frontend.policy.js +33 -0
  175. package/dist/ir/target/frontend.policy.js.map +1 -0
  176. package/dist/ir/target/index.d.ts +6 -0
  177. package/dist/ir/target/index.d.ts.map +1 -0
  178. package/dist/ir/target/index.js +6 -0
  179. package/dist/ir/target/index.js.map +1 -0
  180. package/dist/ir/target/static-site.d.ts +18 -0
  181. package/dist/ir/target/static-site.d.ts.map +1 -0
  182. package/dist/ir/target/static-site.js +2 -0
  183. package/dist/ir/target/static-site.js.map +1 -0
  184. package/dist/ir/target/static-site.policy.d.ts +2911 -0
  185. package/dist/ir/target/static-site.policy.d.ts.map +1 -0
  186. package/dist/ir/target/static-site.policy.js +127 -0
  187. package/dist/ir/target/static-site.policy.js.map +1 -0
  188. package/dist/lowering/backend.d.ts +4 -0
  189. package/dist/lowering/backend.d.ts.map +1 -0
  190. package/dist/lowering/backend.js +57 -0
  191. package/dist/lowering/backend.js.map +1 -0
  192. package/dist/lowering/cli.d.ts +4 -0
  193. package/dist/lowering/cli.d.ts.map +1 -0
  194. package/dist/lowering/cli.js +22 -0
  195. package/dist/lowering/cli.js.map +1 -0
  196. package/dist/lowering/engine.d.ts +18 -0
  197. package/dist/lowering/engine.d.ts.map +1 -0
  198. package/dist/lowering/engine.js +47 -0
  199. package/dist/lowering/engine.js.map +1 -0
  200. package/dist/lowering/frontend.d.ts +9 -0
  201. package/dist/lowering/frontend.d.ts.map +1 -0
  202. package/dist/lowering/frontend.js +246 -0
  203. package/dist/lowering/frontend.js.map +1 -0
  204. package/dist/lowering/targets/to-backend.d.ts +9 -0
  205. package/dist/lowering/targets/to-backend.d.ts.map +1 -0
  206. package/dist/lowering/targets/to-backend.js +55 -0
  207. package/dist/lowering/targets/to-backend.js.map +1 -0
  208. package/dist/lowering/targets/to-cli.d.ts +4 -0
  209. package/dist/lowering/targets/to-cli.d.ts.map +1 -0
  210. package/dist/lowering/targets/to-cli.js +11 -0
  211. package/dist/lowering/targets/to-cli.js.map +1 -0
  212. package/dist/lowering/targets/to-electron.d.ts +30 -0
  213. package/dist/lowering/targets/to-electron.d.ts.map +1 -0
  214. package/dist/lowering/targets/to-electron.js +87 -0
  215. package/dist/lowering/targets/to-electron.js.map +1 -0
  216. package/dist/lowering/targets/to-frontend.d.ts +4 -0
  217. package/dist/lowering/targets/to-frontend.d.ts.map +1 -0
  218. package/dist/lowering/targets/to-frontend.js +30 -0
  219. package/dist/lowering/targets/to-frontend.js.map +1 -0
  220. package/dist/lowering/targets/to-static-site.d.ts +16 -0
  221. package/dist/lowering/targets/to-static-site.d.ts.map +1 -0
  222. package/dist/lowering/targets/to-static-site.js +30 -0
  223. package/dist/lowering/targets/to-static-site.js.map +1 -0
  224. package/dist/mappers/index.d.ts +12 -0
  225. package/dist/mappers/index.d.ts.map +1 -0
  226. package/dist/mappers/index.js +60 -0
  227. package/dist/mappers/index.js.map +1 -0
  228. package/dist/types/extension.d.ts +3 -0
  229. package/dist/types/extension.d.ts.map +1 -0
  230. package/dist/types/extension.js +2 -0
  231. package/dist/types/extension.js.map +1 -0
  232. package/dist/utils/array.d.ts +2 -0
  233. package/dist/utils/array.d.ts.map +1 -0
  234. package/dist/utils/array.js +4 -0
  235. package/dist/utils/array.js.map +1 -0
  236. package/dist/utils/index.d.ts +3 -0
  237. package/dist/utils/index.d.ts.map +1 -0
  238. package/dist/utils/index.js +3 -0
  239. package/dist/utils/index.js.map +1 -0
  240. package/dist/utils/string.d.ts +13 -0
  241. package/dist/utils/string.d.ts.map +1 -0
  242. package/dist/utils/string.js +56 -0
  243. package/dist/utils/string.js.map +1 -0
  244. package/package.json +112 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../../src/emit/static-site/css.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ type EnhancementCaps = {
2
+ sidebarToggle: boolean;
3
+ copyCode: boolean;
4
+ themeToggle: boolean;
5
+ tocScrollSpy: boolean;
6
+ search: boolean;
7
+ mermaid: boolean;
8
+ };
9
+ export declare function emitEnhancements(outDir: string, caps: EnhancementCaps): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=enhancements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancements.d.ts","sourceRoot":"","sources":["../../../src/emit/static-site/enhancements.ts"],"names":[],"mappings":"AAGA,KAAK,eAAe,GAAG;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAkQF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3F"}
@@ -0,0 +1,266 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ function buildEnhancementsJs(caps) {
4
+ return `
5
+ (() => {
6
+ const root = document.documentElement;
7
+ const CAP_SIDEBAR = ${caps.sidebarToggle};
8
+ const CAP_COPY = ${caps.copyCode};
9
+ const CAP_THEME = ${caps.themeToggle};
10
+ const CAP_TOC = ${caps.tocScrollSpy};
11
+ const CAP_SEARCH = ${caps.search};
12
+ const CAP_MERMAID = ${caps.mermaid};
13
+
14
+ function on(el, ev, fn) {
15
+ if (!el) return;
16
+ el.addEventListener(ev, fn);
17
+ }
18
+
19
+ function toggleSidebar(btn) {
20
+ const isCollapsed = root.getAttribute("data-irgen-sidebar") === "collapsed";
21
+ const next = isCollapsed ? "" : "collapsed";
22
+ if (next) root.setAttribute("data-irgen-sidebar", next);
23
+ else root.removeAttribute("data-irgen-sidebar");
24
+ btn.setAttribute("aria-expanded", String(!isCollapsed));
25
+ }
26
+
27
+ function setupSidebarToggle() {
28
+ const btn = document.querySelector("[data-irgen-sidebar-toggle]");
29
+ on(btn, "click", () => toggleSidebar(btn));
30
+ }
31
+
32
+ function readThemePref() {
33
+ try {
34
+ return localStorage.getItem("irgen-theme");
35
+ } catch (_) {
36
+ return null;
37
+ }
38
+ }
39
+
40
+ function writeThemePref(value) {
41
+ try {
42
+ localStorage.setItem("irgen-theme", value);
43
+ } catch (_) {
44
+ // ignore
45
+ }
46
+ }
47
+
48
+ function detectSystemTheme() {
49
+ return window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches
50
+ ? "dark"
51
+ : "light";
52
+ }
53
+
54
+ function applyTheme(value) {
55
+ root.setAttribute("data-theme", value);
56
+ }
57
+
58
+ function setupThemeToggle() {
59
+ const btn = document.querySelector("[data-irgen-theme-toggle]");
60
+ if (!btn) return;
61
+ const pref = readThemePref();
62
+ const initial = pref || detectSystemTheme();
63
+ applyTheme(initial);
64
+ btn.setAttribute("aria-pressed", String(initial === "dark"));
65
+ on(btn, "click", () => {
66
+ const current = root.getAttribute("data-theme") === "dark" ? "dark" : "light";
67
+ const next = current === "dark" ? "light" : "dark";
68
+ applyTheme(next);
69
+ writeThemePref(next);
70
+ btn.setAttribute("aria-pressed", String(next === "dark"));
71
+ });
72
+ }
73
+
74
+ function setupTocScrollSpy() {
75
+ const toc = document.querySelector("[data-irgen-toc]");
76
+ if (!toc) return;
77
+ const links = Array.from(document.querySelectorAll("[data-irgen-toc-link]"));
78
+ if (!links.length) return;
79
+ const targets = links.map((link) => {
80
+ const id = link.getAttribute("data-irgen-toc-link");
81
+ const el = id ? document.getElementById(id) : null;
82
+ return { link, el, id };
83
+ }).filter((t) => t.el);
84
+
85
+ if (!targets.length) return;
86
+
87
+ const observer = new IntersectionObserver((entries) => {
88
+ let activeId = null;
89
+ for (const entry of entries) {
90
+ if (entry.isIntersecting) {
91
+ activeId = entry.target.getAttribute("id");
92
+ break;
93
+ }
94
+ }
95
+ if (!activeId) return;
96
+ targets.forEach((t) => {
97
+ if (!t.id) return;
98
+ t.link.classList.toggle("is-active", t.id === activeId);
99
+ });
100
+ }, { rootMargin: "0px 0px -70% 0px", threshold: [0, 1] });
101
+
102
+ targets.forEach((t) => observer.observe(t.el));
103
+ links.forEach((link) => {
104
+ on(link, "click", (e) => {
105
+ const href = link.getAttribute("href") || "";
106
+ if (!href.startsWith("#")) return;
107
+ const target = document.getElementById(href.slice(1));
108
+ if (!target) return;
109
+ e.preventDefault();
110
+ target.scrollIntoView({ behavior: "smooth", block: "start" });
111
+ });
112
+ });
113
+ }
114
+ function copyText(text) {
115
+ if (navigator.clipboard && navigator.clipboard.writeText) {
116
+ return navigator.clipboard.writeText(text);
117
+ }
118
+ const textarea = document.createElement("textarea");
119
+ textarea.value = text;
120
+ textarea.style.position = "fixed";
121
+ textarea.style.opacity = "0";
122
+ document.body.appendChild(textarea);
123
+ textarea.select();
124
+ document.execCommand("copy");
125
+ textarea.remove();
126
+ return Promise.resolve();
127
+ }
128
+
129
+ function setupCopyCode() {
130
+ const buttons = document.querySelectorAll("[data-irgen-copy-code]");
131
+ buttons.forEach((btn) => {
132
+ on(btn, "click", async () => {
133
+ const container = btn.closest(".irgen-code");
134
+ const code = container ? container.querySelector("code") : null;
135
+ const text = code ? code.textContent || "" : "";
136
+ if (!text) return;
137
+ const label = btn.querySelector(".irgen-button-label");
138
+ const setLabel = (value) => {
139
+ if (label) {
140
+ label.textContent = value;
141
+ } else {
142
+ btn.textContent = value;
143
+ }
144
+ };
145
+ try {
146
+ await copyText(text);
147
+ setLabel("Copied");
148
+ setTimeout(() => { setLabel("Copy"); }, 1200);
149
+ } catch (_) {
150
+ setLabel("Failed");
151
+ setTimeout(() => { setLabel("Copy"); }, 1200);
152
+ }
153
+ });
154
+ });
155
+ }
156
+
157
+ function setupCopyAnchors() {
158
+ const buttons = document.querySelectorAll("[data-irgen-copy-anchor]");
159
+ buttons.forEach((btn) => {
160
+ btn.addEventListener("click", async () => {
161
+ const anchor = btn.getAttribute("data-irgen-copy-anchor");
162
+ if (!anchor) return;
163
+ try {
164
+ const url = new URL(anchor, window.location.href).href;
165
+ await copyText(url);
166
+ btn.classList.add("is-copied");
167
+ setTimeout(() => { btn.classList.remove("is-copied"); }, 1200);
168
+ } catch (_) {
169
+ // no-op
170
+ }
171
+ });
172
+ });
173
+ }
174
+
175
+ async function setupSearch() {
176
+ const root = document.querySelector("[data-irgen-search]");
177
+ if (!root) return;
178
+ const input = root.querySelector("[data-irgen-search-input]");
179
+ const results = root.querySelector("[data-irgen-search-results]");
180
+ if (!input || !results) return;
181
+ const indexUrl = root.getAttribute("data-irgen-search-index") || "assets/search-index.json";
182
+ let index = null;
183
+ let mini = null;
184
+ try {
185
+ const resp = await fetch(indexUrl);
186
+ if (!resp.ok) return;
187
+ index = await resp.json();
188
+ } catch (_) {
189
+ return;
190
+ }
191
+
192
+ if (window.MiniSearch && index && Array.isArray(index.items)) {
193
+ mini = new window.MiniSearch({
194
+ fields: ["title", "description", "content"],
195
+ storeFields: ["title", "description", "url"],
196
+ });
197
+ mini.addAll(index.items);
198
+ }
199
+
200
+ function render(items) {
201
+ if (!items.length) {
202
+ results.innerHTML = "";
203
+ results.classList.remove("is-open");
204
+ return;
205
+ }
206
+ const html = items.slice(0, 8).map((it) => {
207
+ const title = (it.title || "").toString();
208
+ const desc = (it.description || "").toString();
209
+ return \`<a class="irgen-search-item" href="\${it.url}"><strong>\${title}</strong><span>\${desc}</span></a>\`;
210
+ }).join("");
211
+ results.innerHTML = html;
212
+ results.classList.add("is-open");
213
+ }
214
+
215
+ input.addEventListener("input", () => {
216
+ const q = input.value.trim().toLowerCase();
217
+ if (!q || !index || !Array.isArray(index.items)) {
218
+ render([]);
219
+ return;
220
+ }
221
+ if (mini) {
222
+ const matches = mini.search(q, { prefix: true, fuzzy: 0.2 });
223
+ render(matches);
224
+ return;
225
+ }
226
+ const matches = index.items.filter((it) => {
227
+ const hay = \`\${it.title} \${it.description} \${it.content}\`.toLowerCase();
228
+ return hay.includes(q);
229
+ });
230
+ render(matches);
231
+ });
232
+ }
233
+
234
+ function setupMermaid() {
235
+ if (!window.mermaid) return;
236
+ const theme = root.getAttribute("data-theme") === "dark" ? "dark" : "default";
237
+ window.mermaid.initialize({ startOnLoad: false, theme });
238
+ const nodes = document.querySelectorAll(".mermaid");
239
+ if (nodes.length) {
240
+ window.mermaid.run({ nodes });
241
+ }
242
+ }
243
+
244
+ document.addEventListener("DOMContentLoaded", () => {
245
+ if (CAP_SIDEBAR) setupSidebarToggle();
246
+ if (CAP_COPY) {
247
+ setupCopyCode();
248
+ setupCopyAnchors();
249
+ }
250
+ if (CAP_THEME) setupThemeToggle();
251
+ if (CAP_TOC) setupTocScrollSpy();
252
+ if (CAP_SEARCH) setupSearch();
253
+ if (CAP_MERMAID) setupMermaid();
254
+ });
255
+ })();
256
+ `.trim();
257
+ }
258
+ export async function emitEnhancements(outDir, caps) {
259
+ const assetsDir = path.join(outDir, "assets");
260
+ await fs.mkdir(assetsDir, { recursive: true });
261
+ if (!caps.sidebarToggle && !caps.copyCode && !caps.themeToggle && !caps.tocScrollSpy && !caps.search && !caps.mermaid)
262
+ return;
263
+ const js = buildEnhancementsJs(caps);
264
+ await fs.writeFile(path.join(assetsDir, "app.js"), `${js}\n`, "utf-8");
265
+ }
266
+ //# sourceMappingURL=enhancements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancements.js","sourceRoot":"","sources":["../../../src/emit/static-site/enhancements.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAWlC,SAAS,mBAAmB,CAAC,IAAqB;IAChD,OAAO;;;wBAGe,IAAI,CAAC,aAAa;qBACrB,IAAI,CAAC,QAAQ;sBACZ,IAAI,CAAC,WAAW;oBAClB,IAAI,CAAC,YAAY;uBACd,IAAI,CAAC,MAAM;wBACV,IAAI,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoPnC,CAAC,IAAI,EAAE,CAAC;AACT,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,IAAqB;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO;IAC9H,MAAM,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StaticSiteTargetIR } from "../../ir/target/static-site.js";
2
+ export declare function emitStaticSite(ir: StaticSiteTargetIR, outDir: string): Promise<void>;
3
+ //# sourceMappingURL=static-site-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-site-html.d.ts","sourceRoot":"","sources":["../../../src/emit/static-site/static-site-html.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAmlCzE,wBAAsB,cAAc,CAAC,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2J1F"}