@jackens/nnn 2026.2.11 → 2026.2.13

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 (3) hide show
  1. package/nnn.js +20 -28
  2. package/package.json +1 -1
  3. package/readme.md +24 -97
package/nnn.js CHANGED
@@ -7,35 +7,27 @@ var is_string = (arg) => typeof arg === "string";
7
7
 
8
8
  // src/nnn/vivify.ts
9
9
  var ARRAY_INDEX_REGEXP = /^(0|[1-9]\d*)$/;
10
- var get_target = (parent, parent_key, child_key) => {
11
- if (parent_key == null) {
12
- return parent;
13
- }
14
- if (!(parent_key in parent)) {
15
- parent[parent_key] = is_string(child_key) && ARRAY_INDEX_REGEXP.test(child_key) ? [] : {};
16
- }
17
- return parent[parent_key];
18
- };
19
- var _vivify = (parent, parent_key) => new Proxy({}, {
20
- get(_, key) {
21
- const target = get_target(parent, parent_key, key);
22
- if (target != null && typeof target === "object") {
23
- return _vivify(target, key);
10
+ var _is_object = (ref) => typeof ref === "object";
11
+ var _get_target = (parent, parent_key, key) => parent[parent_key] ??= is_string(key) && ARRAY_INDEX_REGEXP.test(key) ? [] : {};
12
+ var _vivify = (parent, parent_key) => {
13
+ return parent != null && _is_object(parent) ? new Proxy(parent, {
14
+ get(_, key) {
15
+ const target = _get_target(parent, parent_key, key);
16
+ const value = target[key];
17
+ return is_string(key) && _is_object(target) && (value == null || _is_object(value)) ? _vivify(target, key) : value;
18
+ },
19
+ set(_, key, value) {
20
+ const target = _get_target(parent, parent_key, key);
21
+ target[key] = value;
22
+ return true;
23
+ },
24
+ deleteProperty(_, key) {
25
+ const target = _get_target(parent, parent_key, key);
26
+ return delete target[key];
24
27
  }
25
- return target?.[key];
26
- },
27
- set(_, key, value) {
28
- const target = get_target(parent, parent_key, key);
29
- target[key] = value;
30
- return true;
31
- },
32
- deleteProperty(_, key) {
33
- const target = get_target(parent, parent_key, key);
34
- delete target[key];
35
- return true;
36
- }
37
- });
38
- var vivify = (ref) => _vivify(ref);
28
+ }) : parent?.[parent_key];
29
+ };
30
+ var vivify = (ref) => _vivify({ _: ref }, "_");
39
31
 
40
32
  // src/nnn/c.ts
41
33
  var _c = (node, prefix, result, splitter) => {
package/package.json CHANGED
@@ -43,5 +43,5 @@
43
43
  "name": "@jackens/nnn",
44
44
  "type": "module",
45
45
  "types": "nnn.d.ts",
46
- "version": "2026.2.11"
46
+ "version": "2026.2.13"
47
47
  }
package/readme.md CHANGED
@@ -1282,138 +1282,65 @@ const ref: any = {}
1282
1282
 
1283
1283
  vivify(ref).one.two[1][2] = 42
1284
1284
 
1285
- expect(ref).to.deep.equal({
1286
- one: {
1287
- two: [
1288
- undefined,
1289
- [undefined, undefined, 42]
1290
- ]
1291
- }
1292
- })
1285
+ expect(ref).to.deep.equal({ one: { two: [undefined, [undefined, undefined, 42]] } })
1293
1286
 
1294
1287
  vivify(ref).one.two[1][3] = 42
1295
1288
 
1296
- expect(ref).to.deep.equal({
1297
- one: {
1298
- two: [
1299
- undefined,
1300
- [undefined, undefined, 42, 42]
1301
- ]
1302
- }
1303
- })
1289
+ expect(ref).to.deep.equal({ one: { two: [undefined, [undefined, undefined, 42, 42]] } })
1304
1290
 
1305
1291
  vivify(ref).one.two[1] = 42
1306
1292
 
1307
- expect(ref).to.deep.equal({
1308
- one: {
1309
- two: [
1310
- undefined,
1311
- 42
1312
- ]
1313
- }
1314
- })
1293
+ expect(ref).to.deep.equal({ one: { two: [undefined, 42] } })
1315
1294
 
1316
1295
  vivify(ref).one.two[3][0] = 42
1317
1296
 
1318
- expect(ref).to.deep.equal({
1319
- one: {
1320
- two: [
1321
- undefined,
1322
- 42,
1323
- undefined,
1324
- [42]
1325
- ]
1326
- }
1327
- })
1297
+ expect(ref).to.deep.equal({ one: { two: [undefined, 42, undefined, [42]] } })
1328
1298
 
1329
1299
  vivify(ref).one.two[3].length = 2
1330
1300
 
1331
- expect(ref).to.deep.equal({
1332
- one: {
1333
- two: [
1334
- undefined,
1335
- 42,
1336
- undefined,
1337
- [42, undefined]
1338
- ]
1339
- }
1340
- })
1301
+ expect(ref).to.deep.equal({ one: { two: [undefined, 42, undefined, [42, undefined]] } })
1302
+
1303
+ expect(vivify(ref).one.two.length).to.deep.equal(4)
1304
+
1305
+ expect(ref).to.deep.equal({ one: { two: [undefined, 42, undefined, [42, undefined]] } })
1341
1306
 
1342
1307
  vivify(ref).one.two = 12
1343
1308
 
1344
- expect(ref).to.deep.equal({
1345
- one: {
1346
- two: 12
1347
- }
1348
- })
1309
+ expect(ref).to.deep.equal({ one: { two: 12 } })
1349
1310
 
1350
1311
  vivify(ref).one.two = undefined
1351
1312
 
1352
- expect(ref).to.deep.equal({
1353
- one: {
1354
- two: undefined
1355
- }
1356
- })
1313
+ expect(ref).to.deep.equal({ one: { two: undefined } })
1357
1314
 
1358
1315
  delete vivify(ref).one.two
1359
1316
 
1360
- expect(ref).to.deep.equal({
1361
- one: {}
1362
- })
1317
+ expect(ref).to.deep.equal({ one: {} })
1318
+
1319
+ expect(vivify(ref).one.toString instanceof Function).to.be.true
1320
+
1321
+ expect(vivify(ref).one.toString.name).to.equal('toString')
1322
+
1323
+ expect(ref).to.deep.equal({ one: {} })
1363
1324
 
1364
1325
  delete vivify(ref).one.two.three
1365
1326
 
1366
- expect(ref).to.deep.equal({
1367
- one: {
1368
- two: {}
1369
- }
1370
- })
1327
+ expect(ref).to.deep.equal({ one: { two: {} } })
1371
1328
 
1372
1329
  vivify(ref).one.two.three.four
1373
1330
 
1374
- expect(ref).to.deep.equal({
1375
- one: {
1376
- two: {
1377
- three: {}
1378
- }
1379
- }
1380
- })
1331
+ expect(ref).to.deep.equal({ one: { two: { three: {} } } })
1381
1332
 
1382
1333
  vivify(ref).one.two[3]
1383
1334
 
1384
- expect(ref).to.deep.equal({
1385
- one: {
1386
- two: {
1387
- three: {}
1388
- }
1389
- }
1390
- })
1335
+ expect(ref).to.deep.equal({ one: { two: { three: {} } } })
1391
1336
 
1392
1337
  vivify(ref).one.two.three.four = 42
1393
1338
 
1394
- expect(ref).to.deep.equal({
1395
- one: {
1396
- two: {
1397
- three: {
1398
- four: 42
1399
- }
1400
- }
1401
- }
1402
- })
1403
-
1404
- const name = vivify(ref).one.two.three.four.toString.name
1339
+ expect(ref).to.deep.equal({ one: { two: { three: { four: 42 } } } })
1405
1340
 
1406
- expect(name).to.deep.equal('toString')
1341
+ expect(vivify(ref).one.two.three.four.toString.name).to.deep.equal('toString')
1407
1342
 
1408
- expect(ref).to.deep.equal({
1409
- one: {
1410
- two: {
1411
- three: {
1412
- four: 42
1413
- }
1414
- }
1415
- }
1416
- })
1343
+ expect(ref).to.deep.equal({ one: { two: { three: { four: 42 } } } })
1417
1344
  ```
1418
1345
 
1419
1346
  ## License