@superblocksteam/util 1.14.1 → 2.0.3-next.46

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.
Files changed (95) hide show
  1. package/.prettierrc +1 -0
  2. package/dist/api-files/api.d.mts +7 -0
  3. package/dist/api-files/api.d.mts.map +1 -0
  4. package/dist/api-files/api.mjs +262 -0
  5. package/dist/api-files/api.mjs.map +1 -0
  6. package/dist/api-files/constants.d.ts +6 -0
  7. package/dist/api-files/constants.d.ts.map +1 -0
  8. package/dist/api-files/constants.js +9 -0
  9. package/dist/api-files/constants.js.map +1 -0
  10. package/dist/api-files/index.d.ts +7 -0
  11. package/dist/api-files/index.d.ts.map +1 -0
  12. package/dist/api-files/index.js +13 -0
  13. package/dist/api-files/index.js.map +1 -0
  14. package/dist/api-files/types.d.ts +117 -0
  15. package/dist/api-files/types.d.ts.map +1 -0
  16. package/dist/api-files/types.js +17 -0
  17. package/dist/api-files/types.js.map +1 -0
  18. package/dist/component-configs.d.ts +1 -0
  19. package/dist/component-configs.d.ts.map +1 -0
  20. package/dist/component-configs.js +10 -9
  21. package/dist/component-configs.js.map +1 -0
  22. package/dist/constants.d.ts +1 -0
  23. package/dist/constants.d.ts.map +1 -0
  24. package/dist/constants.js +1 -0
  25. package/dist/constants.js.map +1 -0
  26. package/dist/data-types.d.ts +1 -0
  27. package/dist/data-types.d.ts.map +1 -0
  28. package/dist/data-types.js +1 -0
  29. package/dist/data-types.js.map +1 -0
  30. package/dist/events.d.ts +1 -0
  31. package/dist/events.d.ts.map +1 -0
  32. package/dist/events.js +1 -0
  33. package/dist/events.js.map +1 -0
  34. package/dist/file-uploader.d.ts +1 -0
  35. package/dist/file-uploader.d.ts.map +1 -0
  36. package/dist/file-uploader.js +1 -0
  37. package/dist/file-uploader.js.map +1 -0
  38. package/dist/generate-component-types.d.ts +2 -1
  39. package/dist/generate-component-types.d.ts.map +1 -0
  40. package/dist/generate-component-types.js +5 -5
  41. package/dist/generate-component-types.js.map +1 -0
  42. package/dist/identifiers.d.ts +1 -0
  43. package/dist/identifiers.d.ts.map +1 -0
  44. package/dist/identifiers.js +2 -1
  45. package/dist/identifiers.js.map +1 -0
  46. package/dist/index.d.ts +16 -11
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +16 -11
  49. package/dist/index.js.map +1 -0
  50. package/dist/localGitRepoState.d.ts +2 -1
  51. package/dist/localGitRepoState.d.ts.map +1 -0
  52. package/dist/localGitRepoState.js +1 -0
  53. package/dist/localGitRepoState.js.map +1 -0
  54. package/dist/login.d.ts +1 -0
  55. package/dist/login.d.ts.map +1 -0
  56. package/dist/login.js +6 -5
  57. package/dist/login.js.map +1 -0
  58. package/dist/mask-unix-signals.d.ts +27 -0
  59. package/dist/mask-unix-signals.d.ts.map +1 -0
  60. package/dist/mask-unix-signals.js +81 -0
  61. package/dist/mask-unix-signals.js.map +1 -0
  62. package/dist/resource-configs.d.ts +9 -1
  63. package/dist/resource-configs.d.ts.map +1 -0
  64. package/dist/resource-configs.js +66 -11
  65. package/dist/resource-configs.js.map +1 -0
  66. package/dist/types.d.ts +8 -7
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +1 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/unreachable.d.ts +2 -1
  71. package/dist/unreachable.d.ts.map +1 -0
  72. package/dist/unreachable.js +3 -2
  73. package/dist/unreachable.js.map +1 -0
  74. package/dist/validation.d.ts +1 -0
  75. package/dist/validation.d.ts.map +1 -0
  76. package/dist/validation.js +4 -3
  77. package/dist/validation.js.map +1 -0
  78. package/eslint.config.js +11 -1
  79. package/package.json +18 -11
  80. package/src/api-files/api.mts +504 -0
  81. package/src/api-files/constants.ts +6 -0
  82. package/src/api-files/index.ts +15 -0
  83. package/src/api-files/types.ts +134 -0
  84. package/src/component-configs.ts +3 -3
  85. package/src/generate-component-types.ts +2 -2
  86. package/src/index.ts +15 -11
  87. package/src/localGitRepoState.ts +1 -1
  88. package/src/login.ts +1 -1
  89. package/src/mask-unix-signals.ts +86 -0
  90. package/src/resource-configs.ts +81 -1
  91. package/src/types.ts +8 -11
  92. package/src/unreachable.ts +4 -2
  93. package/src/validation.ts +4 -3
  94. package/tsconfig.json +9 -2
  95. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,15 @@
1
+ import type * as Api from "./api.mjs" with { "resolution-mode": "import" };
2
+
3
+ export async function writeApiFiles(
4
+ ...args: Parameters<typeof Api.writeApiFiles>
5
+ ) {
6
+ const esmFunction = await import("./api.mjs");
7
+ return esmFunction.writeApiFiles(...args);
8
+ }
9
+
10
+ export async function readAppApiYamlFile(
11
+ ...args: Parameters<typeof Api.readAppApiYamlFile>
12
+ ) {
13
+ const esmFunction = await import("./api.mjs");
14
+ return esmFunction.readAppApiYamlFile(...args);
15
+ }
@@ -0,0 +1,134 @@
1
+ export type AdditionalStepFiles = {
2
+ relativePath: string;
3
+ contents: string;
4
+ language: keyof Step;
5
+ };
6
+
7
+ export type ApiRepresentation = {
8
+ extractLargeSourceFiles: boolean;
9
+ minLinesForExtraction: number;
10
+ };
11
+
12
+ export interface ApiWrapper {
13
+ apiPb: Api;
14
+ name?: string; //@deprecated this attribute is used for getting a name for backends(jobs and workflows) that were never migrated to the new API version.
15
+ }
16
+
17
+ /** A signature, as produced by the agent. */
18
+ export interface Signature {
19
+ /** The id of the key used to sign the data. */
20
+ keyId: string;
21
+ /** The actual signature, in base64. */
22
+ data: string;
23
+ }
24
+
25
+ export type Api = {
26
+ metadata: {
27
+ id: string;
28
+ name: string;
29
+ organization: string;
30
+ timestamps?: {
31
+ created: string;
32
+ updated: string;
33
+ deactivated: boolean;
34
+ };
35
+ // These properties are merged in from the v3 api entity
36
+ creator?: {
37
+ id: string;
38
+ name: string;
39
+ };
40
+ folder?: string;
41
+ };
42
+ blocks?: Block[];
43
+ trigger: any;
44
+ signature?: Signature;
45
+ };
46
+
47
+ export type Block = {
48
+ name: string;
49
+ step?: Step;
50
+ loop?: Loop;
51
+ tryCatch?: TryCatch;
52
+ conditional?: Conditional;
53
+ parallel?: Parallel;
54
+ stream?: Stream;
55
+ };
56
+
57
+ export type Step = {
58
+ integration: string;
59
+ javascript?: LanguageContent;
60
+ python?: LanguageContent;
61
+ };
62
+
63
+ export type Loop = {
64
+ blocks: Block[];
65
+ range: string;
66
+ type: LoopType;
67
+ variables?: Variables;
68
+ };
69
+
70
+ export enum LoopType {
71
+ FOR = "TYPE_FOR",
72
+ FOR_EACH = "TYPE_FOREACH",
73
+ WHILE = "TYPE_WHILE",
74
+ UNSPECIFIED = "TYPE_UNSPECIFIED",
75
+ }
76
+
77
+ export type TryCatch = {
78
+ try?: Blocks;
79
+ catch?: Blocks;
80
+ finally?: Blocks;
81
+ variables?: Variables;
82
+ };
83
+
84
+ export type Conditional = {
85
+ if?: ConditionalBlockWithCondition;
86
+ elseIf: ConditionalBlockWithCondition[];
87
+ else?: Blocks;
88
+ };
89
+
90
+ export type Blocks = {
91
+ blocks: Block[];
92
+ };
93
+
94
+ export type ConditionalBlockWithCondition = Blocks & {
95
+ condition?: string;
96
+ };
97
+
98
+ export type Parallel = {
99
+ static?: {
100
+ paths: Record<string, Blocks>;
101
+ };
102
+ dynamic?: {
103
+ blocks: Block[];
104
+ variables?: Variables;
105
+ paths?: string;
106
+ };
107
+ poolSize?: number;
108
+ wait?: WAIT_TYPE;
109
+ };
110
+
111
+ export type Stream = {
112
+ trigger?: StreamTrigger;
113
+ process?: Blocks;
114
+ variables?: Variables;
115
+ };
116
+
117
+ export type StreamTrigger = {
118
+ name: string;
119
+ step?: Step;
120
+ };
121
+
122
+ export enum WAIT_TYPE {
123
+ ALL = "WAIT_ALL",
124
+ ANY = "WAIT_NONE",
125
+ UNSPECIFIED = "WAIT_UNSPECIFIED",
126
+ }
127
+
128
+ export type Variables = Record<string, string>;
129
+
130
+ export type LanguageContent = {
131
+ body: Body;
132
+ };
133
+
134
+ export type Body = string | { path: string };
@@ -4,9 +4,9 @@ import path from "node:path";
4
4
  import * as util from "node:util";
5
5
  import * as fs from "fs-extra";
6
6
  import * as mimeTypes from "mime-types";
7
- import { CUSTOM_COMPONENTS_PATH } from "./constants";
8
- import { generateComponentTypesFile } from "./generate-component-types";
9
- import { validateCustomComponents } from "./validation";
7
+ import { CUSTOM_COMPONENTS_PATH } from "./constants.js";
8
+ import { generateComponentTypesFile } from "./generate-component-types.js";
9
+ import { validateCustomComponents } from "./validation.js";
10
10
 
11
11
  const asyncExecFile = util.promisify(execFile);
12
12
 
@@ -1,5 +1,5 @@
1
- import { dataTypeDefinions, type DataType } from "./data-types";
2
- import { ComponentConfig } from "./types";
1
+ import { dataTypeDefinions, type DataType } from "./data-types.js";
2
+ import type { ComponentConfig } from "./types.js";
3
3
 
4
4
  const indent = (str: string, spaces: number) => {
5
5
  const spacesString = " ".repeat(spaces);
package/src/index.ts CHANGED
@@ -1,11 +1,15 @@
1
- export * from "./constants";
2
- export * from "./component-configs";
3
- export * from "./events";
4
- export * from "./file-uploader";
5
- export * from "./login";
6
- export * from "./resource-configs";
7
- export * from "./data-types";
8
- export * from "./types";
9
- export * from "./identifiers";
10
- export * from "./localGitRepoState";
11
- export * from "./unreachable";
1
+ export * from "./constants.js";
2
+ export * from "./component-configs.js";
3
+ export * from "./events.js";
4
+ export * from "./file-uploader.js";
5
+ export * from "./login.js";
6
+ export * from "./resource-configs.js";
7
+ export * from "./data-types.js";
8
+ export * from "./types.js";
9
+ export * from "./identifiers.js";
10
+ export * from "./localGitRepoState.js";
11
+ export * from "./unreachable.js";
12
+ export * from "./api-files/types.js";
13
+ export * from "./api-files/index.js";
14
+ export * from "./api-files/constants.js";
15
+ export * from "./mask-unix-signals.js";
@@ -1,4 +1,4 @@
1
- import { ComponentEvent } from "./events";
1
+ import type { ComponentEvent } from "./events.js";
2
2
 
3
3
  export type LocalGitRepoState =
4
4
  | { status: "NO_GIT" }
package/src/login.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { homedir } from "node:os";
2
2
  import { join } from "node:path";
3
3
  import * as fs from "fs-extra";
4
- import { FileAccessError, TOKEN_CONFIG_PATH } from "./constants";
4
+ import { FileAccessError, TOKEN_CONFIG_PATH } from "./constants.js";
5
5
 
6
6
  type BaseUrl = {
7
7
  superblocksBaseUrl: string;
@@ -0,0 +1,86 @@
1
+ const unixSignalsToMask: NodeJS.Signals[] = ["SIGINT", "SIGTERM", "SIGHUP"];
2
+
3
+ // The exit code that is used when the process is aborted due to a unix signal
4
+ const exitCode = 254;
5
+
6
+ export type ActionResult<T> =
7
+ | { success: true; returnValue: T }
8
+ | { success: false; error: unknown };
9
+
10
+ /**
11
+ * Runs an action with some unix signals being masked. This is useful for actions that should not be interrupted and need
12
+ * to be allowed to complete or perform some cleanup. If a signal is received, the action will be notified that it should
13
+ * abort via the `AbortSignal` that is passed to it. The action may or may not choose to abort immediately. The cleanup
14
+ * action is called after the main action and this happens unconditionally, i.e. regardless of whether a signal was received,
15
+ * the main action threw an error, or the main action returned a value. The cleanup action is passed the abort signal and the
16
+ * error (if any) that was thrown by the main action. If a signal was received, the process will exit after the cleanup
17
+ * action has completed. If the main action threw an error, that error will be thrown again. Otherwise, the main action's
18
+ * return value is returned. This function can be thought of as a (unix) signal aware version of `try { … } finally { … }`
19
+ * and `try { … } catch { … } catch { … }`.
20
+ *
21
+ * *Note*: This function registers listeners for some unix signals, so it affects the global behavior of the process. Be
22
+ * careful when using this function in a library.
23
+ *
24
+ * @param action - The main action to execute.
25
+ * @param cleanup - An optional cleanup action to execute when the process is aborted.
26
+ * @returns The result of the `action`.
27
+ */
28
+ export async function maskUnixSignals<T>(
29
+ action: (aborted: AbortSignal) => Promise<T>,
30
+ cleanup?: (
31
+ aborted: AbortSignal,
32
+ actionResult: ActionResult<T>,
33
+ ) => Promise<void>,
34
+ ): Promise<T> {
35
+ const abortController = new AbortController();
36
+ const abortSignal = abortController.signal;
37
+
38
+ const onUnixSignal = (unixSignal: NodeJS.Signals) => {
39
+ console.log(`${unixSignal} received, will abort after cleanup`);
40
+ if (unixSignal === "SIGINT") {
41
+ if (!abortSignal.aborted) {
42
+ console.log("Press Ctrl+C again to force abort");
43
+ } else {
44
+ console.log("Second SIGINT received, will abort immediately");
45
+ process.exit(exitCode);
46
+ }
47
+ }
48
+ // Pass the signal as the reason for aborting so that `action` and `cleanup` can know which signal was received
49
+ abortController.abort(unixSignal);
50
+ };
51
+
52
+ for (const signal of unixSignalsToMask) {
53
+ process.on(signal, onUnixSignal);
54
+ }
55
+ try {
56
+ let result: ActionResult<T>;
57
+ try {
58
+ const returnValue = await action(abortSignal);
59
+ result = { success: true, returnValue };
60
+ } catch (err) {
61
+ result = { success: false, error: err };
62
+ }
63
+ try {
64
+ await cleanup?.(abortSignal, result);
65
+ } finally {
66
+ // If the process received a (unix) signal, this takes precedence over any error that was thrown by `action` or
67
+ // `cleanup`. So we exit here. Otherwise, we let standard JS error handling take over, e.g. an exception
68
+ // thrown by `cleanup` shadows any exception that was thrown by `action`.
69
+ if (abortSignal.aborted) {
70
+ // The process received a (unix) signal, so we exit here.
71
+ process.exit(exitCode);
72
+ }
73
+ }
74
+ if (!result.success) {
75
+ // `action` threw an error
76
+ throw result.error;
77
+ } else {
78
+ // `action` threw an error
79
+ return result.returnValue;
80
+ }
81
+ } finally {
82
+ for (const signal of unixSignalsToMask) {
83
+ process.off(signal, onUnixSignal);
84
+ }
85
+ }
86
+ }
@@ -1,13 +1,20 @@
1
1
  import path from "path";
2
2
  import * as fs from "fs-extra";
3
- import { RESOURCE_CONFIG_PATH } from "./constants";
3
+ import { RESOURCE_CONFIG_PATH } from "./constants.js";
4
4
 
5
5
  export type SuperblocksMetadata = {
6
6
  cliVersion: string;
7
7
  };
8
8
 
9
+ // Resource type is the type of the resource in the Superblocks platform
9
10
  export type SuperblocksResourceType = "APPLICATION" | "BACKEND";
10
11
 
12
+ // Resource-specific config
13
+ export type SuperblocksConfigType =
14
+ | "APPLICATION"
15
+ | "APPLICATION_V2"
16
+ | "BACKEND";
17
+
11
18
  export type VersionedResourceConfig = {
12
19
  location: string;
13
20
  resourceType: SuperblocksResourceType;
@@ -19,6 +26,7 @@ export type SuperblocksResourceConfigMetadata = {
19
26
 
20
27
  export type SuperblocksResourceConfig = {
21
28
  id: string;
29
+ configType: SuperblocksConfigType;
22
30
  metadata?: SuperblocksResourceConfigMetadata;
23
31
  };
24
32
 
@@ -52,6 +60,10 @@ export type ApiInfo = SourceFilesContanier & {
52
60
  name: string;
53
61
  };
54
62
 
63
+ export type SuperblocksApplicationV2Config = SuperblocksResourceConfig & {
64
+ configType: "APPLICATION_V2";
65
+ };
66
+
55
67
  export type SuperblocksMonorepoConfig = {
56
68
  configType: "ROOT";
57
69
  resources: Record<string, VersionedResourceConfig>;
@@ -61,6 +73,7 @@ export type SuperblocksMonorepoConfig = {
61
73
  export type SuperblocksConfig =
62
74
  | SuperblocksMonorepoConfig
63
75
  | SuperblocksApplicationConfig
76
+ | SuperblocksApplicationV2Config
64
77
  | SuperblocksBackendConfig;
65
78
 
66
79
  /**
@@ -155,6 +168,31 @@ export async function getSuperblocksApplicationConfigIfExists(
155
168
  return superblocksConfig as SuperblocksApplicationConfig;
156
169
  }
157
170
 
171
+ export async function getSuperblocksApplicationV2ConfigJson(
172
+ applicationPath?: string,
173
+ ): Promise<SuperblocksApplicationV2Config> {
174
+ let superblocksConfig;
175
+ try {
176
+ const configPath = applicationPath
177
+ ? path.join(applicationPath, RESOURCE_CONFIG_PATH)
178
+ : RESOURCE_CONFIG_PATH;
179
+ superblocksConfig = await fs.readJSON(configPath);
180
+ } catch {
181
+ // no superblocks config file found
182
+ throw new Error(
183
+ "This command must be run within a Superblocks app directory.",
184
+ );
185
+ }
186
+
187
+ if (superblocksConfig.configType !== "APPLICATION_V2") {
188
+ throw new Error(
189
+ "Please execute this command within a Superblocks application directory.",
190
+ );
191
+ }
192
+
193
+ return superblocksConfig as SuperblocksApplicationV2Config;
194
+ }
195
+
158
196
  export async function getSuperblocksBackendConfigIfExists(
159
197
  backendPath: string,
160
198
  ): Promise<SuperblocksBackendConfig | undefined> {
@@ -204,6 +242,11 @@ export async function getSuperblocksResourceConfigIfExists(): Promise<
204
242
  } catch {
205
243
  // Noop
206
244
  }
245
+ try {
246
+ config = await getSuperblocksApplicationV2ConfigJson();
247
+ } catch {
248
+ // Noop
249
+ }
207
250
  try {
208
251
  config = await getSuperblocksBackendConfigJson();
209
252
  } catch {
@@ -211,3 +254,40 @@ export async function getSuperblocksResourceConfigIfExists(): Promise<
211
254
  }
212
255
  return config;
213
256
  }
257
+
258
+ export function getResourceIdFromUrl(
259
+ resourceUrl: any,
260
+ ): [string, SuperblocksResourceType] {
261
+ const url = new URL(resourceUrl);
262
+ if (url.pathname.startsWith("/code-mode")) {
263
+ // find the first uuid in the url
264
+ const tokens = url.pathname.split("/");
265
+ const uuid = tokens.find((token) =>
266
+ token.match(
267
+ /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/,
268
+ ),
269
+ );
270
+ if (!uuid) {
271
+ throw new Error(`Failed to parse resource URL: ${resourceUrl}`);
272
+ }
273
+ return [uuid, "APPLICATION"];
274
+ }
275
+ if (url.pathname.startsWith("/applications")) {
276
+ const tokens = url.pathname.split("/");
277
+ if (tokens.length < 2) {
278
+ throw new Error(`Failed to parse resource URL: ${resourceUrl}`);
279
+ }
280
+ if (tokens[2] === "edit") {
281
+ return [tokens[3], "APPLICATION"];
282
+ } else {
283
+ return [tokens[2], "APPLICATION"];
284
+ }
285
+ } else if (
286
+ url.pathname.startsWith("/workflows") ||
287
+ url.pathname.startsWith("/scheduled_jobs")
288
+ ) {
289
+ return [url.pathname.split("/")[2], "BACKEND"];
290
+ }
291
+
292
+ throw new Error(`Failed to parse resource URL: ${resourceUrl}`);
293
+ }
package/src/types.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { type UUID } from "node:crypto";
2
- import { type DataType } from "./data-types";
1
+ import type { DataType } from "./data-types.js";
2
+ import type { UUID } from "node:crypto";
3
3
 
4
4
  interface PropertiesPanelDisplay<T extends DataType> {
5
5
  /**
@@ -45,16 +45,13 @@ interface PropertiesPanelDisplay<T extends DataType> {
45
45
 
46
46
  /**
47
47
  * The default value should match the dataType of the property.
48
- *
49
- * When dataType is "any", you must provide a string default value.
50
- * Your string will be interpreted based on the controlType, so if you have controlType "js-expr",
51
- * you should provide a string that is a valid javascript expression including quotations marks.
52
48
  */
53
- defaultValue?: T extends "number"
54
- ? number
55
- : T extends "boolean"
56
- ? boolean
57
- : string;
49
+ defaultValue?: T;
50
+
51
+ /**
52
+ * The default value to use when adding a property.
53
+ */
54
+ defaultOnAdd?: T;
58
55
  }
59
56
 
60
57
  export interface PropertyForData<T extends DataType> {
@@ -1,3 +1,5 @@
1
- export function unreachable(value: never): never {
2
- throw new TypeError("Encountered impossible value: " + JSON.stringify(value));
1
+ export function unreachable(value: never, errMsg?: string): never {
2
+ throw new TypeError(
3
+ errMsg ?? "Encountered impossible value: " + JSON.stringify(value),
4
+ );
3
5
  }
package/src/validation.ts CHANGED
@@ -1,7 +1,8 @@
1
- import Ajv, { Schema } from "ajv";
2
- import { DataValidateFunction } from "ajv/dist/types";
1
+ import Ajv from "ajv";
3
2
  import betterAjvErrors from "better-ajv-errors";
4
- import { isReservedPropertyName, isValidIdentifier } from "./identifiers";
3
+ import { isReservedPropertyName, isValidIdentifier } from "./identifiers.js";
4
+ import type { Schema } from "ajv";
5
+ import type { DataValidateFunction } from "ajv/dist/types";
5
6
 
6
7
  const ajv = new Ajv();
7
8
 
package/tsconfig.json CHANGED
@@ -1,11 +1,18 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "declaration": true,
4
- "module": "commonjs",
4
+ "module": "nodenext",
5
+ "moduleDetection": "force",
6
+ "moduleResolution": "nodenext",
7
+ "isolatedModules": true,
5
8
  "outDir": "dist",
6
9
  "rootDir": "src",
7
10
  "strict": true,
8
- "target": "es2019",
11
+ "composite": true,
12
+ "target": "es2022",
13
+ "lib": ["es2022"],
14
+ "sourceMap": true,
15
+ "declarationMap": true,
9
16
  "esModuleInterop": true,
10
17
  "skipLibCheck": true
11
18
  },