sse-cat 2.1.0 → 3.0.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.
package/README.md CHANGED
@@ -3,7 +3,7 @@ Command-line client for Server-Sent Events(SSE).
3
3
 
4
4
  ## Install
5
5
  ```sh
6
- npm install -g sse-cat
6
+ npm install --global sse-cat
7
7
  # or
8
8
  yarn global add sse-cat
9
9
  ```
@@ -22,12 +22,12 @@ Usage: sse-cat [options] <url...>
22
22
  Command-line client for Server-Sent Events(SSE).
23
23
 
24
24
  Options:
25
- -V, --version output the version number
26
- --header [header...] Pass custom header(s) to server
27
- --event [name...] Pass custom event(s) that need to be captured
28
- --heartbeat-event [name]
29
- --heartbeat-timeout [ms]
30
- -h, --help display help for command
25
+ -V, --version output the version number
26
+ --header <header...> Pass custom header(s) to server
27
+ --event <name...> Pass custom event(s) that need to be captured
28
+ --heartbeat-event <name>
29
+ --heartbeat-timeout <milliseconds>
30
+ -h, --help display help for command
31
31
  ```
32
32
 
33
33
  ### Single SSE
package/lib/cli.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ import { program } from 'commander';
3
+ import { subscribeMessages } from './subscribe-events.js';
4
+ import { parseHeaders } from "./utils/parse-headers.js";
5
+ import { assert, isUndefined, isntUndefined } from '@blackglory/prelude';
6
+ import { version, description } from "./utils/package.js";
7
+ const name = 'sse-cat';
8
+ process.title = name;
9
+ program
10
+ .name(name)
11
+ .version(version)
12
+ .description(description)
13
+ .option('--header <header...>', 'Pass custom header(s) to server')
14
+ .option('--event <name...>', 'Pass custom event(s) that need to be captured')
15
+ .option('--heartbeat-event <name>')
16
+ .option('--heartbeat-timeout <milliseconds>')
17
+ .arguments('<url...>')
18
+ .action((urls) => {
19
+ const options = program.opts();
20
+ const headers = getHeaders(options);
21
+ const events = getEvents(options);
22
+ const heartbeatOptions = getHeartbeatOptions(options);
23
+ urls.forEach(async (url) => {
24
+ for await (const message of subscribeMessages(url, {
25
+ headers,
26
+ events,
27
+ heartbeat: heartbeatOptions
28
+ })) {
29
+ console.log(message);
30
+ }
31
+ });
32
+ })
33
+ .parse();
34
+ function getHeartbeatOptions(options) {
35
+ const heartbeatEvent = getHeartbeatEvent(options);
36
+ const heartbeatTimeout = getHeartbeatTimeout(options);
37
+ if (isntUndefined(heartbeatEvent) && isntUndefined(heartbeatTimeout)) {
38
+ const options = {
39
+ event: heartbeatEvent,
40
+ timeout: heartbeatTimeout
41
+ };
42
+ return options;
43
+ }
44
+ else {
45
+ return undefined;
46
+ }
47
+ }
48
+ function getHeartbeatTimeout(options) {
49
+ if (isUndefined(options.heartbeatTimeout)) {
50
+ return undefined;
51
+ }
52
+ else {
53
+ assert(isNumberString(options.heartbeatTimeout), 'The parameter heartbeat-timeout must be an integer');
54
+ const timeout = Number.parseInt(options.heartbeatTimeout, 10);
55
+ assert(timeout > 0, 'timeout must greater than zero');
56
+ return timeout;
57
+ }
58
+ }
59
+ function getHeartbeatEvent(options) {
60
+ return options.heartbeatEvent;
61
+ }
62
+ function getHeaders(options) {
63
+ var _a;
64
+ return parseHeaders((_a = options.header) !== null && _a !== void 0 ? _a : []);
65
+ }
66
+ function getEvents(options) {
67
+ return createEvents(options.event);
68
+ }
69
+ function createEvents(events) {
70
+ if (events && events.length > 0) {
71
+ return events;
72
+ }
73
+ else {
74
+ return ['message'];
75
+ }
76
+ }
77
+ function isNumberString(str) {
78
+ return /^\d+$/.test(str);
79
+ }
80
+ //# sourceMappingURL=cli.js.map
package/lib/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAqB,MAAM,uBAAuB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,iCAA+B;AACtD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,2BAAyB;AASxD,MAAM,IAAI,GAAG,SAAS,CAAA;AACtB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;AAEpB,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,WAAW,CAAC;KACxB,MAAM,CAAC,sBAAsB,EAAE,iCAAiC,CAAC;KACjE,MAAM,CAAC,mBAAmB,EAAE,+CAA+C,CAAC;KAC5E,MAAM,CAAC,0BAA0B,CAAC;KAClC,MAAM,CAAC,oCAAoC,CAAC;KAC5C,SAAS,CAAC,UAAU,CAAC;KACrB,MAAM,CAAC,CAAC,IAAc,EAAE,EAAE;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAY,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IACjC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAErD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;QACvB,IAAI,KAAK,EACP,MAAM,OAAO,IAAI,iBAAiB,CAAC,GAAG,EAAE;YACtC,OAAO;YACP,MAAM;YACN,SAAS,EAAE,gBAAgB;SAC5B,CAAC,EACF;YACA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;SACrB;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC;KACD,KAAK,EAAE,CAAA;AAEV,SAAS,mBAAmB,CAAC,OAAiB;IAC5C,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IACjD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAErD,IAAI,aAAa,CAAC,cAAc,CAAC,IAAI,aAAa,CAAC,gBAAgB,CAAC,EAAE;QACpE,MAAM,OAAO,GAAsB;YACjC,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,gBAAgB;SAC1B,CAAA;QACD,OAAO,OAAO,CAAA;KACf;SAAM;QACL,OAAO,SAAS,CAAA;KACjB;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAiB;IAC5C,IAAI,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;QACzC,OAAO,SAAS,CAAA;KACjB;SAAM;QACL,MAAM,CACJ,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,EACxC,oDAAoD,CACrD,CAAA;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;QAC7D,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,gCAAgC,CAAC,CAAA;QAErD,OAAO,OAAO,CAAA;KACf;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAiB;IAC1C,OAAO,OAAO,CAAC,cAAc,CAAA;AAC/B,CAAC;AAED,SAAS,UAAU,CAAC,OAAiB;;IACnC,OAAO,YAAY,CAAC,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,OAAiB;IAClC,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,YAAY,CAAC,MAAiB;IACrC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,OAAO,MAAM,CAAA;KACd;SAAM;QACL,OAAO,CAAC,SAAS,CAAC,CAAA;KACnB;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { setTimeout } from 'extra-timers';
2
+ import { fetchEvents } from 'extra-sse';
3
+ import { Request } from 'extra-fetch';
4
+ import { isntUndefined } from '@blackglory/prelude';
5
+ import { AbortController, AbortError } from 'extra-abort';
6
+ export async function* subscribeMessages(url, { events, headers, heartbeat }) {
7
+ let cancelHeartbeatTimeout = undefined;
8
+ let lastEventId = undefined;
9
+ while (true) {
10
+ try {
11
+ const controller = new AbortController();
12
+ for await (const { event = 'message', data, id } of fetchEvents(() => new Request(url, { headers, signal: controller.signal }), { lastEventId })) {
13
+ if (isntUndefined(lastEventId)) {
14
+ lastEventId = id;
15
+ }
16
+ if (heartbeat) {
17
+ if (cancelHeartbeatTimeout) {
18
+ if (heartbeat.event === event) {
19
+ cancelHeartbeatTimeout();
20
+ cancelHeartbeatTimeout = setTimeout(heartbeat.timeout, () => {
21
+ controller.abort();
22
+ });
23
+ }
24
+ }
25
+ else {
26
+ cancelHeartbeatTimeout = setTimeout(heartbeat.timeout, () => {
27
+ controller.abort();
28
+ });
29
+ }
30
+ }
31
+ if (events.includes(event)) {
32
+ if (isntUndefined(data)) {
33
+ yield data;
34
+ }
35
+ }
36
+ }
37
+ }
38
+ catch (e) {
39
+ if (e instanceof AbortError) {
40
+ console.error('heartbeat timeout');
41
+ }
42
+ else {
43
+ throw e;
44
+ }
45
+ }
46
+ finally {
47
+ cancelHeartbeatTimeout === null || cancelHeartbeatTimeout === void 0 ? void 0 : cancelHeartbeatTimeout();
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=subscribe-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe-events.js","sourceRoot":"","sources":["../src/subscribe-events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOzD,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CACtC,GAAW,EACX,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAI3B;IAED,IAAI,sBAAsB,GAA6B,SAAS,CAAA;IAChE,IAAI,WAAW,GAAuB,SAAS,CAAA;IAE/C,OAAO,IAAI,EAAE;QACX,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;YACxC,IAAI,KAAK,EACP,MAAM,EACJ,KAAK,GAAG,SAAS,EACjB,IAAI,EACJ,EAAE,EACH,IAAI,WAAW,CACd,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,EAC9D,EAAE,WAAW,EAAE,CAChB,EACD;gBACA,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE;oBAC9B,WAAW,GAAG,EAAE,CAAA;iBACjB;gBAED,IAAI,SAAS,EAAE;oBACb,IAAI,sBAAsB,EAAE;wBAC1B,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,EAAE;4BAC7B,sBAAsB,EAAE,CAAA;4BACxB,sBAAsB,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE;gCAC1D,UAAU,CAAC,KAAK,EAAE,CAAA;4BACpB,CAAC,CAAC,CAAA;yBACH;qBACF;yBAAM;wBACL,sBAAsB,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE;4BAC1D,UAAU,CAAC,KAAK,EAAE,CAAA;wBACpB,CAAC,CAAC,CAAA;qBACH;iBACF;gBAED,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;oBAC1B,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;wBACvB,MAAM,IAAI,CAAA;qBACX;iBACF;aACF;SACF;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,YAAY,UAAU,EAAE;gBAC3B,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;aACnC;iBAAM;gBACL,MAAM,CAAC,CAAA;aACR;SACF;gBAAS;YACR,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,EAAI,CAAA;SAC3B;KACF;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,4 @@
1
+ export function parseHeaders(headers) {
2
+ return Object.fromEntries(headers.map(x => x.split(/:\s+/)));
3
+ }
4
+ //# sourceMappingURL=parse-headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-headers.js","sourceRoot":"","sources":["../../src/utils/parse-headers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,OAAiB;IAC5C,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AAC9D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sse-cat",
3
- "version": "2.1.0",
3
+ "version": "3.0.0",
4
4
  "description": "Command-line client for Server-Sent Events(SSE).",
5
5
  "keywords": [
6
6
  "CLI",
@@ -9,70 +9,77 @@
9
9
  "Server-Sent Event",
10
10
  "Server-Sent Events"
11
11
  ],
12
+ "type": "module",
12
13
  "bin": {
13
- "sse-cat": "dist/cli.cjs"
14
+ "sse-cat": "lib/cli.js"
15
+ },
16
+ "engines": {
17
+ "node": ">=16"
14
18
  },
15
19
  "files": [
16
- "dist"
20
+ "lib"
17
21
  ],
18
22
  "repository": "git@github.com:BlackGlory/sse-cat.git",
19
23
  "author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
20
24
  "license": "MIT",
21
25
  "scripts": {
22
- "deduplicate": "yarn-deduplicate",
23
- "prepublishOnly": "run-s prepare clean build bundle",
24
26
  "prepare": "ts-patch install -s",
25
- "lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src",
26
- "test": "jest --config jest.config.js",
27
- "test:coverage": "jest --coverage --config jest.config.js",
27
+ "deduplicate": "yarn-deduplicate",
28
+ "prepublishOnly": "run-s prepare clean build",
29
+ "lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src __tests__",
30
+ "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand --config jest.config.cjs",
31
+ "test:coverage": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand --coverage --config jest.config.cjs",
32
+ "test:debug": "cross-env NODE_OPTIONS='--experimental-vm-modules --inspect-brk' jest --runInBand --config jest.config.cjs",
28
33
  "dev": "ts-node -r tsconfig-paths/register src/cli.ts",
29
34
  "dev:debug": "node --inspect-brk node_modules/.bin/ts-node -r tsconfig-paths/register src/cli.ts",
30
- "clean": "rimraf lib dist",
35
+ "clean": "rimraf lib",
31
36
  "build": "tsc --project tsconfig.build.json",
32
- "bundle": "webpack --stats-error-details",
33
- "smoke": "node dist/cli.cjs --help",
37
+ "smoke": "node lib/cli.js --help",
34
38
  "release": "standard-version"
35
39
  },
36
40
  "husky": {
37
41
  "hooks": {
38
- "pre-commit": "run-s prepare clean lint build test bundle smoke",
42
+ "pre-commit": "run-s prepare clean lint build test smoke",
39
43
  "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
40
44
  }
41
45
  },
42
- "dependencies": {
43
- "@blackglory/errors": "^2.2.1",
44
- "@blackglory/go": "^1.1.1",
45
- "@blackglory/types": "^1.2.1",
46
- "commander": "^9.4.0",
47
- "eventsource": "^2.0.2",
48
- "extra-timers": "^0.2.5",
49
- "hotypes": "^0.4.4",
50
- "justypes": "^2.0.0",
51
- "rxjs": "^7.5.6"
52
- },
53
46
  "devDependencies": {
54
- "@commitlint/cli": "^17.0.3",
55
- "@commitlint/config-conventional": "^17.0.3",
56
- "@types/eventsource": "^1.1.9",
57
- "@types/jest": "^27.4.0",
58
- "@types/node": "14",
59
- "@typescript-eslint/eslint-plugin": "^5.31.0",
60
- "@typescript-eslint/parser": "^5.31.0",
61
- "eslint": "^8.20.0",
47
+ "@blackglory/jest-resolver": "^0.3.1",
48
+ "@commitlint/cli": "^17.6.7",
49
+ "@commitlint/config-conventional": "^17.6.7",
50
+ "@types/jest": "^29.5.3",
51
+ "@types/node": "20.4.5",
52
+ "@typescript-eslint/eslint-plugin": "^6.2.1",
53
+ "@typescript-eslint/parser": "^6.2.1",
54
+ "cross-env": "^7.0.3",
55
+ "eslint": "^8.46.0",
56
+ "extra-promise": "^6.0.7",
62
57
  "husky": "4",
63
- "jest": "^27.5.1",
58
+ "iterable-operator": "^4.0.6",
59
+ "jest": "^29.6.2",
60
+ "jest-resolve": "^29.6.2",
61
+ "msw": "^1.2.3",
64
62
  "npm-run-all": "^4.1.5",
65
- "rimraf": "^3.0.2",
63
+ "return-style": "^3.0.1",
64
+ "rimraf": "^5.0.1",
66
65
  "standard-version": "^9.5.0",
67
- "ts-jest": "^27.1.3",
66
+ "ts-jest": "^29.1.1",
68
67
  "ts-node": "^10.9.1",
69
- "ts-patch": "^2.0.1",
70
- "tsconfig-paths": "^4.0.0",
71
- "typescript": "^4.7.4",
72
- "typescript-transform-paths": "^3.3.1",
73
- "webpack": "^5.74.0",
74
- "webpack-cli": "^4.10.0",
75
- "webpack-shebang-plugin": "^1.1.7",
76
- "yarn-deduplicate": "^5.0.0"
68
+ "ts-patch": "^3.0.2",
69
+ "tsconfig-paths": "^4.2.0",
70
+ "typescript": "^5.1.6",
71
+ "typescript-transform-paths": "^3.4.6",
72
+ "yarn-deduplicate": "^6.0.2"
73
+ },
74
+ "dependencies": {
75
+ "@blackglory/http-status": "^2.0.2",
76
+ "@blackglory/prelude": "^0.3.3",
77
+ "commander": "^11.0.0",
78
+ "extra-abort": "^0.3.7",
79
+ "extra-fetch": "^4.0.7",
80
+ "extra-filesystem": "^0.5.1",
81
+ "extra-sse": "^0.3.0",
82
+ "extra-timers": "^0.2.6",
83
+ "justypes": "^4.2.1"
77
84
  }
78
85
  }