@jackens/nnn 2026.8.31 → 2026.9.2

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 (4) hide show
  1. package/nnn.d.ts +200 -423
  2. package/nnn.js +113 -138
  3. package/package.json +1 -3
  4. package/readme.md +296 -670
package/nnn.js CHANGED
@@ -1,62 +1,55 @@
1
- // src/nnn/is.ts
2
- var isArray = Array.isArray;
3
- var isNumber = (arg) => typeof arg === "number";
4
- var isFiniteNumber = Number.isFinite;
5
- var isString = (arg) => typeof arg === "string";
6
- var isRecord = (arg) => typeof arg === "object" && arg != null && !isArray(arg);
7
-
8
1
  // src/nnn/c.ts
9
2
  var DEFAULT_SPLITTER = "$$";
10
- var getName = (key, splitter = DEFAULT_SPLITTER) => key.split(splitter)[0].replace(/_/g, "-").replace(/([A-Z])/g, (_, letter) => "-" + letter.toLowerCase());
11
- var _c = (node, prefix, result, splitter) => {
12
- const queue = [[node, prefix]];
13
- while (queue.length > 0) {
14
- const [style0, prefix0] = queue.shift();
15
- if (isArray(style0)) {
16
- result.push(prefix0, prefix0 !== "" ? "{" : "", style0.join(";"), prefix0 !== "" ? "}" : "");
17
- } else {
18
- const todo = [];
19
- let attributes = [];
20
- let attributesPushed = false;
21
- for (const key in style0) {
22
- const value = style0[key];
23
- const name = getName(key, splitter);
24
- if (isString(value) || isNumber(value)) {
25
- if (!attributesPushed) {
26
- attributesPushed = true;
27
- attributes = [];
28
- todo.push([attributes, prefix0]);
29
- }
30
- attributes.push(`${name}:${value}`);
31
- } else if (value != null) {
32
- attributesPushed = false;
33
- const prefixN = [];
34
- const nameChunks = name.split(",");
35
- prefix0.split(",").forEach((prefixChunk) => nameChunks.forEach((nameChunk) => prefixN.push(prefixChunk + nameChunk)));
36
- todo.push([value, prefixN.join()]);
37
- }
38
- }
39
- queue.unshift(...todo);
3
+ var combinePrefixAndName = (prefix, name) => {
4
+ const prefixes = prefix === "" ? [""] : prefix.split(",");
5
+ const names = name.split(",");
6
+ const combined = [];
7
+ for (const p of prefixes) {
8
+ for (const n of names) {
9
+ combined.push(p + n);
40
10
  }
41
11
  }
12
+ return combined.join(",");
42
13
  };
43
- var c = (root, splitter = DEFAULT_SPLITTER) => {
44
- const chunks = [];
45
- for (const key in root) {
46
- const value = root[key];
47
- const name = getName(key, splitter);
48
- if (value != null) {
49
- if (key[0] === "@") {
50
- chunks.push(name + "{");
51
- _c(value, "", chunks, splitter);
52
- chunks.push("}");
14
+ var _c = (node, splitter = DEFAULT_SPLITTER, prefix = "", flatten = false) => {
15
+ const out = [];
16
+ let buffer = [];
17
+ const flush = () => {
18
+ if (buffer.length === 0) {
19
+ return;
20
+ }
21
+ out.push(prefix === "" ? buffer.join(";") : `${prefix}{${buffer.join(";")}}`);
22
+ buffer = [];
23
+ };
24
+ for (const [rawKey, value] of Object.entries(node)) {
25
+ if (value == null) {
26
+ continue;
27
+ }
28
+ const splitterIndex = rawKey.indexOf(splitter);
29
+ const name = splitterIndex < 0 ? rawKey : rawKey.slice(0, splitterIndex);
30
+ if (typeof value === "number" || typeof value === "string") {
31
+ if (flatten) {
32
+ out.push(`${prefix + name}:${value}`);
53
33
  } else {
54
- _c(value, name, chunks, splitter);
34
+ buffer.push(`${name}:${value}`);
55
35
  }
36
+ continue;
37
+ }
38
+ if (flatten) {
39
+ out.push(_c(value, splitter, prefix + name, true));
40
+ continue;
41
+ }
42
+ flush();
43
+ if (prefix === "" && (name === ":root" || name[0] === "@")) {
44
+ out.push(`${name}{${_c(value, splitter, "", name === ":root")}}`);
45
+ } else {
46
+ out.push(_c(value, splitter, combinePrefixAndName(prefix, name), false));
56
47
  }
57
48
  }
58
- return chunks.join("");
49
+ flush();
50
+ return out.join(flatten ? ";" : "");
59
51
  };
52
+ var c = (node, splitter = DEFAULT_SPLITTER) => _c(node, splitter);
60
53
  // src/nnn/createEscape.ts
61
54
  var createEscape = (escapeFn) => (template, ...values) => String.raw(template, ...values.map(escapeFn));
62
55
  // src/nnn/createTokenizer.ts
@@ -69,7 +62,7 @@ var createTokenizer = (decorator, ...specs) => (code) => {
69
62
  for (const [metadata, pattern] of specs) {
70
63
  let index = -1;
71
64
  let chunk = "";
72
- if (isString(pattern) && pattern.length > 0) {
65
+ if (typeof pattern === "string" && pattern.length > 0) {
73
66
  index = code.indexOf(pattern);
74
67
  chunk = code.slice(index, index + pattern.length);
75
68
  }
@@ -106,19 +99,21 @@ var csvParse = (csv, separator = ",") => {
106
99
  // src/nnn/h.ts
107
100
  var XLINK_NS = "http://www.w3.org/1999/xlink";
108
101
  var _h = (createElement, tagOrNode, ...args) => {
109
- const node = isString(tagOrNode) ? createElement(tagOrNode) : tagOrNode;
102
+ const node = typeof tagOrNode === "string" ? createElement(tagOrNode) : tagOrNode;
110
103
  args.forEach((arg) => {
111
104
  let child = null;
112
105
  if (arg instanceof Node) {
113
106
  child = arg;
114
- } else if (isArray(arg)) {
107
+ } else if (Array.isArray(arg)) {
115
108
  child = _h(createElement, ...arg);
116
- } else if (isRecord(arg)) {
109
+ } else if (typeof arg === "string" || typeof arg === "number") {
110
+ child = document.createTextNode(arg);
111
+ } else if (arg != null) {
117
112
  for (const name in arg) {
118
113
  const value = arg[name];
119
114
  if (name[0] === "$") {
120
115
  const name1 = name.slice(1);
121
- if (isRecord(value)) {
116
+ if (typeof value === "object" && value != null && !Array.isArray(value)) {
122
117
  Object.assign(node[name1] ??= {}, value);
123
118
  } else {
124
119
  node[name1] = value;
@@ -148,8 +143,6 @@ var _h = (createElement, tagOrNode, ...args) => {
148
143
  }
149
144
  }
150
145
  }
151
- } else if (isString(arg) || isNumber(arg)) {
152
- child = document.createTextNode(arg);
153
146
  }
154
147
  if (child != null) {
155
148
  node.appendChild(child);
@@ -199,53 +192,38 @@ var fixPlTypography = (node) => {
199
192
  }
200
193
  }
201
194
  };
202
- // src/nnn/hasOwn.ts
203
- var hasOwn = (ref, key) => ref != null && Object.hasOwn(ref, key);
204
- // src/nnn/jsOnParse.ts
205
- var jsOnParse = (handlers, text) => JSON.parse(text, (key, value) => {
206
- if (isRecord(value)) {
207
- let isSecondKey = false;
208
- for (key in value) {
209
- if (isSecondKey) {
210
- return value;
211
- }
212
- isSecondKey = true;
213
- }
214
- const handler = handlers[key];
215
- const params = value[key];
216
- if (handler instanceof Function && isArray(params)) {
217
- return handler(...params);
218
- }
219
- }
220
- return value;
221
- });
222
195
  // src/nnn/monokai.ts
223
- var darkKey = "@media only screen and (prefers-color-scheme: dark)" + "$$monokai";
224
196
  var monokai = {
225
197
  ":root$$monokai": {
226
- __bg: "#faf4f2",
227
- __fg: "#29242a",
228
- __comment: "#918c8e",
229
- __identifier_1: "#7058be",
230
- __identifier_2: "#269d69",
231
- __identifier_3: "#1c8ca8",
232
- __identifier_4: "#29242a",
233
- __keyword_1: "#e14775",
234
- __keyword_2: "#7058be",
235
- __keyword_3: "#1c8ca8",
236
- __number: "#7058be",
237
- __operator: "#e14775",
238
- __punctuation: "#918c8e",
239
- __string: "#cc7a0a"
198
+ "--": {
199
+ bg: "#faf4f2",
200
+ fg: "#29242a",
201
+ comment: "#918c8e",
202
+ identifier: {
203
+ 1: "#7058be",
204
+ 2: "#269d69",
205
+ 3: "#1c8ca8",
206
+ 4: "#29242a"
207
+ },
208
+ keyword: {
209
+ 1: "#e14775",
210
+ 2: "#7058be",
211
+ 3: "#1c8ca8"
212
+ },
213
+ number: "#7058be",
214
+ operator: "#e14775",
215
+ punctuation: "#918c8e",
216
+ string: "#cc7a0a"
217
+ }
240
218
  },
241
219
  pre$$monokai: {
242
- backgroundColor: "var(--bg)",
220
+ "background-color": "var(--bg)",
243
221
  color: "var(--fg)",
244
222
  margin: 0,
245
223
  padding: "1em",
246
224
  overflow: "visible",
247
225
  " code": {
248
- fontFamily: '"Source Code Pro"',
226
+ "font-family": '"Source Code Pro"',
249
227
  padding: 0
250
228
  }
251
229
  },
@@ -253,55 +231,61 @@ var monokai = {
253
231
  bg: { color: "var(--bg)" },
254
232
  fg: { color: "var(--fg)" },
255
233
  comment: { color: "var(--comment)" },
256
- identifier_1: { color: "var(--identifier-1)" },
257
- identifier_2: { color: "var(--identifier-2)" },
258
- identifier_3: { color: "var(--identifier-3)" },
259
- identifier_4: { color: "var(--identifier-4)" },
260
- keyword_1: { color: "var(--keyword-1)" },
261
- keyword_2: { color: "var(--keyword-2)" },
262
- keyword_3: { color: "var(--keyword-3)" },
234
+ identifier: {
235
+ 1: { color: "var(--identifier1)" },
236
+ 2: { color: "var(--identifier2)" },
237
+ 3: { color: "var(--identifier3)" },
238
+ 4: { color: "var(--identifier4)" }
239
+ },
240
+ keyword: {
241
+ 1: { color: "var(--keyword1)" },
242
+ 2: { color: "var(--keyword2)" },
243
+ 3: { color: "var(--keyword3)" }
244
+ },
263
245
  number: { color: "var(--number)" },
264
246
  operator: { color: "var(--operator)" },
265
247
  punctuation: { color: "var(--punctuation)" },
266
248
  string: { color: "var(--string)" }
267
249
  },
268
- [darkKey]: {
250
+ "@media only screen and (prefers-color-scheme: dark)$$monokai": {
269
251
  ":root": {
270
- __bg: "#2d2a2e",
271
- __fg: "#fcfcfa",
272
- __comment: "#727072",
273
- __identifier_1: "#ae81ff",
274
- __identifier_2: "#a9dc76",
275
- __identifier_3: "#66d9ef",
276
- __identifier_4: "#fcfcfa",
277
- __keyword_1: "#ff6188",
278
- __keyword_2: "#ae81ff",
279
- __keyword_3: "#66d9ef",
280
- __number: "#ae81ff",
281
- __operator: "#ff6188",
282
- __punctuation: "#727072",
283
- __string: "#ffd866"
252
+ "--": {
253
+ bg: "#2d2a2e",
254
+ fg: "#fcfcfa",
255
+ comment: "#727072",
256
+ identifier: {
257
+ 1: "#ae81ff",
258
+ 2: "#a9dc76",
259
+ 3: "#66d9ef",
260
+ 4: "#fcfcfa"
261
+ },
262
+ keyword: {
263
+ 1: "#ff6188",
264
+ 2: "#ae81ff",
265
+ 3: "#66d9ef"
266
+ },
267
+ number: "#ae81ff",
268
+ operator: "#ff6188",
269
+ punctuation: "#727072",
270
+ string: "#ffd866"
271
+ }
284
272
  }
285
273
  }
286
274
  };
287
275
  // src/nnn/nanolightTs.ts
288
276
  var COMMENT = "comment";
289
- var IDENTIFIER_1 = "identifier-1";
290
- var IDENTIFIER_2 = "identifier-2";
291
- var IDENTIFIER_3 = "identifier-3";
292
- var IDENTIFIER_4 = "identifier-4";
293
- var KEYWORD_1 = "keyword-1";
294
- var KEYWORD_2 = "keyword-2";
295
- var KEYWORD_3 = "keyword-3";
277
+ var IDENTIFIER1 = "identifier1";
278
+ var IDENTIFIER2 = "identifier2";
279
+ var IDENTIFIER3 = "identifier3";
280
+ var IDENTIFIER4 = "identifier4";
281
+ var KEYWORD1 = "keyword1";
282
+ var KEYWORD2 = "keyword2";
283
+ var KEYWORD3 = "keyword3";
296
284
  var NUMBER = "number";
297
285
  var OPERATOR = "operator";
298
286
  var PUNCTUATION = "punctuation";
299
287
  var STRING = "string";
300
- var nanolightTs = /* @__PURE__ */ createTokenizer((chunk, name) => name != null ? ["span", { class: name }, chunk] : chunk, [COMMENT, /\/\*.*?\*\//s], [COMMENT, /(?<!\\)\/\/.*?(?=\n)/], [STRING, /".*?"/], [STRING, /'.*?'/], [STRING, /`.*?`/s], [STRING, /\/[^\s]*[^\\]\/[dgimsuvy]*/], [NUMBER, /0b[01_]+/], [NUMBER, /0o[01234567_]+/], [NUMBER, /0x[\dabcdef_]+/], [NUMBER, /\d[\d_]*(\.[\d_]+)?(e[+-]?[\d_]+)?/], [OPERATOR, "!"], [OPERATOR, "!="], [OPERATOR, "!=="], [OPERATOR, "%"], [OPERATOR, "%="], [OPERATOR, "&&"], [OPERATOR, "&&="], [OPERATOR, "&"], [OPERATOR, "&="], [OPERATOR, "*"], [OPERATOR, "**"], [OPERATOR, "**="], [OPERATOR, "*="], [OPERATOR, "+"], [OPERATOR, "++"], [OPERATOR, "+="], [OPERATOR, "-"], [OPERATOR, "--"], [OPERATOR, "-="], [OPERATOR, "..."], [OPERATOR, "/"], [OPERATOR, "/="], [OPERATOR, ":"], [OPERATOR, "<"], [OPERATOR, "<<"], [OPERATOR, "<<="], [OPERATOR, "<="], [OPERATOR, "="], [OPERATOR, "=="], [OPERATOR, "==="], [OPERATOR, "=>"], [OPERATOR, ">"], [OPERATOR, ">="], [OPERATOR, ">>"], [OPERATOR, ">>="], [OPERATOR, ">>>"], [OPERATOR, ">>>="], [OPERATOR, "?"], [OPERATOR, "?"], [OPERATOR, "??"], [OPERATOR, "??="], [OPERATOR, "^"], [OPERATOR, "^="], [OPERATOR, "|"], [OPERATOR, "|="], [OPERATOR, "||"], [OPERATOR, "||="], [OPERATOR, "~"], [OPERATOR, "~="], [OPERATOR, /(?<=\s):/], [PUNCTUATION, "("], [PUNCTUATION, ")"], [PUNCTUATION, ","], [PUNCTUATION, "."], [PUNCTUATION, ":"], [PUNCTUATION, ";"], [PUNCTUATION, "?."], [PUNCTUATION, "["], [PUNCTUATION, "]"], [PUNCTUATION, "{"], [PUNCTUATION, "}"], [KEYWORD_1, "as"], [KEYWORD_1, "async"], [KEYWORD_1, "await"], [KEYWORD_1, "break"], [KEYWORD_1, "case"], [KEYWORD_1, "catch"], [KEYWORD_1, "class"], [KEYWORD_1, "const"], [KEYWORD_1, "continue"], [KEYWORD_1, "debugger"], [KEYWORD_1, "default"], [KEYWORD_1, "delete"], [KEYWORD_1, "do"], [KEYWORD_1, "else"], [KEYWORD_1, "export"], [KEYWORD_1, "extends"], [KEYWORD_1, "finally"], [KEYWORD_1, "for"], [KEYWORD_1, "from"], [KEYWORD_1, "function"], [KEYWORD_1, "function*"], [KEYWORD_1, "goto"], [KEYWORD_1, "if"], [KEYWORD_1, "import"], [KEYWORD_1, "in"], [KEYWORD_1, "instanceof"], [KEYWORD_1, "is"], [KEYWORD_1, "keyof"], [KEYWORD_1, "let"], [KEYWORD_1, "new"], [KEYWORD_1, "of"], [KEYWORD_1, "package"], [KEYWORD_1, "return"], [KEYWORD_1, "super"], [KEYWORD_1, "switch"], [KEYWORD_1, "this"], [KEYWORD_1, "throw"], [KEYWORD_1, "try"], [KEYWORD_1, "type"], [KEYWORD_1, "typeof"], [KEYWORD_1, "var"], [KEYWORD_1, "void"], [KEYWORD_1, "while"], [KEYWORD_1, "with"], [KEYWORD_1, "yield"], [KEYWORD_1, "yield*"], [KEYWORD_2, "false"], [KEYWORD_2, "Infinity"], [KEYWORD_2, "NaN"], [KEYWORD_2, "null"], [KEYWORD_2, "true"], [KEYWORD_2, "undefined"], [KEYWORD_3, "any"], [KEYWORD_3, "bigint"], [KEYWORD_3, "boolean"], [KEYWORD_3, "eval"], [KEYWORD_3, "number"], [KEYWORD_3, "string"], [KEYWORD_3, "symbol"], [KEYWORD_3, "unknown"], [IDENTIFIER_1, /[\p{Lu}_$][\p{Lu}\d_$]*/u], [IDENTIFIER_2, /[\p{L}_$][\p{L}\d_$]*(?=[(`])/u], [IDENTIFIER_3, /\p{Lu}[\p{L}\d_$]*/u], [IDENTIFIER_4, /[\p{L}_$][\p{L}\d_$]*/u]);
301
- // src/nnn/omit.ts
302
- var omit = (ref, keys) => Object.fromEntries(Object.entries(ref).filter(([key]) => !keys.includes(key)));
303
- // src/nnn/pick.ts
304
- var pick = (ref, keys) => Object.fromEntries(Object.entries(ref).filter(([key]) => keys.includes(key)));
288
+ var nanolightTs = /* @__PURE__ */ createTokenizer((chunk, name) => name != null ? ["span", { class: name }, chunk] : chunk, [COMMENT, /\/\*.*?\*\//s], [COMMENT, /(?<!\\)\/\/.*?(?=\n)/], [STRING, /".*?"/], [STRING, /'.*?'/], [STRING, /`.*?`/s], [STRING, /\/[^\s]*[^\\]\/[dgimsuvy]*/], [NUMBER, /0b[01_]+/], [NUMBER, /0o[01234567_]+/], [NUMBER, /0x[\dabcdef_]+/], [NUMBER, /\d[\d_]*(\.[\d_]+)?(e[+-]?[\d_]+)?/], [OPERATOR, "!"], [OPERATOR, "!="], [OPERATOR, "!=="], [OPERATOR, "%"], [OPERATOR, "%="], [OPERATOR, "&&"], [OPERATOR, "&&="], [OPERATOR, "&"], [OPERATOR, "&="], [OPERATOR, "*"], [OPERATOR, "**"], [OPERATOR, "**="], [OPERATOR, "*="], [OPERATOR, "+"], [OPERATOR, "++"], [OPERATOR, "+="], [OPERATOR, "-"], [OPERATOR, "--"], [OPERATOR, "-="], [OPERATOR, "..."], [OPERATOR, "/"], [OPERATOR, "/="], [OPERATOR, ":"], [OPERATOR, "<"], [OPERATOR, "<<"], [OPERATOR, "<<="], [OPERATOR, "<="], [OPERATOR, "="], [OPERATOR, "=="], [OPERATOR, "==="], [OPERATOR, "=>"], [OPERATOR, ">"], [OPERATOR, ">="], [OPERATOR, ">>"], [OPERATOR, ">>="], [OPERATOR, ">>>"], [OPERATOR, ">>>="], [OPERATOR, "?"], [OPERATOR, "?"], [OPERATOR, "??"], [OPERATOR, "??="], [OPERATOR, "^"], [OPERATOR, "^="], [OPERATOR, "|"], [OPERATOR, "|="], [OPERATOR, "||"], [OPERATOR, "||="], [OPERATOR, "~"], [OPERATOR, "~="], [OPERATOR, /(?<=\s):/], [PUNCTUATION, "("], [PUNCTUATION, ")"], [PUNCTUATION, ","], [PUNCTUATION, "."], [PUNCTUATION, ":"], [PUNCTUATION, ";"], [PUNCTUATION, "?."], [PUNCTUATION, "["], [PUNCTUATION, "]"], [PUNCTUATION, "{"], [PUNCTUATION, "}"], [KEYWORD1, "as"], [KEYWORD1, "async"], [KEYWORD1, "await"], [KEYWORD1, "break"], [KEYWORD1, "case"], [KEYWORD1, "catch"], [KEYWORD1, "class"], [KEYWORD1, "const"], [KEYWORD1, "continue"], [KEYWORD1, "debugger"], [KEYWORD1, "default"], [KEYWORD1, "delete"], [KEYWORD1, "do"], [KEYWORD1, "else"], [KEYWORD1, "export"], [KEYWORD1, "extends"], [KEYWORD1, "finally"], [KEYWORD1, "for"], [KEYWORD1, "from"], [KEYWORD1, "function"], [KEYWORD1, "function*"], [KEYWORD1, "goto"], [KEYWORD1, "if"], [KEYWORD1, "import"], [KEYWORD1, "in"], [KEYWORD1, "instanceof"], [KEYWORD1, "is"], [KEYWORD1, "keyof"], [KEYWORD1, "let"], [KEYWORD1, "new"], [KEYWORD1, "of"], [KEYWORD1, "package"], [KEYWORD1, "return"], [KEYWORD1, "super"], [KEYWORD1, "switch"], [KEYWORD1, "this"], [KEYWORD1, "throw"], [KEYWORD1, "try"], [KEYWORD1, "type"], [KEYWORD1, "typeof"], [KEYWORD1, "var"], [KEYWORD1, "void"], [KEYWORD1, "while"], [KEYWORD1, "with"], [KEYWORD1, "yield"], [KEYWORD1, "yield*"], [KEYWORD2, "false"], [KEYWORD2, "Infinity"], [KEYWORD2, "NaN"], [KEYWORD2, "null"], [KEYWORD2, "true"], [KEYWORD2, "undefined"], [KEYWORD3, "any"], [KEYWORD3, "bigint"], [KEYWORD3, "boolean"], [KEYWORD3, "eval"], [KEYWORD3, "number"], [KEYWORD3, "string"], [KEYWORD3, "symbol"], [KEYWORD3, "unknown"], [IDENTIFIER1, /[\p{Lu}_$][\p{Lu}\d_$]*/u], [IDENTIFIER2, /[\p{L}_$][\p{L}\d_$]*(?=[(`])/u], [IDENTIFIER3, /\p{Lu}[\p{L}\d_$]*/u], [IDENTIFIER4, /[\p{L}_$][\p{L}\d_$]*/u]);
305
289
  // src/nnn/rwd.ts
306
290
  var rwd = (root, selector, cellWidthPx, cellHeightPx, ...specs) => {
307
291
  const main = root[selector] ??= {};
@@ -337,12 +321,12 @@ var uuidV1 = (date = new Date, node = Math.random().toString(16).slice(2)) => {
337
321
  // src/nnn/vivify.ts
338
322
  var ARRAY_INDEX_REGEXP = /^(0|[1-9]\d*)$/;
339
323
  var isObject = (ref) => typeof ref === "object";
340
- var getTarget = (parent, parentKey, key) => parent[parentKey] ??= isString(key) && ARRAY_INDEX_REGEXP.test(key) ? [] : {};
324
+ var getTarget = (parent, parentKey, key) => parent[parentKey] ??= typeof key === "string" && ARRAY_INDEX_REGEXP.test(key) ? [] : {};
341
325
  var _vivify = (parent, parentKey) => new Proxy(parent, {
342
326
  get(_, key) {
343
327
  const target = getTarget(parent, parentKey, key);
344
328
  const value = target[key];
345
- return isString(key) && isObject(target) && (value == null || isObject(value)) ? _vivify(target, key) : value;
329
+ return typeof key === "string" && isObject(target) && (value == null || isObject(value)) ? _vivify(target, key) : value;
346
330
  },
347
331
  set(_, key, value) {
348
332
  const target = getTarget(parent, parentKey, key);
@@ -362,17 +346,8 @@ export {
362
346
  csvParse,
363
347
  fixPlTypography,
364
348
  h,
365
- hasOwn,
366
- isArray,
367
- isFiniteNumber,
368
- isNumber,
369
- isRecord,
370
- isString,
371
- jsOnParse,
372
349
  monokai,
373
350
  nanolightTs,
374
- omit,
375
- pick,
376
351
  rwd,
377
352
  s,
378
353
  svgUse,
package/package.json CHANGED
@@ -20,8 +20,6 @@
20
20
  "isRecord",
21
21
  "isString",
22
22
  "JS-to-CSS",
23
- "jsOnParse",
24
- "JSON",
25
23
  "Monokai",
26
24
  "nanolight",
27
25
  "nnn",
@@ -43,5 +41,5 @@
43
41
  "name": "@jackens/nnn",
44
42
  "type": "module",
45
43
  "types": "nnn.d.ts",
46
- "version": "2026.8.31"
44
+ "version": "2026.9.2"
47
45
  }