effect-start 0.17.2 → 0.19.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 (80) hide show
  1. package/dist/Development.d.ts +7 -2
  2. package/dist/Development.js +12 -6
  3. package/dist/PlatformRuntime.d.ts +4 -0
  4. package/dist/PlatformRuntime.js +9 -0
  5. package/dist/Route.d.ts +6 -2
  6. package/dist/Route.js +22 -0
  7. package/dist/RouteHttp.d.ts +1 -1
  8. package/dist/RouteHttp.js +12 -19
  9. package/dist/RouteMount.d.ts +2 -1
  10. package/dist/Start.d.ts +1 -5
  11. package/dist/Start.js +1 -8
  12. package/dist/Unique.d.ts +50 -0
  13. package/dist/Unique.js +187 -0
  14. package/dist/bun/BunHttpServer.js +5 -6
  15. package/dist/bun/BunRoute.d.ts +1 -1
  16. package/dist/bun/BunRoute.js +2 -2
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.js +1 -0
  19. package/dist/node/Effectify.d.ts +209 -0
  20. package/dist/node/Effectify.js +19 -0
  21. package/dist/node/FileSystem.d.ts +3 -5
  22. package/dist/node/FileSystem.js +42 -62
  23. package/dist/node/PlatformError.d.ts +46 -0
  24. package/dist/node/PlatformError.js +43 -0
  25. package/dist/testing/TestLogger.js +1 -1
  26. package/package.json +10 -5
  27. package/src/Development.ts +13 -18
  28. package/src/PlatformRuntime.ts +11 -0
  29. package/src/Route.ts +31 -2
  30. package/src/RouteHttp.ts +15 -31
  31. package/src/RouteMount.ts +1 -1
  32. package/src/Start.ts +1 -15
  33. package/src/Unique.ts +232 -0
  34. package/src/bun/BunHttpServer.ts +6 -9
  35. package/src/bun/BunRoute.ts +3 -3
  36. package/src/index.ts +1 -0
  37. package/src/node/Effectify.ts +262 -0
  38. package/src/node/FileSystem.ts +59 -97
  39. package/src/node/PlatformError.ts +102 -0
  40. package/src/testing/TestLogger.ts +1 -1
  41. package/dist/Random.d.ts +0 -5
  42. package/dist/Random.js +0 -49
  43. package/src/Commander.test.ts +0 -1639
  44. package/src/ContentNegotiation.test.ts +0 -603
  45. package/src/Development.test.ts +0 -119
  46. package/src/Entity.test.ts +0 -592
  47. package/src/FileRouterPattern.test.ts +0 -147
  48. package/src/FileRouter_files.test.ts +0 -64
  49. package/src/FileRouter_path.test.ts +0 -145
  50. package/src/FileRouter_tree.test.ts +0 -132
  51. package/src/Http.test.ts +0 -319
  52. package/src/HttpAppExtra.test.ts +0 -103
  53. package/src/HttpUtils.test.ts +0 -85
  54. package/src/PathPattern.test.ts +0 -648
  55. package/src/Random.ts +0 -59
  56. package/src/RouteBody.test.ts +0 -232
  57. package/src/RouteHook.test.ts +0 -40
  58. package/src/RouteHttp.test.ts +0 -2909
  59. package/src/RouteMount.test.ts +0 -481
  60. package/src/RouteSchema.test.ts +0 -427
  61. package/src/RouteSse.test.ts +0 -249
  62. package/src/RouteTree.test.ts +0 -494
  63. package/src/RouteTrie.test.ts +0 -322
  64. package/src/RouterPattern.test.ts +0 -676
  65. package/src/Values.test.ts +0 -263
  66. package/src/bun/BunBundle.test.ts +0 -268
  67. package/src/bun/BunBundle_imports.test.ts +0 -48
  68. package/src/bun/BunHttpServer.test.ts +0 -251
  69. package/src/bun/BunImportTrackerPlugin.test.ts +0 -77
  70. package/src/bun/BunRoute.test.ts +0 -162
  71. package/src/bundler/BundleHttp.test.ts +0 -132
  72. package/src/effect/HttpRouter.test.ts +0 -548
  73. package/src/experimental/EncryptedCookies.test.ts +0 -488
  74. package/src/hyper/HyperHtml.test.ts +0 -209
  75. package/src/hyper/HyperRoute.test.tsx +0 -197
  76. package/src/middlewares/BasicAuthMiddleware.test.ts +0 -84
  77. package/src/testing/TestHttpClient.test.ts +0 -83
  78. package/src/testing/TestLogger.test.ts +0 -51
  79. package/src/x/datastar/Datastar.test.ts +0 -266
  80. package/src/x/tailwind/TailwindPlugin.test.ts +0 -333
@@ -1,333 +0,0 @@
1
- import * as test from "bun:test"
2
- import { extractClassNames } from "./TailwindPlugin.ts"
3
-
4
- // Keep the old broad implementation for comparison tests
5
- function extractClassNamesBroad(source: string): Set<string> {
6
- // Old broad implementation
7
- const CLASS_NAME_REGEX = /^[^"'`\s]+$/
8
- const classTokenRegex =
9
- /\b[a-zA-Z][a-zA-Z0-9_:-]*(?:\[[^\]]*\])?(?:\/[0-9]+)?/g
10
-
11
- return new Set(
12
- Array
13
- .from(source.matchAll(classTokenRegex))
14
- .map(match => match[0])
15
- .filter(token => CLASS_NAME_REGEX.test(token)),
16
- )
17
- }
18
-
19
- test.describe(`${extractClassNames.name}`, () => {
20
- test.it("Basic HTML class attributes", () => {
21
- const source = `<div class="bg-red-500 text-white">Hello</div>`
22
- const result = extractClassNames(source)
23
-
24
- test
25
- .expect([...result].sort())
26
- .toEqual(["bg-red-500", "text-white"])
27
- })
28
-
29
- test.it("Basic JSX className attributes", () => {
30
- const source =
31
- `<div className="flex items-center justify-between">Content</div>`
32
- const result = extractClassNames(source)
33
-
34
- test
35
- .expect([...result].sort())
36
- .toEqual(["flex", "items-center", "justify-between"])
37
- })
38
-
39
- test.it("Single quotes", () => {
40
- const source = `<div class='bg-blue-500 hover:bg-blue-600'>Button</div>`
41
- const result = extractClassNames(source)
42
-
43
- test
44
- .expect([...result].sort())
45
- .toEqual(["bg-blue-500", "hover:bg-blue-600"])
46
- })
47
-
48
- test.it("Template literals in JSX", () => {
49
- const source = `<div className={\`bg-\${color} text-lg\`}>Dynamic</div>`
50
- const result = extractClassNames(source)
51
-
52
- // Should extract valid static class names from template literals
53
- test
54
- .expect([...result].sort())
55
- .toEqual(["text-lg"])
56
- })
57
-
58
- test.it("JSX with quoted strings", () => {
59
- const source = `<div className={"p-4 m-2"}>Static in braces</div>`
60
- const result = extractClassNames(source)
61
-
62
- test
63
- .expect([...result].sort())
64
- .toEqual(["m-2", "p-4"])
65
- })
66
-
67
- test.it("Multi-line attributes", () => {
68
- const source = `<div
69
- className="
70
- grid
71
- grid-cols-3
72
- gap-4
73
- "
74
- >Grid</div>`
75
- const result = extractClassNames(source)
76
-
77
- test
78
- .expect([...result].sort())
79
- .toEqual(["gap-4", "grid", "grid-cols-3"])
80
- })
81
-
82
- test.it("Whitespace variations around equals", () => {
83
- const cases = [
84
- `<div class="text-sm">Normal</div>`,
85
- `<div class ="text-md">Space before</div>`,
86
- `<div class= "text-lg">Space after</div>`,
87
- `<div class = "text-xl">Spaces both</div>`,
88
- ]
89
-
90
- for (const source of cases) {
91
- const result = extractClassNames(source)
92
-
93
- test
94
- .expect(result.size)
95
- .toBe(1)
96
- }
97
- })
98
-
99
- test.it("Arbitrary value classes", () => {
100
- const source =
101
- `<div className="w-[32px] bg-[#ff0000] text-[1.5rem]">Arbitrary</div>`
102
- const result = extractClassNames(source)
103
-
104
- test
105
- .expect([...result].sort())
106
- .toEqual(["bg-[#ff0000]", "text-[1.5rem]", "w-[32px]"])
107
- })
108
-
109
- test.it("Fraction classes", () => {
110
- const source = `<div className="w-1/2 h-3/4">Fractions</div>`
111
- const result = extractClassNames(source)
112
-
113
- test
114
- .expect([...result].sort())
115
- .toEqual(["h-3/4", "w-1/2"])
116
- })
117
-
118
- test.it("Complex Tailwind classes", () => {
119
- const source =
120
- `<div className="sm:w-1/2 md:w-1/3 lg:w-1/4 hover:bg-gray-100 focus:ring-2">Responsive</div>`
121
- const result = extractClassNames(source)
122
-
123
- test
124
- .expect([...result].sort())
125
- .toEqual([
126
- "focus:ring-2",
127
- "hover:bg-gray-100",
128
- "lg:w-1/4",
129
- "md:w-1/3",
130
- "sm:w-1/2",
131
- ])
132
- })
133
-
134
- test.it("Should ignore similar attribute names", () => {
135
- const source =
136
- `<div data-class="should-ignore" myclass="also-ignore" class="keep-this">Test</div>`
137
- const result = extractClassNames(source)
138
-
139
- test
140
- .expect([...result])
141
- .toEqual(["keep-this"])
142
- })
143
-
144
- test.it("Should handle case sensitivity", () => {
145
- const source =
146
- `<div Class="uppercase-class" class="lowercase-class">Mixed case</div>`
147
- const result = extractClassNames(source)
148
-
149
- // Our current implementation only matches lowercase 'class'
150
- test
151
- .expect([...result])
152
- .toEqual(["lowercase-class"])
153
- })
154
-
155
- test.it("Empty class attributes", () => {
156
- const source = `<div class="" className=''>Empty</div>`
157
- const result = extractClassNames(source)
158
-
159
- test
160
- .expect(result.size)
161
- .toBe(0)
162
- })
163
-
164
- test.it("Classes with special characters", () => {
165
- const source =
166
- `<div className="group-hover:text-blue-500 peer-focus:ring-2">Special chars</div>`
167
- const result = extractClassNames(source)
168
-
169
- test
170
- .expect([...result].sort())
171
- .toEqual(["group-hover:text-blue-500", "peer-focus:ring-2"])
172
- })
173
-
174
- test.it("Should not match classes in comments", () => {
175
- const source = `
176
- <!-- <div class="commented-out">Should not match</div> -->
177
- <div class="real-class">Should match</div>
178
- `
179
- const result = extractClassNames(source)
180
-
181
- test
182
- .expect([...result])
183
- .toEqual(["real-class"])
184
- })
185
-
186
- test.it("Should not match classes in strings", () => {
187
- const source = `
188
- const message = "This class='fake-class' should not match";
189
- <div class="real-class">Real element</div>
190
- `
191
- const result = extractClassNames(source)
192
-
193
- test
194
- .expect([...result])
195
- .toEqual(["real-class"])
196
- })
197
-
198
- test.it("Complex JSX expressions should be ignored", () => {
199
- const source = `
200
- <div className={condition ? "conditional-class" : "other-class"}>Conditional</div>
201
- <div className={\`template-\${variable}\`}>Template</div>
202
- <div className={getClasses()}>Function call</div>
203
- <div className="static-class">Static</div>
204
- `
205
- const result = extractClassNames(source)
206
-
207
- // Only the static class should match with our strict implementation
208
- test
209
- .expect([...result])
210
- .toEqual(["static-class"])
211
- })
212
-
213
- test.it("Vue.js class bindings should be ignored", () => {
214
- const source = `
215
- <div :class="{ 'active': isActive }">Vue object</div>
216
- <div :class="['base', condition && 'active']">Vue array</div>
217
- <div class="static-vue-class">Static Vue</div>
218
- `
219
- const result = extractClassNames(source)
220
-
221
- // Only static class should match
222
- test
223
- .expect([...result])
224
- .toEqual(["static-vue-class"])
225
- })
226
-
227
- test.it("Svelte class directives should be ignored", () => {
228
- const source = `
229
- <div class:active={condition}>Svelte directive</div>
230
- <div class="static-svelte-class">Static Svelte</div>
231
- `
232
- const result = extractClassNames(source)
233
-
234
- test
235
- .expect([...result])
236
- .toEqual(["static-svelte-class"])
237
- })
238
-
239
- test.it("Escaped quotes should be handled", () => {
240
- const source =
241
- `<div class="text-sm before:content-['Hello']">Escaped quotes</div>`
242
- const result = extractClassNames(source)
243
-
244
- test
245
- .expect([...result].sort())
246
- .toEqual(["before:content-['Hello']", "text-sm"])
247
- })
248
-
249
- test.it("Current broad implementation comparison", () => {
250
- const source = `
251
- <div class="bg-red-500 text-white">Element</div>
252
- <p>Some random-text-with-hyphens in content</p>
253
- const variable = "some-string";
254
- `
255
-
256
- const broadResult = extractClassNamesBroad(source)
257
- const strictResult = extractClassNames(source)
258
-
259
- // Broad should pick up more tokens
260
- test
261
- .expect(broadResult.size)
262
- .toBeGreaterThan(strictResult.size)
263
- // Strict should only have the actual class names
264
- test
265
- .expect([...strictResult].sort())
266
- .toEqual(["bg-red-500", "text-white"])
267
- })
268
-
269
- test.it("Component names with dots", () => {
270
- const source =
271
- `<Toast.Toast class="toast toast-top toast-center fixed top-8 z-10">Content</Toast.Toast>`
272
- const result = extractClassNames(source)
273
-
274
- test
275
- .expect([...result].sort())
276
- .toEqual(["fixed", "toast", "toast-center", "toast-top", "top-8", "z-10"])
277
- })
278
-
279
- test.it("Complex component names and attributes", () => {
280
- const source = `
281
- <My.Component.Name className="flex items-center">Content</My.Component.Name>
282
- <Component-with-dashes class="bg-red-500">Content</Component-with-dashes>
283
- <Component123 className="text-lg">Content</Component123>
284
- <namespace:element class="border-2">XML style</namespace:element>
285
- `
286
- const result = extractClassNames(source)
287
-
288
- test
289
- .expect([...result].sort())
290
- .toEqual([
291
- "bg-red-500",
292
- "border-2",
293
- "flex",
294
- "items-center",
295
- "text-lg",
296
- ])
297
- })
298
-
299
- test.it("Conditional JSX with Toast component", () => {
300
- const source = `{toastParam !== undefined && (
301
- <Toast.Toast class="toast toast-top toast-center fixed top-8 z-10">
302
- <div class="alert alert-success">
303
- <span>
304
- {toastParam}
305
- </span>
306
- </div>
307
- </Toast.Toast>
308
- )}`
309
- const result = extractClassNames(source)
310
-
311
- test
312
- .expect([...result].sort())
313
- .toEqual([
314
- "alert",
315
- "alert-success",
316
- "fixed",
317
- "toast",
318
- "toast-center",
319
- "toast-top",
320
- "top-8",
321
- "z-10",
322
- ])
323
- })
324
-
325
- test.it("Template literals with expressions", () => {
326
- const source = `<div class={\`toast \${props.class ?? ""}\`}>Content</div>`
327
- const result = extractClassNames(source)
328
-
329
- test
330
- .expect([...result].sort())
331
- .toEqual(["toast"])
332
- })
333
- })