@kravc/dos 2.0.0-alpha.20 → 2.0.0-alpha.22

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.
@@ -1,7 +1,22 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Bash(npx ts-node:*)"
4
+ "Bash(npm outdated:*)",
5
+ "Bash(npm info:*)",
6
+ "Bash(npm pack:*)",
7
+ "Bash(node -e \"const m = require\\(''''/Users/ok/dev/dos/dos/node_modules/read-yaml-file''''\\); console.log\\(Object.keys\\(m\\)\\)\")",
8
+ "Bash(tar -tf read-yaml-file-3.0.0.tgz)",
9
+ "Bash(tar -xOf read-yaml-file-3.0.0.tgz package/index.js)",
10
+ "Bash(rm -f read-yaml-file-3.0.0.tgz)",
11
+ "Bash(tar -xOf z-schema-12.1.1.tgz package/package.json)",
12
+ "Bash(node -e \"const d=JSON.parse\\(require\\(''''fs''''\\).readFileSync\\(''''/dev/stdin'''',''''utf8''''\\)\\); console.log\\(''''type:'''', d.type, ''''main:'''', d.main, ''''exports:'''', JSON.stringify\\(d.exports, null, 2\\)\\)\")",
13
+ "Bash(rm -f z-schema-12.1.1.tgz)",
14
+ "Bash(npm install:*)",
15
+ "Bash(npx tsc:*)",
16
+ "Bash(node -e \"const ZSchema = require\\(''''/Users/ok/dev/dos/dos/node_modules/z-schema''''\\); console.log\\(Object.getOwnPropertyNames\\(ZSchema.prototype\\).join\\(''''\\\\n''''\\)\\)\")",
17
+ "Bash(node:*)",
18
+ "Bash(npx tsc@5.9.3 --noEmit)",
19
+ "Bash(npm test:*)"
5
20
  ]
6
21
  }
7
22
  }
package/bin/spec.js CHANGED
@@ -1,3 +1,22 @@
1
1
  #!/usr/bin/env node
2
- require('ts-node/register');
3
- require('../scripts/spec.ts');
2
+ 'use strict';
3
+
4
+ const { resolve } = require('path');
5
+ const { statSync } = require('fs');
6
+
7
+ const [,, servicePath] = process.argv;
8
+
9
+ if (!servicePath) {
10
+ process.stderr.write('Usage: spec <path-to-service>\n');
11
+ process.exit(1);
12
+ }
13
+
14
+ let fullPath = resolve(process.cwd(), servicePath);
15
+
16
+ if (statSync(fullPath).isDirectory()) {
17
+ fullPath = resolve(fullPath, 'index.js');
18
+ }
19
+
20
+ const { service } = require(fullPath);
21
+
22
+ process.stdout.write(JSON.stringify(service.spec, null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"ensureItem.d.ts","sourceRoot":"","sources":["../../../src/Service/test/ensureItem.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9D,4DAA4D;AAC5D,QAAA,MAAM,UAAU,GAAI,OAAO,KAAK,EAAE,OAAO,KAAK,SAG7C,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ensureItem.d.ts","sourceRoot":"","sources":["../../../src/Service/test/ensureItem.ts"],"names":[],"mappings":"AACA,OAAiB,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9D,4DAA4D;AAC5D,QAAA,MAAM,UAAU,GAAI,OAAO,KAAK,EAAE,OAAO,KAAK,SAG7C,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ /// <reference types="jest" />
6
7
  const findItem_1 = __importDefault(require("./findItem"));
7
8
  /** Ensures item to exists in a list for specified query. */
8
9
  const ensureItem = (items, query) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ensureItem.js","sourceRoot":"","sources":["../../../src/Service/test/ensureItem.ts"],"names":[],"mappings":";;;;;AAAA,0DAA8D;AAE9D,4DAA4D;AAC5D,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,KAAY,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC,CAAC;AAEF,kBAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ensureItem.js","sourceRoot":"","sources":["../../../src/Service/test/ensureItem.ts"],"names":[],"mappings":";;;;;AAAA,8BAA8B;AAC9B,0DAA8D;AAE9D,4DAA4D;AAC5D,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,KAAY,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC,CAAC;AAEF,kBAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensureNoItem.d.ts","sourceRoot":"","sources":["../../../src/Service/test/ensureNoItem.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9D,iEAAiE;AACjE,QAAA,MAAM,YAAY,GAAI,MAAM,KAAK,EAAE,OAAO,KAAK,SAG9C,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ensureNoItem.d.ts","sourceRoot":"","sources":["../../../src/Service/test/ensureNoItem.ts"],"names":[],"mappings":"AACA,OAAiB,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9D,iEAAiE;AACjE,QAAA,MAAM,YAAY,GAAI,MAAM,KAAK,EAAE,OAAO,KAAK,SAG9C,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ /// <reference types="jest" />
6
7
  const findItem_1 = __importDefault(require("./findItem"));
7
8
  /** Ensures item does not exist in a list for specified query. */
8
9
  const ensureNoItem = (data, query) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ensureNoItem.js","sourceRoot":"","sources":["../../../src/Service/test/ensureNoItem.ts"],"names":[],"mappings":";;;;;AAAA,0DAA8D;AAE9D,iEAAiE;AACjE,MAAM,YAAY,GAAG,CAAC,IAAW,EAAE,KAAY,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,kBAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ensureNoItem.js","sourceRoot":"","sources":["../../../src/Service/test/ensureNoItem.ts"],"names":[],"mappings":";;;;;AAAA,8BAA8B;AAC9B,0DAA8D;AAE9D,iEAAiE;AACjE,MAAM,YAAY,GAAG,CAAC,IAAW,EAAE,KAAY,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,kBAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"firstItemGet.d.ts","sourceRoot":"","sources":["../../../src/Service/test/firstItemGet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,4FAA4F;AAC5F,QAAA,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,eAAe,MAAM,EAAE,sBAAqB,OAAe,YAU9F,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"firstItemGet.d.ts","sourceRoot":"","sources":["../../../src/Service/test/firstItemGet.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,4FAA4F;AAC5F,QAAA,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,eAAe,MAAM,EAAE,sBAAqB,OAAe,YAU9F,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ /// <reference types="jest" />
3
4
  const lodash_1 = require("lodash");
4
5
  const schema_1 = require("@kravc/schema");
5
6
  /** Returns value or ensures specified attribute exists for the first item from the list. */
@@ -1 +1 @@
1
- {"version":3,"file":"firstItemGet.js","sourceRoot":"","sources":["../../../src/Service/test/firstItemGet.ts"],"names":[],"mappings":";;AAAA,mCAA6B;AAC7B,0CAAoC;AAGpC,4FAA4F;AAC5F,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,aAAqB,EAAE,sBAA+B,KAAK,EAAE,EAAE;IACjG,MAAM,CAAE,SAAS,CAAE,GAAG,KAAK,CAAC;IAE5B,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,IAAA,YAAG,EAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAEhC,OAAO,IAAA,YAAG,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,kBAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"firstItemGet.js","sourceRoot":"","sources":["../../../src/Service/test/firstItemGet.ts"],"names":[],"mappings":";;AAAA,8BAA8B;AAC9B,mCAA6B;AAC7B,0CAAoC;AAGpC,4FAA4F;AAC5F,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,aAAqB,EAAE,sBAA+B,KAAK,EAAE,EAAE;IACjG,MAAM,CAAE,SAAS,CAAE,GAAG,KAAK,CAAC;IAE5B,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,IAAA,YAAG,EAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAEhC,OAAO,IAAA,YAAG,EAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,kBAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useComposerMiddleware.d.ts","sourceRoot":"","sources":["../../src/Service/useComposerMiddleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAc1C,8DAA8D;AAC9D,QAAA,MAAM,qBAAqB,GAAI,UAAU,OAAO,EAAE,SAAS,OAAO;;;;;;QAqCjE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"useComposerMiddleware.d.ts","sourceRoot":"","sources":["../../src/Service/useComposerMiddleware.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAc1C,8DAA8D;AAC9D,QAAA,MAAM,qBAAqB,GAAI,UAAU,OAAO,EAAE,SAAS,OAAO;;;;;;QAqCjE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const read_yaml_file_1 = require("read-yaml-file");
3
+ const fs_1 = require("fs");
4
+ const js_yaml_1 = require("js-yaml");
4
5
  const useOasMiddleware_1 = require("./useOasMiddleware");
5
6
  const ROOT_PATH = process.cwd();
6
7
  const COMPOSER_FILES = [
@@ -18,7 +19,7 @@ const useComposerMiddleware = (_service, context) => {
18
19
  /** Returns specified composer source file. */
19
20
  const readFileJson = (httpPath) => {
20
21
  const fileName = httpPath.replace('/', '');
21
- const composerSource = (0, read_yaml_file_1.sync)(`${ROOT_PATH}/.composer/${fileName}`);
22
+ const composerSource = (0, js_yaml_1.load)((0, fs_1.readFileSync)(`${ROOT_PATH}/.composer/${fileName}`, 'utf8'));
22
23
  return JSON.stringify(composerSource, null, 2);
23
24
  };
24
25
  const isComposerPath = COMPOSER_FILES.includes(httpPath);
@@ -1 +1 @@
1
- {"version":3,"file":"useComposerMiddleware.js","sourceRoot":"","sources":["../../src/Service/useComposerMiddleware.ts"],"names":[],"mappings":";;AAAA,mDAAsC;AAEtC,yDAA0D;AAE1D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAEhC,MAAM,cAAc,GAAG;IACrB,aAAa;IACb,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;CACnB,CAAC;AAEF,8DAA8D;AAC9D,MAAM,qBAAqB,GAAG,CAAC,QAAiB,EAAE,OAAgB,EAAE,EAAE;IACpE,MAAM,EACJ,QAAQ,EACR,UAAU,EACV,aAAa,EACd,GAAG,OAAO,CAAC;IAEZ,MAAM,YAAY,GAAG,UAAU,KAAK,KAAK,CAAC;IAE1C,8CAA8C;IAC9C,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,IAAA,qBAAI,EAAC,GAAG,SAAS,cAAc,QAAQ,EAAE,CAAC,CAAC;QAElE,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzD,MAAM,0BAA0B,GAC9B,aAAa;QACb,YAAY;QACZ,cAAc,CAAC;IAEjB,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO;QACL,OAAO,EAAE;YACP,cAAc,EAAE,4BAAS;SAC1B;QACD,UAAU,EAAE,4BAAS;QACrB,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"useComposerMiddleware.js","sourceRoot":"","sources":["../../src/Service/useComposerMiddleware.ts"],"names":[],"mappings":";;AAAA,2BAAkC;AAClC,qCAA+B;AAE/B,yDAA0D;AAE1D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAEhC,MAAM,cAAc,GAAG;IACrB,aAAa;IACb,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;CACnB,CAAC;AAEF,8DAA8D;AAC9D,MAAM,qBAAqB,GAAG,CAAC,QAAiB,EAAE,OAAgB,EAAE,EAAE;IACpE,MAAM,EACJ,QAAQ,EACR,UAAU,EACV,aAAa,EACd,GAAG,OAAO,CAAC;IAEZ,MAAM,YAAY,GAAG,UAAU,KAAK,KAAK,CAAC;IAE1C,8CAA8C;IAC9C,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,IAAA,cAAI,EAAC,IAAA,iBAAY,EAAC,GAAG,SAAS,cAAc,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAExF,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzD,MAAM,0BAA0B,GAC9B,aAAa;QACb,YAAY;QACZ,cAAc,CAAC;IAEjB,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO;QACL,OAAO,EAAE;YACP,cAAc,EAAE,4BAAS;SAC1B;QACD,UAAU,EAAE,4BAAS;QACrB,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kravc/dos",
3
- "version": "2.0.0-alpha.20",
3
+ "version": "2.0.0-alpha.22",
4
4
  "description": "Convention-based, easy-to-use library for building API-driven serverless services.",
5
5
  "keywords": [
6
6
  "Service",
@@ -24,7 +24,6 @@
24
24
  "src": "src"
25
25
  },
26
26
  "scripts": {
27
- "spec": "npx ts-node scripts/spec.ts ./example",
28
27
  "start": "npx http example/index.ts",
29
28
  "test": "eslint --fix src/ example/ && jest --coverage",
30
29
  "prebuild": "rimraf dist",
@@ -36,13 +35,13 @@
36
35
  "author": "Oleksandr Kravets <a@kra.vc>",
37
36
  "license": "ISC",
38
37
  "dependencies": {
39
- "@kravc/schema": "^2.8.0",
38
+ "@kravc/schema": "^2.8.3",
40
39
  "@types/jsonwebtoken": "^9.0.10",
41
40
  "cookie": "^1.1.1",
41
+ "js-yaml": "^4.1.1",
42
42
  "jsonwebtoken": "^9.0.3",
43
43
  "lodash": "^4.17.23",
44
44
  "pluralize": "^8.0.0",
45
- "read-yaml-file": "^2.1.0",
46
45
  "safe-stable-stringify": "^2.5.0",
47
46
  "ulid": "^3.0.2",
48
47
  "z-schema": "^6.0.2"
@@ -51,6 +50,7 @@
51
50
  "@eslint/js": "^10.0.1",
52
51
  "@kravc/http": "^0.5.0",
53
52
  "@types/jest": "^30.0.0",
53
+ "@types/js-yaml": "^4.0.9",
54
54
  "@types/lodash": "^4.17.23",
55
55
  "@types/pluralize": "^0.0.33",
56
56
  "eslint": "^10.0.1",
@@ -61,7 +61,7 @@
61
61
  "rimraf": "^6.1.3",
62
62
  "ts-jest": "^29.4.6",
63
63
  "ts-node": "^10.9.2",
64
- "typescript": "^5.9.3",
64
+ "typescript": "^6.0.2",
65
65
  "typescript-eslint": "^8.56.0"
66
66
  }
67
67
  }
@@ -1,3 +1,4 @@
1
+ /// <reference types="jest" />
1
2
  import findItem, { type Items, type Query } from './findItem';
2
3
 
3
4
  /** Ensures item to exists in a list for specified query. */
@@ -1,3 +1,4 @@
1
+ /// <reference types="jest" />
1
2
  import findItem, { type Items, type Query } from './findItem';
2
3
 
3
4
  /** Ensures item does not exist in a list for specified query. */
@@ -1,3 +1,4 @@
1
+ /// <reference types="jest" />
1
2
  import { get } from 'lodash';
2
3
  import { got } from '@kravc/schema';
3
4
  import { type Items } from './findItem';
@@ -1,4 +1,5 @@
1
- import { sync } from 'read-yaml-file';
1
+ import { readFileSync } from 'fs';
2
+ import { load } from 'js-yaml';
2
3
  import type { Context } from '../Context';
3
4
  import { OK_STATUS, JSON_TYPE } from './useOasMiddleware';
4
5
 
@@ -26,7 +27,7 @@ const useComposerMiddleware = (_service: unknown, context: Context) => {
26
27
  /** Returns specified composer source file. */
27
28
  const readFileJson = (httpPath: string) => {
28
29
  const fileName = httpPath.replace('/', '');
29
- const composerSource = sync(`${ROOT_PATH}/.composer/${fileName}`);
30
+ const composerSource = load(readFileSync(`${ROOT_PATH}/.composer/${fileName}`, 'utf8'));
30
31
 
31
32
  return JSON.stringify(composerSource, null, 2);
32
33
  };
package/scripts/spec.ts DELETED
@@ -1,23 +0,0 @@
1
- #!/usr/bin/env ts-node
2
- 'use strict';
3
-
4
- import { resolve } from 'path';
5
- import { statSync } from 'fs';
6
-
7
- const [,, servicePath] = process.argv;
8
-
9
- if (!servicePath) {
10
- process.stderr.write('Usage: specs <path-to-service>\n');
11
- process.exit(1);
12
- }
13
-
14
- let fullPath = resolve(process.cwd(), servicePath);
15
-
16
- if (statSync(fullPath).isDirectory()) {
17
- fullPath = resolve(fullPath, 'index.ts');
18
- }
19
-
20
- // eslint-disable-next-line @typescript-eslint/no-require-imports
21
- const { service } = require(fullPath);
22
-
23
- process.stdout.write(JSON.stringify(service.spec, null, 2));