fcdns 0.5.10 → 0.7.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 (44) hide show
  1. package/lib/cli.js +113 -0
  2. package/lib/cli.js.map +1 -0
  3. package/lib/dao/clear.js +8 -0
  4. package/lib/dao/clear.js.map +1 -0
  5. package/lib/dao/get-poison-test-result.js +18 -0
  6. package/lib/dao/get-poison-test-result.js.map +1 -0
  7. package/lib/dao/get-route-result.js +19 -0
  8. package/lib/dao/get-route-result.js.map +1 -0
  9. package/lib/dao/upsert-poison-test-result.js +14 -0
  10. package/lib/dao/upsert-poison-test-result.js.map +1 -0
  11. package/lib/dao/upsert-route-result.js +14 -0
  12. package/lib/dao/upsert-route-result.js.map +1 -0
  13. package/lib/database.js +44 -0
  14. package/lib/database.js.map +1 -0
  15. package/lib/hostnames.js +25 -0
  16. package/lib/hostnames.js.map +1 -0
  17. package/lib/ip-ranges.js +77 -0
  18. package/lib/ip-ranges.js.map +1 -0
  19. package/lib/poison-tester.js +55 -0
  20. package/lib/poison-tester.js.map +1 -0
  21. package/lib/record-types.js +77 -0
  22. package/lib/record-types.js.map +1 -0
  23. package/lib/router.js +63 -0
  24. package/lib/router.js.map +1 -0
  25. package/lib/server.js +88 -0
  26. package/lib/server.js.map +1 -0
  27. package/lib/utils/create-dns-resolver.js +7 -0
  28. package/lib/utils/create-dns-resolver.js.map +1 -0
  29. package/lib/utils/hostname-pattern.js +11 -0
  30. package/lib/utils/hostname-pattern.js.map +1 -0
  31. package/lib/utils/is-ipv4-address.js +4 -0
  32. package/lib/utils/is-ipv4-address.js.map +1 -0
  33. package/lib/utils/is-ipv6-address.js +4 -0
  34. package/lib/utils/is-ipv6-address.js.map +1 -0
  35. package/lib/utils/is-server-online.js +21 -0
  36. package/lib/utils/is-server-online.js.map +1 -0
  37. package/lib/utils/package.js +16 -0
  38. package/lib/utils/package.js.map +1 -0
  39. package/lib/utils/parse-server-info.js +8 -0
  40. package/lib/utils/parse-server-info.js.map +1 -0
  41. package/lib/utils/resolve-a.js +14 -0
  42. package/lib/utils/resolve-a.js.map +1 -0
  43. package/package.json +56 -54
  44. package/dist/cli.cjs +0 -48324
package/lib/server.js ADDED
@@ -0,0 +1,88 @@
1
+ import { RouteResult } from './router.js';
2
+ import * as dns from 'native-node-dns';
3
+ import { getErrorResultAsync } from 'return-style';
4
+ import chalk from 'chalk';
5
+ import { RecordType } from './record-types.js';
6
+ import { go } from '@blackglory/prelude';
7
+ export function startServer({ logger, port, timeout, router, trustedServer, untrustedServer }) {
8
+ const server = dns.createServer();
9
+ server.on('error', console.error);
10
+ server.on('socketError', console.error);
11
+ server.on('request', async (req, res) => {
12
+ logger.trace(`request: ${JSON.stringify(req)}`);
13
+ res.header.rcode = dns.consts.NAME_TO_RCODE.SERVFAIL;
14
+ const question = req.question[0];
15
+ const startTime = Date.now();
16
+ const [err, result] = await getErrorResultAsync(() => router.route(question.name));
17
+ if (err) {
18
+ logger.error(`${formatHostname(question.name)} ${err}`, getElapsed(startTime));
19
+ }
20
+ else {
21
+ logger.debug(`${formatHostname(question.name)} ${RouteResult[result]}`, getElapsed(startTime));
22
+ const server = go(() => {
23
+ switch (result) {
24
+ case RouteResult.TrustedServer: return trustedServer;
25
+ case RouteResult.UntrustedServer: return untrustedServer;
26
+ case RouteResult.Unresolved: return untrustedServer;
27
+ default: throw new Error('Unknown route result');
28
+ }
29
+ });
30
+ const [err, response] = await getErrorResultAsync(() => resolve(server, question, timeout));
31
+ if (err) {
32
+ logger.error(`${formatHostname(question.name)} ${err}`, getElapsed(startTime));
33
+ }
34
+ else {
35
+ logger.info(`${formatHostname(question.name)} ${formatRecordType(question.type)}`, getElapsed(startTime));
36
+ res.header.rcode = response.header.rcode;
37
+ res.answer = response.answer;
38
+ res.authority = response.authority;
39
+ }
40
+ }
41
+ logger.trace(`response: ${JSON.stringify(res)}`);
42
+ res.send();
43
+ });
44
+ server.serve(port);
45
+ }
46
+ function resolve(server, question, timeout) {
47
+ return new Promise((resolve, reject) => {
48
+ let response;
49
+ const request = dns.Request({
50
+ question,
51
+ server: {
52
+ address: server.host,
53
+ port: server.port,
54
+ type: 'udp'
55
+ },
56
+ timeout,
57
+ cache: false,
58
+ try_edns: true
59
+ });
60
+ request.on('timeout', () => reject(new Error('timeout')));
61
+ request.on('cancelled', () => reject(new Error('cancelled')));
62
+ request.on('end', () => {
63
+ if (response) {
64
+ resolve(response);
65
+ }
66
+ else {
67
+ reject(new Error('No response'));
68
+ }
69
+ });
70
+ request.on('message', (err, msg) => {
71
+ if (err)
72
+ return reject(err);
73
+ response = msg;
74
+ });
75
+ request.send();
76
+ });
77
+ }
78
+ function formatHostname(hostname) {
79
+ return chalk.cyan(hostname);
80
+ }
81
+ function getElapsed(startTime) {
82
+ return Date.now() - startTime;
83
+ }
84
+ function formatRecordType(recordType) {
85
+ var _a;
86
+ return (_a = RecordType[recordType]) !== null && _a !== void 0 ? _a : `Unknown(${recordType})`;
87
+ }
88
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { promises as dns } from 'dns';
2
+ export function createDNSResolver(...servers) {
3
+ const resolver = new dns.Resolver();
4
+ resolver.setServers(servers);
5
+ return resolver;
6
+ }
7
+ //# sourceMappingURL=create-dns-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-dns-resolver.js","sourceRoot":"","sources":["../../src/utils/create-dns-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,KAAK,CAAA;AAErC,MAAM,UAAU,iBAAiB,CAAC,GAAG,OAAiB;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAA;IACnC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAC5B,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export class HostnamePattern {
2
+ constructor(pattern) {
3
+ const re = pattern.replace(/\./g, '\\.')
4
+ .replace(/\*/g, '.*');
5
+ this.re = new RegExp(`^${re}$`, 'i');
6
+ }
7
+ match(hostname) {
8
+ return this.re.test(hostname);
9
+ }
10
+ }
11
+ //# sourceMappingURL=hostname-pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostname-pattern.js","sourceRoot":"","sources":["../../src/utils/hostname-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAG1B,YAAY,OAAe;QACzB,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export function isIPv4Address(text) {
2
+ return /^[\d\.]+$/.test(text);
3
+ }
4
+ //# sourceMappingURL=is-ipv4-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-ipv4-address.js","sourceRoot":"","sources":["../../src/utils/is-ipv4-address.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export function isIPv6Address(text) {
2
+ return /^[\da-f:]+$/.test(text);
3
+ }
4
+ //# sourceMappingURL=is-ipv6-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-ipv6-address.js","sourceRoot":"","sources":["../../src/utils/is-ipv6-address.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { timeout, TimeoutError } from 'extra-promise';
2
+ import ping from 'ping';
3
+ import { go } from '@blackglory/prelude';
4
+ export async function isServerOnline(address, timeoutMsecs) {
5
+ try {
6
+ const result = await Promise.race([
7
+ go(async () => {
8
+ const res = await ping.promise.probe(address);
9
+ return res.alive;
10
+ }),
11
+ timeout(timeoutMsecs)
12
+ ]);
13
+ return result;
14
+ }
15
+ catch (e) {
16
+ if (e instanceof TimeoutError)
17
+ return false;
18
+ throw e;
19
+ }
20
+ }
21
+ //# sourceMappingURL=is-server-online.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-server-online.js","sourceRoot":"","sources":["../../src/utils/is-server-online.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAExC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACZ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBAC7C,OAAO,GAAG,CAAC,KAAK,CAAA;YAClB,CAAC,CAAC;YACF,OAAO,CAAC,YAAY,CAAC;SACtB,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,YAAY;YAAE,OAAO,KAAK,CAAA;QAE3C,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { readJSONFileSync, findUpPackageFilenameSync } from 'extra-filesystem';
3
+ import { assert, isString } from '@blackglory/prelude';
4
+ import path from 'path';
5
+ const pkgFilename = findUpPackageFilenameSync(fileURLToPath(new URL(import.meta.url)));
6
+ assert(pkgFilename, 'The package.json is not found');
7
+ export const pkgDirname = path.dirname(pkgFilename);
8
+ const pkg = readJSONFileSync(pkgFilename);
9
+ export const name = pkg.name;
10
+ assert(isString(name), 'The name is not found in package.json');
11
+ export const description = pkg.description;
12
+ assert(isString(description), 'The description is not found in package.json');
13
+ export const version = pkg.version;
14
+ assert(isString(version), 'The version is not found in package.json');
15
+ assert(/^\d+\.\d+\.\d+$/.test(version), 'The version is invalid');
16
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/utils/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,WAAW,GAAG,yBAAyB,CAC3C,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACxC,CAAA;AACD,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAA;AAEpD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;AAEnD,MAAM,GAAG,GAAG,gBAAgB,CAAyB,WAAW,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;AAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,uCAAuC,CAAC,CAAA;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAA;AAC1C,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,8CAA8C,CAAC,CAAA;AAE7E,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAA0C,CAAA;AACrE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,0CAA0C,CAAC,CAAA;AACrE,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ export function parseServerInfo(server) {
2
+ const [host, port] = server.split(':');
3
+ return {
4
+ host,
5
+ port: port ? Number.parseInt(port, 10) : undefined
6
+ };
7
+ }
8
+ //# sourceMappingURL=parse-server-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-server-info.js","sourceRoot":"","sources":["../../src/utils/parse-server-info.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAiC,CAAA;IACtE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KACnD,CAAA;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { timeout } from 'extra-promise';
2
+ export { TimeoutError } from 'extra-promise';
3
+ export async function resolveA(resolver, hostname, timeoutMsecs) {
4
+ if (timeoutMsecs) {
5
+ return await Promise.race([
6
+ resolver.resolve4(hostname),
7
+ timeout(timeoutMsecs)
8
+ ]);
9
+ }
10
+ else {
11
+ return await resolver.resolve4(hostname);
12
+ }
13
+ }
14
+ //# sourceMappingURL=resolve-a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-a.js","sourceRoot":"","sources":["../../src/utils/resolve-a.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAM5C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAsB,EACtB,QAAgB,EAChB,YAAqB;IAErB,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,OAAO,CAAC,YAAY,CAAC;SACtB,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "fcdns",
3
- "version": "0.5.10",
3
+ "version": "0.7.0",
4
4
  "description": "DNS relay server with fact-checking.",
5
5
  "keywords": [
6
6
  "dns"
7
7
  ],
8
- "bin": "dist/cli.cjs",
8
+ "type": "module",
9
+ "bin": "lib/cli.js",
9
10
  "files": [
10
11
  "migrations",
11
- "dist"
12
+ "lib"
12
13
  ],
14
+ "engines": {
15
+ "node": ">=18.17.0"
16
+ },
13
17
  "repository": "git@github.com:BlackGlory/fcdns.git",
14
18
  "author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
15
19
  "license": "MIT",
@@ -17,75 +21,73 @@
17
21
  "prepare": "ts-patch install -s",
18
22
  "deduplicate": "yarn-deduplicate",
19
23
  "postinstall": "patch-package",
20
- "prepublishOnly": "run-s postinstall prepare clean build bundle",
21
- "lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src",
22
- "test": "jest --config jest.config.js",
23
- "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
24
- "test:coverage": "jest --coverage --config jest.config.js",
25
- "clean": "rimraf lib dist",
24
+ "prepublishOnly": "run-s postinstall prepare clean build",
25
+ "lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src __tests__",
26
+ "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand --config jest.config.cjs",
27
+ "test:coverage": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand --coverage --config jest.config.cjs",
28
+ "test:debug": "cross-env NODE_OPTIONS='--experimental-vm-modules --inspect-brk' jest --runInBand --config jest.config.cjs",
29
+ "clean": "rimraf lib",
26
30
  "build": "run-p build:*",
27
31
  "build:src": "tsc --project tsconfig.build.json",
28
32
  "build:scripts": "tsc --project tsconfig.scripts.json",
29
- "bundle": "webpack --stats-error-details",
30
- "smoke": "node dist/cli.cjs --help",
33
+ "smoke": "node lib/cli.js --help",
31
34
  "release": "standard-version",
32
- "script:generate-whitelist-by-cc": "ts-node scripts/generate-whitelist-by-cc.ts",
33
- "script:import-poison-test-results-from-ndjson-map-file": "ts-node scripts/import-poison-test-results-from-ndjson-map-file.ts",
34
- "script:import-route-results-from-ndjson-map-file": "ts-node scripts/import-route-results-from-ndjson-map-file.ts"
35
+ "script:generate-ip-whitelist-by-cc": "ts-node --esm scripts/generate-ip-whitelist-by-cc.ts"
35
36
  },
36
37
  "husky": {
37
38
  "hooks": {
38
- "pre-commit": "run-s postinstall prepare clean lint build test bundle smoke",
39
+ "pre-commit": "run-s postinstall prepare clean lint build test smoke",
39
40
  "commit-msg": "commitlint --env HUSKY_GIT_PARAMS"
40
41
  }
41
42
  },
42
43
  "devDependencies": {
43
- "@commitlint/cli": "^17.0.3",
44
- "@commitlint/config-conventional": "^17.0.3",
45
- "@types/better-sqlite3": "^7.6.0",
46
- "@types/jest": "^27.4.1",
44
+ "@blackglory/jest-resolver": "^0.3.1",
45
+ "@commitlint/cli": "^18.4.3",
46
+ "@commitlint/config-conventional": "^18.4.3",
47
+ "@types/better-sqlite3": "^7.6.8",
48
+ "@types/jest": "^29.5.11",
47
49
  "@types/node": "14",
48
- "@types/ping": "^0.4.1",
49
- "@typescript-eslint/eslint-plugin": "^5.33.0",
50
- "@typescript-eslint/parser": "^5.33.0",
51
- "eslint": "^8.21.0",
52
- "extra-prompts": "^0.1.3",
50
+ "@types/ping": "^0.4.4",
51
+ "@typescript-eslint/eslint-plugin": "^6.16.0",
52
+ "@typescript-eslint/parser": "^6.16.0",
53
+ "cross-env": "^7.0.3",
54
+ "eslint": "^8.56.0",
55
+ "extra-prompts": "^0.1.6",
53
56
  "husky": "4",
54
- "internet-number": "^3.0.3",
55
- "jest": "^27.5.1",
57
+ "internet-number": "^4.0.1",
58
+ "jest": "^29.7.0",
59
+ "jest-resolve": "^29.7.0",
56
60
  "npm-run-all": "^4.1.5",
57
- "rimraf": "^3.0.2",
61
+ "rimraf": "^5.0.5",
58
62
  "standard-version": "^9.5.0",
59
- "ts-jest": "^27.1.4",
60
- "ts-node": "^10.9.1",
61
- "ts-patch": "^2.0.2",
62
- "typescript": "^4.7.4",
63
- "typescript-transform-paths": "^3.3.1",
64
- "webpack": "^5.74.0",
65
- "webpack-cli": "^4.10.0",
66
- "webpack-shebang-plugin": "^1.1.8",
67
- "yarn-deduplicate": "^5.0.0"
63
+ "ts-jest": "^29.1.1",
64
+ "ts-node": "^10.9.2",
65
+ "ts-patch": "^3.1.1",
66
+ "typescript": "5.3.3",
67
+ "typescript-transform-paths": "^3.4.6",
68
+ "yarn-deduplicate": "^6.0.2"
68
69
  },
69
70
  "dependencies": {
70
- "@blackglory/better-sqlite3-migrations": "^0.1.15",
71
- "@blackglory/errors": "^2.2.2",
72
- "@blackglory/prelude": "^0.1.3",
73
- "@blackglory/structures": "^0.6.2",
74
- "address-range": "^0.2.11",
75
- "better-sqlite3": "^7.6.2",
76
- "chalk": "^4.1.2",
77
- "commander": "^9.4.0",
78
- "extra-filesystem": "^0.4.5",
79
- "extra-lazy": "^1.3.1",
80
- "extra-logger": "^0.6.9",
81
- "extra-promise": "^2.4.1",
82
- "iterable-operator": "^1.2.0",
83
- "migrations-file": "^0.2.4",
71
+ "@blackglory/better-sqlite3-migrations": "^0.1.18",
72
+ "@blackglory/errors": "^3.0.3",
73
+ "@blackglory/prelude": "^0.3.4",
74
+ "@blackglory/structures": "^0.13.4",
75
+ "address-range": "^0.2.14",
76
+ "better-sqlite3": "^9.2.2",
77
+ "chalk": "^5.3.0",
78
+ "commander": "^11.1.0",
79
+ "extra-filesystem": "^0.5.1",
80
+ "extra-lazy": "^2.0.2",
81
+ "extra-logger": "^0.7.2",
82
+ "extra-promise": "^6.0.8",
83
+ "extra-utils": "^5.6.0",
84
+ "iterable-operator": "^4.0.6",
85
+ "migration-files": "^0.4.1",
84
86
  "native-node-dns": "0.7.6",
85
87
  "native-node-dns-packet": "0.1.5",
86
- "patch-package": "^6.4.7",
87
- "ping": "^0.4.2",
88
- "return-style": "^1.0.0",
89
- "you-died": "^0.4.1"
88
+ "patch-package": "^8.0.0",
89
+ "ping": "^0.4.4",
90
+ "return-style": "^3.0.1",
91
+ "you-died": "^0.4.5"
90
92
  }
91
93
  }