@luna_ui/luna 0.11.0 → 0.20.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 (86) hide show
  1. package/dist/api-DAWeanTX.js +1 -0
  2. package/dist/api-qXll116-.d.ts +80 -0
  3. package/dist/cli.mjs +27 -22
  4. package/dist/css/index.js +1 -0
  5. package/dist/event-utils.d.ts +1 -1
  6. package/dist/event-utils.js +1 -1
  7. package/dist/{index-BZoM-af5.d.ts → index-VY8G32hr.d.ts} +16 -76
  8. package/dist/index.d.ts +4 -3
  9. package/dist/index.js +1 -1
  10. package/dist/jsx-dev-runtime.js +1 -1
  11. package/dist/jsx-runtime.d.ts +1 -1
  12. package/dist/jsx-runtime.js +1 -1
  13. package/dist/raw.d.ts +2 -0
  14. package/dist/raw.js +1 -0
  15. package/dist/resource.d.ts +41 -0
  16. package/dist/resource.js +1 -0
  17. package/dist/router-lite.d.ts +44 -0
  18. package/dist/router-lite.js +1 -0
  19. package/dist/signals-shared.d.ts +12 -0
  20. package/dist/signals-shared.js +1 -0
  21. package/dist/signals.d.ts +2 -3
  22. package/dist/signals.js +1 -1
  23. package/dist/vite-plugin.d.ts +7708 -2
  24. package/dist/vite-plugin.js +7 -6
  25. package/package.json +30 -11
  26. package/dist/event-utils-9cHYnvun.js +0 -1
  27. package/dist/src-BFWjzzPo.js +0 -1
  28. package/src/css/extract.ts +0 -798
  29. package/src/css/index.ts +0 -10
  30. package/src/css/inject.ts +0 -205
  31. package/src/css/inline.ts +0 -182
  32. package/src/css/minify.ts +0 -70
  33. package/src/css/optimizer.ts +0 -6
  34. package/src/css/runtime.ts +0 -344
  35. package/src/css-optimizer/README.md +0 -353
  36. package/src/css-optimizer/cooccurrence.ts +0 -100
  37. package/src/css-optimizer/core.ts +0 -263
  38. package/src/css-optimizer/extractors.ts +0 -243
  39. package/src/css-optimizer/hash.ts +0 -54
  40. package/src/css-optimizer/index.ts +0 -129
  41. package/src/css-optimizer/merge.ts +0 -109
  42. package/src/css-optimizer/moonbit-analyzer.ts +0 -210
  43. package/src/css-optimizer/parser.ts +0 -120
  44. package/src/css-optimizer/pattern.ts +0 -171
  45. package/src/css-optimizer/transformers.ts +0 -301
  46. package/src/css-optimizer/types.ts +0 -128
  47. package/src/event-utils.ts +0 -227
  48. package/src/hydration/createHydrator.ts +0 -62
  49. package/src/hydration/delegate.ts +0 -62
  50. package/src/hydration/drag.ts +0 -214
  51. package/src/hydration/index.ts +0 -12
  52. package/src/hydration/keyboard.ts +0 -64
  53. package/src/hydration/toggle.ts +0 -101
  54. package/src/index.ts +0 -908
  55. package/src/jsx-dev-runtime.ts +0 -2
  56. package/src/jsx-runtime.ts +0 -398
  57. package/src/signals.ts +0 -113
  58. package/src/vite-plugin.ts +0 -718
  59. package/tests/__screenshots__/apg.test.ts/APG-Components---Accessibility-Tests-Button-Pattern-disabled-button-has-aria-disabled-1.png +0 -0
  60. package/tests/__screenshots__/resource.test.ts/Resource-API--SolidJS-style--createResource-error-is-undefined-when-pending-1.png +0 -0
  61. package/tests/__screenshots__/resource.test.ts/Resource-API--SolidJS-style--createResource-transitions-to-success-on-resolve-1.png +0 -0
  62. package/tests/apg.test.ts +0 -466
  63. package/tests/context.test.ts +0 -118
  64. package/tests/css-optimizer-extractors.test.ts +0 -264
  65. package/tests/css-optimizer-integration.test.ts +0 -566
  66. package/tests/css-optimizer-transformers.test.ts +0 -301
  67. package/tests/css-optimizer.test.ts +0 -646
  68. package/tests/css-runtime.bench.ts +0 -442
  69. package/tests/css-runtime.test.ts +0 -342
  70. package/tests/debounced.test.ts +0 -165
  71. package/tests/dom.test.ts +0 -873
  72. package/tests/integration.test.ts +0 -405
  73. package/tests/issue-11-show-null-to-truthy.test.ts +0 -176
  74. package/tests/issue-5-for-infinite-loop.test.ts +0 -516
  75. package/tests/jsx-runtime.test.tsx +0 -393
  76. package/tests/lifecycle.test.ts +0 -833
  77. package/tests/move-before.bench.ts +0 -304
  78. package/tests/preact-signals-comparison.test.ts +0 -1608
  79. package/tests/resource.test.ts +0 -170
  80. package/tests/router.test.ts +0 -117
  81. package/tests/show-initial-mount-leak.test.tsx +0 -182
  82. package/tests/solidjs-api.test.ts +0 -660
  83. package/tests/static-perf.bench.ts +0 -64
  84. package/tests/store.test.ts +0 -263
  85. package/tests/tsx-syntax.test.tsx +0 -404
  86. /package/dist/{event-utils-BkTM7rk5.d.ts → event-utils-BvAf0NwN.d.ts} +0 -0
@@ -1,264 +0,0 @@
1
- /**
2
- * CSS Optimizer Extractors Tests
3
- *
4
- * Tests for pluggable class extraction strategies.
5
- */
6
-
7
- import { describe, test, expect } from "vitest";
8
- import {
9
- HtmlExtractor,
10
- JsxExtractor,
11
- SvelteExtractor,
12
- MultiExtractor,
13
- htmlExtractor,
14
- jsxExtractor,
15
- svelteExtractor,
16
- } from "../src/css-optimizer/extractors.js";
17
-
18
- describe("HtmlExtractor", () => {
19
- const extractor = new HtmlExtractor();
20
-
21
- test("should extract class usages from simple HTML", () => {
22
- const html = `<div class="_a _b">content</div>`;
23
- const usages = extractor.extract(html);
24
-
25
- expect(usages).toHaveLength(1);
26
- expect(usages[0].classes).toEqual(["_a", "_b"]);
27
- });
28
-
29
- test("should filter by class prefix", () => {
30
- const html = `<div class="_luna other _test non-prefixed">content</div>`;
31
- const usages = extractor.extract(html, { classPrefix: "_" });
32
-
33
- expect(usages).toHaveLength(1);
34
- expect(usages[0].classes).toContain("_luna");
35
- expect(usages[0].classes).toContain("_test");
36
- expect(usages[0].classes).not.toContain("other");
37
- });
38
-
39
- test("should respect minClasses option", () => {
40
- const html = `
41
- <div class="_single">one class</div>
42
- <div class="_a _b">two classes</div>
43
- <div class="_x _y _z">three classes</div>
44
- `;
45
-
46
- const usages2 = extractor.extract(html, { minClasses: 2 });
47
- expect(usages2).toHaveLength(2);
48
-
49
- const usages3 = extractor.extract(html, { minClasses: 3 });
50
- expect(usages3).toHaveLength(1);
51
- });
52
-
53
- test("should include source information", () => {
54
- const html = `<div class="_a _b">content</div>`;
55
- const usages = extractor.extract(html, { source: "test.html" });
56
-
57
- expect(usages[0].source).toContain("test.html");
58
- });
59
-
60
- test("should sort classes alphabetically", () => {
61
- const html = `<div class="_z _a _m">content</div>`;
62
- const usages = extractor.extract(html);
63
-
64
- expect(usages[0].classes).toEqual(["_a", "_m", "_z"]);
65
- });
66
-
67
- test("should handle multiple elements", () => {
68
- const html = `
69
- <div class="_a _b">first</div>
70
- <span class="_c _d">second</span>
71
- <p class="_e _f">third</p>
72
- `;
73
- const usages = extractor.extract(html);
74
-
75
- expect(usages).toHaveLength(3);
76
- });
77
-
78
- test("should handle custom prefix", () => {
79
- const html = `<div class="tw-flex tw-gap custom">content</div>`;
80
- const usages = extractor.extract(html, { classPrefix: "tw-" });
81
-
82
- expect(usages).toHaveLength(1);
83
- expect(usages[0].classes).toEqual(["tw-flex", "tw-gap"]);
84
- });
85
- });
86
-
87
- describe("JsxExtractor", () => {
88
- const extractor = new JsxExtractor();
89
-
90
- test("should extract from className string literals", () => {
91
- const jsx = `<div className="_a _b">content</div>`;
92
- const usages = extractor.extract(jsx);
93
-
94
- expect(usages).toHaveLength(1);
95
- expect(usages[0].classes).toEqual(["_a", "_b"]);
96
- });
97
-
98
- test("should extract from template literals in braces", () => {
99
- const jsx = `<div className={"_x _y"}>content</div>`;
100
- const usages = extractor.extract(jsx);
101
-
102
- expect(usages).toHaveLength(1);
103
- expect(usages[0].classes).toEqual(["_x", "_y"]);
104
- });
105
-
106
- test("should handle multiple JSX elements", () => {
107
- const jsx = `
108
- function Component() {
109
- return (
110
- <div>
111
- <span className="_a _b">first</span>
112
- <button className="_c _d">second</button>
113
- </div>
114
- );
115
- }
116
- `;
117
- const usages = extractor.extract(jsx);
118
-
119
- expect(usages).toHaveLength(2);
120
- });
121
-
122
- test("should filter by prefix", () => {
123
- const jsx = `<div className="_luna regular _test other">content</div>`;
124
- const usages = extractor.extract(jsx, { classPrefix: "_" });
125
-
126
- expect(usages[0].classes).toContain("_luna");
127
- expect(usages[0].classes).toContain("_test");
128
- expect(usages[0].classes).not.toContain("regular");
129
- });
130
- });
131
-
132
- describe("SvelteExtractor", () => {
133
- const extractor = new SvelteExtractor();
134
-
135
- test("should extract from Svelte templates", () => {
136
- const svelte = `<div class="_a _b">content</div>`;
137
- const usages = extractor.extract(svelte);
138
-
139
- expect(usages).toHaveLength(1);
140
- expect(usages[0].classes).toEqual(["_a", "_b"]);
141
- });
142
-
143
- test("should handle dynamic expressions", () => {
144
- const svelte = `<div class="_static {dynamic} _another">content</div>`;
145
- const usages = extractor.extract(svelte);
146
-
147
- expect(usages).toHaveLength(1);
148
- // Should only extract static classes
149
- expect(usages[0].classes).toEqual(["_another", "_static"]);
150
- });
151
-
152
- test("should handle complex expressions", () => {
153
- const svelte = `<div class="_base {isActive ? '_active' : ''} _end">content</div>`;
154
- const usages = extractor.extract(svelte);
155
-
156
- expect(usages).toHaveLength(1);
157
- expect(usages[0].classes).toContain("_base");
158
- expect(usages[0].classes).toContain("_end");
159
- });
160
- });
161
-
162
- describe("MultiExtractor", () => {
163
- const extractor = new MultiExtractor();
164
-
165
- test("should use HTML extractor by default", () => {
166
- const html = `<div class="_a _b">content</div>`;
167
- const usages = extractor.extract(html);
168
-
169
- expect(usages).toHaveLength(1);
170
- });
171
-
172
- test("should select extractor by file type", () => {
173
- const jsx = `<div className="_x _y">content</div>`;
174
- const usages = extractor.extractWithType(jsx, "jsx");
175
-
176
- expect(usages).toHaveLength(1);
177
- expect(usages[0].classes).toEqual(["_x", "_y"]);
178
- });
179
-
180
- test("should extract from multiple files", () => {
181
- const files = [
182
- { content: `<div class="_a _b">html</div>`, path: "index.html" },
183
- { content: `<div className="_c _d">jsx</div>`, path: "app.jsx" },
184
- { content: `<div class="_e _f">svelte</div>`, path: "component.svelte" },
185
- ];
186
-
187
- const usages = extractor.extractFromFiles(files);
188
-
189
- expect(usages).toHaveLength(3);
190
- });
191
-
192
- test("should include file path as source", () => {
193
- const files = [
194
- { content: `<div class="_a _b">content</div>`, path: "src/page.html" },
195
- ];
196
-
197
- const usages = extractor.extractFromFiles(files);
198
- expect(usages[0].source).toContain("src/page.html");
199
- });
200
-
201
- test("should allow registering custom extractors", () => {
202
- const customExtractor = new MultiExtractor();
203
- customExtractor.register("vue", new HtmlExtractor()); // Vue uses class=""
204
-
205
- const vue = `<template><div class="_vue _style">content</div></template>`;
206
- const usages = customExtractor.extractWithType(vue, "vue");
207
-
208
- expect(usages).toHaveLength(1);
209
- });
210
- });
211
-
212
- describe("Default extractor instances", () => {
213
- test("htmlExtractor should be a singleton", () => {
214
- expect(htmlExtractor).toBeInstanceOf(HtmlExtractor);
215
- });
216
-
217
- test("jsxExtractor should be a singleton", () => {
218
- expect(jsxExtractor).toBeInstanceOf(JsxExtractor);
219
- });
220
-
221
- test("svelteExtractor should be a singleton", () => {
222
- expect(svelteExtractor).toBeInstanceOf(SvelteExtractor);
223
- });
224
- });
225
-
226
- describe("Extractor edge cases", () => {
227
- test("should handle empty content", () => {
228
- expect(htmlExtractor.extract("")).toHaveLength(0);
229
- expect(jsxExtractor.extract("")).toHaveLength(0);
230
- expect(svelteExtractor.extract("")).toHaveLength(0);
231
- });
232
-
233
- test("should handle content without matching classes", () => {
234
- const html = `<div class="regular classes">no prefixed classes</div>`;
235
- expect(htmlExtractor.extract(html)).toHaveLength(0);
236
- });
237
-
238
- test("should handle malformed HTML", () => {
239
- const malformed = `<div class="_a _b><span class="_c`;
240
- // Should not throw
241
- const usages = htmlExtractor.extract(malformed);
242
- expect(Array.isArray(usages)).toBe(true);
243
- });
244
-
245
- test("should handle nested elements", () => {
246
- const html = `
247
- <div class="_outer _wrap">
248
- <div class="_inner _content">
249
- <span class="_deep _nested">text</span>
250
- </div>
251
- </div>
252
- `;
253
- const usages = htmlExtractor.extract(html);
254
- expect(usages).toHaveLength(3);
255
- });
256
-
257
- test("should handle extra whitespace", () => {
258
- const html = `<div class=" _spacy _classes ">content</div>`;
259
- const usages = htmlExtractor.extract(html);
260
-
261
- expect(usages).toHaveLength(1);
262
- expect(usages[0].classes).toHaveLength(2);
263
- });
264
- });