@ix-xs/node-comfort 1.2.0 → 2.1.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 (78) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +137 -548
  3. package/index.js +80 -35
  4. package/package.json +161 -33
  5. package/src/Arr.js +1050 -418
  6. package/src/Async.js +817 -0
  7. package/src/Cache.js +433 -0
  8. package/src/Checker.js +1202 -539
  9. package/src/Cli.js +1293 -0
  10. package/src/Color.js +556 -0
  11. package/src/Crypto.js +1082 -0
  12. package/src/Emitter.js +356 -0
  13. package/src/Env.js +689 -0
  14. package/src/FS.js +1626 -894
  15. package/src/Func.js +823 -356
  16. package/src/Http.js +700 -0
  17. package/src/Id.js +568 -200
  18. package/src/Logger.js +963 -378
  19. package/src/Num.js +965 -360
  20. package/src/Obj.js +1077 -379
  21. package/src/SQLite.js +1629 -1005
  22. package/src/Schema.js +2101 -0
  23. package/src/Str.js +1209 -432
  24. package/src/Sys.js +654 -0
  25. package/src/Time.js +1533 -440
  26. package/src/Utils.js +342 -325
  27. package/src/errors.js +335 -0
  28. package/src/internal/shared.js +415 -0
  29. package/types/index.d.ts +735 -526
  30. package/types/src/Arr.d.ts +533 -145
  31. package/types/src/Arr.d.ts.map +1 -1
  32. package/types/src/Async.d.ts +372 -0
  33. package/types/src/Async.d.ts.map +1 -0
  34. package/types/src/Cache.d.ts +221 -0
  35. package/types/src/Cache.d.ts.map +1 -0
  36. package/types/src/Checker.d.ts +651 -232
  37. package/types/src/Checker.d.ts.map +1 -1
  38. package/types/src/Cli.d.ts +664 -0
  39. package/types/src/Cli.d.ts.map +1 -0
  40. package/types/src/Color.d.ts +300 -0
  41. package/types/src/Color.d.ts.map +1 -0
  42. package/types/src/Crypto.d.ts +620 -0
  43. package/types/src/Crypto.d.ts.map +1 -0
  44. package/types/src/Emitter.d.ts +189 -0
  45. package/types/src/Emitter.d.ts.map +1 -0
  46. package/types/src/Env.d.ts +412 -0
  47. package/types/src/Env.d.ts.map +1 -0
  48. package/types/src/FS.d.ts +717 -238
  49. package/types/src/FS.d.ts.map +1 -1
  50. package/types/src/Func.d.ts +508 -135
  51. package/types/src/Func.d.ts.map +1 -1
  52. package/types/src/Http.d.ts +444 -0
  53. package/types/src/Http.d.ts.map +1 -0
  54. package/types/src/Id.d.ts +199 -66
  55. package/types/src/Id.d.ts.map +1 -1
  56. package/types/src/Logger.d.ts +414 -46
  57. package/types/src/Logger.d.ts.map +1 -1
  58. package/types/src/Num.d.ts +514 -137
  59. package/types/src/Num.d.ts.map +1 -1
  60. package/types/src/Obj.d.ts +453 -104
  61. package/types/src/Obj.d.ts.map +1 -1
  62. package/types/src/SQLite.d.ts +754 -308
  63. package/types/src/SQLite.d.ts.map +1 -1
  64. package/types/src/Schema.d.ts +1189 -0
  65. package/types/src/Schema.d.ts.map +1 -0
  66. package/types/src/Str.d.ts +617 -166
  67. package/types/src/Str.d.ts.map +1 -1
  68. package/types/src/Sys.d.ts +314 -0
  69. package/types/src/Sys.d.ts.map +1 -0
  70. package/types/src/Time.d.ts +759 -204
  71. package/types/src/Time.d.ts.map +1 -1
  72. package/types/src/Utils.d.ts +158 -102
  73. package/types/src/Utils.d.ts.map +1 -1
  74. package/types/src/errors.d.ts +316 -0
  75. package/types/src/errors.d.ts.map +1 -0
  76. package/types/src/internal/shared.d.ts +123 -0
  77. package/types/src/internal/shared.d.ts.map +1 -0
  78. 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", "findUp", "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", "isHostname", "isMACAddress", "isIBAN", "isE164", "isObjectId", "isULID", "isDataURL", "isMimeType", "isTimeZone", "isLocale", "isCron", "isASCII", "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, findUp, 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, isHostname, isMACAddress, isIBAN, isE164, isObjectId, isULID, isDataURL, isMimeType, isTimeZone, isLocale, isCron, isASCII, 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,202 @@
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.1.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-reference.js",
188
+ "build:types": "node scripts/build-types.js",
189
+ "build:reference": "node scripts/build-reference.js",
190
+ "test": "node --test --test-reporter=spec --test-timeout=120000 \"test/**/*.test.js\"",
191
+ "test:types": "node scripts/check-types.js",
192
+ "docs:install": "npm ci --prefix docs",
193
+ "docs:dev": "npm run dev --prefix docs",
194
+ "docs:build": "npm run build --prefix docs && npm run check-links --prefix docs && npm run check-translation --prefix docs",
195
+ "check": "npm run build && npm test && npm run test:types",
196
+ "prepublishOnly": "npm run check"
72
197
  },
73
- "homepage": "https://github.com/ix-xs/node-comfort#readme"
198
+ "devDependencies": {
199
+ "@types/node": "^22.13.0",
200
+ "typescript": "~6.0.3"
201
+ }
74
202
  }