@restorecommerce/facade 1.3.0 → 1.3.2

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/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.3.2](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@1.3.1...@restorecommerce/facade@1.3.2) (2023-06-14)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **facade:** dev:serve script ([b971bec](https://github.com/restorecommerce/libs/commit/b971bec598a388ccbe273d41f68560c16f0ba1c3))
12
+
13
+
14
+
15
+
16
+
17
+ ## [1.3.1](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@1.3.0...@restorecommerce/facade@1.3.1) (2023-06-12)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * **facade:** add postinstall script ([20af900](https://github.com/restorecommerce/libs/commit/20af900e89854fa4ad733ce44b41ad3647b4ada5))
23
+
24
+
25
+
26
+
27
+
6
28
  # [1.3.0](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@1.2.0...@restorecommerce/facade@1.3.0) (2023-06-12)
7
29
 
8
30
 
@@ -67,16 +67,11 @@ export const preprocessGQLInput = (data, model) => __awaiter(void 0, void 0, voi
67
67
  const stream = upload.createReadStream();
68
68
  const chunks = [];
69
69
  try {
70
- for (var _d = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield stream_1.next(), _a = stream_1_1.done, !_a;) {
70
+ for (var _d = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield stream_1.next(), _a = stream_1_1.done, !_a; _d = true) {
71
71
  _c = stream_1_1.value;
72
72
  _d = false;
73
- try {
74
- let chunk = _c;
75
- chunks.push(chunk);
76
- }
77
- finally {
78
- _d = true;
79
- }
73
+ let chunk = _c;
74
+ chunks.push(chunk);
80
75
  }
81
76
  }
82
77
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -1,6 +1,7 @@
1
1
  import { GraphQLBoolean, GraphQLFloat, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, } from 'graphql';
2
2
  import { GraphQLEnumType, GraphQLInputObjectType, GraphQLScalarType } from 'graphql/type/definition.js';
3
- import GraphQLUpload from 'graphql-upload/GraphQLUpload.js';
3
+ // import GraphQLUpload from 'graphql-upload/GraphQLUpload.js';
4
+ import GraphQLUpload from 'graphql-upload/GraphQLUpload.mjs';
4
5
  import { capitalizeProtoName } from './utils.js';
5
6
  import { authSubjectType } from './types.js';
6
7
  import { FieldDescriptorProto_Label, FieldDescriptorProto_Type } from 'ts-proto-descriptors';
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ import compose from 'koa-compose';
31
31
  import { setUseSubscriptions } from './gql/protos/utils.js';
32
32
  import bodyParser from 'koa-bodyparser';
33
33
  import cors from '@koa/cors';
34
+ import graphqlUploadKoa from 'graphql-upload/graphqlUploadKoa.mjs';
34
35
  export * from './modules/index.js';
35
36
  export * from './middlewares/index.js';
36
37
  export * from './interfaces.js';
@@ -264,6 +265,11 @@ export class RestoreCommerceFacade {
264
265
  },
265
266
  });
266
267
  yield gqlServer.start();
268
+ // TODO set maxFile size and maximum files via config
269
+ this.koa.use(graphqlUploadKoa({
270
+ maxFileSize: 10000000,
271
+ maxFiles: 20,
272
+ }));
267
273
  this.koa.use(cors());
268
274
  this.koa.use(bodyParser());
269
275
  this.koa.use(koaMiddleware(gqlServer, {
@@ -7,14 +7,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import LRU from 'lru-cache';
10
+ import { LRUCache } from 'lru-cache';
11
11
  import { epochTime } from './utils.js';
12
12
  export class InMemoryAdapter {
13
13
  constructor(type) {
14
14
  this.type = type;
15
- this.tokenStorage = new LRU({ max: 1000 });
16
- this.sessionStorage = new LRU({ max: 1000 });
17
- this.grantIdStorage = new LRU({ max: 1000 });
15
+ this.tokenStorage = new LRUCache({ max: 1000 });
16
+ this.sessionStorage = new LRUCache({ max: 1000 });
17
+ this.grantIdStorage = new LRUCache({ max: 1000 });
18
18
  }
19
19
  key(id) {
20
20
  return `${this.type}:${id}`;
@@ -70,15 +70,15 @@ export class InMemoryAdapter {
70
70
  }
71
71
  destroy(id) {
72
72
  return __awaiter(this, void 0, void 0, function* () {
73
- this.tokenStorage.del(this.key(id));
73
+ this.tokenStorage.delete(this.key(id));
74
74
  });
75
75
  }
76
76
  revokeByGrantId(grantId) {
77
77
  return __awaiter(this, void 0, void 0, function* () {
78
78
  const grant = this.grantIdStorage.get(grantId);
79
79
  if (grant) {
80
- grant.forEach((token) => this.tokenStorage.del(token));
81
- this.grantIdStorage.del(grantId);
80
+ grant.forEach((token) => this.tokenStorage.delete(token));
81
+ this.grantIdStorage.delete(grantId);
82
82
  }
83
83
  });
84
84
  }
@@ -1,2 +1,2 @@
1
- import { type OstorageConfig } from './interfaces.js';
1
+ import { OstorageConfig } from "./interfaces.js";
2
2
  export declare const ostorageModule: import("../../interfaces.js").FacadeModuleFactory<OstorageConfig, import("./interfaces.js").OstorageContext>;
@@ -8,9 +8,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { FederatedOstorageSchema } from './gql/federation.js';
11
- import { namespace } from './interfaces.js';
12
- import { OstorageSrvGrpcClient } from './grpc/index.js';
13
- import { createFacadeModuleFactory } from '../../utils.js';
11
+ import { namespace } from "./interfaces.js";
12
+ import { OstorageSrvGrpcClient } from "./grpc/index.js";
13
+ import { createFacadeModuleFactory } from "../../utils.js";
14
+ import { handleGetFile } from './objectDownloadReqHandler.js';
15
+ import Router from 'koa-router';
16
+ import bodyParser from 'koa-bodyparser';
14
17
  export const ostorageModule = createFacadeModuleFactory(namespace, (facade, config) => {
15
18
  const ostorage = {
16
19
  client: new OstorageSrvGrpcClient(config.config.client.address, Object.assign(Object.assign({}, config.config.client), { logger: facade.logger }))
@@ -19,6 +22,23 @@ export const ostorageModule = createFacadeModuleFactory(namespace, (facade, conf
19
22
  name: namespace,
20
23
  schema: FederatedOstorageSchema(config.config)
21
24
  });
25
+ const router = new Router();
26
+ router.use(bodyParser());
27
+ router.get(/^\/storage\/([^/]+)\/(.+)/, (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
28
+ const authToken = ctx.request.header['authorization'];
29
+ let token;
30
+ if (authToken && authToken.startsWith('Bearer ')) {
31
+ token = authToken.split(' ')[1];
32
+ ctx.subject = { token };
33
+ ctx.subject = { token };
34
+ }
35
+ const bucket = ctx.params[0];
36
+ const key = ctx.params[1];
37
+ yield handleGetFile(bucket, key, ctx, ostorage.client);
38
+ return ctx.response;
39
+ }));
40
+ facade.koa.use(router.routes());
41
+ facade.koa.use(router.allowedMethods());
22
42
  facade.koa.use((ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
23
43
  ctx.ostorage = ostorage;
24
44
  yield next();
@@ -0,0 +1 @@
1
+ export declare const handleGetFile: (bucket: string, key: string, ctx: any, client: any) => Promise<any>;
@@ -0,0 +1,134 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
11
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
12
+ var m = o[Symbol.asyncIterator], i;
13
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
14
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
15
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
16
+ };
17
+ import { createServiceConfig } from '@restorecommerce/service-config';
18
+ import { createLogger } from '@restorecommerce/logger';
19
+ import { isNumber } from 'util';
20
+ const cfg = createServiceConfig(process.cwd());
21
+ const loggerCfg = cfg.get('logger');
22
+ let logger = createLogger(loggerCfg);
23
+ const dlQueryParamExist = (ctx) => {
24
+ // check if URL contains query parameter 'dl'
25
+ let filePath, hostName;
26
+ if (ctx && ctx.request && ctx.request.url) {
27
+ filePath = ctx.request.url;
28
+ }
29
+ if (ctx && ctx.request && ctx.request.header
30
+ && ctx.request.header.host) {
31
+ hostName = ctx.request.header.host;
32
+ }
33
+ const completeUrl = 'http://' + hostName + filePath;
34
+ const reqURL = new URL(completeUrl);
35
+ return reqURL.searchParams.has('dl');
36
+ };
37
+ export const handleGetFile = (bucket, key, ctx, client) => __awaiter(void 0, void 0, void 0, function* () {
38
+ var _a, e_1, _b, _c;
39
+ var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
40
+ try {
41
+ let download = false;
42
+ download = dlQueryParamExist(ctx);
43
+ // get the target orgKey from the ostorage meta and set it before making ACS request
44
+ let req = { bucket, key, download };
45
+ logger.debug('Received download request', { bucket, key });
46
+ const ostorageSrv = client['ostorage'];
47
+ req = { bucket, key, download, subject: ctx.subject };
48
+ let grpcGetStream = yield ostorageSrv.get(req);
49
+ let statusCode, statusMessage, objectOptions, objectLastModified, objectBuffer = [], objectKey;
50
+ try {
51
+ for (var _t = true, grpcGetStream_1 = __asyncValues(grpcGetStream), grpcGetStream_1_1; grpcGetStream_1_1 = yield grpcGetStream_1.next(), _a = grpcGetStream_1_1.done, !_a; _t = true) {
52
+ _c = grpcGetStream_1_1.value;
53
+ _t = false;
54
+ const data = _c;
55
+ if (!statusCode) {
56
+ statusCode = (_e = (_d = data === null || data === void 0 ? void 0 : data.response) === null || _d === void 0 ? void 0 : _d.status) === null || _e === void 0 ? void 0 : _e.code;
57
+ }
58
+ if (!statusMessage) {
59
+ statusMessage = (_g = (_f = data === null || data === void 0 ? void 0 : data.response) === null || _f === void 0 ? void 0 : _f.status) === null || _g === void 0 ? void 0 : _g.message;
60
+ }
61
+ if (!objectOptions) {
62
+ objectOptions = (_j = (_h = data === null || data === void 0 ? void 0 : data.response) === null || _h === void 0 ? void 0 : _h.payload) === null || _j === void 0 ? void 0 : _j.options;
63
+ }
64
+ if (!objectLastModified) {
65
+ objectLastModified = (_l = (_k = data === null || data === void 0 ? void 0 : data.payload) === null || _k === void 0 ? void 0 : _k.meta) === null || _l === void 0 ? void 0 : _l.modified;
66
+ }
67
+ if ((_o = (_m = data === null || data === void 0 ? void 0 : data.response) === null || _m === void 0 ? void 0 : _m.payload) === null || _o === void 0 ? void 0 : _o.object) {
68
+ objectBuffer.push((_q = (_p = data === null || data === void 0 ? void 0 : data.response) === null || _p === void 0 ? void 0 : _p.payload) === null || _q === void 0 ? void 0 : _q.object);
69
+ }
70
+ if (!objectKey) {
71
+ objectKey = (_s = (_r = data === null || data === void 0 ? void 0 : data.response) === null || _r === void 0 ? void 0 : _r.payload) === null || _s === void 0 ? void 0 : _s.key;
72
+ }
73
+ }
74
+ }
75
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
76
+ finally {
77
+ try {
78
+ if (!_t && !_a && (_b = grpcGetStream_1.return)) yield _b.call(grpcGetStream_1);
79
+ }
80
+ finally { if (e_1) throw e_1.error; }
81
+ }
82
+ const setResponseHeaders = () => {
83
+ if (objectLastModified) {
84
+ ctx.response.set('Last-Modified', new Date(objectLastModified));
85
+ }
86
+ if (!objectOptions) {
87
+ logger.debug(`Object ${key} from bucket ${bucket} does not have options`);
88
+ }
89
+ else {
90
+ // set response headers on ctx response received from ostorage-srv
91
+ let { encoding, content_type, content_language, content_disposition, length, version, md5 } = objectOptions;
92
+ if (encoding) {
93
+ ctx.response.set('Content-Encoding', encoding);
94
+ }
95
+ if (content_type) {
96
+ ctx.response.set('Content-Type', content_type);
97
+ }
98
+ if (content_language) {
99
+ ctx.response.set('Content-Language', content_language);
100
+ }
101
+ if (content_disposition) {
102
+ ctx.response.set('Content-Disposition', `${content_disposition};filename=${objectKey}`);
103
+ }
104
+ if (length) {
105
+ ctx.response.set('Content-Length', length);
106
+ }
107
+ if (version) {
108
+ ctx.response.set('ETag', version);
109
+ }
110
+ if (md5) {
111
+ ctx.response.set('Content-MD5', md5);
112
+ }
113
+ }
114
+ };
115
+ // add status
116
+ if (statusCode != 200) {
117
+ logger.error('Error downloading file', { code: statusCode, message: statusMessage });
118
+ }
119
+ else if (statusCode === 200) {
120
+ // assigning the grpcStream object through transform to Koa ctx response
121
+ setResponseHeaders();
122
+ logger.info(`Successfully downloaded file ${key}`);
123
+ }
124
+ ctx.response.body = Buffer.concat(objectBuffer);
125
+ ctx.response.status = statusCode ? statusCode : 500;
126
+ return ctx.response;
127
+ }
128
+ catch (error) {
129
+ logger.error(`Error downloading file ${key}`, { code: error.code, message: error.message, stack: error.stack });
130
+ ctx.response.body = error.message;
131
+ ctx.response.status = isNumber(error.code) ? error.code : 500;
132
+ return ctx.response;
133
+ }
134
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@restorecommerce/facade",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "description": "Facade for Restorecommerce microservices",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -18,49 +18,49 @@
18
18
  "type": "module",
19
19
  "dependencies": {
20
20
  "@apollo/federation": "^0.38.1",
21
- "@apollo/gateway": "^2.3.2",
22
- "@apollo/server": "^4.4.0",
23
- "@as-integrations/koa": "^0.3.0",
21
+ "@apollo/gateway": "^2.4.7",
22
+ "@apollo/server": "^4.7.1",
23
+ "@as-integrations/koa": "^1.1.0",
24
24
  "@cloudnative/health": "^2.1.2",
25
- "@grpc/grpc-js": "^1.8.11",
26
- "@grpc/proto-loader": "^0.7.5",
25
+ "@grpc/grpc-js": "^1.8.14",
26
+ "@grpc/proto-loader": "^0.7.7",
27
27
  "@koa/cors": "^4.0.0",
28
28
  "@restorecommerce/grpc-client": "^2.0.1",
29
- "@restorecommerce/kafka-client": "^1.0.8",
29
+ "@restorecommerce/kafka-client": "^1.0.9",
30
30
  "@restorecommerce/logger": "^1.2.3",
31
- "@restorecommerce/rc-grpc-clients": "^3.1.0",
31
+ "@restorecommerce/rc-grpc-clients": "^3.1.1",
32
32
  "@restorecommerce/service-config": "^1.0.5",
33
33
  "array.prototype.flat": "^1.3.1",
34
34
  "co": "^4.6.0",
35
35
  "debug": "^4.3.4",
36
36
  "federation-subscription-tools": "^0.2.1",
37
37
  "graphql": "^16.6.0",
38
- "graphql-upload": "^15.0.2",
39
- "graphql-ws": "^5.11.3",
38
+ "graphql-upload": "^16.0.2",
39
+ "graphql-ws": "^5.13.1",
40
40
  "handlebars": "^4.7.7",
41
- "jose": "^4.12.0",
42
- "koa": "^2.14.1",
41
+ "jose": "^4.14.4",
42
+ "koa": "^2.14.2",
43
43
  "koa-body": "^6.0.1",
44
- "koa-bodyparser": "^4.3.0",
44
+ "koa-bodyparser": "^4.4.0",
45
45
  "koa-compose": "^4.1.0",
46
- "koa-helmet": "^6.1.0",
46
+ "koa-helmet": "^7.0.2",
47
47
  "koa-mount": "^4.0.0",
48
48
  "koa-router": "^12.0.0",
49
49
  "koa-websocket": "^7.0.0",
50
50
  "lodash": "^4.17.21",
51
- "lru-cache": "^7.17.0",
52
- "nanoid": "^3.3.4",
53
- "node-fetch": "^3.3.0",
51
+ "lru-cache": "^9.1.2",
52
+ "nanoid": "^4.0.2",
53
+ "node-fetch": "^3.3.1",
54
54
  "oauth": "^0.10.0",
55
- "oidc-provider": "^7.14.3",
55
+ "oidc-provider": "^8.2.2",
56
56
  "querystring": "^0.2.1",
57
57
  "request-ip": "^3.3.0",
58
- "rxjs": "^7.8.0",
59
- "ts-proto-descriptors": "^1.6.0",
58
+ "rxjs": "^7.8.1",
59
+ "ts-proto-descriptors": "^1.9.0",
60
60
  "useragent": "^2.3.0",
61
61
  "uuid": "^9.0.0",
62
- "winston": "^3.8.2",
63
- "ws": "^8.12.1"
62
+ "winston": "^3.9.0",
63
+ "ws": "^8.13.0"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@graphql-codegen/core": "^4.0.0",
@@ -68,24 +68,24 @@
68
68
  "@graphql-codegen/typescript-resolvers": "^4.0.0",
69
69
  "@types/array.prototype.flat": "^1.2.1",
70
70
  "@types/co": "^4.6.3",
71
- "@types/debug": "^4.1.7",
71
+ "@types/debug": "^4.1.8",
72
72
  "@types/ejs": "^3.1.2",
73
73
  "@types/express": "^4.17.17",
74
- "@types/express-serve-static-core": "^4.17.33",
75
- "@types/graphql-upload": "^15.0.2",
74
+ "@types/express-serve-static-core": "^4.17.35",
75
+ "@types/graphql-upload": "^16.0.0",
76
76
  "@types/jest": "^29.4.0",
77
- "@types/koa": "^2.13.5",
77
+ "@types/koa": "^2.13.6",
78
78
  "@types/koa-bodyparser": "^4.3.10",
79
79
  "@types/koa-helmet": "^6.0.4",
80
80
  "@types/koa-mount": "^4.0.2",
81
81
  "@types/koa-router": "^7.4.1",
82
82
  "@types/koa-websocket": "^5.0.7",
83
- "@types/koa__cors": "^3.3.1",
84
- "@types/lodash": "^4.14.191",
83
+ "@types/koa__cors": "^4.0.0",
84
+ "@types/lodash": "^4.14.195",
85
85
  "@types/lru-cache": "^7.10.10",
86
- "@types/node": "^18.14.1",
86
+ "@types/node": "^20.2.5",
87
87
  "@types/oauth": "^0.9.1",
88
- "@types/oidc-provider": "^8.1.1",
88
+ "@types/oidc-provider": "^8.2.0",
89
89
  "@types/request-ip": "^0.0.37",
90
90
  "@types/supertest": "^2.0.12",
91
91
  "@types/useragent": "^2.3.1",
@@ -95,13 +95,13 @@
95
95
  "jest": "^29.5.0",
96
96
  "nodemon": "^2.0.20",
97
97
  "npm-run-all": "^4.1.5",
98
- "rimraf": "^4.1.2",
98
+ "rimraf": "^5.0.1",
99
99
  "supertest": "^6.3.3",
100
- "ts-jest": "~29.1.0",
100
+ "ts-jest": "29.1.0",
101
101
  "ts-jest-resolver": "^2.0.1",
102
102
  "ts-node": "^10.9.1",
103
- "tsconfig-paths": "^4.1.2",
104
- "typescript": "^4.9.5"
103
+ "tsconfig-paths": "^4.2.0",
104
+ "typescript": "^5.1.3"
105
105
  },
106
106
  "scripts": {
107
107
  "build": "npm-run-all build:clean generate build:compile build:codegen:clean build:codegen:compile copyhbs",
@@ -111,10 +111,10 @@
111
111
  "build:codegen:compile": "tsc -p tsconfig.codegen.json",
112
112
  "dev": "npm-run-all build:clean dev:compile",
113
113
  "dev:compile": "tsc -w -p tsconfig.json",
114
- "pretest": "rm -rf ./node_modules/@josephg/resolvable/index.ts",
114
+ "postinstall": "rm -rf ./node_modules/@josephg/resolvable/index.ts",
115
115
  "test": "NODE_OPTIONS=--experimental-vm-modules jest --runInBand --testTimeout=30000",
116
116
  "test:watch": "jest --watch",
117
- "dev:serve": "TS_NODE_PROJECT=tsconfig.test.json nodemon -e ts,hbs -w ./tests -w ./src -x node --inspect=7000 -r ts-node/register tests/server.ts",
117
+ "dev:serve": "TS_NODE_PROJECT=tsconfig.test.json nodemon -e ts,hbs -w ./tests -w ./src -x ts-node-esm --project tsconfig.test.json -r ts-node/register tests/server.ts",
118
118
  "generate": "ts-node-esm --project tsconfig.generate.json -r tsconfig-paths/register generate.ts",
119
119
  "prepublishOnly": "npm run build",
120
120
  "debug-run": "ts-node-esm --project tsconfig.debug.json debug-run.ts",
@@ -136,5 +136,5 @@
136
136
  }
137
137
  }
138
138
  },
139
- "gitHead": "18bb61bb70fbf8a8e5908edb3332ae015c7f5e54"
139
+ "gitHead": "4202cabe00d8363f62e3f53159755dca71781328"
140
140
  }
@@ -4,6 +4,8 @@
4
4
  "typeRoots": [
5
5
  "./node_modules/@types"
6
6
  ],
7
+ "allowJs": true,
8
+ "maxNodeModuleJsDepth": 10,
7
9
  "esModuleInterop": true,
8
10
  "allowSyntheticDefaultImports": true,
9
11
  "declaration": true,