Skip to content

Commit 994d467

Browse files
committed
Upgrade deps, scripts, docs to v8 & Aug 2026
Bumped core dependencies (Biome 2.5.6, pnpm 11, TypeScript 6.0.3, Turbo 2.10.7) and aligned dev packages. Refactored scripts to use `turbo run` and updated package.json entries. Fixed imports to use `node:url`, switched frontmatter access to dot notation, cleaned up re‑exports and import ordering. Updated markdown files: version dates to August 2026, added notes on the unconfirmed "Bypass Age Verification" setting, and migrated all React Router references from v7 to v8. Expanded `turbo.json` with UI streaming and additional task definitions. Adjusted workspace overrides for minimatch.
1 parent f531a78 commit 994d467

41 files changed

Lines changed: 729 additions & 551 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

biome.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "https://biomejs.dev/schemas/2.4.4/schema.json",
2+
"$schema": "https://biomejs.dev/schemas/2.5.6/schema.json",
33
"vcs": {
44
"enabled": true,
55
"clientKind": "git",
@@ -18,7 +18,7 @@
1818
"linter": {
1919
"enabled": true,
2020
"rules": {
21-
"recommended": true
21+
"preset": "recommended"
2222
}
2323
},
2424
"javascript": {

package.json

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
},
1313
"author": "Tuan Duc Tran <tuanductran.dev@gmail.com>",
1414
"license": "MIT",
15-
"packageManager": "pnpm@10.34.4",
15+
"packageManager": "pnpm@11.18.0",
1616
"engines": {
17-
"node": ">=20.0.0"
17+
"node": ">=20.0.0",
18+
"pnpm": ">=11.0.0"
1819
},
1920
"keywords": [
2021
"nextdns",
@@ -46,40 +47,35 @@
4647
"lint:links": "find . -name \"*.md\" -not -path \"*/node_modules/*\" -not -path \"*/templates/*\" | xargs markdown-link-check -c config.json",
4748
"lint:md": "markdownlint .",
4849
"lint:md:fix": "markdownlint . --fix",
49-
"lint:rules": "pnpm -F nextdns-skills-scripts build && pnpm -F nextdns-skills-scripts validate-rules",
50+
"lint:rules": "turbo run validate-rules",
5051
"lint:syntax": "case-police \"skills/**/rules/**/*.md\"",
5152
"lint:syntax:fix": "case-police --fix \"skills/**/rules/**/*.md\"",
52-
"build": "turbo build",
53-
"build:skills": "pnpm -F nextdns-skills-build build-all",
54-
"build:api": "pnpm -F nextdns-skills-build build-api",
55-
"build:cli": "pnpm -F nextdns-skills-build build-cli",
56-
"build:ui": "pnpm -F nextdns-skills-build build-ui",
57-
"build:integrations": "pnpm -F nextdns-skills-build build-integrations",
58-
"build:frontend": "pnpm -F nextdns-skills-build build-frontend",
59-
"update-counts": "pnpm -F nextdns-skills-scripts build && pnpm -F nextdns-skills-scripts update-counts",
60-
"dev": "turbo dev",
61-
"check-duplicates": "pnpm -F nextdns-skills-scripts build && pnpm -F nextdns-skills-scripts check-duplicates",
62-
"check-tags": "pnpm -F nextdns-skills-scripts build && pnpm -F nextdns-skills-scripts check-tags",
63-
"stats": "pnpm -F nextdns-skills-scripts build && pnpm -F nextdns-skills-scripts generate-stats --text",
64-
"lint:quality": "pnpm run check-duplicates && pnpm run check-tags",
65-
"rule-search": "pnpm -F nextdns-skills-build search",
66-
"rule-export": "pnpm -F nextdns-skills-build export",
67-
"test": "turbo test",
68-
"test:coverage": "turbo test:coverage",
69-
"types:check": "tsc -p tsconfig.json"
53+
"build": "turbo run build",
54+
"build:skills": "turbo run build-all",
55+
"build:api": "turbo run build-api",
56+
"build:cli": "turbo run build-cli",
57+
"build:ui": "turbo run build-ui",
58+
"build:integrations": "turbo run build-integrations",
59+
"build:frontend": "turbo run build-frontend",
60+
"update-counts": "turbo run update-counts",
61+
"dev": "turbo run dev",
62+
"check-duplicates": "turbo run check-duplicates",
63+
"check-tags": "turbo run check-tags",
64+
"stats": "turbo run generate-stats -- --text",
65+
"lint:quality": "turbo run check-duplicates check-tags",
66+
"rule-search": "turbo run search --",
67+
"rule-export": "turbo run export --",
68+
"test": "turbo run test",
69+
"test:coverage": "turbo run test:coverage",
70+
"types:check": "turbo run types:check && tsc -p tsconfig.json"
7071
},
7172
"devDependencies": {
72-
"@biomejs/biome": "^2.4.8",
73-
"@types/node": "^25.5.0",
74-
"case-police": "^2.2.0",
75-
"markdown-link-check": "^3.14.2",
76-
"markdownlint-cli": "^0.49.0",
77-
"turbo": "^2.8.20",
78-
"typescript": "^6.0.0"
79-
},
80-
"pnpm": {
81-
"overrides": {
82-
"minimatch": ">=10.2.3"
83-
}
73+
"@biomejs/biome": "^2.5.6",
74+
"@types/node": "^26.1.2",
75+
"case-police": "^2.2.1",
76+
"markdown-link-check": "^3.15.0",
77+
"markdownlint-cli": "^0.49.1",
78+
"turbo": "^2.10.7",
79+
"typescript": "6.0.3"
8480
}
8581
}

packages/nextdns-scripts/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@
3434
],
3535
"license": "MIT",
3636
"devDependencies": {
37-
"@types/node": "^25.5.0",
38-
"@vitest/coverage-v8": "^4.1.0",
37+
"@types/node": "^26.1.2",
38+
"@vitest/coverage-v8": "^4.1.10",
3939
"tsup": "^8.5.1",
40-
"typescript": "^6.0.0",
41-
"vitest": "^4.1.0"
40+
"typescript": "6.0.3",
41+
"vitest": "^4.1.10"
4242
}
4343
}

packages/nextdns-scripts/src/__tests__/utils.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ type: capability
7878
---
7979
# Body`;
8080
const fm = parseFrontmatter(md);
81-
expect(fm['title']).toBe('Authentication');
82-
expect(fm['impact']).toBe('HIGH');
83-
expect(fm['type']).toBe('capability');
81+
expect(fm.title).toBe('Authentication');
82+
expect(fm.impact).toBe('HIGH');
83+
expect(fm.type).toBe('capability');
8484
});
8585

8686
it('parses YAML array fields', () => {
@@ -91,7 +91,7 @@ tags:
9191
- authentication
9292
---`;
9393
const fm = parseFrontmatter(md);
94-
expect(fm['tags']).toEqual(['api', 'security', 'authentication']);
94+
expect(fm.tags).toEqual(['api', 'security', 'authentication']);
9595
});
9696

9797
it('strips surrounding quotes from values', () => {
@@ -100,8 +100,8 @@ title: "Rate Limiting"
100100
impactDescription: 'Some description'
101101
---`;
102102
const fm = parseFrontmatter(md);
103-
expect(fm['title']).toBe('Rate Limiting');
104-
expect(fm['impactDescription']).toBe('Some description');
103+
expect(fm.title).toBe('Rate Limiting');
104+
expect(fm.impactDescription).toBe('Some description');
105105
});
106106

107107
it('handles multiple fields including mixed scalar and array', () => {
@@ -114,10 +114,10 @@ tags:
114114
type: efficiency
115115
---`;
116116
const fm = parseFrontmatter(md);
117-
expect(fm['title']).toBe('My Rule');
118-
expect(fm['impact']).toBe('MEDIUM');
119-
expect(fm['tags']).toEqual(['one', 'two']);
120-
expect(fm['type']).toBe('efficiency');
117+
expect(fm.title).toBe('My Rule');
118+
expect(fm.impact).toBe('MEDIUM');
119+
expect(fm.tags).toEqual(['one', 'two']);
120+
expect(fm.type).toBe('efficiency');
121121
});
122122

123123
it('returns empty object when closing --- is missing', () => {

packages/nextdns-scripts/src/check-duplicates.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import fs from 'node:fs';
1414
import path from 'node:path';
15-
import { fileURLToPath } from 'url';
15+
import { fileURLToPath } from 'node:url';
1616
import { collectRuleFiles, parseFrontmatter } from './utils.js';
1717

1818
const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -58,8 +58,8 @@ function loadAllRules(): RuleEntry[] {
5858
for (const filePath of collectRuleFiles(rulesDir)) {
5959
const content = fs.readFileSync(filePath, 'utf8');
6060
const fm = parseFrontmatter(content);
61-
const title = typeof fm['title'] === 'string' ? fm['title'] : '';
62-
const tags = Array.isArray(fm['tags']) ? (fm['tags'] as string[]) : [];
61+
const title = typeof fm.title === 'string' ? fm.title : '';
62+
const tags = Array.isArray(fm.tags) ? (fm.tags as string[]) : [];
6363

6464
// Determine subdir (first path component inside rules/)
6565
const rel = path.relative(path.join(dir, 'rules'), filePath);

packages/nextdns-scripts/src/check-tags.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import fs from 'node:fs';
1414
import path from 'node:path';
15-
import { fileURLToPath } from 'url';
15+
import { fileURLToPath } from 'node:url';
1616
import { collectRuleFiles, parseFrontmatter } from './utils.js';
1717

1818
const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -49,7 +49,7 @@ function validateTags(): boolean {
4949
const rel = path.relative(REPO_ROOT, filePath);
5050
const content = fs.readFileSync(filePath, 'utf8');
5151
const fm = parseFrontmatter(content);
52-
const tags = Array.isArray(fm['tags']) ? (fm['tags'] as string[]) : [];
52+
const tags = Array.isArray(fm.tags) ? (fm.tags as string[]) : [];
5353

5454
if (tags.length === 0) {
5555
errors.push({ file: rel, level: 'error', message: 'No tags defined (minimum 3 required)' });

packages/nextdns-scripts/src/generate-stats.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import fs from 'node:fs';
1919
import path from 'node:path';
20-
import { fileURLToPath } from 'url';
20+
import { fileURLToPath } from 'node:url';
2121
import { collectRuleFiles, parseFrontmatter } from './utils.js';
2222

2323
const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -79,11 +79,11 @@ function buildReport(): StatsReport {
7979
stat.total++;
8080
totalRules++;
8181

82-
const type = typeof fm['type'] === 'string' ? fm['type'] : '';
82+
const type = typeof fm.type === 'string' ? fm.type : '';
8383
if (type === 'capability') stat.capability++;
8484
else if (type === 'efficiency') stat.efficiency++;
8585

86-
const impact = typeof fm['impact'] === 'string' ? fm['impact'].toUpperCase() : 'MEDIUM';
86+
const impact = typeof fm.impact === 'string' ? fm.impact.toUpperCase() : 'MEDIUM';
8787
if (impact === 'HIGH') {
8888
stat.high++;
8989
impactDistribution.HIGH++;
@@ -95,7 +95,7 @@ function buildReport(): StatsReport {
9595
impactDistribution.MEDIUM++;
9696
}
9797

98-
const tags = Array.isArray(fm['tags']) ? (fm['tags'] as string[]) : [];
98+
const tags = Array.isArray(fm.tags) ? (fm.tags as string[]) : [];
9999
if (tags.length === 0) {
100100
rulesWithNoTags.push(path.relative(REPO_ROOT, filePath));
101101
}

packages/nextdns-scripts/src/update-counts.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import fs from 'node:fs';
1010
import path from 'node:path';
11-
import { fileURLToPath } from 'url';
11+
import { fileURLToPath } from 'node:url';
1212
import { walkDir } from './utils.js';
1313

1414
const __dirname = path.dirname(fileURLToPath(import.meta.url));

packages/nextdns-scripts/src/validate-rules.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import fs from 'node:fs';
1313
import path from 'node:path';
14-
import { fileURLToPath } from 'url';
14+
import { fileURLToPath } from 'node:url';
1515
import { walkDir } from './utils.js';
1616

1717
const __dirname = path.dirname(fileURLToPath(import.meta.url));

packages/nextdns-skills-build/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@
5454
],
5555
"license": "MIT",
5656
"devDependencies": {
57-
"@types/node": "^25.5.0",
58-
"@vitest/coverage-v8": "^4.1.0",
57+
"@types/node": "^26.1.2",
58+
"@vitest/coverage-v8": "^4.1.10",
5959
"tsup": "^8.5.1",
60-
"typescript": "^6.0.0",
61-
"vitest": "^4.1.0"
60+
"typescript": "6.0.3",
61+
"vitest": "^4.1.10"
6262
}
6363
}

0 commit comments

Comments
 (0)