@nudojs/env 0.3.0 → 0.4.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.
@@ -99,6 +99,19 @@ function envFn(paramTypes, returnType, apply, opts) {
99
99
  if (opts?.conf && opts.conf !== "exact") a.conf = opts.conf;
100
100
  return a;
101
101
  }
102
+ function envFnVariadic(restType, returnType, opts) {
103
+ const required = opts?.required ?? [];
104
+ const restName = opts?.restName ?? "...rest";
105
+ const paramTypes = [...required, restType];
106
+ const params = [
107
+ ...required.map((_, i) => `x${i}`),
108
+ restName
109
+ ];
110
+ return envFn(paramTypes, returnType, opts?.apply, {
111
+ params,
112
+ ...opts?.name ? { name: opts.name } : {}
113
+ });
114
+ }
102
115
  function slotsOf(entries) {
103
116
  const out = {};
104
117
  for (const [k, v] of Object.entries(entries)) {
@@ -396,6 +409,7 @@ export {
396
409
  promiseOf,
397
410
  brandOf,
398
411
  envFn,
412
+ envFnVariadic,
399
413
  objAbs,
400
414
  prim,
401
415
  defineEnv
package/dist/es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineEnv
3
- } from "./chunk-MW5NHORB.js";
3
+ } from "./chunk-6RZUMVN5.js";
4
4
  export {
5
5
  defineEnv
6
6
  };
package/dist/node.js CHANGED
@@ -3,6 +3,7 @@ import {
3
3
  brandOf,
4
4
  defineEnv,
5
5
  envFn,
6
+ envFnVariadic,
6
7
  nullLit,
7
8
  objAbs,
8
9
  prim,
@@ -10,7 +11,7 @@ import {
10
11
  tupleOf,
11
12
  undef,
12
13
  unionOf
13
- } from "./chunk-MW5NHORB.js";
14
+ } from "./chunk-6RZUMVN5.js";
14
15
 
15
16
  // src/node.ts
16
17
  import {
@@ -130,6 +131,106 @@ function defineEnv2() {
130
131
  chmodSync: envFn([prim.str(), prim.num()], undef()),
131
132
  chownSync: envFn([prim.str(), prim.num(), prim.num()], undef()),
132
133
  accessSync: envFn([prim.str(), prim.num()], undef()),
134
+ // Callback-style async on `fs` / `node:fs` (Node actual API).
135
+ // Promise APIs live only under fs.promises / node:fs/promises.
136
+ readFile: envFn(
137
+ [prim.str(), prim.unknown, prim.unknown],
138
+ undef(),
139
+ void 0,
140
+ { params: ["path", "options?", "callback"] }
141
+ ),
142
+ writeFile: envFn(
143
+ [prim.str(), unionOf(prim.str(), bufferBrand), prim.unknown],
144
+ undef(),
145
+ void 0,
146
+ { params: ["path", "data", "callback"] }
147
+ ),
148
+ mkdir: envFn(
149
+ [prim.str(), prim.unknown, prim.unknown],
150
+ undef(),
151
+ void 0,
152
+ { params: ["path", "options?", "callback"] }
153
+ ),
154
+ rm: envFn(
155
+ [prim.str(), prim.unknown, prim.unknown],
156
+ undef(),
157
+ void 0,
158
+ { params: ["path", "options?", "callback"] }
159
+ ),
160
+ stat: envFn(
161
+ [prim.str(), prim.unknown, prim.unknown],
162
+ undef(),
163
+ void 0,
164
+ { params: ["path", "options?", "callback"] }
165
+ ),
166
+ readdir: envFn(
167
+ [prim.str(), prim.unknown, prim.unknown],
168
+ undef(),
169
+ void 0,
170
+ { params: ["path", "options?", "callback"] }
171
+ ),
172
+ access: envFn(
173
+ [prim.str(), prim.unknown, prim.unknown],
174
+ undef(),
175
+ void 0,
176
+ { params: ["path", "mode?", "callback"] }
177
+ ),
178
+ appendFile: envFn(
179
+ [prim.str(), unionOf(prim.str(), bufferBrand), prim.unknown],
180
+ undef(),
181
+ void 0,
182
+ { params: ["path", "data", "callback"] }
183
+ ),
184
+ unlink: envFn(
185
+ [prim.str(), prim.unknown, prim.unknown],
186
+ undef(),
187
+ void 0,
188
+ { params: ["path", "options?", "callback"] }
189
+ ),
190
+ rename: envFn(
191
+ [prim.str(), prim.str(), prim.unknown],
192
+ undef(),
193
+ void 0,
194
+ { params: ["oldPath", "newPath", "callback"] }
195
+ ),
196
+ copyFile: envFn(
197
+ [prim.str(), prim.str(), prim.unknown],
198
+ undef(),
199
+ void 0,
200
+ { params: ["src", "dest", "callback"] }
201
+ ),
202
+ realpath: envFn(
203
+ [prim.str(), prim.unknown, prim.unknown],
204
+ undef(),
205
+ void 0,
206
+ { params: ["path", "options?", "callback"] }
207
+ ),
208
+ readlink: envFn(
209
+ [prim.str(), prim.unknown, prim.unknown],
210
+ undef(),
211
+ void 0,
212
+ { params: ["path", "options?", "callback"] }
213
+ ),
214
+ symlink: envFn(
215
+ [prim.str(), prim.str(), prim.unknown, prim.unknown],
216
+ undef(),
217
+ void 0,
218
+ { params: ["target", "path", "type?", "callback"] }
219
+ ),
220
+ chmod: envFn(
221
+ [prim.str(), prim.num(), prim.unknown],
222
+ undef(),
223
+ void 0,
224
+ { params: ["path", "mode", "callback"] }
225
+ ),
226
+ open: envFn(
227
+ [prim.str(), prim.unknown, prim.unknown],
228
+ undef(),
229
+ void 0,
230
+ { params: ["path", "flags?", "callback"] }
231
+ )
232
+ };
233
+ const fsPromisesModule = {
133
234
  readFile: envFn(
134
235
  [prim.str(), prim.unknown],
135
236
  promiseOf(unionOf(prim.str(), bufferBrand))
@@ -148,7 +249,19 @@ function defineEnv2() {
148
249
  [prim.str(), prim.unknown],
149
250
  promiseOf(arrOf(prim.unknown))
150
251
  ),
151
- access: envFn([prim.str(), prim.num()], promiseOf(undef()))
252
+ access: envFn([prim.str(), prim.num()], promiseOf(undef())),
253
+ appendFile: envFn(
254
+ [prim.str(), unionOf(prim.str(), bufferBrand)],
255
+ promiseOf(undef())
256
+ ),
257
+ unlink: envFn([prim.str()], promiseOf(undef())),
258
+ rename: envFn([prim.str(), prim.str()], promiseOf(undef())),
259
+ copyFile: envFn([prim.str(), prim.str()], promiseOf(undef())),
260
+ realpath: envFn([prim.str()], promiseOf(prim.str())),
261
+ readlink: envFn([prim.str()], promiseOf(prim.str())),
262
+ symlink: envFn([prim.str(), prim.str()], promiseOf(undef())),
263
+ chmod: envFn([prim.str(), prim.num()], promiseOf(undef())),
264
+ open: envFn([prim.str(), prim.str()], promiseOf(prim.unknown))
152
265
  };
153
266
  const strImpl1Abs = (fn) => (args) => {
154
267
  const a = absStr(args[0]);
@@ -178,10 +291,21 @@ function defineEnv2() {
178
291
  return p !== void 0 ? boolLit(nodePath.isAbsolute(p)) : void 0;
179
292
  };
180
293
  const pathModule = {
181
- join: envFn([prim.str(), prim.str()], prim.str(), pathJoinAbs),
182
- resolve: envFn([prim.str()], prim.str(), pathResolveAbs),
294
+ // Node variadic: declare min required arity + rest label (not n fixed slots).
295
+ join: envFnVariadic(prim.str(), prim.str(), {
296
+ apply: pathJoinAbs,
297
+ required: [prim.str()],
298
+ restName: "...paths"
299
+ }),
300
+ resolve: envFnVariadic(prim.str(), prim.str(), {
301
+ apply: pathResolveAbs,
302
+ restName: "...paths"
303
+ }),
183
304
  dirname: envFn([prim.str()], prim.str(), strImpl1Abs(nodePath.dirname)),
184
- basename: envFn([prim.str(), prim.str()], prim.str(), pathBasenameAbs),
305
+ // ext is optional in Node — required arity 1; label+type render `ext?: string`.
306
+ basename: envFn([prim.str(), prim.str()], prim.str(), pathBasenameAbs, {
307
+ params: ["path", "ext?"]
308
+ }),
185
309
  extname: envFn([prim.str()], prim.str(), strImpl1Abs(nodePath.extname)),
186
310
  relative: envFn([prim.str(), prim.str()], prim.str(), pathRelativeAbs),
187
311
  normalize: envFn([prim.str()], prim.str(), strImpl1Abs(nodePath.normalize)),
@@ -259,6 +383,7 @@ function defineEnv2() {
259
383
  toJSON: envFn([], prim.str())
260
384
  });
261
385
  const urlModule = {
386
+ // base is optional in Node — required arity 1; label+type render `base?: string`.
262
387
  URL: envFn(
263
388
  [prim.str(), prim.str()],
264
389
  nodeUrlObj,
@@ -286,7 +411,8 @@ function defineEnv2() {
286
411
  } catch {
287
412
  return void 0;
288
413
  }
289
- }
414
+ },
415
+ { params: ["href", "base?"] }
290
416
  ),
291
417
  URLSearchParams: envFn(
292
418
  [prim.unknown],
@@ -384,15 +510,27 @@ function defineEnv2() {
384
510
  fork: envFn([prim.str(), arrOf(prim.str()), prim.unknown], prim.unknown)
385
511
  };
386
512
  const utilModule = {
387
- promisify: envFn([prim.unknown], prim.unknown),
513
+ // Signature-level: promisify preserves fn-ness only as unknown (no generic).
514
+ promisify: envFn([prim.unknown], prim.unknown, void 0, { name: "util.promisify" }),
388
515
  inspect: envFn([prim.unknown, prim.unknown], prim.str()),
389
- format: envFn([prim.str()], prim.str()),
516
+ format: envFnVariadic(prim.unknown, prim.str(), {
517
+ // util.format() with zero args is valid in Node.
518
+ restName: "...args",
519
+ name: "util.format"
520
+ }),
521
+ callbackify: envFn([prim.unknown], prim.unknown),
522
+ deprecate: envFn([prim.unknown, prim.str()], prim.unknown),
523
+ inherits: envFn([prim.unknown, prim.unknown], undef()),
524
+ isDeepStrictEqual: envFn([prim.unknown, prim.unknown], prim.bool()),
390
525
  types: objAbs({
391
526
  isDate: envFn([prim.unknown], prim.bool()),
392
527
  isRegExp: envFn([prim.unknown], prim.bool()),
393
528
  isPromise: envFn([prim.unknown], prim.bool()),
394
529
  isArrayBuffer: envFn([prim.unknown], prim.bool()),
395
- isTypedArray: envFn([prim.unknown], prim.bool())
530
+ isTypedArray: envFn([prim.unknown], prim.bool()),
531
+ isNativeError: envFn([prim.unknown], prim.bool()),
532
+ isAsyncFunction: envFn([prim.unknown], prim.bool()),
533
+ isGeneratorFunction: envFn([prim.unknown], prim.bool())
396
534
  }),
397
535
  TextEncoder: envFn(
398
536
  [],
@@ -403,6 +541,79 @@ function defineEnv2() {
403
541
  objAbs({ decode: envFn([prim.unknown], prim.str()) })
404
542
  )
405
543
  };
544
+ const eventEmitterShape = objAbs({
545
+ on: envFn([prim.str(), prim.unknown], prim.unknown),
546
+ once: envFn([prim.str(), prim.unknown], prim.unknown),
547
+ off: envFn([prim.str(), prim.unknown], prim.unknown),
548
+ emit: envFn([prim.str()], prim.bool()),
549
+ addListener: envFn([prim.str(), prim.unknown], prim.unknown),
550
+ removeListener: envFn([prim.str(), prim.unknown], prim.unknown),
551
+ removeAllListeners: envFn([prim.str()], prim.unknown),
552
+ listeners: envFn([prim.str()], arrOf(prim.unknown)),
553
+ listenerCount: envFn([prim.str()], prim.num()),
554
+ eventNames: envFn([], arrOf(prim.str()))
555
+ });
556
+ const eventEmitterInstance = brandOf("EventEmitter", eventEmitterShape);
557
+ const EventEmitterCtor = envFn([prim.unknown], eventEmitterInstance, void 0, {
558
+ params: ["options?"]
559
+ });
560
+ const eventsModule = {
561
+ EventEmitter: EventEmitterCtor,
562
+ once: envFn(
563
+ [prim.unknown, prim.str()],
564
+ promiseOf(arrOf(prim.unknown))
565
+ ),
566
+ on: envFn([prim.unknown, prim.str()], prim.unknown),
567
+ listenerCount: envFn([prim.unknown, prim.str()], prim.num())
568
+ };
569
+ const streamIoMethods = {
570
+ on: envFn([prim.str(), prim.unknown], prim.unknown),
571
+ once: envFn([prim.str(), prim.unknown], prim.unknown),
572
+ off: envFn([prim.str(), prim.unknown], prim.unknown),
573
+ emit: envFn([prim.str()], prim.bool()),
574
+ pipe: envFn([prim.unknown], prim.unknown),
575
+ destroy: envFn([prim.unknown], undef()),
576
+ read: envFn([prim.num()], prim.unknown),
577
+ write: envFn([unionOf(prim.str(), bufferBrand)], prim.bool()),
578
+ end: envFn([prim.unknown], undef()),
579
+ pause: envFn([], prim.unknown),
580
+ resume: envFn([], prim.unknown),
581
+ setEncoding: envFn([prim.str()], prim.unknown)
582
+ };
583
+ const streamCtor = (brandName) => envFn([prim.unknown], brandOf(brandName, objAbs(streamIoMethods)), void 0, {
584
+ params: ["options?"]
585
+ });
586
+ const streamModule = {
587
+ Readable: streamCtor("Readable"),
588
+ Writable: streamCtor("Writable"),
589
+ Duplex: streamCtor("Duplex"),
590
+ Transform: streamCtor("Transform"),
591
+ pipeline: envFnVariadic(prim.unknown, promiseOf(undef()), {
592
+ restName: "...streams"
593
+ }),
594
+ finished: envFn([prim.unknown], promiseOf(undef()))
595
+ };
596
+ const parsedQueryString = brandOf(
597
+ "ParsedQueryString",
598
+ objAbs({})
599
+ );
600
+ const querystringModule = {
601
+ // sep/eq/options optional — required arity 1; labels+types render `sep?: string` etc.
602
+ parse: envFn(
603
+ [prim.str(), prim.str(), prim.str(), prim.unknown],
604
+ parsedQueryString,
605
+ void 0,
606
+ { params: ["str", "sep?", "eq?", "options?"] }
607
+ ),
608
+ stringify: envFn(
609
+ [prim.unknown, prim.str(), prim.str(), prim.unknown],
610
+ prim.str(),
611
+ void 0,
612
+ { params: ["obj", "sep?", "eq?", "options?"] }
613
+ ),
614
+ escape: envFn([prim.str()], prim.str()),
615
+ unescape: envFn([prim.str()], prim.str())
616
+ };
406
617
  const nodeGlobals = {
407
618
  process: objAbs({
408
619
  env: objAbs({}),
@@ -472,15 +683,8 @@ function defineEnv2() {
472
683
  const modules = {
473
684
  fs: fsModule,
474
685
  "node:fs": fsModule,
475
- "node:fs/promises": {
476
- readFile: fsModule.readFile,
477
- writeFile: fsModule.writeFile,
478
- mkdir: fsModule.mkdir,
479
- rm: fsModule.rm,
480
- stat: fsModule.stat,
481
- readdir: fsModule.readdir,
482
- access: fsModule.access
483
- },
686
+ "fs/promises": fsPromisesModule,
687
+ "node:fs/promises": fsPromisesModule,
484
688
  path: pathModule,
485
689
  "node:path": pathModule,
486
690
  os: osModule,
@@ -492,7 +696,13 @@ function defineEnv2() {
492
696
  child_process: childProcessModule,
493
697
  "node:child_process": childProcessModule,
494
698
  util: utilModule,
495
- "node:util": utilModule
699
+ "node:util": utilModule,
700
+ events: eventsModule,
701
+ "node:events": eventsModule,
702
+ stream: streamModule,
703
+ "node:stream": streamModule,
704
+ querystring: querystringModule,
705
+ "node:querystring": querystringModule
496
706
  };
497
707
  return {
498
708
  globals: { ...esEnv.globals, ...nodeGlobals },
package/dist/web.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  promiseOf,
9
9
  undef,
10
10
  unionOf
11
- } from "./chunk-MW5NHORB.js";
11
+ } from "./chunk-6RZUMVN5.js";
12
12
 
13
13
  // src/web.ts
14
14
  import { litValue, strLit, numLit } from "@nudojs/core";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nudojs/env",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "engines": {
5
5
  "node": ">=20"
6
6
  },
@@ -35,7 +35,7 @@
35
35
  "registry": "https://registry.npmjs.org"
36
36
  },
37
37
  "dependencies": {
38
- "@nudojs/core": "2.0.0"
38
+ "@nudojs/core": "2.1.0"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsup src/es.ts src/web.ts src/node.ts --format esm --dts"