@ix-xs/node-comfort 1.2.0 → 2.0.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 (75) hide show
  1. package/CHANGELOG.md +190 -0
  2. package/README.md +136 -549
  3. package/index.js +80 -35
  4. package/package.json +160 -33
  5. package/src/Arr.js +887 -419
  6. package/src/Async.js +585 -0
  7. package/src/Cache.js +329 -0
  8. package/src/Checker.js +971 -539
  9. package/src/Cli.js +1034 -0
  10. package/src/Color.js +415 -0
  11. package/src/Crypto.js +707 -0
  12. package/src/Emitter.js +289 -0
  13. package/src/Env.js +555 -0
  14. package/src/FS.js +1483 -894
  15. package/src/Func.js +670 -353
  16. package/src/Http.js +538 -0
  17. package/src/Id.js +384 -201
  18. package/src/Logger.js +739 -378
  19. package/src/Num.js +844 -361
  20. package/src/Obj.js +855 -372
  21. package/src/SQLite.js +1308 -1005
  22. package/src/Schema.js +1586 -0
  23. package/src/Str.js +983 -436
  24. package/src/Sys.js +511 -0
  25. package/src/Time.js +1260 -422
  26. package/src/Utils.js +321 -325
  27. package/src/errors.js +292 -0
  28. package/types/index.d.ts +693 -526
  29. package/types/src/Arr.d.ts +455 -145
  30. package/types/src/Arr.d.ts.map +1 -1
  31. package/types/src/Async.d.ts +321 -0
  32. package/types/src/Async.d.ts.map +1 -0
  33. package/types/src/Cache.d.ts +195 -0
  34. package/types/src/Cache.d.ts.map +1 -0
  35. package/types/src/Checker.d.ts +501 -235
  36. package/types/src/Checker.d.ts.map +1 -1
  37. package/types/src/Cli.d.ts +582 -0
  38. package/types/src/Cli.d.ts.map +1 -0
  39. package/types/src/Color.d.ts +294 -0
  40. package/types/src/Color.d.ts.map +1 -0
  41. package/types/src/Crypto.d.ts +534 -0
  42. package/types/src/Crypto.d.ts.map +1 -0
  43. package/types/src/Emitter.d.ts +170 -0
  44. package/types/src/Emitter.d.ts.map +1 -0
  45. package/types/src/Env.d.ts +382 -0
  46. package/types/src/Env.d.ts.map +1 -0
  47. package/types/src/FS.d.ts +686 -238
  48. package/types/src/FS.d.ts.map +1 -1
  49. package/types/src/Func.d.ts +380 -135
  50. package/types/src/Func.d.ts.map +1 -1
  51. package/types/src/Http.d.ts +374 -0
  52. package/types/src/Http.d.ts.map +1 -0
  53. package/types/src/Id.d.ts +149 -68
  54. package/types/src/Id.d.ts.map +1 -1
  55. package/types/src/Logger.d.ts +363 -46
  56. package/types/src/Logger.d.ts.map +1 -1
  57. package/types/src/Num.d.ts +473 -137
  58. package/types/src/Num.d.ts.map +1 -1
  59. package/types/src/Obj.d.ts +390 -104
  60. package/types/src/Obj.d.ts.map +1 -1
  61. package/types/src/SQLite.d.ts +646 -309
  62. package/types/src/SQLite.d.ts.map +1 -1
  63. package/types/src/Schema.d.ts +940 -0
  64. package/types/src/Schema.d.ts.map +1 -0
  65. package/types/src/Str.d.ts +569 -166
  66. package/types/src/Str.d.ts.map +1 -1
  67. package/types/src/Sys.d.ts +269 -0
  68. package/types/src/Sys.d.ts.map +1 -0
  69. package/types/src/Time.d.ts +663 -204
  70. package/types/src/Time.d.ts.map +1 -1
  71. package/types/src/Utils.d.ts +154 -102
  72. package/types/src/Utils.d.ts.map +1 -1
  73. package/types/src/errors.d.ts +292 -0
  74. package/types/src/errors.d.ts.map +1 -0
  75. package/types/index.d.ts.map +0 -1
package/index.js CHANGED
@@ -1,39 +1,84 @@
1
- const Logger = require("./src/Logger");
2
- const FS = require("./src/FS");
3
- const Checker = require("./src/Checker");
4
- const Utils = require("./src/Utils");
5
- const SQLite = require("./src/SQLite");
6
- const str = require("./src/Str");
7
- const num = require("./src/Num");
8
- const arr = require("./src/Arr");
9
- const obj = require("./src/Obj");
10
- const func = require("./src/Func");
11
- const time = require("./src/Time");
12
- const id = require("./src/Id");
1
+ "use strict";
2
+
3
+ // Every namespace is loaded the first time you touch it, so requiring the
4
+ // package costs almost nothing.
5
+
6
+ const fs = require("node:fs");
7
+ const path = require("node:path");
8
+
9
+ // The .env file must be applied before any user code reads process.env.
10
+ if (String(process.env.NODE_COMFORT_DOTENV).toLowerCase() !== "false" && fs.existsSync(path.join(process.cwd(), ".env"))) {
11
+ require("./src/Env.js");
12
+ }
13
+
14
+ /** @type {Record<string, () => any>} */
15
+ const modules = {
16
+ logger: () => require("./src/Logger.js"),
17
+ fs: () => require("./src/FS.js"),
18
+ checker: () => require("./src/Checker.js"),
19
+ utils: () => require("./src/Utils.js"),
20
+ str: () => require("./src/Str.js"),
21
+ num: () => require("./src/Num.js"),
22
+ arr: () => require("./src/Arr.js"),
23
+ obj: () => require("./src/Obj.js"),
24
+ func: () => require("./src/Func.js"),
25
+ time: () => require("./src/Time.js"),
26
+ id: () => require("./src/Id.js"),
27
+ crypto: () => require("./src/Crypto.js"),
28
+ color: () => require("./src/Color.js"),
29
+ cli: () => require("./src/Cli.js"),
30
+ sys: () => require("./src/Sys.js"),
31
+ async: () => require("./src/Async.js"),
32
+ schema: () => require("./src/Schema.js"),
33
+ http: () => require("./src/Http.js"),
34
+ env: () => require("./src/Env.js"),
35
+ errors: () => require("./src/errors.js"),
36
+ SQLite: () => require("./src/SQLite.js"),
37
+ Cache: () => require("./src/Cache.js"),
38
+ Emitter: () => require("./src/Emitter.js"),
39
+ };
40
+
41
+ // Helpers that are also available at the top level (nc.info, nc.readJSON...).
42
+ const flat = {
43
+ logger: ["log", "trace", "debug", "info", "success", "warn", "error", "fatal", "group", "groupEnd", "timeStart", "timeEnd", "table", "box", "divider", "setLevel", "getLevel", "isLevelEnabled", "configure", "setTimestamp", "setDelimiter", "createLogger"],
44
+ fs: ["getEnv", "createPath", "getFolder", "getFile", "getFoldersIn", "getFilesIn", "glob", "find", "readFile", "readLines", "readJSON", "writeFile", "writeJSON", "appendFile", "createFile", "createFolder", "ensureFolder", "ensureFile", "touch", "deleteFolder", "deleteFile", "remove", "deleteFoldersIn", "deleteFilesIn", "emptyFolder", "copy", "move", "copyFoldersIn", "copyFolder", "copyFilesIn", "copyFile", "moveFoldersIn", "moveFolder", "moveFilesIn", "moveFile", "exists", "isFile", "isFolder", "stat", "fileSize", "folderSize", "hashFile", "tempFolder", "sanitizeFilename", "watch"],
45
+ checker: ["isArray", "isNumber", "isFinite", "isInteger", "isSafeInteger", "isFloat", "isPositive", "isNegative", "isBoolean", "isString", "isSymbol", "isBigInt", "isUndefined", "isNull", "isNil", "isDefined", "isPrimitive", "isFunction", "isAsyncFunction", "isGeneratorFunction", "isGenerator", "isClass", "isObject", "isPlainObject", "isPromise", "isRegExp", "isDate", "isValidDate", "isMap", "isSet", "isWeakMap", "isWeakSet", "isIterable", "isAsyncIterable", "isBuffer", "isTypedArray", "isError", "isEmpty", "isBlank", "isArrayOf", "isOneOf", "isEmail", "isURL", "isUUID", "isJSON", "isNumeric", "isIP", "isIPv4", "isIPv6", "isPort", "isHex", "isHexColor", "isBase64", "isSemver", "isISODate", "isSlug", "isAlpha", "isAlphanumeric", "isCreditCard", "isJWT", "assert", "assertType"],
46
+ utils: ["wait", "when", "dontCrash", "JSONString", "JSONParse"],
47
+ };
13
48
 
14
49
  /**
15
- * @ix-xs/node-comfort
16
- *
17
- * A zero-dependency comfort belt for Node.js: a colorful logger, a safe
18
- * filesystem helper, a tiny SQLite wrapper, runtime type checks, async/process
19
- * helpers, plus rich string, number, array, object, function, date and
20
- * id/crypto utilities.
50
+ * @param {string} name
51
+ * @param {() => unknown} load
21
52
  */
22
- module.exports = {
23
- ...Logger,
24
- ...FS,
25
- ...Checker,
26
- ...Utils,
27
- SQLite,
28
- str,
29
- num,
30
- arr,
31
- obj,
32
- func,
33
- time,
34
- id,
35
- logger: Logger,
36
- fs: FS,
37
- checker: Checker,
38
- utils: Utils,
53
+ const lazy = (name, load) => {
54
+ let loaded = false;
55
+ /** @type {unknown} */
56
+ let value;
57
+ Object.defineProperty(exports, name, {
58
+ get: () => {
59
+ if (!loaded) {
60
+ value = load();
61
+ loaded = true;
62
+ }
63
+ return value;
64
+ },
65
+ set: (replacement) => {
66
+ value = replacement;
67
+ loaded = true;
68
+ },
69
+ enumerable: true,
70
+ configurable: true,
71
+ });
39
72
  };
73
+
74
+ for (const [namespace, names] of Object.entries(flat)) {
75
+ for (const name of names) lazy(name, () => modules[namespace]()[name]);
76
+ }
77
+ for (const [name, load] of Object.entries(modules)) lazy(name, load);
78
+
79
+ exports.nc = exports;
80
+ exports.nodeComfort = exports;
81
+
82
+ // Never runs. Node reads this line to know the named exports of the package
83
+ // when it is imported from an ES module.
84
+ 0 && (module.exports = { log, trace, debug, info, success, warn, error, fatal, group, groupEnd, timeStart, timeEnd, table, box, divider, setLevel, getLevel, isLevelEnabled, configure, setTimestamp, setDelimiter, createLogger, getEnv, createPath, getFolder, getFile, getFoldersIn, getFilesIn, glob, find, readFile, readLines, readJSON, writeFile, writeJSON, appendFile, createFile, createFolder, ensureFolder, ensureFile, touch, deleteFolder, deleteFile, remove, deleteFoldersIn, deleteFilesIn, emptyFolder, copy, move, copyFoldersIn, copyFolder, copyFilesIn, copyFile, moveFoldersIn, moveFolder, moveFilesIn, moveFile, exists, isFile, isFolder, stat, fileSize, folderSize, hashFile, tempFolder, sanitizeFilename, watch, isArray, isNumber, isFinite, isInteger, isSafeInteger, isFloat, isPositive, isNegative, isBoolean, isString, isSymbol, isBigInt, isUndefined, isNull, isNil, isDefined, isPrimitive, isFunction, isAsyncFunction, isGeneratorFunction, isGenerator, isClass, isObject, isPlainObject, isPromise, isRegExp, isDate, isValidDate, isMap, isSet, isWeakMap, isWeakSet, isIterable, isAsyncIterable, isBuffer, isTypedArray, isError, isEmpty, isBlank, isArrayOf, isOneOf, isEmail, isURL, isUUID, isJSON, isNumeric, isIP, isIPv4, isIPv6, isPort, isHex, isHexColor, isBase64, isSemver, isISODate, isSlug, isAlpha, isAlphanumeric, isCreditCard, isJWT, assert, assertType, wait, when, dontCrash, JSONString, JSONParse, logger, fs, checker, utils, str, num, arr, obj, func, time, id, crypto, color, cli, sys, async, schema, http, env, errors, SQLite, Cache, Emitter, nc, nodeComfort });
package/package.json CHANGED
@@ -1,74 +1,201 @@
1
1
  {
2
2
  "name": "@ix-xs/node-comfort",
3
- "version": "1.2.0",
4
- "description": "Zero-dependency comfort belt for Node.js: colorful logger, filesystem helper, SQLite wrapper, runtime type checks, async/process helpers, plus rich string, number, array, object, function, date and id/crypto utilities.",
5
- "main": "index.js",
6
- "types": "types/index.d.ts",
7
- "type": "commonjs",
3
+ "version": "2.0.0",
4
+ "description": "The zero-dependency standard library for Node.js: logger, filesystem, SQLite, schema validation, HTTP client, CLI toolkit, cache, env, async pools, colors, events, i18n dates, ids, crypto and hundreds of fully typed helpers.",
8
5
  "keywords": [
9
6
  "utils",
10
7
  "utilities",
11
8
  "helpers",
12
9
  "toolkit",
10
+ "stdlib",
11
+ "standard-library",
12
+ "zero-dependency",
13
+ "no-dependencies",
14
+ "typescript",
13
15
  "logger",
14
- "console",
15
16
  "colors",
16
17
  "ansi",
18
+ "cli",
19
+ "spinner",
20
+ "progress-bar",
21
+ "prompt",
17
22
  "filesystem",
18
23
  "fs",
24
+ "glob",
19
25
  "sqlite",
20
26
  "database",
21
- "type-check",
22
- "guards",
27
+ "schema",
23
28
  "validation",
29
+ "http",
30
+ "fetch",
31
+ "retry",
32
+ "cache",
33
+ "lru",
34
+ "env",
35
+ "dotenv",
36
+ "async",
37
+ "concurrency",
38
+ "queue",
39
+ "events",
40
+ "emitter",
41
+ "date",
42
+ "i18n",
43
+ "timezone",
44
+ "duration",
24
45
  "string",
25
46
  "slugify",
26
- "camelcase",
27
- "number",
28
- "format-bytes",
29
47
  "array",
30
48
  "object",
31
- "deep-clone",
32
49
  "deep-merge",
33
50
  "debounce",
34
51
  "throttle",
35
52
  "memoize",
36
- "retry",
37
- "date",
38
- "duration",
39
53
  "uuid",
40
54
  "ulid",
41
55
  "nanoid",
42
- "hash",
43
56
  "crypto",
44
- "zero-dependency",
45
- "no-dependencies"
57
+ "encryption",
58
+ "password-hashing"
46
59
  ],
47
- "author": "ix-xs",
60
+ "homepage": "https://ix-xs.github.io/node-comfort/",
61
+ "bugs": {
62
+ "url": "https://github.com/ix-xs/node-comfort/issues"
63
+ },
64
+ "repository": {
65
+ "type": "git",
66
+ "url": "git+https://github.com/ix-xs/node-comfort.git"
67
+ },
48
68
  "license": "MIT",
49
- "engines": {
50
- "node": ">=20.12.0"
69
+ "author": "ix-xs",
70
+ "type": "commonjs",
71
+ "main": "./index.js",
72
+ "types": "./types/index.d.ts",
73
+ "exports": {
74
+ ".": {
75
+ "types": "./types/index.d.ts",
76
+ "default": "./index.js"
77
+ },
78
+ "./logger": {
79
+ "types": "./types/src/Logger.d.ts",
80
+ "default": "./src/Logger.js"
81
+ },
82
+ "./fs": {
83
+ "types": "./types/src/FS.d.ts",
84
+ "default": "./src/FS.js"
85
+ },
86
+ "./checker": {
87
+ "types": "./types/src/Checker.d.ts",
88
+ "default": "./src/Checker.js"
89
+ },
90
+ "./utils": {
91
+ "types": "./types/src/Utils.d.ts",
92
+ "default": "./src/Utils.js"
93
+ },
94
+ "./str": {
95
+ "types": "./types/src/Str.d.ts",
96
+ "default": "./src/Str.js"
97
+ },
98
+ "./num": {
99
+ "types": "./types/src/Num.d.ts",
100
+ "default": "./src/Num.js"
101
+ },
102
+ "./arr": {
103
+ "types": "./types/src/Arr.d.ts",
104
+ "default": "./src/Arr.js"
105
+ },
106
+ "./obj": {
107
+ "types": "./types/src/Obj.d.ts",
108
+ "default": "./src/Obj.js"
109
+ },
110
+ "./func": {
111
+ "types": "./types/src/Func.d.ts",
112
+ "default": "./src/Func.js"
113
+ },
114
+ "./time": {
115
+ "types": "./types/src/Time.d.ts",
116
+ "default": "./src/Time.js"
117
+ },
118
+ "./id": {
119
+ "types": "./types/src/Id.d.ts",
120
+ "default": "./src/Id.js"
121
+ },
122
+ "./crypto": {
123
+ "types": "./types/src/Crypto.d.ts",
124
+ "default": "./src/Crypto.js"
125
+ },
126
+ "./color": {
127
+ "types": "./types/src/Color.d.ts",
128
+ "default": "./src/Color.js"
129
+ },
130
+ "./cli": {
131
+ "types": "./types/src/Cli.d.ts",
132
+ "default": "./src/Cli.js"
133
+ },
134
+ "./sys": {
135
+ "types": "./types/src/Sys.d.ts",
136
+ "default": "./src/Sys.js"
137
+ },
138
+ "./async": {
139
+ "types": "./types/src/Async.d.ts",
140
+ "default": "./src/Async.js"
141
+ },
142
+ "./schema": {
143
+ "types": "./types/src/Schema.d.ts",
144
+ "default": "./src/Schema.js"
145
+ },
146
+ "./http": {
147
+ "types": "./types/src/Http.d.ts",
148
+ "default": "./src/Http.js"
149
+ },
150
+ "./env": {
151
+ "types": "./types/src/Env.d.ts",
152
+ "default": "./src/Env.js"
153
+ },
154
+ "./errors": {
155
+ "types": "./types/src/errors.d.ts",
156
+ "default": "./src/errors.js"
157
+ },
158
+ "./sqlite": {
159
+ "types": "./types/src/SQLite.d.ts",
160
+ "default": "./src/SQLite.js"
161
+ },
162
+ "./cache": {
163
+ "types": "./types/src/Cache.d.ts",
164
+ "default": "./src/Cache.js"
165
+ },
166
+ "./emitter": {
167
+ "types": "./types/src/Emitter.d.ts",
168
+ "default": "./src/Emitter.js"
169
+ },
170
+ "./package.json": "./package.json"
51
171
  },
52
172
  "files": [
53
173
  "index.js",
54
174
  "src/",
55
175
  "types/",
56
176
  "README.md",
177
+ "CHANGELOG.md",
57
178
  "LICENSE"
58
179
  ],
59
- "scripts": {
60
- "build": "tsc",
61
- "prepublishOnly": "npm run build"
62
- },
63
- "devDependencies": {
64
- "typescript": "^5.6.0"
180
+ "engines": {
181
+ "node": ">=22.13.0"
65
182
  },
66
- "repository": {
67
- "type": "git",
68
- "url": "https://github.com/ix-xs/node-comfort.git"
183
+ "publishConfig": {
184
+ "access": "public"
69
185
  },
70
- "bugs": {
71
- "url": "https://github.com/ix-xs/node-comfort/issues"
186
+ "scripts": {
187
+ "build": "node scripts/build-types.js && node scripts/build-docs.js",
188
+ "build:types": "node scripts/build-types.js",
189
+ "build:docs": "node scripts/build-docs.js",
190
+ "build:site": "node scripts/build-site.js",
191
+ "site:serve": "node scripts/serve-site.js",
192
+ "test": "node --test \"test/**/*.test.js\"",
193
+ "test:types": "node scripts/check-types.js",
194
+ "check": "npm run build && npm run build:site && npm test && npm run test:types",
195
+ "prepublishOnly": "npm run check"
72
196
  },
73
- "homepage": "https://github.com/ix-xs/node-comfort#readme"
197
+ "devDependencies": {
198
+ "@types/node": "^22.13.0",
199
+ "typescript": "~6.0.3"
200
+ }
74
201
  }