@luna_ui/luna 0.11.0 → 0.17.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,170 +0,0 @@
1
- import { describe, test, expect, vi } from "vitest";
2
- import {
3
- createResource,
4
- createDeferred,
5
- createRenderEffect,
6
- createRoot,
7
- } from "../src/index";
8
-
9
- describe("Resource API (SolidJS-style)", () => {
10
- describe("createResource", () => {
11
- test("starts in pending state", () => {
12
- const [resource] = createResource<string>(() => {
13
- // Never resolves
14
- });
15
-
16
- expect(resource.loading).toBe(true);
17
- expect(resource.state).toBe("pending");
18
- });
19
-
20
- test("transitions to success on resolve", async () => {
21
- const [resource] = createResource<string>((resolve) => {
22
- resolve("success-data");
23
- });
24
-
25
- // Resolve happens synchronously in this case
26
- expect(resource.state).toBe("ready");
27
- expect(resource()).toBe("success-data");
28
- expect(resource.error).toBeUndefined();
29
- });
30
-
31
- test("transitions to failure on reject", () => {
32
- const [resource] = createResource<string>((_, reject) => {
33
- reject("error-message");
34
- });
35
-
36
- expect(resource.state).toBe("errored");
37
- expect(resource.error).toBe("error-message");
38
- });
39
-
40
- test("error is undefined when pending", () => {
41
- const [resource] = createResource<string>(() => {
42
- // Never resolves
43
- });
44
-
45
- expect(resource.loading).toBe(true);
46
- expect(resource.error).toBeUndefined();
47
- });
48
-
49
- test("async resolve works", async () => {
50
- let resolveRef: ((value: string) => void) | null = null;
51
-
52
- const [resource] = createResource<string>((resolve) => {
53
- resolveRef = resolve;
54
- });
55
-
56
- expect(resource.loading).toBe(true);
57
-
58
- resolveRef!("async-data");
59
-
60
- expect(resource.state).toBe("ready");
61
- expect(resource()).toBe("async-data");
62
- });
63
-
64
- test("refetch re-runs fetcher", () => {
65
- let fetchCount = 0;
66
- const [resource, { refetch }] = createResource<string>((resolve) => {
67
- fetchCount++;
68
- resolve(`fetch-${fetchCount}`);
69
- });
70
-
71
- expect(fetchCount).toBe(1);
72
- expect(resource()).toBe("fetch-1");
73
-
74
- refetch();
75
-
76
- expect(fetchCount).toBe(2);
77
- expect(resource()).toBe("fetch-2");
78
- });
79
- });
80
-
81
- describe("createDeferred", () => {
82
- test("returns accessor, resolve, and reject", () => {
83
- const [resource, resolve, reject] = createDeferred<number>();
84
-
85
- expect(typeof resource).toBe("function");
86
- expect(typeof resolve).toBe("function");
87
- expect(typeof reject).toBe("function");
88
- });
89
-
90
- test("starts in pending state", () => {
91
- const [resource] = createDeferred<number>();
92
- expect(resource.loading).toBe(true);
93
- });
94
-
95
- test("resolve transitions to success", () => {
96
- const [resource, resolve] = createDeferred<number>();
97
-
98
- resolve(42);
99
-
100
- expect(resource.loading).toBe(false);
101
- expect(resource()).toBe(42);
102
- });
103
-
104
- test("reject transitions to failure", () => {
105
- const [resource, , reject] = createDeferred<number>();
106
-
107
- reject("deferred-error");
108
-
109
- expect(resource.loading).toBe(false);
110
- expect(resource.error).toBe("deferred-error");
111
- });
112
- });
113
-
114
- describe("reactivity", () => {
115
- test("accessor is reactive", () => {
116
- const [resource, resolve] = createDeferred<string>();
117
- let effectRunCount = 0;
118
-
119
- createRoot((dispose) => {
120
- createRenderEffect(() => {
121
- resource(); // Access value to track
122
- effectRunCount++;
123
- });
124
-
125
- expect(effectRunCount).toBe(1);
126
-
127
- resolve("data");
128
- // Effect should re-run because accessor is reactive
129
- expect(effectRunCount).toBe(2);
130
- dispose();
131
- });
132
- });
133
- });
134
-
135
- describe("integration with Promise", () => {
136
- test("works with setTimeout simulation", async () => {
137
- vi.useFakeTimers();
138
-
139
- const [resource] = createResource<string>((resolve) => {
140
- setTimeout(() => resolve("delayed"), 100);
141
- });
142
-
143
- expect(resource.loading).toBe(true);
144
-
145
- vi.advanceTimersByTime(100);
146
-
147
- expect(resource.state).toBe("ready");
148
- expect(resource()).toBe("delayed");
149
-
150
- vi.useRealTimers();
151
- });
152
-
153
- test("can wrap fetch-like async operations", async () => {
154
- const mockFetch = vi.fn().mockResolvedValue({ data: "fetched" });
155
-
156
- const [resource] = createResource<{ data: string }>((resolve, reject) => {
157
- mockFetch()
158
- .then(resolve)
159
- .catch((e: Error) => reject(e.message));
160
- });
161
-
162
- // Wait for promise to resolve
163
- await vi.waitFor(() => {
164
- expect(resource.state).toBe("ready");
165
- });
166
-
167
- expect(resource()).toEqual({ data: "fetched" });
168
- });
169
- });
170
- });
@@ -1,117 +0,0 @@
1
- import { describe, test, expect, beforeEach } from "vitest";
2
- import {
3
- routePage,
4
- routePageTitled,
5
- routePageFull,
6
- createRouter,
7
- routerNavigate,
8
- routerReplace,
9
- routerGetPath,
10
- routerGetMatch,
11
- routerGetBase,
12
- type Routes,
13
- type BrowserRouter,
14
- } from "../src/index";
15
-
16
- describe("Route definitions", () => {
17
- test("routePage creates a page route", () => {
18
- const route = routePage("/home", "HomePage");
19
- expect(route).toBeDefined();
20
- // MoonBit enum representation
21
- expect((route as any).$tag).toBeDefined();
22
- });
23
-
24
- test("routePageTitled with title", () => {
25
- const route = routePageTitled("/about", "AboutPage", "About Us");
26
- expect(route).toBeDefined();
27
- });
28
-
29
- test("routePageFull with title and meta", () => {
30
- const route = routePageFull("/about", "AboutPage", "About Us", [
31
- { _0: "description", _1: "About our company" },
32
- ]);
33
- expect(route).toBeDefined();
34
- });
35
-
36
- test("multiple page routes", () => {
37
- const routes: Routes[] = [
38
- routePage("/", "Home"),
39
- routePage("/about", "About"),
40
- routePage("/contact", "Contact"),
41
- ];
42
- expect(routes.length).toBe(3);
43
- });
44
- });
45
-
46
- describe("BrowserRouter", () => {
47
- let router: BrowserRouter;
48
-
49
- beforeEach(() => {
50
- // Reset location to root
51
- window.history.replaceState(null, "", "/");
52
- });
53
-
54
- test("createRouter creates a router", () => {
55
- const routes = [routePage("/", "Home"), routePage("/about", "About")];
56
- router = createRouter(routes);
57
- expect(router).toBeDefined();
58
- });
59
-
60
- test("createRouter with base path", () => {
61
- const routes = [routePage("/", "Home")];
62
- router = createRouter(routes, "/app");
63
- expect(routerGetBase(router)).toBe("/app");
64
- });
65
-
66
- test("routerGetPath returns current path", () => {
67
- const routes = [routePage("/", "Home")];
68
- router = createRouter(routes);
69
- // Initial path should be "/"
70
- const path = routerGetPath(router);
71
- expect(typeof path).toBe("string");
72
- });
73
-
74
- test("routerNavigate changes path", () => {
75
- const routes = [routePage("/", "Home"), routePage("/about", "About")];
76
- router = createRouter(routes);
77
-
78
- routerNavigate(router, "/about");
79
- expect(routerGetPath(router)).toBe("/about");
80
- });
81
-
82
- test("routerReplace changes path without adding to history", () => {
83
- const routes = [routePage("/", "Home"), routePage("/about", "About")];
84
- router = createRouter(routes);
85
-
86
- const historyLength = window.history.length;
87
- routerReplace(router, "/about");
88
- expect(routerGetPath(router)).toBe("/about");
89
- // Replace should not add to history
90
- expect(window.history.length).toBe(historyLength);
91
- });
92
-
93
- test("routerGetMatch returns match for current route", () => {
94
- const routes = [routePage("/", "Home"), routePage("/about", "About")];
95
- router = createRouter(routes);
96
-
97
- routerNavigate(router, "/about");
98
- const match = routerGetMatch(router);
99
-
100
- expect(match).toBeDefined();
101
- if (match) {
102
- expect(match.route.component).toBe("About");
103
- expect(match.path).toBe("/about");
104
- }
105
- });
106
-
107
- test("routerGetMatch returns undefined for unmatched route", () => {
108
- const routes = [routePage("/", "Home")];
109
- router = createRouter(routes);
110
-
111
- routerNavigate(router, "/nonexistent");
112
- const match = routerGetMatch(router);
113
- // Should be undefined or match might still return something
114
- // depending on implementation
115
- expect(typeof match === "undefined" || match !== null).toBe(true);
116
- });
117
- });
@@ -1,182 +0,0 @@
1
- /** @jsxImportSource ../src */
2
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
3
- import "global-jsdom/register";
4
- import {
5
- createSignal,
6
- onMount,
7
- onCleanup,
8
- render,
9
- mount,
10
- Show,
11
- show,
12
- } from "../src/index";
13
- import type { JSX } from "../src/jsx-runtime";
14
-
15
- const flushMicrotasks = () => new Promise<void>((resolve) => queueMicrotask(resolve));
16
- const countLogs = (log: string[]) => {
17
- const created = log.filter((item) => item.endsWith(" created")).length;
18
- const mounted = log.filter((item) => item.endsWith(" mounted")).length;
19
- const cleanups = log.filter((item) => item.endsWith(" cleanup")).length;
20
- return { created, mounted, cleanups };
21
- };
22
-
23
- const expectCounts = (
24
- log: string[],
25
- expected: { created: number; mounted: number; cleanups: number },
26
- ) => {
27
- const { created, mounted, cleanups } = countLogs(log);
28
- try {
29
- expect(created).toBe(expected.created);
30
- expect(mounted).toBe(expected.mounted);
31
- expect(cleanups).toBe(expected.cleanups);
32
- } catch (error) {
33
- console.log({ counts: { created, mounted, cleanups }, log });
34
- throw error;
35
- }
36
- };
37
-
38
- describe("Show initial mount behavior", () => {
39
- let container: HTMLElement;
40
-
41
- beforeEach(() => {
42
- container = document.createElement("div");
43
- document.body.appendChild(container);
44
- });
45
-
46
- afterEach(() => {
47
- container.remove();
48
- });
49
-
50
- it("reproduces multiple instances with Show when=true on initial render", async () => {
51
- const log: string[] = [];
52
- let gId = 1;
53
-
54
- function Child(): JSX.Element {
55
- const id = gId++;
56
-
57
- onMount(() => {
58
- log.push(`${id} mounted`);
59
- });
60
-
61
- onCleanup(() => {
62
- log.push(`${id} cleanup`);
63
- });
64
-
65
- log.push(`${id} created`);
66
-
67
- return <p>I'm here</p>;
68
- }
69
-
70
- function Counter(): JSX.Element {
71
- return (
72
- <div>
73
- <Show when={true}>{() => <Child />}</Show>
74
- </div>
75
- );
76
- }
77
-
78
- render(container, <Counter />);
79
-
80
- await flushMicrotasks();
81
- await flushMicrotasks();
82
- await flushMicrotasks();
83
- await flushMicrotasks();
84
-
85
- expectCounts(log, { created: 1, mounted: 1, cleanups: 0 });
86
- });
87
-
88
- it("does not create multiple instances without Show", async () => {
89
- const log: string[] = [];
90
- let gId = 1;
91
-
92
- function Child(): JSX.Element {
93
- const id = gId++;
94
-
95
- onMount(() => {
96
- log.push(`${id} mounted`);
97
- });
98
-
99
- onCleanup(() => {
100
- log.push(`${id} cleanup`);
101
- });
102
-
103
- log.push(`${id} created`);
104
-
105
- return <p>I'm here</p>;
106
- }
107
-
108
- function Counter(): JSX.Element {
109
- return (
110
- <div>
111
- <Child />
112
- </div>
113
- );
114
- }
115
-
116
- render(container, <Counter />);
117
-
118
- await flushMicrotasks();
119
- await flushMicrotasks();
120
-
121
- expectCounts(log, { created: 1, mounted: 1, cleanups: 0 });
122
- });
123
-
124
- it("does not create multiple instances with Show when=true using mount", async () => {
125
- const log: string[] = [];
126
- let gId = 1;
127
-
128
- function Child(): JSX.Element {
129
- const id = gId++;
130
-
131
- onMount(() => {
132
- log.push(`${id} mounted`);
133
- });
134
-
135
- onCleanup(() => {
136
- log.push(`${id} cleanup`);
137
- });
138
-
139
- log.push(`${id} created`);
140
-
141
- return <p>I'm here</p>;
142
- }
143
-
144
- const node = Show({ when: true, children: () => <Child /> });
145
- mount(container, node);
146
-
147
- await flushMicrotasks();
148
- await flushMicrotasks();
149
-
150
- expectCounts(log, { created: 1, mounted: 1, cleanups: 0 });
151
- });
152
-
153
- it("does not create multiple instances when render uses show() primitive", async () => {
154
- const log: string[] = [];
155
- let gId = 1;
156
- const [visible] = createSignal(true);
157
-
158
- function Child(): JSX.Element {
159
- const id = gId++;
160
-
161
- onMount(() => {
162
- log.push(`${id} mounted`);
163
- });
164
-
165
- onCleanup(() => {
166
- log.push(`${id} cleanup`);
167
- });
168
-
169
- log.push(`${id} created`);
170
-
171
- return <p>I'm here</p>;
172
- }
173
-
174
- const node = show(visible, () => <Child />);
175
- render(container, node);
176
-
177
- await flushMicrotasks();
178
- await flushMicrotasks();
179
-
180
- expectCounts(log, { created: 1, mounted: 1, cleanups: 0 });
181
- });
182
- });