@nospt/backstage-plugin-apigee-backend 1.1.0-rc2

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.
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ var fetchUtils = require('./fetch-utils.cjs.js');
4
+
5
+ class SharedflowClient {
6
+ constructor(auth) {
7
+ this.auth = auth;
8
+ }
9
+ auth;
10
+ /**
11
+ * Lists all sharedflows in the given Apigee organisation.
12
+ */
13
+ async listSharedflows(org) {
14
+ const url = `https://apigee.googleapis.com/v1/organizations/${encodeURIComponent(org)}/sharedflows`;
15
+ const body = await fetchUtils.fetchWithRetry(url, () => this.auth.getAccessToken());
16
+ return body.sharedFlows ?? [];
17
+ }
18
+ }
19
+
20
+ exports.SharedflowClient = SharedflowClient;
21
+ //# sourceMappingURL=sharedflow-client.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedflow-client.cjs.js","sources":["../../src/lib/sharedflow-client.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\r\nimport { GoogleAuth } from 'google-auth-library';\r\nimport { fetchWithRetry } from './fetch-utils';\r\n\r\n/**\r\n * Minimal representation of an Apigee sharedflow as returned by\r\n * GET /v1/organizations/{org}/sharedflows\r\n */\r\nexport interface ApigeeSharedflow {\r\n name: string;\r\n latestRevisionId?: string;\r\n metaData?: {\r\n createdAt?: string;\r\n lastModifiedAt?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Client for the Apigee Management API's sharedflow endpoints.\r\n */\r\nexport class SharedflowClient {\r\n constructor(private readonly auth: GoogleAuth) {}\r\n\r\n /**\r\n * Lists all sharedflows in the given Apigee organisation.\r\n */\r\n async listSharedflows(org: string): Promise<ApigeeSharedflow[]> {\r\n const url = `https://apigee.googleapis.com/v1/organizations/${encodeURIComponent(org)}/sharedflows`;\r\n const body = await fetchWithRetry(url, () => this.auth.getAccessToken());\r\n return (body as { sharedFlows?: ApigeeSharedflow[] }).sharedFlows ?? [];\r\n }\r\n}\r\n"],"names":["fetchWithRetry"],"mappings":";;;;AAoBO,MAAM,gBAAA,CAAiB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,MAAM,gBAAgB,GAAA,EAA0C;AAC9D,IAAA,MAAM,GAAA,GAAM,CAAA,+CAAA,EAAkD,kBAAA,CAAmB,GAAG,CAAC,CAAA,YAAA,CAAA;AACrF,IAAA,MAAM,IAAA,GAAO,MAAMA,yBAAA,CAAe,GAAA,EAAK,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAgB,CAAA;AACvE,IAAA,OAAQ,IAAA,CAA8C,eAAe,EAAC;AAAA,EACxE;AACF;;;;"}
@@ -0,0 +1,93 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var alpha = require('@backstage/plugin-catalog-node/alpha');
5
+ var googleAuthLibrary = require('google-auth-library');
6
+ var apigeeClient = require('./lib/apigee-client.cjs.js');
7
+ var apiHubClient = require('./lib/api-hub-client.cjs.js');
8
+ var sharedflowClient = require('./lib/sharedflow-client.cjs.js');
9
+ var entityProvider = require('./lib/entity-provider.cjs.js');
10
+ var apigeeStitchingProcessor = require('./lib/apigee-stitching-processor.cjs.js');
11
+
12
+ const catalogModuleApigee = backendPluginApi.createBackendModule({
13
+ pluginId: "catalog",
14
+ moduleId: "apigee-catalog",
15
+ register(env) {
16
+ env.registerInit({
17
+ deps: {
18
+ catalog: alpha.catalogProcessingExtensionPoint,
19
+ scheduler: backendPluginApi.coreServices.scheduler,
20
+ logger: backendPluginApi.coreServices.logger,
21
+ config: backendPluginApi.coreServices.rootConfig
22
+ },
23
+ async init({ catalog, scheduler, logger, config }) {
24
+ let orgs;
25
+ try {
26
+ orgs = config.getConfigArray("apigee.orgs");
27
+ } catch {
28
+ throw new Error(
29
+ 'Apigee catalog module misconfigured: "apigee.orgs" is required in app-config.yaml.\nExample:\n apigee:\n orgs:\n - name: my-org\n projectId: my-gcp-project'
30
+ );
31
+ }
32
+ if (orgs.length === 0) {
33
+ throw new Error(
34
+ 'Apigee catalog module misconfigured: "apigee.orgs" must contain at least one entry.'
35
+ );
36
+ }
37
+ logger.info(
38
+ `[catalog-module-apigee] Initialized with ${orgs.length} org(s): ` + orgs.map((o) => o.getString("name")).join(", ")
39
+ );
40
+ const scheduleConfig = config.has("apigee.schedule") ? backendPluginApi.readSchedulerServiceTaskScheduleDefinitionFromConfig(
41
+ config.getConfig("apigee.schedule")
42
+ ) : {
43
+ frequency: { minutes: 60 },
44
+ timeout: { minutes: 10 },
45
+ initialDelay: { seconds: 30 }
46
+ };
47
+ const taskRunner = scheduler.createScheduledTaskRunner(scheduleConfig);
48
+ const auth = new googleAuthLibrary.GoogleAuth({
49
+ scopes: ["https://www.googleapis.com/auth/cloud-platform"]
50
+ });
51
+ const apigeeClient$1 = new apigeeClient.ApigeeClient(auth);
52
+ const apiHubClient$1 = new apiHubClient.ApiHubClient(
53
+ auth,
54
+ "",
55
+ config.getOptionalString("apigee.apiHubLocation") ?? "global"
56
+ );
57
+ const sharedflowClient$1 = new sharedflowClient.SharedflowClient(auth);
58
+ const orgsConfig = orgs.map((orgCfg) => ({
59
+ name: orgCfg.getString("name"),
60
+ projectId: orgCfg.getString("projectId"),
61
+ environments: orgCfg.has("environments") ? orgCfg.getStringArray("environments") : void 0,
62
+ githubOrgSlug: orgCfg.getOptionalString("githubOrgSlug"),
63
+ // D-01: explicit proxy-name -> API Hub apiId overrides per org
64
+ apiHubMappings: orgCfg.has("apiHubMappings") ? orgCfg.getConfig("apiHubMappings").get() : void 0
65
+ }));
66
+ const provider = new entityProvider.ApigeeEntityProvider(
67
+ taskRunner,
68
+ logger,
69
+ orgsConfig,
70
+ apigeeClient$1,
71
+ apiHubClient$1,
72
+ sharedflowClient$1,
73
+ {
74
+ defaultOwner: config.getOptionalString("apigee.defaultOwner"),
75
+ // D-03: inline spec size guard (bytes); provider falls back to 512000
76
+ specMaxBytes: config.getOptionalNumber("apigee.specMaxBytes"),
77
+ // Optional env→lifecycle map; when set the provider derives a proxy's
78
+ // lifecycle from its deployed environments instead of a flat 'production'.
79
+ environmentLifecycle: config.has("apigee.environmentLifecycle") ? config.getConfig("apigee.environmentLifecycle").get() : void 0
80
+ }
81
+ );
82
+ catalog.addEntityProvider(provider);
83
+ catalog.addProcessor(new apigeeStitchingProcessor.ApigeeStitchingProcessor(logger));
84
+ logger.info(
85
+ "[catalog-module-apigee] Registered Apigee stitching processor"
86
+ );
87
+ }
88
+ });
89
+ }
90
+ });
91
+
92
+ exports.catalogModuleApigee = catalogModuleApigee;
93
+ //# sourceMappingURL=module.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\r\nimport {\r\n coreServices,\r\n createBackendModule,\r\n readSchedulerServiceTaskScheduleDefinitionFromConfig,\r\n} from '@backstage/backend-plugin-api';\r\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\r\nimport { GoogleAuth } from 'google-auth-library';\r\nimport { ApigeeClient } from './lib/apigee-client';\r\nimport { ApiHubClient } from './lib/api-hub-client';\r\nimport { SharedflowClient } from './lib/sharedflow-client';\r\nimport { ApigeeEntityProvider } from './lib/entity-provider';\r\nimport { ApigeeStitchingProcessor } from './lib/apigee-stitching-processor';\r\n\r\n/**\r\n * Backstage catalog backend module for Apigee API discovery.\r\n * Plugs into the catalog backend and registers Apigee proxies + API Hub\r\n * definitions as Backstage API entities.\r\n */\r\nexport const catalogModuleApigee = createBackendModule({\r\n pluginId: 'catalog',\r\n moduleId: 'apigee-catalog',\r\n register(env) {\r\n env.registerInit({\r\n deps: {\r\n catalog: catalogProcessingExtensionPoint,\r\n scheduler: coreServices.scheduler,\r\n logger: coreServices.logger,\r\n config: coreServices.rootConfig,\r\n },\r\n async init({ catalog, scheduler, logger, config }) {\r\n // AUTH-03: Fail fast if apigee.orgs is missing or empty.\r\n let orgs: ReturnType<typeof config.getConfigArray>;\r\n try {\r\n orgs = config.getConfigArray('apigee.orgs');\r\n } catch {\r\n throw new Error(\r\n 'Apigee catalog module misconfigured: \"apigee.orgs\" is required in app-config.yaml.\\n' +\r\n 'Example:\\n' +\r\n ' apigee:\\n' +\r\n ' orgs:\\n' +\r\n ' - name: my-org\\n' +\r\n ' projectId: my-gcp-project',\r\n );\r\n }\r\n if (orgs.length === 0) {\r\n throw new Error(\r\n 'Apigee catalog module misconfigured: \"apigee.orgs\" must contain at least one entry.',\r\n );\r\n }\r\n logger.info(\r\n `[catalog-module-apigee] Initialized with ${orgs.length} org(s): ` +\r\n orgs.map(o => o.getString('name')).join(', '),\r\n );\r\n\r\n // Build task schedule — prefer apigee.schedule config, fall back to 60-min default\r\n const scheduleConfig = config.has('apigee.schedule')\r\n ? readSchedulerServiceTaskScheduleDefinitionFromConfig(\r\n config.getConfig('apigee.schedule'),\r\n )\r\n : {\r\n frequency: { minutes: 60 },\r\n timeout: { minutes: 10 },\r\n initialDelay: { seconds: 30 },\r\n };\r\n const taskRunner = scheduler.createScheduledTaskRunner(scheduleConfig);\r\n\r\n // Shared GoogleAuth instance (AUTH-01: GCP Application Default Credentials)\r\n const auth = new GoogleAuth({\r\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\r\n });\r\n\r\n // Instantiate clients (ApiHubClient: no projectId needed; provided per-call by entity provider)\r\n const apigeeClient = new ApigeeClient(auth);\r\n const apiHubClient = new ApiHubClient(\r\n auth,\r\n '',\r\n config.getOptionalString('apigee.apiHubLocation') ?? 'global',\r\n );\r\n const sharedflowClient = new SharedflowClient(auth);\r\n\r\n // Build orgsConfig from config\r\n const orgsConfig = orgs.map(orgCfg => ({\r\n name: orgCfg.getString('name'),\r\n projectId: orgCfg.getString('projectId'),\r\n environments: orgCfg.has('environments')\r\n ? orgCfg.getStringArray('environments')\r\n : undefined,\r\n githubOrgSlug: orgCfg.getOptionalString('githubOrgSlug'),\r\n // D-01: explicit proxy-name -> API Hub apiId overrides per org\r\n apiHubMappings: orgCfg.has('apiHubMappings')\r\n ? (orgCfg.getConfig('apiHubMappings').get() as Record<string, string>)\r\n : undefined,\r\n }));\r\n\r\n // Register the entity provider with the catalog\r\n const provider = new ApigeeEntityProvider(\r\n taskRunner,\r\n logger,\r\n orgsConfig,\r\n apigeeClient,\r\n apiHubClient,\r\n sharedflowClient,\r\n {\r\n defaultOwner: config.getOptionalString('apigee.defaultOwner'),\r\n // D-03: inline spec size guard (bytes); provider falls back to 512000\r\n specMaxBytes: config.getOptionalNumber('apigee.specMaxBytes'),\r\n // Optional env→lifecycle map; when set the provider derives a proxy's\r\n // lifecycle from its deployed environments instead of a flat 'production'.\r\n environmentLifecycle: config.has('apigee.environmentLifecycle')\r\n ? (config\r\n .getConfig('apigee.environmentLifecycle')\r\n .get() as Record<string, string>)\r\n : undefined,\r\n },\r\n );\r\n catalog.addEntityProvider(provider);\r\n\r\n // Phase 4 (STITCH-01): register the repository-stitching processor so\r\n // annotated backend Components are linked to their proxy API entities.\r\n catalog.addProcessor(new ApigeeStitchingProcessor(logger));\r\n logger.info(\r\n '[catalog-module-apigee] Registered Apigee stitching processor',\r\n );\r\n },\r\n });\r\n },\r\n});\r\n\r\n"],"names":["createBackendModule","catalogProcessingExtensionPoint","coreServices","readSchedulerServiceTaskScheduleDefinitionFromConfig","GoogleAuth","apigeeClient","ApigeeClient","apiHubClient","ApiHubClient","sharedflowClient","SharedflowClient","ApigeeEntityProvider","ApigeeStitchingProcessor"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
5
+ var router = require('./router.cjs.js');
6
+
7
+ const apigeePlugin = backendPluginApi.createBackendPlugin({
8
+ pluginId: "apigee",
9
+ register(env) {
10
+ env.registerInit({
11
+ deps: {
12
+ httpRouter: backendPluginApi.coreServices.httpRouter,
13
+ logger: backendPluginApi.coreServices.logger,
14
+ config: backendPluginApi.coreServices.rootConfig
15
+ },
16
+ async init({ httpRouter, logger, config }) {
17
+ const router$1 = await router.createRouter({ logger });
18
+ const middleware = rootHttpRouter.MiddlewareFactory.create({ config, logger });
19
+ router$1.use(middleware.notFound());
20
+ router$1.use(middleware.error);
21
+ httpRouter.use(router$1);
22
+ }
23
+ });
24
+ }
25
+ });
26
+
27
+ exports.apigeePlugin = apigeePlugin;
28
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\r\nimport {\r\n coreServices,\r\n createBackendPlugin,\r\n} from '@backstage/backend-plugin-api';\r\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\r\nimport { createRouter } from './router';\r\n\r\nexport const apigeePlugin = createBackendPlugin({\r\n pluginId: 'apigee',\r\n register(env) {\r\n env.registerInit({\r\n deps: {\r\n httpRouter: coreServices.httpRouter,\r\n logger: coreServices.logger,\r\n config: coreServices.rootConfig,\r\n },\r\n async init({ httpRouter, logger, config }) {\r\n const router = await createRouter({ logger });\r\n const middleware = MiddlewareFactory.create({ config, logger });\r\n\r\n router.use(middleware.notFound());\r\n router.use(middleware.error);\r\n\r\n httpRouter.use(router);\r\n },\r\n });\r\n },\r\n});\r\n"],"names":["createBackendPlugin","coreServices","router","createRouter","MiddlewareFactory"],"mappings":";;;;;;AAQO,MAAM,eAAeA,oCAAA,CAAoB;AAAA,EAC9C,QAAA,EAAU,QAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,YAAYC,6BAAA,CAAa,UAAA;AAAA,QACzB,QAAQA,6BAAA,CAAa,MAAA;AAAA,QACrB,QAAQA,6BAAA,CAAa;AAAA,OACvB;AAAA,MACA,MAAM,IAAA,CAAK,EAAE,UAAA,EAAY,MAAA,EAAQ,QAAO,EAAG;AACzC,QAAA,MAAMC,QAAA,GAAS,MAAMC,mBAAA,CAAa,EAAE,QAAQ,CAAA;AAC5C,QAAA,MAAM,aAAaC,gCAAA,CAAkB,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAE9D,QAAAF,QAAA,CAAO,GAAA,CAAI,UAAA,CAAW,QAAA,EAAU,CAAA;AAChC,QAAAA,QAAA,CAAO,GAAA,CAAI,WAAW,KAAK,CAAA;AAE3B,QAAA,UAAA,CAAW,IAAIA,QAAM,CAAA;AAAA,MACvB;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var express = require('express');
4
+
5
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
6
+
7
+ var express__default = /*#__PURE__*/_interopDefaultCompat(express);
8
+
9
+ async function createRouter({
10
+ logger
11
+ }) {
12
+ const router = express__default.default.Router();
13
+ router.use(express__default.default.json());
14
+ router.get("/health", (_req, res) => {
15
+ logger.debug("Serving Apigee bootstrap health response");
16
+ res.json({ status: "ok", pluginId: "apigee" });
17
+ });
18
+ router.get("/hello", (_req, res) => {
19
+ logger.info("Serving Apigee hello response");
20
+ res.json({ message: "Hello from the Apigee backend!", timestamp: (/* @__PURE__ */ new Date()).toISOString() });
21
+ });
22
+ return router;
23
+ }
24
+
25
+ exports.createRouter = createRouter;
26
+ //# sourceMappingURL=router.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.cjs.js","sources":["../src/router.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\r\nimport { LoggerService } from '@backstage/backend-plugin-api';\r\nimport express from 'express';\r\n\r\ntype RouterOptions = {\r\n logger: LoggerService;\r\n};\r\n\r\nexport async function createRouter({\r\n logger,\r\n}: RouterOptions): Promise<express.Router> {\r\n const router = express.Router();\r\n\r\n router.use(express.json());\r\n\r\n router.get('/health', (_req, res) => {\r\n logger.debug('Serving Apigee bootstrap health response');\r\n res.json({ status: 'ok', pluginId: 'apigee' });\r\n });\r\n\r\n router.get('/hello', (_req, res) => {\r\n logger.info('Serving Apigee hello response');\r\n res.json({ message: 'Hello from the Apigee backend!', timestamp: new Date().toISOString() });\r\n });\r\n\r\n return router;\r\n}\r\n"],"names":["express"],"mappings":";;;;;;;;AAQA,eAAsB,YAAA,CAAa;AAAA,EACjC;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,MAAA,GAASA,yBAAQ,MAAA,EAAO;AAE9B,EAAA,MAAA,CAAO,GAAA,CAAIA,wBAAA,CAAQ,IAAA,EAAM,CAAA;AAEzB,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,CAAC,IAAA,EAAM,GAAA,KAAQ;AACnC,IAAA,MAAA,CAAO,MAAM,0CAA0C,CAAA;AACvD,IAAA,GAAA,CAAI,KAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/C,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,CAAC,IAAA,EAAM,GAAA,KAAQ;AAClC,IAAA,MAAA,CAAO,KAAK,+BAA+B,CAAA;AAC3C,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,OAAA,EAAS,gCAAA,EAAkC,SAAA,EAAA,qBAAe,IAAA,EAAK,EAAE,WAAA,EAAY,EAAG,CAAA;AAAA,EAC7F,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;;"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@nospt/backstage-plugin-apigee-backend",
3
+ "version": "1.1.0-rc2",
4
+ "license": "Apache-2.0",
5
+ "description": "Backstage backend plugin bootstrap for Apigee integration",
6
+ "author": "NOS SGPS, S.A.",
7
+ "homepage": "https://github.com/nosportugal/backstage-plugin-apigee#readme",
8
+ "keywords": [
9
+ "backstage",
10
+ "backstage-plugin",
11
+ "apigee"
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/nosportugal/backstage-plugin-apigee",
16
+ "directory": "plugins/apigee-backend"
17
+ },
18
+ "main": "dist/index.cjs.js",
19
+ "types": "dist/index.d.ts",
20
+ "publishConfig": {
21
+ "access": "public",
22
+ "main": "dist/index.cjs.js",
23
+ "types": "dist/index.d.ts"
24
+ },
25
+ "backstage": {
26
+ "role": "backend-plugin",
27
+ "pluginId": "apigee",
28
+ "pluginPackages": [
29
+ "@nospt/backstage-plugin-apigee",
30
+ "@nospt/backstage-plugin-apigee-backend",
31
+ "@nospt/backstage-plugin-apigee-common"
32
+ ],
33
+ "features": {
34
+ ".": "@backstage/BackendFeature"
35
+ }
36
+ },
37
+ "scripts": {
38
+ "start": "backstage-cli package start",
39
+ "build": "backstage-cli package build",
40
+ "lint": "backstage-cli package lint",
41
+ "test": "backstage-cli package test",
42
+ "clean": "backstage-cli package clean",
43
+ "prepack": "backstage-cli package prepack",
44
+ "postpack": "backstage-cli package postpack"
45
+ },
46
+ "dependencies": {
47
+ "@backstage/backend-defaults": "^0.16.0",
48
+ "@backstage/backend-plugin-api": "^1.8.0",
49
+ "@backstage/catalog-model": "^1.7.3",
50
+ "@backstage/plugin-catalog-node": "^1.13.0",
51
+ "@nospt/backstage-plugin-apigee-common": "^1.1.0-rc2",
52
+ "express": "^4.17.1",
53
+ "google-auth-library": "^9.15.1",
54
+ "node-fetch": "^2.7.0"
55
+ },
56
+ "devDependencies": {
57
+ "@backstage/backend-test-utils": "^1.11.1",
58
+ "@backstage/cli": "^0.36.0",
59
+ "@types/express": "^4.17.6",
60
+ "@types/jest": "^30.0.0",
61
+ "@types/node-fetch": "^2.6.12",
62
+ "@types/supertest": "^2.0.12",
63
+ "nock": "^13.5.6",
64
+ "supertest": "^6.2.4"
65
+ },
66
+ "files": [
67
+ "dist",
68
+ "config.d.ts",
69
+ "README.md"
70
+ ],
71
+ "typesVersions": {
72
+ "*": {
73
+ "package.json": [
74
+ "package.json"
75
+ ]
76
+ }
77
+ }
78
+ }