@wenathlan/argan 2.0.166 → 2.0.168

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.
package/README.md CHANGED
@@ -21,7 +21,7 @@ pnpm dev
21
21
 
22
22
  - `family.ts` — the family keyword file (the fold law): the single table of
23
23
  the eight siblings beside argan with the spec §12 accent of each one — the
24
- shell rail foot, the landing footer and `tests/family.test.ts` all consume
24
+ shell rail foot, the landing footer and `test/family.test.ts` all consume
25
25
  this one table — plus the retired `familyurl.ts` arm riding as the
26
26
  familyurl lane: the verbatim relative-url contract (`"../" + slug + "/"`)
27
27
  that keeps every cross-app link mount-proof.
package/docs/engine.md CHANGED
@@ -57,4 +57,4 @@ Argan is the DNS and gateway library of the wenathlan family (`@wenathlan/argan`
57
57
 
58
58
  ## Testing
59
59
 
60
- Seven vitest batteries at `tests/`: `design.test.ts`, `dnssec.test.ts`, `family.test.ts`, `mimetypes.test.ts` (pins the 3217 count), `protocols.test.ts` (pins 231 rows and the 144 TLS-capable wires), `sandboxmodality.test.ts` and `zonediff.test.ts`.
60
+ Seven vitest batteries at `test/`: `design.test.ts`, `dnssec.test.ts`, `family.test.ts`, `mimetypes.test.ts` (pins the 3217 count), `protocols.test.ts` (pins 231 rows and the 144 TLS-capable wires), `sandboxmodality.test.ts` and `zonediff.test.ts`.
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@wenathlan/argan",
3
- "version": "2.0.166",
3
+ "version": "2.0.168",
4
4
  "private": false,
5
5
  "description": "argan is the DNS and gateway library of the wenathlan family: zones, records, dnssec and handshake — the system network library whose site shares the unified database. The envelope distributes the documentation set, the zero-build site and the tests directory as one package.",
6
+ "license": "GPL-3.0-only",
6
7
  "scripts": {
7
8
  "dev": "vite --host",
8
9
  "build": "vite build",
@@ -14,11 +15,11 @@
14
15
  "restore:entry": "node -e \"const{readFileSync}=require('node:fs');const{execSync}=require('node:child_process');const script=/script[^>]*App\\.tsx/;const triad=/family=Inter[\\s\\S]*Geist\\+Mono/;const face=(h)=>script.test(h)&&triad.test(h);if(face(readFileSync('index.html','utf8'))){console.log('index.html already rides the source face');process.exit(0)}if(!face(execSync('git show HEAD:./index.html',{encoding:'utf8'}))){console.error('refusing: HEAD index.html is not the canonical source face yet (script App.tsx + the font triad) - land the source-face fix first; nothing was touched');process.exit(1)}execSync('git checkout -- index.html',{stdio:'inherit'});console.log('index.html restored from HEAD (the source face)')\""
15
16
  },
16
17
  "dependencies": {
17
- "@ai-sdk/openai": "^4.0.109",
18
- "@ai-sdk/openai-compatible": "^3.0.85",
19
- "@ai-sdk/provider-utils": "^5.0.75",
18
+ "@ai-sdk/openai": "^4.0.111",
19
+ "@ai-sdk/openai-compatible": "^3.0.87",
20
+ "@ai-sdk/provider-utils": "^5.0.76",
20
21
  "@anthropic-ai/sdk": "^1.6.0",
21
- "@biomejs/biome": "^2.6.5",
22
+ "@biomejs/biome": "^2.6.6",
22
23
  "@capacitor/android": "^8.6.0",
23
24
  "@capacitor/cli": "^8.6.0",
24
25
  "@capacitor/core": "^8.6.0",
@@ -70,31 +71,31 @@
70
71
  "@radix-ui/react-toggle-group": "^1.2.1",
71
72
  "@radix-ui/react-tooltip": "^1.4.1",
72
73
  "@reactuses/core": "^6.6.1",
73
- "@tailwindcss/postcss": "^4.3.4",
74
+ "@tailwindcss/postcss": "^4.3.5",
74
75
  "@tailwindcss/typography": "^0.5.20",
75
- "@tailwindcss/vite": "^4.3.4",
76
- "@tanstack/react-query": "^5.106.1",
76
+ "@tailwindcss/vite": "^4.3.5",
77
+ "@tanstack/react-query": "^5.107.1",
77
78
  "@tanstack/react-table": "^9.3.1",
78
79
  "@tsconfig/node26": "^26.0.1",
79
80
  "@types/babel__core": "^7.20.5",
80
81
  "@types/better-sqlite3": "^9.6.0",
81
82
  "@types/chrome": "^0.3.7",
82
83
  "@types/express": "^5.0.6",
83
- "@types/google.maps": "^3.66.9",
84
+ "@types/google.maps": "^3.66.10",
84
85
  "@types/node": "^26.6.6",
85
86
  "@types/react": "^19.3.0",
86
87
  "@types/react-dom": "^19.3.0",
87
88
  "@types/three": "^0.187.0",
88
89
  "@vitejs/plugin-react": "^6.2.1",
89
- "@wenathlan/argan": "~2.0.165",
90
- "@wenathlan/cadria": "~2.0.165",
91
- "@wenathlan/debonair": "~2.0.165",
92
- "@wenathlan/devthink": "~2.0.165",
93
- "@wenathlan/getry": "~2.0.165",
94
- "@wenathlan/saddle": "~2.0.165",
95
- "@wenathlan/vault": "~2.0.165",
90
+ "@wenathlan/argan": "~2.0.167",
91
+ "@wenathlan/cadria": "~2.0.167",
92
+ "@wenathlan/debonair": "~2.0.167",
93
+ "@wenathlan/devthink": "~2.0.167",
94
+ "@wenathlan/getry": "~2.0.167",
95
+ "@wenathlan/saddle": "~2.0.167",
96
+ "@wenathlan/vault": "~2.0.167",
96
97
  "add": "^2.0.9",
97
- "ai": "^7.0.163",
98
+ "ai": "^7.0.165",
98
99
  "autoprefixer": "^10.6.2",
99
100
  "axios": "^1.21.0",
100
101
  "baseline-browser-mapping": "^2.11.35",
@@ -105,7 +106,7 @@
105
106
  "class-variance-authority": "^0.7.1",
106
107
  "clsx": "^2.1.1",
107
108
  "cmdk": "^1.1.1",
108
- "commander": "^15.0.0",
109
+ "commander": "^15.1.0",
109
110
  "date-fns": "^4.4.0",
110
111
  "deepmerge-ts": "^8.0.2",
111
112
  "dockerode": "^5.0.1",
@@ -120,25 +121,24 @@
120
121
  "fast-check": "^4.10.2",
121
122
  "fast-uri": "^4.2.3",
122
123
  "follow-redirects": "^1.16.2",
123
- "framer-motion": "^14.9.1",
124
+ "framer-motion": "^14.10.1",
124
125
  "glob": "^14.0.4",
125
126
  "gsap": "^3.15.1",
126
- "hono": "^4.13.16",
127
+ "hono": "^4.13.17",
127
128
  "ink": "^8.0.0",
128
129
  "input-otp": "^1.5.0",
129
130
  "js-yaml": "^5.5.0",
130
131
  "jsdom": "^31.0.0",
131
132
  "katex": "^0.19.1",
132
- "lucide-react": "^1.69.0",
133
133
  "minimatch": "^11.0.5",
134
- "motion": "^14.9.1",
134
+ "motion": "^14.10.1",
135
135
  "mysql2": "^3.24.6",
136
136
  "nanoid": "^6.0.2",
137
137
  "next": "^16.4.5",
138
138
  "next-auth": "^4.24.15",
139
139
  "next-intl": "^4.14.9",
140
140
  "next-themes": "^0.4.6",
141
- "openai": "^7.52.0",
141
+ "openai": "^7.53.0",
142
142
  "p-limit": "^7.3.3",
143
143
  "p-retry": "^9.0.0",
144
144
  "playwright": "^1.65.0",
@@ -154,7 +154,7 @@
154
154
  "react-dom": "^19.3.1",
155
155
  "react-hook-form": "^7.91.0",
156
156
  "react-markdown": "^10.1.0",
157
- "react-resizable-panels": "^4.18.1",
157
+ "react-resizable-panels": "^4.19.1",
158
158
  "react-syntax-highlighter": "^16.1.2",
159
159
  "recharts": "^3.10.1",
160
160
  "request-ip": "^3.3.0",
@@ -165,7 +165,7 @@
165
165
  "source-map-js": "^1.2.2",
166
166
  "streamdown": "^2.7.1",
167
167
  "tailwind-merge": "^3.7.0",
168
- "tailwindcss": "^4.3.4",
168
+ "tailwindcss": "^4.3.5",
169
169
  "tailwindcss-animate": "^1.0.7",
170
170
  "three": "^0.187.0",
171
171
  "ts-node": "^10.9.2",
@@ -185,14 +185,14 @@
185
185
  "yaml": "^2.9.1",
186
186
  "z-ai-web-dev-sdk": "^0.0.18",
187
187
  "zod": "^4.6.7",
188
- "zustand": "^5.0.15"
188
+ "zustand": "^5.1.0"
189
189
  },
190
190
  "devDependencies": {
191
- "@ai-sdk/openai": "^4.0.109",
192
- "@ai-sdk/openai-compatible": "^3.0.85",
193
- "@ai-sdk/provider-utils": "^5.0.75",
191
+ "@ai-sdk/openai": "^4.0.111",
192
+ "@ai-sdk/openai-compatible": "^3.0.87",
193
+ "@ai-sdk/provider-utils": "^5.0.76",
194
194
  "@anthropic-ai/sdk": "^1.6.0",
195
- "@biomejs/biome": "^2.6.5",
195
+ "@biomejs/biome": "^2.6.6",
196
196
  "@capacitor/android": "^8.6.0",
197
197
  "@capacitor/cli": "^8.6.0",
198
198
  "@capacitor/core": "^8.6.0",
@@ -244,31 +244,31 @@
244
244
  "@radix-ui/react-toggle-group": "^1.2.1",
245
245
  "@radix-ui/react-tooltip": "^1.4.1",
246
246
  "@reactuses/core": "^6.6.1",
247
- "@tailwindcss/postcss": "^4.3.4",
247
+ "@tailwindcss/postcss": "^4.3.5",
248
248
  "@tailwindcss/typography": "^0.5.20",
249
- "@tailwindcss/vite": "^4.3.4",
250
- "@tanstack/react-query": "^5.106.1",
249
+ "@tailwindcss/vite": "^4.3.5",
250
+ "@tanstack/react-query": "^5.107.1",
251
251
  "@tanstack/react-table": "^9.3.1",
252
252
  "@tsconfig/node26": "^26.0.1",
253
253
  "@types/babel__core": "^7.20.5",
254
254
  "@types/better-sqlite3": "^9.6.0",
255
255
  "@types/chrome": "^0.3.7",
256
256
  "@types/express": "^5.0.6",
257
- "@types/google.maps": "^3.66.9",
257
+ "@types/google.maps": "^3.66.10",
258
258
  "@types/node": "^26.6.6",
259
259
  "@types/react": "^19.3.0",
260
260
  "@types/react-dom": "^19.3.0",
261
261
  "@types/three": "^0.187.0",
262
262
  "@vitejs/plugin-react": "^6.2.1",
263
- "@wenathlan/argan": "~2.0.165",
264
- "@wenathlan/cadria": "~2.0.165",
265
- "@wenathlan/debonair": "~2.0.165",
266
- "@wenathlan/devthink": "~2.0.165",
267
- "@wenathlan/getry": "~2.0.165",
268
- "@wenathlan/saddle": "~2.0.165",
269
- "@wenathlan/vault": "~2.0.165",
263
+ "@wenathlan/argan": "~2.0.167",
264
+ "@wenathlan/cadria": "~2.0.167",
265
+ "@wenathlan/debonair": "~2.0.167",
266
+ "@wenathlan/devthink": "~2.0.167",
267
+ "@wenathlan/getry": "~2.0.167",
268
+ "@wenathlan/saddle": "~2.0.167",
269
+ "@wenathlan/vault": "~2.0.167",
270
270
  "add": "^2.0.9",
271
- "ai": "^7.0.163",
271
+ "ai": "^7.0.165",
272
272
  "autoprefixer": "^10.6.2",
273
273
  "axios": "^1.21.0",
274
274
  "baseline-browser-mapping": "^2.11.35",
@@ -279,7 +279,7 @@
279
279
  "class-variance-authority": "^0.7.1",
280
280
  "clsx": "^2.1.1",
281
281
  "cmdk": "^1.1.1",
282
- "commander": "^15.0.0",
282
+ "commander": "^15.1.0",
283
283
  "date-fns": "^4.4.0",
284
284
  "deepmerge-ts": "^8.0.2",
285
285
  "dockerode": "^5.0.1",
@@ -294,25 +294,24 @@
294
294
  "fast-check": "^4.10.2",
295
295
  "fast-uri": "^4.2.3",
296
296
  "follow-redirects": "^1.16.2",
297
- "framer-motion": "^14.9.1",
297
+ "framer-motion": "^14.10.1",
298
298
  "glob": "^14.0.4",
299
299
  "gsap": "^3.15.1",
300
- "hono": "^4.13.16",
300
+ "hono": "^4.13.17",
301
301
  "ink": "^8.0.0",
302
302
  "input-otp": "^1.5.0",
303
303
  "js-yaml": "^5.5.0",
304
304
  "jsdom": "^31.0.0",
305
305
  "katex": "^0.19.1",
306
- "lucide-react": "^1.69.0",
307
306
  "minimatch": "^11.0.5",
308
- "motion": "^14.9.1",
307
+ "motion": "^14.10.1",
309
308
  "mysql2": "^3.24.6",
310
309
  "nanoid": "^6.0.2",
311
310
  "next": "^16.4.5",
312
311
  "next-auth": "^4.24.15",
313
312
  "next-intl": "^4.14.9",
314
313
  "next-themes": "^0.4.6",
315
- "openai": "^7.52.0",
314
+ "openai": "^7.53.0",
316
315
  "p-limit": "^7.3.3",
317
316
  "p-retry": "^9.0.0",
318
317
  "playwright": "^1.65.0",
@@ -328,7 +327,7 @@
328
327
  "react-dom": "^19.3.1",
329
328
  "react-hook-form": "^7.91.0",
330
329
  "react-markdown": "^10.1.0",
331
- "react-resizable-panels": "^4.18.1",
330
+ "react-resizable-panels": "^4.19.1",
332
331
  "react-syntax-highlighter": "^16.1.2",
333
332
  "recharts": "^3.10.1",
334
333
  "request-ip": "^3.3.0",
@@ -339,7 +338,7 @@
339
338
  "source-map-js": "^1.2.2",
340
339
  "streamdown": "^2.7.1",
341
340
  "tailwind-merge": "^3.7.0",
342
- "tailwindcss": "^4.3.4",
341
+ "tailwindcss": "^4.3.5",
343
342
  "tailwindcss-animate": "^1.0.7",
344
343
  "three": "^0.187.0",
345
344
  "ts-node": "^10.9.2",
@@ -359,14 +358,14 @@
359
358
  "yaml": "^2.9.1",
360
359
  "z-ai-web-dev-sdk": "^0.0.18",
361
360
  "zod": "^4.6.7",
362
- "zustand": "^5.0.15"
361
+ "zustand": "^5.1.0"
363
362
  },
364
363
  "overrides": {
365
- "@ai-sdk/openai": "^4.0.109",
366
- "@ai-sdk/openai-compatible": "^3.0.85",
367
- "@ai-sdk/provider-utils": "^5.0.75",
364
+ "@ai-sdk/openai": "^4.0.111",
365
+ "@ai-sdk/openai-compatible": "^3.0.87",
366
+ "@ai-sdk/provider-utils": "^5.0.76",
368
367
  "@anthropic-ai/sdk": "^1.6.0",
369
- "@biomejs/biome": "^2.6.5",
368
+ "@biomejs/biome": "^2.6.6",
370
369
  "@capacitor/android": "^8.6.0",
371
370
  "@capacitor/cli": "^8.6.0",
372
371
  "@capacitor/core": "^8.6.0",
@@ -418,31 +417,31 @@
418
417
  "@radix-ui/react-toggle-group": "^1.2.1",
419
418
  "@radix-ui/react-tooltip": "^1.4.1",
420
419
  "@reactuses/core": "^6.6.1",
421
- "@tailwindcss/postcss": "^4.3.4",
420
+ "@tailwindcss/postcss": "^4.3.5",
422
421
  "@tailwindcss/typography": "^0.5.20",
423
- "@tailwindcss/vite": "^4.3.4",
424
- "@tanstack/react-query": "^5.106.1",
422
+ "@tailwindcss/vite": "^4.3.5",
423
+ "@tanstack/react-query": "^5.107.1",
425
424
  "@tanstack/react-table": "^9.3.1",
426
425
  "@tsconfig/node26": "^26.0.1",
427
426
  "@types/babel__core": "^7.20.5",
428
427
  "@types/better-sqlite3": "^9.6.0",
429
428
  "@types/chrome": "^0.3.7",
430
429
  "@types/express": "^5.0.6",
431
- "@types/google.maps": "^3.66.9",
430
+ "@types/google.maps": "^3.66.10",
432
431
  "@types/node": "^26.6.6",
433
432
  "@types/react": "^19.3.0",
434
433
  "@types/react-dom": "^19.3.0",
435
434
  "@types/three": "^0.187.0",
436
435
  "@vitejs/plugin-react": "^6.2.1",
437
- "@wenathlan/argan": "~2.0.165",
438
- "@wenathlan/cadria": "~2.0.165",
439
- "@wenathlan/debonair": "~2.0.165",
440
- "@wenathlan/devthink": "~2.0.165",
441
- "@wenathlan/getry": "~2.0.165",
442
- "@wenathlan/saddle": "~2.0.165",
443
- "@wenathlan/vault": "~2.0.165",
436
+ "@wenathlan/argan": "~2.0.167",
437
+ "@wenathlan/cadria": "~2.0.167",
438
+ "@wenathlan/debonair": "~2.0.167",
439
+ "@wenathlan/devthink": "~2.0.167",
440
+ "@wenathlan/getry": "~2.0.167",
441
+ "@wenathlan/saddle": "~2.0.167",
442
+ "@wenathlan/vault": "~2.0.167",
444
443
  "add": "^2.0.9",
445
- "ai": "^7.0.163",
444
+ "ai": "^7.0.165",
446
445
  "autoprefixer": "^10.6.2",
447
446
  "axios": "^1.21.0",
448
447
  "baseline-browser-mapping": "^2.11.35",
@@ -453,7 +452,7 @@
453
452
  "class-variance-authority": "^0.7.1",
454
453
  "clsx": "^2.1.1",
455
454
  "cmdk": "^1.1.1",
456
- "commander": "^15.0.0",
455
+ "commander": "^15.1.0",
457
456
  "date-fns": "^4.4.0",
458
457
  "deepmerge-ts": "^8.0.2",
459
458
  "dockerode": "^5.0.1",
@@ -468,25 +467,24 @@
468
467
  "fast-check": "^4.10.2",
469
468
  "fast-uri": "^4.2.3",
470
469
  "follow-redirects": "^1.16.2",
471
- "framer-motion": "^14.9.1",
470
+ "framer-motion": "^14.10.1",
472
471
  "glob": "^14.0.4",
473
472
  "gsap": "^3.15.1",
474
- "hono": "^4.13.16",
473
+ "hono": "^4.13.17",
475
474
  "ink": "^8.0.0",
476
475
  "input-otp": "^1.5.0",
477
476
  "js-yaml": "^5.5.0",
478
477
  "jsdom": "^31.0.0",
479
478
  "katex": "^0.19.1",
480
- "lucide-react": "^1.69.0",
481
479
  "minimatch": "^11.0.5",
482
- "motion": "^14.9.1",
480
+ "motion": "^14.10.1",
483
481
  "mysql2": "^3.24.6",
484
482
  "nanoid": "^6.0.2",
485
483
  "next": "^16.4.5",
486
484
  "next-auth": "^4.24.15",
487
485
  "next-intl": "^4.14.9",
488
486
  "next-themes": "^0.4.6",
489
- "openai": "^7.52.0",
487
+ "openai": "^7.53.0",
490
488
  "p-limit": "^7.3.3",
491
489
  "p-retry": "^9.0.0",
492
490
  "playwright": "^1.65.0",
@@ -502,7 +500,7 @@
502
500
  "react-dom": "^19.3.1",
503
501
  "react-hook-form": "^7.91.0",
504
502
  "react-markdown": "^10.1.0",
505
- "react-resizable-panels": "^4.18.1",
503
+ "react-resizable-panels": "^4.19.1",
506
504
  "react-syntax-highlighter": "^16.1.2",
507
505
  "recharts": "^3.10.1",
508
506
  "request-ip": "^3.3.0",
@@ -513,7 +511,7 @@
513
511
  "source-map-js": "^1.2.2",
514
512
  "streamdown": "^2.7.1",
515
513
  "tailwind-merge": "^3.7.0",
516
- "tailwindcss": "^4.3.4",
514
+ "tailwindcss": "^4.3.5",
517
515
  "tailwindcss-animate": "^1.0.7",
518
516
  "three": "^0.187.0",
519
517
  "ts-node": "^10.9.2",
@@ -533,7 +531,7 @@
533
531
  "yaml": "^2.9.1",
534
532
  "z-ai-web-dev-sdk": "^0.0.18",
535
533
  "zod": "^4.6.7",
536
- "zustand": "^5.0.15",
534
+ "zustand": "^5.1.0",
537
535
  "xcode": {
538
536
  "uuid": "11.1.1"
539
537
  }
@@ -553,7 +551,7 @@
553
551
  "files": [
554
552
  "README.md",
555
553
  "docs",
556
- "tests",
554
+ "test",
557
555
  "cli.ts",
558
556
  "mimetypes.ts"
559
557
  ],
@@ -15,7 +15,7 @@ import {
15
15
  validateSignatureLabels,
16
16
  validateSignatureTtl,
17
17
  validateSignatureWindow,
18
- } from "../dnssec.ts";
18
+ } from "../dns.ts";
19
19
 
20
20
  /** A small DNSKEY whose key tag was computed by hand from the RFC 4034 Appendix B loop. */
21
21
  const ZONEKEY: DnsKey = { flags: 256, protocol: 3, algorithm: 8, publicKey: "qrs=" };
@@ -45,6 +45,13 @@ describe("family table", () => {
45
45
  }
46
46
  });
47
47
 
48
+ it("answers the os slug at the family root even though the rail never lists it", () => {
49
+ // the owner seat pins the devthink lane the sibling batteries pin: the
50
+ // os answers at the family root itself, never one segment deep
51
+ assert.equal(familyurl("devthink"), "../");
52
+ assert.equal(familyurl("/devthink/"), "../");
53
+ });
54
+
48
55
  it("strips decorative slashes and normalizes the slug", () => {
49
56
  assert.equal(familyurl("/cadria/"), "../cadria/");
50
57
  assert.equal(familyurl(" getry "), "../ getry /");
@@ -17,7 +17,7 @@ import {
17
17
  protocolSchemes,
18
18
  protocolTone,
19
19
  tlsCapableProtocols,
20
- } from "../protocols.ts";
20
+ } from "../dns.ts";
21
21
 
22
22
  /** The schemes the owner law names (the transfer and application wires of the mesh). */
23
23
  const LAW_SCHEMES: readonly string[] = [
@@ -9,7 +9,7 @@
9
9
  // modality id pins the seat for the platform's join to validate at
10
10
  // dispatch — this module never judges engine vocabulary). runnable with
11
11
  // vitest:
12
- // pnpm vitest run tests/sandboxmodality.test.ts
12
+ // pnpm vitest run test/sandboxmodality.test.ts
13
13
  import assert from "node:assert/strict";
14
14
  import { describe, it } from "vitest";
15
15
  import { lanesof } from "@wenathlan/saddle/workloadlaw";
@@ -12,7 +12,7 @@ import {
12
12
  serialForPublication,
13
13
  ZoneDiffError,
14
14
  type ZoneRecord,
15
- } from "../zonediff.ts";
15
+ } from "../dns.ts";
16
16
 
17
17
  const ORIGIN = "example.com.";
18
18
 
@@ -0,0 +1,63 @@
1
+ // # zones.test — the domains ledger of argan, runnable with the vitest
2
+ // runner:
3
+ // pnpm test
4
+ // The ledger is the domains-under-management table of the dns library: the
5
+ // seed rows ride the zones db table through seedIfEmpty and reach the home
6
+ // and zones faces over the catalog accessor. The battery pins the
7
+ // restoration the complaint register ordered (complaint #72 — "de sete
8
+ // domínios dois foram arrancados indevidamente": of seven domains, two were
9
+ // ripped, and the name, type and content properties never belonged in a
10
+ // removal): the gateway and the os domains of the devthink.pro family ride
11
+ // the ledger again, treated exactly like the standing domains — the same
12
+ // ZoneSnapshot grammar, argan primary (master) and signed from day one per
13
+ // the family law, hanging under the devthink.pro apex.
14
+ import assert from "node:assert/strict";
15
+ import { describe, it } from "vitest";
16
+ import { findZone } from "../argan.ts";
17
+ import { seedZones } from "../seed.ts";
18
+
19
+ /** the two family domains the complaint register ordered restored. */
20
+ const RESTORED = ["gateway.devthink.pro", "os.devthink.pro"];
21
+
22
+ describe("domains ledger", () => {
23
+ it("carries the two ripped family domains restored, beside the standing five", () => {
24
+ // the ledger answers seven domains: the five standing rows plus the two
25
+ // the complaint register orders back
26
+ assert.equal(seedZones.length, 7);
27
+ for (const origin of RESTORED) {
28
+ const zone = findZone(seedZones, origin);
29
+ assert.ok(zone, `the ledger lost the restored domain ${origin}`);
30
+ }
31
+ });
32
+
33
+ it("treats the restored domains like the standing ones — the same grammar", () => {
34
+ for (const origin of RESTORED) {
35
+ const zone = findZone(seedZones, origin);
36
+ assert.ok(zone);
37
+ // the row type is the standing one: origin, kind, serial, state — no
38
+ // extra shape, no invented fields
39
+ assert.deepEqual(Object.keys(zone).sort(), ["kind", "origin", "serial", "state"]);
40
+ // argan is primary for the family domains (the registry law: one
41
+ // primary; the secondaries ride authenticated transfer)
42
+ assert.equal(zone.kind, "master");
43
+ // the family law: the domains in the account are signed from day one
44
+ assert.equal(zone.state, "signed");
45
+ // the zone law: the serial rides the YYYYMMDDNN shape (date plus the
46
+ // revision of the day)
47
+ assert.match(zone.serial, /^\d{8}\d{2}$/);
48
+ }
49
+ });
50
+
51
+ it("hangs the restored domains under the devthink.pro apex the ledger keeps", () => {
52
+ // the family domains of the complaint live under the bought apex — the
53
+ // hung model law: one purchased domain anchors everything
54
+ const apex = findZone(seedZones, "devthink.pro");
55
+ assert.ok(apex, "the ledger lost the devthink.pro apex");
56
+ for (const origin of RESTORED) {
57
+ assert.ok(origin.endsWith(".devthink.pro"), `${origin} hangs under the apex`);
58
+ }
59
+ // the restored rows never shadow the apex or each other
60
+ const origins = seedZones.map((zone) => zone.origin);
61
+ assert.equal(new Set(origins).size, origins.length, "the ledger carries a duplicate origin");
62
+ });
63
+ });
File without changes
File without changes