@nudojs/cli 0.2.1 → 0.3.1

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 (64) hide show
  1. package/dist/{chunk-3HCPXPEW.js → chunk-YDM4HHQ4.js} +1783 -1421
  2. package/dist/evaluator-api.d.ts +12 -1
  3. package/dist/evaluator-api.js +52 -2
  4. package/dist/index.d.ts +1 -2
  5. package/dist/index.js +366 -3572
  6. package/package.json +23 -11
  7. package/CHANGELOG.md +0 -41
  8. package/examples/real-world.js +0 -66
  9. package/examples/validate-real-world.ts +0 -160
  10. package/src/__tests__/builtin-advanced.test.ts +0 -292
  11. package/src/__tests__/builtin-api.test.ts +0 -308
  12. package/src/__tests__/builtin-functions.test.ts +0 -313
  13. package/src/__tests__/builtin-map.test.ts +0 -129
  14. package/src/__tests__/builtin-promise.test.ts +0 -150
  15. package/src/__tests__/builtin-regexp.test.ts +0 -133
  16. package/src/__tests__/builtin-set.test.ts +0 -163
  17. package/src/__tests__/builtin-url.test.ts +0 -256
  18. package/src/__tests__/builtin-web.test.ts +0 -340
  19. package/src/__tests__/combination-scenarios.test.ts +0 -384
  20. package/src/__tests__/edge-cases.test.ts +0 -749
  21. package/src/__tests__/evaluator-loops.test.ts +0 -283
  22. package/src/__tests__/evaluator-nullish-coalescing.test.ts +0 -86
  23. package/src/__tests__/evaluator-optional-chaining.test.ts +0 -37
  24. package/src/__tests__/evaluator-phase2.test.ts +0 -564
  25. package/src/__tests__/evaluator-phase3.test.ts +0 -864
  26. package/src/__tests__/evaluator-refined.test.ts +0 -121
  27. package/src/__tests__/evaluator-string-methods.test.ts +0 -151
  28. package/src/__tests__/evaluator.test.ts +0 -943
  29. package/src/__tests__/mock-arrow-function.test.ts +0 -169
  30. package/src/__tests__/mock-comparison.test.ts +0 -221
  31. package/src/__tests__/mock-comprehensive.test.ts +0 -250
  32. package/src/__tests__/mock-final-integration.test.ts +0 -263
  33. package/src/__tests__/mock-helpers.test.ts +0 -174
  34. package/src/__tests__/mock-realworld.test.ts +0 -191
  35. package/src/__tests__/mock-rest-debug.test.ts +0 -110
  36. package/src/__tests__/mock-rest-edge.test.ts +0 -176
  37. package/src/__tests__/mock-sinon-runtime.test.ts +0 -168
  38. package/src/__tests__/narrowing-discriminated.test.ts +0 -35
  39. package/src/__tests__/narrowing-in-operator.test.ts +0 -56
  40. package/src/__tests__/narrowing-switch.test.ts +0 -56
  41. package/src/__tests__/narrowing-truthiness.test.ts +0 -52
  42. package/src/__tests__/narrowing.test.ts +0 -82
  43. package/src/__tests__/nudo-mock-syntax.test.ts +0 -245
  44. package/src/__tests__/realworld-patterns.test.ts +0 -430
  45. package/src/__tests__/syntax-sugar.test.ts +0 -345
  46. package/src/builtins/builtin-intl.ts +0 -17
  47. package/src/builtins/builtin-map.ts +0 -174
  48. package/src/builtins/builtin-promise.ts +0 -116
  49. package/src/builtins/builtin-reflect.ts +0 -30
  50. package/src/builtins/builtin-regexp.ts +0 -34
  51. package/src/builtins/builtin-set.ts +0 -131
  52. package/src/builtins/builtin-symbol.ts +0 -16
  53. package/src/builtins/builtin-url.ts +0 -58
  54. package/src/builtins/builtin-weak.ts +0 -22
  55. package/src/builtins/builtin-web.ts +0 -111
  56. package/src/builtins/index.ts +0 -61
  57. package/src/config.ts +0 -32
  58. package/src/env-loader.ts +0 -174
  59. package/src/evaluator-api.ts +0 -36
  60. package/src/evaluator.ts +0 -5623
  61. package/src/index.ts +0 -931
  62. package/src/narrowing.ts +0 -537
  63. package/src/resolve-npm.ts +0 -63
  64. package/tsconfig.json +0 -9
@@ -1,256 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { parse, extractDirectives, type CaseDirective } from "@nudojs/parser";
3
- import { typeValueToString, createEnvironment, T } from "@nudojs/core";
4
- import { evaluateFunctionFull } from "../evaluator.js";
5
-
6
- function runTest(source: string): { name: string; caseName: string; result: string }[] {
7
- const ast = parse(source);
8
- const directives = extractDirectives(ast);
9
- const env = createEnvironment();
10
- const results: { name: string; caseName: string; result: string }[] = [];
11
-
12
- for (const fn of directives) {
13
- const caseDirectives = fn.directives.filter((d): d is CaseDirective => d.kind === "case");
14
- for (const dir of caseDirectives) {
15
- const result = evaluateFunctionFull(fn.node, dir.args, env);
16
- results.push({ name: fn.name, caseName: dir.name, result: typeValueToString(result.value) });
17
- }
18
- }
19
- return results;
20
- }
21
-
22
- describe("Built-in URL API", () => {
23
- it("new URL(str) should return URL instance", () => {
24
- const results = runTest(`
25
- // @nudo:case "new-url" ()
26
- function fn() {
27
- const url = new URL("https://example.com/path?q=1#hash");
28
- return url;
29
- }
30
- `);
31
- expect(results[0].result).toContain("URL");
32
- });
33
-
34
- it("url.href should return string", () => {
35
- const results = runTest(`
36
- // @nudo:case "href" ()
37
- function fn() {
38
- const url = new URL("https://example.com/path");
39
- return url.href;
40
- }
41
- `);
42
- expect(results[0].result).toBe("string");
43
- });
44
-
45
- it("url.origin should return string", () => {
46
- const results = runTest(`
47
- // @nudo:case "origin" ()
48
- function fn() {
49
- const url = new URL("https://example.com/path");
50
- return url.origin;
51
- }
52
- `);
53
- expect(results[0].result).toBe("string");
54
- });
55
-
56
- it("url.protocol should return string", () => {
57
- const results = runTest(`
58
- // @nudo:case "protocol" ()
59
- function fn() {
60
- const url = new URL("https://example.com/path");
61
- return url.protocol;
62
- }
63
- `);
64
- expect(results[0].result).toBe("string");
65
- });
66
-
67
- it("url.host should return string", () => {
68
- const results = runTest(`
69
- // @nudo:case "host" ()
70
- function fn() {
71
- const url = new URL("https://example.com/path");
72
- return url.host;
73
- }
74
- `);
75
- expect(results[0].result).toBe("string");
76
- });
77
-
78
- it("url.hostname should return string", () => {
79
- const results = runTest(`
80
- // @nudo:case "hostname" ()
81
- function fn() {
82
- const url = new URL("https://example.com/path");
83
- return url.hostname;
84
- }
85
- `);
86
- expect(results[0].result).toBe("string");
87
- });
88
-
89
- it("url.port should return string", () => {
90
- const results = runTest(`
91
- // @nudo:case "port" ()
92
- function fn() {
93
- const url = new URL("https://example.com:8080/path");
94
- return url.port;
95
- }
96
- `);
97
- expect(results[0].result).toBe("string");
98
- });
99
-
100
- it("url.pathname should return string", () => {
101
- const results = runTest(`
102
- // @nudo:case "pathname" ()
103
- function fn() {
104
- const url = new URL("https://example.com/path?q=1");
105
- return url.pathname;
106
- }
107
- `);
108
- expect(results[0].result).toBe("string");
109
- });
110
-
111
- it("url.search should return string", () => {
112
- const results = runTest(`
113
- // @nudo:case "search" ()
114
- function fn() {
115
- const url = new URL("https://example.com/path?q=1");
116
- return url.search;
117
- }
118
- `);
119
- expect(results[0].result).toBe("string");
120
- });
121
-
122
- it("url.hash should return string", () => {
123
- const results = runTest(`
124
- // @nudo:case "hash" ()
125
- function fn() {
126
- const url = new URL("https://example.com/path#section");
127
- return url.hash;
128
- }
129
- `);
130
- expect(results[0].result).toBe("string");
131
- });
132
-
133
- it("url.username should return string", () => {
134
- const results = runTest(`
135
- // @nudo:case "username" ()
136
- function fn() {
137
- const url = new URL("https://user@example.com/path");
138
- return url.username;
139
- }
140
- `);
141
- expect(results[0].result).toBe("string");
142
- });
143
-
144
- it("url.password should return string", () => {
145
- const results = runTest(`
146
- // @nudo:case "password" ()
147
- function fn() {
148
- const url = new URL("https://user:pass@example.com/path");
149
- return url.password;
150
- }
151
- `);
152
- expect(results[0].result).toBe("string");
153
- });
154
-
155
- it("url.toString() should return string", () => {
156
- const results = runTest(`
157
- // @nudo:case "toString" ()
158
- function fn() {
159
- const url = new URL("https://example.com/path");
160
- return url.toString();
161
- }
162
- `);
163
- expect(results[0].result).toBe("string");
164
- });
165
- });
166
-
167
- describe("Built-in URLSearchParams API", () => {
168
- it("new URLSearchParams() should return URLSearchParams instance", () => {
169
- const results = runTest(`
170
- // @nudo:case "new-params" ()
171
- function fn() {
172
- const params = new URLSearchParams();
173
- return params;
174
- }
175
- `);
176
- expect(results[0].result).toContain("URLSearchParams");
177
- });
178
-
179
- it("params.get() should return string | null", () => {
180
- const results = runTest(`
181
- // @nudo:case "get" ()
182
- function fn() {
183
- const params = new URLSearchParams();
184
- return params.get("key");
185
- }
186
- `);
187
- expect(results[0].result).toContain("string");
188
- expect(results[0].result).toContain("null");
189
- });
190
-
191
- it("params.has() should return boolean", () => {
192
- const results = runTest(`
193
- // @nudo:case "has" ()
194
- function fn() {
195
- const params = new URLSearchParams();
196
- return params.has("key");
197
- }
198
- `);
199
- expect(results[0].result).toBe("boolean");
200
- });
201
-
202
- it("params.set() should return undefined", () => {
203
- const results = runTest(`
204
- // @nudo:case "set" ()
205
- function fn() {
206
- const params = new URLSearchParams();
207
- return params.set("key", "value");
208
- }
209
- `);
210
- expect(results[0].result).toBe("undefined");
211
- });
212
-
213
- it("params.delete() should return undefined", () => {
214
- const results = runTest(`
215
- // @nudo:case "delete" ()
216
- function fn() {
217
- const params = new URLSearchParams();
218
- return params.delete("key");
219
- }
220
- `);
221
- expect(results[0].result).toBe("undefined");
222
- });
223
-
224
- it("params.append() should return undefined", () => {
225
- const results = runTest(`
226
- // @nudo:case "append" ()
227
- function fn() {
228
- const params = new URLSearchParams();
229
- return params.append("key", "value");
230
- }
231
- `);
232
- expect(results[0].result).toBe("undefined");
233
- });
234
-
235
- it("params.toString() should return string", () => {
236
- const results = runTest(`
237
- // @nudo:case "toString" ()
238
- function fn() {
239
- const params = new URLSearchParams();
240
- return params.toString();
241
- }
242
- `);
243
- expect(results[0].result).toBe("string");
244
- });
245
-
246
- it("params.getAll() should return string[]", () => {
247
- const results = runTest(`
248
- // @nudo:case "getAll" ()
249
- function fn() {
250
- const params = new URLSearchParams();
251
- return params.getAll("key");
252
- }
253
- `);
254
- expect(results[0].result).toBe("string[]");
255
- });
256
- });
@@ -1,340 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { parse, extractDirectives, type CaseDirective } from "@nudojs/parser";
3
- import { typeValueToString, createEnvironment, T } from "@nudojs/core";
4
- import { evaluateFunctionFull } from "../evaluator.js";
5
-
6
- function runTest(source: string): { name: string; caseName: string; result: string }[] {
7
- const ast = parse(source);
8
- const directives = extractDirectives(ast);
9
- const env = createEnvironment();
10
- const results: { name: string; caseName: string; result: string }[] = [];
11
-
12
- for (const fn of directives) {
13
- const caseDirectives = fn.directives.filter((d): d is CaseDirective => d.kind === "case");
14
- for (const dir of caseDirectives) {
15
- const result = evaluateFunctionFull(fn.node, dir.args, env);
16
- results.push({ name: fn.name, caseName: dir.name, result: typeValueToString(result.value) });
17
- }
18
- }
19
- return results;
20
- }
21
-
22
- describe("Built-in fetch API", () => {
23
- it("fetch(url) should return Promise<Response>", () => {
24
- const results = runTest(`
25
- // @nudo:case "fetch" ()
26
- function fn() {
27
- return fetch("https://example.com");
28
- }
29
- `);
30
- expect(results[0].result).toContain("Promise");
31
- expect(results[0].result).toContain("Response");
32
- });
33
-
34
- it("await fetch(url) should return Response instance", () => {
35
- const results = runTest(`
36
- // @nudo:case "await-fetch" ()
37
- async function fn() {
38
- const response = await fetch("https://example.com");
39
- return response;
40
- }
41
- `);
42
- expect(results[0].result).toContain("Response");
43
- });
44
- });
45
-
46
- describe("Built-in Response API", () => {
47
- it("new Response() should return Response instance", () => {
48
- const results = runTest(`
49
- // @nudo:case "new-response" ()
50
- function fn() {
51
- const response = new Response();
52
- return response;
53
- }
54
- `);
55
- expect(results[0].result).toContain("Response");
56
- });
57
-
58
- it("response.ok should return boolean", () => {
59
- const results = runTest(`
60
- // @nudo:case "ok" ()
61
- function fn() {
62
- const response = new Response();
63
- return response.ok;
64
- }
65
- `);
66
- expect(results[0].result).toBe("boolean");
67
- });
68
-
69
- it("response.status should return number", () => {
70
- const results = runTest(`
71
- // @nudo:case "status" ()
72
- function fn() {
73
- const response = new Response();
74
- return response.status;
75
- }
76
- `);
77
- expect(results[0].result).toBe("number");
78
- });
79
-
80
- it("response.statusText should return string", () => {
81
- const results = runTest(`
82
- // @nudo:case "statusText" ()
83
- function fn() {
84
- const response = new Response();
85
- return response.statusText;
86
- }
87
- `);
88
- expect(results[0].result).toBe("string");
89
- });
90
-
91
- it("response.url should return string", () => {
92
- const results = runTest(`
93
- // @nudo:case "url" ()
94
- function fn() {
95
- const response = new Response();
96
- return response.url;
97
- }
98
- `);
99
- expect(results[0].result).toBe("string");
100
- });
101
-
102
- it("response.type should return string", () => {
103
- const results = runTest(`
104
- // @nudo:case "type" ()
105
- function fn() {
106
- const response = new Response();
107
- return response.type;
108
- }
109
- `);
110
- expect(results[0].result).toBe("string");
111
- });
112
-
113
- it("response.redirected should return boolean", () => {
114
- const results = runTest(`
115
- // @nudo:case "redirected" ()
116
- function fn() {
117
- const response = new Response();
118
- return response.redirected;
119
- }
120
- `);
121
- expect(results[0].result).toBe("boolean");
122
- });
123
-
124
- it("response.json() should return Promise<unknown>", () => {
125
- const results = runTest(`
126
- // @nudo:case "json" ()
127
- function fn() {
128
- const response = new Response();
129
- return response.json();
130
- }
131
- `);
132
- expect(results[0].result).toBe("Promise<unknown>");
133
- });
134
-
135
- it("response.text() should return Promise<string>", () => {
136
- const results = runTest(`
137
- // @nudo:case "text" ()
138
- function fn() {
139
- const response = new Response();
140
- return response.text();
141
- }
142
- `);
143
- expect(results[0].result).toBe("Promise<string>");
144
- });
145
-
146
- it("response.arrayBuffer() should return Promise<unknown>", () => {
147
- const results = runTest(`
148
- // @nudo:case "arrayBuffer" ()
149
- function fn() {
150
- const response = new Response();
151
- return response.arrayBuffer();
152
- }
153
- `);
154
- expect(results[0].result).toBe("Promise<unknown>");
155
- });
156
-
157
- it("response.blob() should return Promise<unknown>", () => {
158
- const results = runTest(`
159
- // @nudo:case "blob" ()
160
- function fn() {
161
- const response = new Response();
162
- return response.blob();
163
- }
164
- `);
165
- expect(results[0].result).toBe("Promise<unknown>");
166
- });
167
- });
168
-
169
- describe("Built-in Headers API", () => {
170
- it("new Headers() should return Headers instance", () => {
171
- const results = runTest(`
172
- // @nudo:case "new-headers" ()
173
- function fn() {
174
- const headers = new Headers();
175
- return headers;
176
- }
177
- `);
178
- expect(results[0].result).toContain("Headers");
179
- });
180
-
181
- it("headers.get() should return string | null", () => {
182
- const results = runTest(`
183
- // @nudo:case "get" ()
184
- function fn() {
185
- const headers = new Headers();
186
- return headers.get("content-type");
187
- }
188
- `);
189
- expect(results[0].result).toContain("string");
190
- expect(results[0].result).toContain("null");
191
- });
192
-
193
- it("headers.has() should return boolean", () => {
194
- const results = runTest(`
195
- // @nudo:case "has" ()
196
- function fn() {
197
- const headers = new Headers();
198
- return headers.has("content-type");
199
- }
200
- `);
201
- expect(results[0].result).toBe("boolean");
202
- });
203
-
204
- it("headers.set() should return undefined", () => {
205
- const results = runTest(`
206
- // @nudo:case "set" ()
207
- function fn() {
208
- const headers = new Headers();
209
- return headers.set("content-type", "application/json");
210
- }
211
- `);
212
- expect(results[0].result).toBe("undefined");
213
- });
214
-
215
- it("headers.delete() should return undefined", () => {
216
- const results = runTest(`
217
- // @nudo:case "delete" ()
218
- function fn() {
219
- const headers = new Headers();
220
- return headers.delete("content-type");
221
- }
222
- `);
223
- expect(results[0].result).toBe("undefined");
224
- });
225
-
226
- it("headers.append() should return undefined", () => {
227
- const results = runTest(`
228
- // @nudo:case "append" ()
229
- function fn() {
230
- const headers = new Headers();
231
- return headers.append("content-type", "text/plain");
232
- }
233
- `);
234
- expect(results[0].result).toBe("undefined");
235
- });
236
- });
237
-
238
- describe("Built-in FormData API", () => {
239
- it("new FormData() should return FormData instance", () => {
240
- const results = runTest(`
241
- // @nudo:case "new-formdata" ()
242
- function fn() {
243
- const formData = new FormData();
244
- return formData;
245
- }
246
- `);
247
- expect(results[0].result).toContain("FormData");
248
- });
249
-
250
- it("formData.get() should return string | null", () => {
251
- const results = runTest(`
252
- // @nudo:case "get" ()
253
- function fn() {
254
- const formData = new FormData();
255
- return formData.get("name");
256
- }
257
- `);
258
- expect(results[0].result).toContain("string");
259
- expect(results[0].result).toContain("null");
260
- });
261
-
262
- it("formData.has() should return boolean", () => {
263
- const results = runTest(`
264
- // @nudo:case "has" ()
265
- function fn() {
266
- const formData = new FormData();
267
- return formData.has("name");
268
- }
269
- `);
270
- expect(results[0].result).toBe("boolean");
271
- });
272
-
273
- it("formData.set() should return undefined", () => {
274
- const results = runTest(`
275
- // @nudo:case "set" ()
276
- function fn() {
277
- const formData = new FormData();
278
- return formData.set("name", "value");
279
- }
280
- `);
281
- expect(results[0].result).toBe("undefined");
282
- });
283
-
284
- it("formData.delete() should return undefined", () => {
285
- const results = runTest(`
286
- // @nudo:case "delete" ()
287
- function fn() {
288
- const formData = new FormData();
289
- return formData.delete("name");
290
- }
291
- `);
292
- expect(results[0].result).toBe("undefined");
293
- });
294
-
295
- it("formData.append() should return undefined", () => {
296
- const results = runTest(`
297
- // @nudo:case "append" ()
298
- function fn() {
299
- const formData = new FormData();
300
- return formData.append("name", "value");
301
- }
302
- `);
303
- expect(results[0].result).toBe("undefined");
304
- });
305
- });
306
-
307
- describe("Built-in AbortController API", () => {
308
- it("new AbortController() should return AbortController instance", () => {
309
- const results = runTest(`
310
- // @nudo:case "new-abort-controller" ()
311
- function fn() {
312
- const controller = new AbortController();
313
- return controller;
314
- }
315
- `);
316
- expect(results[0].result).toContain("AbortController");
317
- });
318
-
319
- it("controller.signal should return unknown", () => {
320
- const results = runTest(`
321
- // @nudo:case "signal" ()
322
- function fn() {
323
- const controller = new AbortController();
324
- return controller.signal;
325
- }
326
- `);
327
- expect(results[0].result).toBe("unknown");
328
- });
329
-
330
- it("controller.abort() should return undefined", () => {
331
- const results = runTest(`
332
- // @nudo:case "abort" ()
333
- function fn() {
334
- const controller = new AbortController();
335
- return controller.abort();
336
- }
337
- `);
338
- expect(results[0].result).toBe("undefined");
339
- });
340
- });