endpoints-sdk-cli 2.1.2 → 2.3.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
@@ -17,7 +17,7 @@ $ npm install -g endpoints-sdk-cli
17
17
  $ mes COMMAND
18
18
  running command...
19
19
  $ mes (-v|--version|version)
20
- endpoints-sdk-cli/2.1.2 darwin-x64 node-v12.17.0
20
+ endpoints-sdk-cli/2.3.0 darwin-arm64 node-v18.3.0
21
21
  $ mes --help [COMMAND]
22
22
  USAGE
23
23
  $ mes COMMAND
@@ -49,12 +49,12 @@ DESCRIPTION
49
49
  1. make endpoints.config.json for version control.
50
50
 
51
51
  {
52
- "dependencies": {
53
- "service-name": {
54
- "version": "26177ed7e673daf0cc5a69e9793dd863424d272f",
55
- "repository": "git@github.com:[username/repository].git"
56
- }
57
- }
52
+ "dependencies": {
53
+ "service-name": {
54
+ "version": "26177ed7e673daf0cc5a69e9793dd863424d272f",
55
+ "repository": "git@github.com:[username/repository].git"
56
+ }
57
+ }
58
58
  }
59
59
 
60
60
  > service name is inferred from Repository name.
@@ -74,7 +74,7 @@ EXAMPLES
74
74
  $ mes add https://github.com/[username/repository].git
75
75
  ```
76
76
 
77
- _See code: [src/commands/add.ts](https://github.com/matsuri-tech/endpoints-sdk-cli/blob/v2.1.2/src/commands/add.ts)_
77
+ _See code: [src/commands/add.ts](https://github.com/matsuri-tech/endpoints-sdk-cli/blob/v2.3.0/src/commands/add.ts)_
78
78
 
79
79
  ## `mes help [COMMAND]`
80
80
 
@@ -91,7 +91,7 @@ OPTIONS
91
91
  --all see all commands in CLI
92
92
  ```
93
93
 
94
- _See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v3.2.0/src/commands/help.ts)_
94
+ _See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v3.3.1/src/commands/help.ts)_
95
95
 
96
96
  ## `mes install`
97
97
 
@@ -102,7 +102,7 @@ USAGE
102
102
  $ mes install
103
103
  ```
104
104
 
105
- _See code: [src/commands/install.ts](https://github.com/matsuri-tech/endpoints-sdk-cli/blob/v2.1.2/src/commands/install.ts)_
105
+ _See code: [src/commands/install.ts](https://github.com/matsuri-tech/endpoints-sdk-cli/blob/v2.3.0/src/commands/install.ts)_
106
106
 
107
107
  ## `mes update [SERVICE]`
108
108
 
@@ -113,7 +113,7 @@ USAGE
113
113
  $ mes update [SERVICE]
114
114
  ```
115
115
 
116
- _See code: [src/commands/update.ts](https://github.com/matsuri-tech/endpoints-sdk-cli/blob/v2.1.2/src/commands/update.ts)_
116
+ _See code: [src/commands/update.ts](https://github.com/matsuri-tech/endpoints-sdk-cli/blob/v2.3.0/src/commands/update.ts)_
117
117
  <!-- commandsstop -->
118
118
 
119
119
 
@@ -2,15 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Config = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const fs = tslib_1.__importStar(require("fs"));
6
- const path = tslib_1.__importStar(require("path"));
5
+ const fs = tslib_1.__importStar(require("node:fs"));
6
+ const path = tslib_1.__importStar(require("node:path"));
7
7
  const prettier = tslib_1.__importStar(require("prettier"));
8
8
  const unique_1 = require("../utils/unique");
9
9
  class Config {
10
10
  constructor() {
11
11
  this.dependencies = {};
12
12
  this.path = 'endpoints.config.json';
13
- this.output = path.resolve(fs.existsSync(path.resolve('./src')) ? './src/endpoints/' : './endpoints/');
13
+ this.output = fs.existsSync(path.resolve('./src')) ? './src/endpoints/' : './endpoints/';
14
14
  this.environment_identifier = 'process.env.NODE_ENV';
15
15
  if (fs.existsSync(this.path)) {
16
16
  const data = JSON.parse(fs.readFileSync(this.path).toString());
@@ -18,7 +18,7 @@ class Config {
18
18
  this.dependencies = data.dependencies;
19
19
  }
20
20
  if (data.output) {
21
- this.output = path.resolve(data.output);
21
+ this.output = data.output;
22
22
  }
23
23
  if (!fs.existsSync(this.output)) {
24
24
  fs.mkdirSync(this.output);
@@ -30,7 +30,7 @@ class Config {
30
30
  }
31
31
  push({ name, path, version, workspace }) {
32
32
  var _a, _b;
33
- const workspaces = unique_1.unique([
33
+ const workspaces = (0, unique_1.unique)([
34
34
  ...(((_b = (_a = this.dependencies) === null || _a === void 0 ? void 0 : _a[name]) === null || _b === void 0 ? void 0 : _b.workspaces) || []),
35
35
  workspace,
36
36
  ]).filter((w) => Boolean(w));
@@ -7,6 +7,7 @@ export interface Env {
7
7
  export interface Endpoint {
8
8
  path: string;
9
9
  desc: string;
10
+ method?: string;
10
11
  }
11
12
  export interface Api {
12
13
  [endpoint: string]: Endpoint;
@@ -2,9 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Repository = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const path = tslib_1.__importStar(require("path"));
6
- const child_process_1 = require("child_process");
7
- const fs = tslib_1.__importStar(require("fs"));
5
+ const path = tslib_1.__importStar(require("node:path"));
6
+ const node_child_process_1 = require("node:child_process");
7
+ const fs = tslib_1.__importStar(require("node:fs"));
8
8
  const rimraf_1 = tslib_1.__importDefault(require("rimraf"));
9
9
  class Repository {
10
10
  constructor(str) {
@@ -15,25 +15,26 @@ class Repository {
15
15
  this.cache = path.resolve(`./node_modules/.endpoints-tmp/${Math.random().toString(36).slice(-8)}`);
16
16
  }
17
17
  clone({ version, workspace = '' }) {
18
- child_process_1.execSync(`git clone --no-checkout --quiet ${this.path} ${this.cache}`);
18
+ (0, node_child_process_1.execSync)(`git clone --no-checkout --quiet ${this.path} ${this.cache}`);
19
19
  this.reset(version);
20
20
  this.hash = this.revParse();
21
21
  this.data = this.checkout(workspace);
22
22
  }
23
23
  checkout(workspace) {
24
24
  const file = path.resolve(this.cache, workspace, '.endpoints.json');
25
- child_process_1.execSync(`cd ${this.cache} && git checkout origin/master -- ${file}`);
25
+ const mainBranch = (0, node_child_process_1.execSync)(`cd ${this.cache}; git rev-parse --abbrev-ref origin/HEAD`).toString().trim();
26
+ (0, node_child_process_1.execSync)(`cd ${this.cache}; git checkout ${mainBranch} -- ${file}`);
26
27
  return JSON.parse(fs.readFileSync(file).toString());
27
28
  }
28
29
  revParse() {
29
- const hash = child_process_1.execSync(`cd ${this.cache}; git rev-parse HEAD`)
30
+ const hash = (0, node_child_process_1.execSync)(`cd ${this.cache}; git rev-parse HEAD`)
30
31
  .toString()
31
32
  .trim();
32
33
  return hash;
33
34
  }
34
35
  reset(version) {
35
36
  if (version && version !== 'latest') {
36
- child_process_1.execSync(`cd ${this.cache}; git reset --hard ${version}`);
37
+ (0, node_child_process_1.execSync)(`cd ${this.cache}; git reset --hard ${version}`);
37
38
  }
38
39
  }
39
40
  clean() {
@@ -12,7 +12,7 @@ class Add extends command_1.Command {
12
12
  try {
13
13
  repository.clone({ version, workspace });
14
14
  const config = new Config_1.Config();
15
- makeFiles_1.makeFiles({ repository, config, workspace });
15
+ (0, makeFiles_1.makeFiles)({ repository, config, workspace });
16
16
  config.push({
17
17
  name: repository.name,
18
18
  path: repository.path,
@@ -23,6 +23,7 @@ class Add extends command_1.Command {
23
23
  this.log(`${color_1.color.green('success')}: ${repository.name} updated!`);
24
24
  }
25
25
  catch (error) {
26
+ // @ts-expect-error
26
27
  this.error(color_1.color.red(error.stack));
27
28
  }
28
29
  finally {
@@ -13,22 +13,23 @@ class Install extends command_1.Command {
13
13
  if (!config.dependencies) {
14
14
  throw new Error('Dependencies property of the endpoints.config.json does not exist. Use the add command to add dependencies before installing');
15
15
  }
16
- Object.values(config.dependencies).forEach(({ repository: path, version, workspaces = [''] }) => {
17
- workspaces.forEach(workspace => {
16
+ for (const { repository: path, version, workspaces = [''] } of Object.values(config.dependencies)) {
17
+ for (const workspace of workspaces) {
18
18
  const repository = new Repository_1.Repository(path);
19
19
  repositories.push(repository);
20
20
  repository.clone({ version, workspace });
21
- makeFiles_1.makeFiles({ repository, workspace, config });
22
- });
23
- });
21
+ (0, makeFiles_1.makeFiles)({ repository, workspace, config });
22
+ }
23
+ }
24
24
  }
25
25
  catch (error) {
26
+ // @ts-expect-error
26
27
  this.error(color_1.color.red(error.message));
27
28
  }
28
29
  finally {
29
- repositories.forEach(repository => {
30
+ for (const repository of repositories) {
30
31
  repository.clean();
31
- });
32
+ }
32
33
  }
33
34
  }
34
35
  }
@@ -18,10 +18,10 @@ class Update extends command_1.Command {
18
18
  throw new Error('The service does not exist in the dependency. Check dependencies property of the endpoints.config.json. Or use the add command to add dependencies before installing');
19
19
  }
20
20
  const { repository: path, version, workspaces = [''] } = config.dependencies[args.service];
21
- workspaces.forEach(workspace => {
21
+ for (const workspace of workspaces) {
22
22
  const repository = new Repository_1.Repository(path);
23
23
  repository.clone({ version, workspace });
24
- makeFiles_1.makeFiles({ repository, config, workspace });
24
+ (0, makeFiles_1.makeFiles)({ repository, config, workspace });
25
25
  config.push({
26
26
  name: repository.name,
27
27
  path: repository.path,
@@ -29,16 +29,17 @@ class Update extends command_1.Command {
29
29
  workspace,
30
30
  });
31
31
  repositories.push(repository);
32
- });
32
+ }
33
33
  config.publish();
34
34
  }
35
35
  catch (error) {
36
+ // @ts-expect-error
36
37
  this.error(color_1.color.red(error.message));
37
38
  }
38
39
  finally {
39
- repositories.forEach(repository => {
40
+ for (const repository of repositories) {
40
41
  repository.clean();
41
- });
42
+ }
42
43
  }
43
44
  }
44
45
  }
package/lib/makeFiles.js CHANGED
@@ -2,20 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeFiles = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const path = tslib_1.__importStar(require("path"));
5
+ const path = tslib_1.__importStar(require("node:path"));
6
6
  const templates = tslib_1.__importStar(require("./templates"));
7
- const fs = tslib_1.__importStar(require("fs"));
7
+ const fs = tslib_1.__importStar(require("node:fs"));
8
8
  const format_1 = require("./utils/format");
9
9
  const makeName = (...args) => {
10
10
  return args.filter(e => Boolean(e)).join('.');
11
11
  };
12
- exports.makeFiles = ({ repository, workspace, config }) => {
12
+ const makeFiles = ({ repository, workspace, config }) => {
13
13
  const files = [];
14
- Object.entries(repository.data).forEach(([version, period]) => {
14
+ for (const [version, period] of Object.entries(repository.data)) {
15
15
  const content = templates.files.endpoints({ repository, version, period, config });
16
16
  const basename = makeName(repository.name, workspace, version);
17
17
  files.push({ version, basename });
18
- fs.writeFileSync(path.resolve(config.output, `${basename}.ts`), format_1.format(content));
19
- });
20
- fs.writeFileSync(path.resolve(config.output, `${makeName(repository.name, workspace)}.ts`), format_1.format(templates.files.index({ files, repository })));
18
+ fs.writeFileSync(path.resolve(config.output, `${basename}.ts`), (0, format_1.format)(content));
19
+ }
20
+ fs.writeFileSync(path.resolve(config.output, `${makeName(repository.name, workspace)}.ts`), (0, format_1.format)(templates.files.index({ files, repository })));
21
21
  };
22
+ exports.makeFiles = makeFiles;
@@ -4,14 +4,14 @@ exports.endpoints = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const templates = tslib_1.__importStar(require("../functions"));
6
6
  const camelCase_1 = require("../../utils/camelCase");
7
- exports.endpoints = ({ repository, version, period, config, }) => {
7
+ const endpoints = ({ repository, version, period, config, }) => {
8
8
  const names = [];
9
9
  const fns = Object.entries(period.api).map(([_name, endpoint]) => {
10
- const name = camelCase_1.camelCase(_name);
10
+ const name = (0, camelCase_1.camelCase)(_name);
11
11
  names.push(name);
12
12
  return templates.endpoint(name, endpoint);
13
13
  });
14
- const exportFns = `export const ${camelCase_1.camelCase(repository.name)}_${camelCase_1.camelCase(version)} = {${names.join(',')}}`;
14
+ const exportFns = `export const ${(0, camelCase_1.camelCase)(repository.name)}_${(0, camelCase_1.camelCase)(version)} = {${names.join(',')}}`;
15
15
  return [
16
16
  '/* eslint-disable */',
17
17
  templates.root({ period, config }),
@@ -19,3 +19,4 @@ exports.endpoints = ({ repository, version, period, config, }) => {
19
19
  exportFns,
20
20
  ].join('');
21
21
  };
22
+ exports.endpoints = endpoints;
@@ -2,15 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.indexFile = void 0;
4
4
  const camelCase_1 = require("../../utils/camelCase");
5
- exports.indexFile = ({ files, repository, }) => {
5
+ const indexFile = ({ files, repository, }) => {
6
6
  return `
7
7
  /* eslint-disable */
8
8
  ${files
9
9
  .map(({ version, basename }) => {
10
- return `import * as ${camelCase_1.camelCase(version)} from './${basename}'`;
10
+ return `import * as ${(0, camelCase_1.camelCase)(version)} from './${basename}'`;
11
11
  })
12
12
  .join('\n')}
13
- export const ${camelCase_1.camelCase(repository.name)} = {${files
14
- .map(({ version }) => camelCase_1.camelCase(version))
13
+ export const ${(0, camelCase_1.camelCase)(repository.name)} = {${files
14
+ .map(({ version }) => (0, camelCase_1.camelCase)(version))
15
15
  .join(',')}}`;
16
16
  };
17
+ exports.indexFile = indexFile;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.endpoint = void 0;
4
4
  const unique_1 = require("../../utils/unique");
5
5
  const isNumberLiteral = (str) => {
6
- return str && isFinite(Number(str));
6
+ return str && Number.isFinite(Number(str));
7
7
  };
8
8
  const detectType = (str) => {
9
9
  return isNumberLiteral(str) ? 'number' : 'string';
@@ -56,19 +56,19 @@ const makePathTemplate = (p) => {
56
56
  .join('/');
57
57
  return t.startsWith('/') ? t.slice(1) : t;
58
58
  };
59
- exports.endpoint = (name, e) => {
59
+ const endpoint = (name, e) => {
60
60
  const [path, queryParamsStr] = e.path.split('?');
61
61
  const queryParams = makeQueryParams(queryParamsStr);
62
62
  const pathParams = makePathParams(path);
63
63
  const queryParamNames = pickNames(queryParams);
64
64
  const pathParamNames = pickNames(pathParams);
65
- const paramNames = unique_1.unique([...queryParamNames, ...pathParamNames]);
66
- const params = unique_1.unique([...queryParams, ...pathParams]);
65
+ const paramNames = (0, unique_1.unique)([...queryParamNames, ...pathParamNames]);
66
+ const params = (0, unique_1.unique)([...queryParams, ...pathParams]);
67
67
  const QUERY_PARAMS_COMMENTS = makeQueryParamsComments(queryParams);
68
68
  const QUERY_PARAMS_OBJECT = `{${queryParamNames.join(',')}}`;
69
69
  const ARGUMENTS = makeArguments(params, paramNames, pathParamNames);
70
70
  const PATH_TEMPLATE = makePathTemplate(path);
71
- return `
71
+ return [`
72
72
  /**
73
73
  * ${e.desc}
74
74
  ${QUERY_PARAMS_COMMENTS}
@@ -84,6 +84,8 @@ exports.endpoint = (name, e) => {
84
84
  }).join("&");
85
85
  const __path = \`\${__root}/\${\`${PATH_TEMPLATE}\`}\`;
86
86
  return __queries ? \`\${__path}?\${__queries}\` : __path;
87
- }
88
- `;
87
+ };
88
+ `,
89
+ e.method ? `${name}.method='${e.method}'` : null].filter(Boolean).join('\n');
89
90
  };
91
+ exports.endpoint = endpoint;
@@ -4,13 +4,13 @@ exports.root = void 0;
4
4
  const normalizeName = (n) => {
5
5
  return n === 'dev' ?
6
6
  'development' :
7
- n === 'prod' ?
8
- 'production' : n;
7
+ (n === 'prod' ?
8
+ 'production' : n);
9
9
  };
10
10
  const normalizeUrl = (u) => {
11
11
  return u.endsWith('/') ? u.slice(0, -1) : u;
12
12
  };
13
- exports.root = ({ period, config }) => {
13
+ const root = ({ period, config }) => {
14
14
  const content = Object.entries(period.env).map(([n, u]) => {
15
15
  return `
16
16
  if(${config.environment_identifier}==="${normalizeName(n)}"){
@@ -28,3 +28,4 @@ exports.root = ({ period, config }) => {
28
28
  return __root
29
29
  }`;
30
30
  };
31
+ exports.root = root;
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.camelCase = void 0;
4
- exports.camelCase = (str) => {
4
+ const camelCase = (str) => {
5
5
  const tmp = str.charAt(0).toLowerCase() + str.slice(1);
6
- return tmp.replace(/[-_.](.)/g, (_, group1) => {
6
+ return tmp.replace(/[._-](.)/g, (_, group1) => {
7
7
  return group1.toUpperCase();
8
8
  });
9
9
  };
10
+ exports.camelCase = camelCase;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.format = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const prettier = tslib_1.__importStar(require("prettier"));
6
- exports.format = (content) => {
6
+ const format = (content) => {
7
7
  return prettier.format(content, { parser: 'typescript' });
8
8
  };
9
+ exports.format = format;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.unique = void 0;
4
- exports.unique = (arr) => {
5
- const a = arr.concat();
4
+ const unique = (arr) => {
5
+ const a = [...arr];
6
6
  for (let i = 0; i < a.length; ++i) {
7
7
  for (let j = i + 1; j < a.length; ++j) {
8
8
  if (a[i] === a[j]) {
@@ -12,3 +12,4 @@ exports.unique = (arr) => {
12
12
  }
13
13
  return a;
14
14
  };
15
+ exports.unique = unique;
@@ -1 +1 @@
1
- {"version":"2.1.2","commands":{"add":{"id":"add","description":"\nadd service to dependencies & make endpoints files.\n\n1. make endpoints.config.json for version control.\n\n{\n \"dependencies\": {\n \"service-name\": {\n \"version\": \"26177ed7e673daf0cc5a69e9793dd863424d272f\",\n \"repository\": \"git@github.com:[username/repository].git\"\n }\n }\n}\n\n> service name is inferred from Repository name.\n\n2. make src/endpoints/[service-name].ts\n","pluginName":"endpoints-sdk-cli","pluginType":"core","aliases":[],"examples":["$ mes add [username/repository]","$ mes add [username/repository] --version [commmit hash]","$ mes add [username/repository] -v [commmit hash]","$ mes add [username/repository] -v latest","$ mes add [username/repository] --workspace [workspace directory]","$ mes add [username/repository] -w [workspace directory]","$ mes add /Users/.../local-repository/","$ mes add ./local-repository","$ mes add git@github.com:[username/repository].git","$ mes add https://github.com/[username/repository].git"],"flags":{"version":{"name":"version","type":"option","char":"v","description":"latest or commit hash"},"workspace":{"name":"workspace","type":"option","char":"w","description":"a path to workspace containing .endpoints.json"}},"args":[{"name":"repository"}]},"install":{"id":"install","description":"generate endpoints files based on endpoints.config.json","pluginName":"endpoints-sdk-cli","pluginType":"core","aliases":[],"flags":{},"args":[]},"update":{"id":"update","description":"update service version & regenerate endpoints files","pluginName":"endpoints-sdk-cli","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"service"}]}}}
1
+ {"version":"2.3.0","commands":{"add":{"id":"add","description":"\nadd service to dependencies & make endpoints files.\n\n1. make endpoints.config.json for version control.\n\n{\n \"dependencies\": {\n \"service-name\": {\n \"version\": \"26177ed7e673daf0cc5a69e9793dd863424d272f\",\n \"repository\": \"git@github.com:[username/repository].git\"\n }\n }\n}\n\n> service name is inferred from Repository name.\n\n2. make src/endpoints/[service-name].ts\n","pluginName":"endpoints-sdk-cli","pluginType":"core","aliases":[],"examples":["$ mes add [username/repository]","$ mes add [username/repository] --version [commmit hash]","$ mes add [username/repository] -v [commmit hash]","$ mes add [username/repository] -v latest","$ mes add [username/repository] --workspace [workspace directory]","$ mes add [username/repository] -w [workspace directory]","$ mes add /Users/.../local-repository/","$ mes add ./local-repository","$ mes add git@github.com:[username/repository].git","$ mes add https://github.com/[username/repository].git"],"flags":{"version":{"name":"version","type":"option","char":"v","description":"latest or commit hash"},"workspace":{"name":"workspace","type":"option","char":"w","description":"a path to workspace containing .endpoints.json"}},"args":[{"name":"repository"}]},"install":{"id":"install","description":"generate endpoints files based on endpoints.config.json","pluginName":"endpoints-sdk-cli","pluginType":"core","aliases":[],"flags":{},"args":[]},"update":{"id":"update","description":"update service version & regenerate endpoints files","pluginName":"endpoints-sdk-cli","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"service"}]}}}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "endpoints-sdk-cli",
3
3
  "description": "endpoints sdk cli",
4
- "version": "2.1.2",
4
+ "version": "2.3.0",
5
5
  "author": "hrdtbs",
6
6
  "bin": {
7
7
  "mes": "./bin/run"
@@ -31,7 +31,7 @@
31
31
  "eslint-config-oclif": "^3.1",
32
32
  "eslint-config-oclif-typescript": "^0.2.0",
33
33
  "globby": "^11.0.1",
34
- "mocha": "^8.1.2",
34
+ "mocha": "^10.0.0",
35
35
  "nyc": "^15.1.0",
36
36
  "standard-version": "^9.0.0",
37
37
  "ts-node": "^9.0.0",