@lucasviola/specwiki 1.0.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 (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +226 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/generate.d.ts +5 -0
  8. package/dist/commands/generate.d.ts.map +1 -0
  9. package/dist/commands/generate.js +197 -0
  10. package/dist/commands/generate.js.map +1 -0
  11. package/dist/commands/init.d.ts +5 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +91 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/open.d.ts +8 -0
  16. package/dist/commands/open.d.ts.map +1 -0
  17. package/dist/commands/open.js +150 -0
  18. package/dist/commands/open.js.map +1 -0
  19. package/dist/config/loader.d.ts +20 -0
  20. package/dist/config/loader.d.ts.map +1 -0
  21. package/dist/config/loader.js +143 -0
  22. package/dist/config/loader.js.map +1 -0
  23. package/dist/config/patterns.d.ts +9 -0
  24. package/dist/config/patterns.d.ts.map +1 -0
  25. package/dist/config/patterns.js +159 -0
  26. package/dist/config/patterns.js.map +1 -0
  27. package/dist/core/Logger.d.ts +8 -0
  28. package/dist/core/Logger.d.ts.map +1 -0
  29. package/dist/core/Logger.js +33 -0
  30. package/dist/core/Logger.js.map +1 -0
  31. package/dist/core/paths.d.ts +8 -0
  32. package/dist/core/paths.d.ts.map +1 -0
  33. package/dist/core/paths.js +45 -0
  34. package/dist/core/paths.js.map +1 -0
  35. package/dist/discover/specs.d.ts +11 -0
  36. package/dist/discover/specs.d.ts.map +1 -0
  37. package/dist/discover/specs.js +157 -0
  38. package/dist/discover/specs.js.map +1 -0
  39. package/dist/output/html/assets/highlight.css +101 -0
  40. package/dist/output/html/assets/search.js +368 -0
  41. package/dist/output/html/assets/specwiki.css +905 -0
  42. package/dist/output/html/renderer.d.ts +21 -0
  43. package/dist/output/html/renderer.d.ts.map +1 -0
  44. package/dist/output/html/renderer.js +203 -0
  45. package/dist/output/html/renderer.js.map +1 -0
  46. package/dist/output/html/search-index.d.ts +20 -0
  47. package/dist/output/html/search-index.d.ts.map +1 -0
  48. package/dist/output/html/search-index.js +46 -0
  49. package/dist/output/html/search-index.js.map +1 -0
  50. package/dist/output/html/templates/article.mustache +85 -0
  51. package/dist/output/html/templates/index.mustache +80 -0
  52. package/dist/output/html/templates/layout.mustache +205 -0
  53. package/dist/output/llms.d.ts +4 -0
  54. package/dist/output/llms.d.ts.map +1 -0
  55. package/dist/output/llms.js +44 -0
  56. package/dist/output/llms.js.map +1 -0
  57. package/dist/output/readme-index.d.ts +17 -0
  58. package/dist/output/readme-index.d.ts.map +1 -0
  59. package/dist/output/readme-index.js +71 -0
  60. package/dist/output/readme-index.js.map +1 -0
  61. package/dist/output/wiki.d.ts +11 -0
  62. package/dist/output/wiki.d.ts.map +1 -0
  63. package/dist/output/wiki.js +400 -0
  64. package/dist/output/wiki.js.map +1 -0
  65. package/dist/parse/markdown.d.ts +6 -0
  66. package/dist/parse/markdown.d.ts.map +1 -0
  67. package/dist/parse/markdown.js +225 -0
  68. package/dist/parse/markdown.js.map +1 -0
  69. package/dist/types.d.ts +96 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +2 -0
  72. package/dist/types.js.map +1 -0
  73. package/package.json +67 -0
@@ -0,0 +1,368 @@
1
+ (function () {
2
+ "use strict";
3
+
4
+ var indexEl = document.getElementById("search-index");
5
+ var inputEl = document.getElementById("specwiki-search-input");
6
+ var resultsEl = document.getElementById("specwiki-search-results");
7
+ var groupsEl = document.getElementById("specwiki-search-groups");
8
+ var statusEl = document.getElementById("specwiki-search-status");
9
+
10
+ if (
11
+ !indexEl ||
12
+ !inputEl ||
13
+ !resultsEl ||
14
+ !groupsEl ||
15
+ !statusEl ||
16
+ typeof lunr === "undefined"
17
+ ) {
18
+ return;
19
+ }
20
+
21
+ var data;
22
+ try {
23
+ data = JSON.parse(indexEl.textContent || "");
24
+ } catch {
25
+ return;
26
+ }
27
+
28
+ if (!data || !Array.isArray(data.documents)) {
29
+ return;
30
+ }
31
+
32
+ var idx;
33
+ try {
34
+ idx = lunr(function () {
35
+ this.ref("slug");
36
+ this.field("title", { boost: 10 });
37
+ this.field("description", { boost: 5 });
38
+ this.field("category", { boost: 3 });
39
+ this.field("body");
40
+
41
+ for (var i = 0; i < data.documents.length; i++) {
42
+ var doc = data.documents[i];
43
+ this.add({
44
+ slug: doc.slug,
45
+ title: doc.title,
46
+ description: doc.description || "",
47
+ category: doc.category || "",
48
+ body: doc.body || "",
49
+ });
50
+ }
51
+ });
52
+ } catch {
53
+ return;
54
+ }
55
+
56
+ var docBySlug = Object.create(null);
57
+ for (var j = 0; j < data.documents.length; j++) {
58
+ docBySlug[data.documents[j].slug] = data.documents[j];
59
+ }
60
+
61
+ var activeOptions = [];
62
+ var activeIndex = -1;
63
+
64
+ function clearActiveOption() {
65
+ for (var i = 0; i < activeOptions.length; i++) {
66
+ activeOptions[i].setAttribute("aria-selected", "false");
67
+ }
68
+ activeIndex = -1;
69
+ inputEl.removeAttribute("aria-activedescendant");
70
+ }
71
+
72
+ function setOpen(open) {
73
+ resultsEl.hidden = !open;
74
+ inputEl.setAttribute("aria-expanded", String(open));
75
+ }
76
+
77
+ function closeResults() {
78
+ clearActiveOption();
79
+ activeOptions = [];
80
+ groupsEl.replaceChildren();
81
+ statusEl.textContent = "";
82
+ statusEl.hidden = true;
83
+ setOpen(false);
84
+ }
85
+
86
+ function closeDrawer() {
87
+ var toggle = document.getElementById("specwiki-nav-toggle");
88
+ var drawer = document.getElementById("specwiki-nav-drawer");
89
+ var backdrop = document.getElementById("specwiki-nav-backdrop");
90
+ if (
91
+ !toggle ||
92
+ !drawer ||
93
+ !backdrop ||
94
+ toggle.getAttribute("aria-expanded") !== "true"
95
+ ) {
96
+ return;
97
+ }
98
+
99
+ document.documentElement.classList.remove("specwiki-nav-open");
100
+ toggle.setAttribute("aria-expanded", "false");
101
+ drawer.setAttribute("aria-hidden", "true");
102
+ drawer.inert = true;
103
+ backdrop.hidden = true;
104
+ }
105
+
106
+ function focusSearch() {
107
+ closeDrawer();
108
+ inputEl.focus();
109
+ }
110
+
111
+ function isEditable(target) {
112
+ if (!target || !target.tagName) {
113
+ return false;
114
+ }
115
+ var tagName = target.tagName.toLowerCase();
116
+ return (
117
+ tagName === "input" ||
118
+ tagName === "textarea" ||
119
+ tagName === "select" ||
120
+ tagName === "button" ||
121
+ target.isContentEditable
122
+ );
123
+ }
124
+
125
+ function appendHighlighted(parent, text, query) {
126
+ var terms = query
127
+ .split(/\s+/)
128
+ .filter(Boolean)
129
+ .map(function (term) {
130
+ return term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
131
+ });
132
+ if (!terms.length) {
133
+ parent.appendChild(document.createTextNode(text));
134
+ return;
135
+ }
136
+
137
+ var matcher = new RegExp("(" + terms.join("|") + ")", "gi");
138
+ var parts = text.split(matcher);
139
+ for (var i = 0; i < parts.length; i++) {
140
+ if (!parts[i]) {
141
+ continue;
142
+ }
143
+ if (i % 2 === 1) {
144
+ var mark = document.createElement("mark");
145
+ mark.className = "specwiki-search-match";
146
+ mark.textContent = parts[i];
147
+ parent.appendChild(mark);
148
+ } else {
149
+ parent.appendChild(document.createTextNode(parts[i]));
150
+ }
151
+ }
152
+ }
153
+
154
+ function excerptFor(doc) {
155
+ var excerpt = doc.description || doc.body || "";
156
+ return excerpt.length > 180 ? excerpt.slice(0, 179) + "…" : excerpt;
157
+ }
158
+
159
+ function createOption(doc, query, optionIndex) {
160
+ var option = document.createElement("a");
161
+ var optionId = "specwiki-search-option-" + optionIndex;
162
+ option.className = "specwiki-search-option";
163
+ option.href = doc.slug + ".html";
164
+ option.setAttribute("href", doc.slug + ".html");
165
+ option.setAttribute("id", optionId);
166
+ option.setAttribute("role", "option");
167
+ option.setAttribute("aria-selected", "false");
168
+
169
+ var title = document.createElement("span");
170
+ title.className = "specwiki-search-title";
171
+ appendHighlighted(title, doc.title || doc.slug, query);
172
+ option.appendChild(title);
173
+
174
+ var category = document.createElement("span");
175
+ category.className = "specwiki-search-category";
176
+ category.textContent = doc.categoryLabel || doc.category || "Other";
177
+ option.appendChild(category);
178
+
179
+ var excerpt = excerptFor(doc);
180
+ if (excerpt) {
181
+ var snippet = document.createElement("span");
182
+ snippet.className = "specwiki-search-snippet";
183
+ appendHighlighted(snippet, excerpt, query);
184
+ option.appendChild(snippet);
185
+ }
186
+
187
+ option.addEventListener("mouseenter", function () {
188
+ setActiveOption(optionIndex);
189
+ });
190
+ option.addEventListener("click", function () {
191
+ closeResults();
192
+ });
193
+ return option;
194
+ }
195
+
196
+ function setActiveOption(nextIndex) {
197
+ if (!activeOptions.length) {
198
+ return;
199
+ }
200
+ if (activeIndex >= 0) {
201
+ activeOptions[activeIndex].setAttribute("aria-selected", "false");
202
+ }
203
+ activeIndex = (nextIndex + activeOptions.length) % activeOptions.length;
204
+ var active = activeOptions[activeIndex];
205
+ active.setAttribute("aria-selected", "true");
206
+ inputEl.setAttribute("aria-activedescendant", active.getAttribute("id"));
207
+ if (active.scrollIntoView) {
208
+ active.scrollIntoView({ block: "nearest" });
209
+ }
210
+ }
211
+
212
+ function showNoResults() {
213
+ clearActiveOption();
214
+ activeOptions = [];
215
+ groupsEl.replaceChildren();
216
+ statusEl.textContent = "No matching specs. Try fewer or different words.";
217
+ statusEl.hidden = false;
218
+ setOpen(true);
219
+ }
220
+
221
+ function showResults(results, query) {
222
+ clearActiveOption();
223
+ activeOptions = [];
224
+ groupsEl.replaceChildren();
225
+ statusEl.textContent = "";
226
+ statusEl.hidden = true;
227
+
228
+ var rankedDocs = [];
229
+ for (var i = 0; i < results.length && rankedDocs.length < 10; i++) {
230
+ var doc = docBySlug[results[i].ref];
231
+ if (doc) {
232
+ rankedDocs.push(doc);
233
+ }
234
+ }
235
+ if (!rankedDocs.length) {
236
+ showNoResults();
237
+ return;
238
+ }
239
+
240
+ var groups = [];
241
+ var groupByLabel = Object.create(null);
242
+ for (var j = 0; j < rankedDocs.length; j++) {
243
+ var rankedDoc = rankedDocs[j];
244
+ var categoryLabel =
245
+ rankedDoc.categoryLabel || rankedDoc.category || "Other";
246
+ var group = groupByLabel[categoryLabel];
247
+ if (!group) {
248
+ group = {
249
+ label: categoryLabel,
250
+ documents: [],
251
+ };
252
+ groupByLabel[categoryLabel] = group;
253
+ groups.push(group);
254
+ }
255
+ group.documents.push(rankedDoc);
256
+ }
257
+
258
+ for (var groupIndex = 0; groupIndex < groups.length; groupIndex++) {
259
+ var section = document.createElement("section");
260
+ section.className = "specwiki-search-group";
261
+ var heading = document.createElement("h2");
262
+ heading.className = "specwiki-search-group-heading";
263
+ heading.textContent = groups[groupIndex].label;
264
+ section.appendChild(heading);
265
+
266
+ var list = document.createElement("ul");
267
+ list.className = "specwiki-search-results-list";
268
+ list.setAttribute("role", "presentation");
269
+ for (
270
+ var docIndex = 0;
271
+ docIndex < groups[groupIndex].documents.length;
272
+ docIndex++
273
+ ) {
274
+ var listItem = document.createElement("li");
275
+ listItem.setAttribute("role", "presentation");
276
+ var option = createOption(
277
+ groups[groupIndex].documents[docIndex],
278
+ query,
279
+ activeOptions.length,
280
+ );
281
+ activeOptions.push(option);
282
+ listItem.appendChild(option);
283
+ list.appendChild(listItem);
284
+ }
285
+ section.appendChild(list);
286
+ groupsEl.appendChild(section);
287
+ }
288
+
289
+ closeDrawer();
290
+ setOpen(true);
291
+ }
292
+
293
+ inputEl.addEventListener("input", function () {
294
+ var q = inputEl.value.trim();
295
+ if (!q) {
296
+ closeResults();
297
+ return;
298
+ }
299
+
300
+ try {
301
+ showResults(idx.search(q), q);
302
+ } catch {
303
+ closeResults();
304
+ }
305
+ });
306
+
307
+ inputEl.addEventListener("keydown", function (event) {
308
+ if (
309
+ (event.key === "ArrowDown" || event.key === "ArrowUp") &&
310
+ activeOptions.length
311
+ ) {
312
+ event.preventDefault();
313
+ setActiveOption(
314
+ activeIndex < 0
315
+ ? event.key === "ArrowDown"
316
+ ? 0
317
+ : activeOptions.length - 1
318
+ : event.key === "ArrowDown"
319
+ ? activeIndex + 1
320
+ : activeIndex - 1,
321
+ );
322
+ return;
323
+ }
324
+ if (event.key === "Enter" && activeIndex >= 0) {
325
+ event.preventDefault();
326
+ document.location.href = activeOptions[activeIndex].getAttribute("href");
327
+ return;
328
+ }
329
+ if (event.key === "Escape") {
330
+ closeResults();
331
+ inputEl.focus();
332
+ }
333
+ });
334
+
335
+ inputEl.addEventListener("focus", closeDrawer);
336
+ var navToggle = document.getElementById("specwiki-nav-toggle");
337
+ if (navToggle) {
338
+ navToggle.addEventListener("click", closeResults);
339
+ }
340
+
341
+ document.addEventListener("keydown", function (event) {
342
+ var slashShortcut =
343
+ event.key === "/" &&
344
+ !event.metaKey &&
345
+ !event.ctrlKey &&
346
+ !event.altKey &&
347
+ !event.shiftKey &&
348
+ !isEditable(event.target);
349
+ var commandShortcut =
350
+ event.key.toLowerCase() === "k" &&
351
+ (event.metaKey || event.ctrlKey) &&
352
+ !event.altKey;
353
+ if (slashShortcut || commandShortcut) {
354
+ event.preventDefault();
355
+ focusSearch();
356
+ }
357
+ });
358
+
359
+ document.addEventListener("click", function (event) {
360
+ if (
361
+ event.target &&
362
+ typeof event.target.closest === "function" &&
363
+ !event.target.closest(".specwiki-search")
364
+ ) {
365
+ closeResults();
366
+ }
367
+ });
368
+ })();