Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: background tasks #3740

Merged
merged 69 commits into from
Jan 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
4790100
wip(tasks): start with tasks
brunozoric Nov 29, 2023
526625c
wip(tasks): split plugin and definition
brunozoric Nov 30, 2023
c893c45
wip(tasks): task runs
brunozoric Dec 4, 2023
baa2829
feat(api-headless-cms): add json type field
brunozoric Dec 4, 2023
cdaec0a
feat(tasks): graphql and crud
brunozoric Dec 5, 2023
13f2297
refactor(tasks): database response manager
brunozoric Dec 5, 2023
b1a7083
chore: update ts configs
brunozoric Dec 5, 2023
f37579f
refactor(tasks): rename tests
brunozoric Dec 6, 2023
7c9c1ea
feat(tasks): add step fn token to input and output
brunozoric Dec 6, 2023
900cb92
refactor(tasks): add state machine id to event
brunozoric Dec 8, 2023
43bbadb
feat(tasks): task crud
brunozoric Dec 8, 2023
f1cbee2
refactor(pulumi-aws): background tasks
brunozoric Dec 8, 2023
0712207
refactor(pulumi-aws): background tasks logging policy
brunozoric Dec 11, 2023
4bbb104
refactor(tasks): simplify response types
brunozoric Dec 12, 2023
5cb1a27
refactor(tasks): move classes and abstractions
brunozoric Dec 12, 2023
97dba6c
refactor(pulumi-aws): update step function definition
brunozoric Dec 12, 2023
c7294a5
feat(pulumi-aws): add waiting possibility in background task
brunozoric Dec 13, 2023
1373616
test(tasks): add crud tests
brunozoric Dec 13, 2023
e7825d2
test(tasks): definitions crud
brunozoric Dec 13, 2023
8f8bdac
fix(tasks): expose graphql
brunozoric Dec 13, 2023
37b0232
test(tasks): task manager and event validation
brunozoric Dec 14, 2023
e4fed20
feat(pulumi-aws): deploy event bridge to step fn connection
brunozoric Dec 14, 2023
68fe0e7
feat(tasks): implement graphql
brunozoric Dec 14, 2023
3d38d48
feat(tasks): ability to stop a task
brunozoric Dec 15, 2023
1f35cd1
test(tasks): graphql to list tasks from database
brunozoric Dec 15, 2023
7a110d4
test(tasks): trigger crud
brunozoric Dec 15, 2023
1bf99e2
fix(tests): validate task definition id
brunozoric Dec 15, 2023
0be1a4e
test(tasks): modify tasks to camel cased id
brunozoric Dec 15, 2023
45e7a17
feat(tasks): add task values store method
brunozoric Dec 18, 2023
3cda7ca
feat(api-elasticsearch-tasks): indexing
brunozoric Dec 18, 2023
d3bb26b
feat(api-elasticsearch-task): code split task runner
brunozoric Dec 19, 2023
aa2520a
feat(api-background-tasks): wrapper for tasks and definitions
brunozoric Dec 19, 2023
034ad7f
fix(api-background-tasks): readme
brunozoric Dec 19, 2023
ee4b630
fix(tasks): store task management
brunozoric Dec 19, 2023
b061762
test(api-elasticsearch-tasks): wip reindexing
brunozoric Dec 19, 2023
6dbd877
feat(api-background-tasks-dynamodb): ddb tasks
brunozoric Dec 20, 2023
a13cc0d
feat(api-background-tasks-es): elasticsearch tasks
brunozoric Dec 20, 2023
2f3830f
feat(api-background-tasks-os): opensearch tasks
brunozoric Dec 20, 2023
c59aa4a
refactor: rename dynamodb tasks package
brunozoric Dec 20, 2023
112c55d
fix(cwp-template-aws): dynamodb setup
brunozoric Dec 20, 2023
0bf0c6a
fix(cwp-template-aws): os setup
brunozoric Dec 20, 2023
9a33a8d
fix(tasks): event input
brunozoric Dec 20, 2023
c920e8e
refactor(tasks): graphql type names
brunozoric Dec 21, 2023
15b129d
feat(pulumi-aws): step to transform event input into lambda input
brunozoric Dec 21, 2023
bd480da
feat: add count dynamodb items task to dev deployment
brunozoric Dec 21, 2023
3b7cec6
fix: deployment is missing some packages because they are private
brunozoric Dec 22, 2023
7af4aca
feat(tasks): enable users to wait certain amount of time to continue …
brunozoric Dec 22, 2023
a8abed7
refactor(pulumi-aws): wait task use new response var
brunozoric Dec 22, 2023
901ef88
refactor: continuing task
brunozoric Dec 22, 2023
720aceb
fix: task status after next merge
brunozoric Dec 26, 2023
21fbcd5
fix(project-utils): add sharp to webpack externals for all Lambda fun…
Pavel910 Dec 29, 2023
b478199
feat(pulumi-aws): add sharp layer to background task function
Pavel910 Dec 29, 2023
886701f
feat(aws-layers): add ts definition
brunozoric Dec 30, 2023
4084848
fix(pulumi-aws): remove unnecessary expect error
brunozoric Dec 30, 2023
7ad2edf
fix(cwp-template-aws): position of background tasks init
brunozoric Jan 2, 2024
1caf5ad
fix(tasks): updating task
brunozoric Jan 2, 2024
17b4f1d
fix(db-dynamodb): retry batch write on unprocessed items
brunozoric Jan 2, 2024
125ead4
fix(pulumi-aws): aborted status
brunozoric Jan 2, 2024
031632f
fix(api-elasticsearch-tasks): method to add logs is now user friendly
brunozoric Jan 2, 2024
b0fa4c1
refactor(tasks): export all types from root
brunozoric Jan 2, 2024
e80f538
feat(aws-sdk): add sfn package
brunozoric Jan 4, 2024
0f9c340
feat(pulumi-aws): pass execution name into lambda
brunozoric Jan 4, 2024
7148aab
refactor(tasks): add additional fields into the task model
brunozoric Jan 4, 2024
8250161
refactor(api-elasticsearch-tasks): implement changes from tasks package
brunozoric Jan 4, 2024
4b957fa
fix(tasks): convert Error into plain object for output
brunozoric Jan 4, 2024
26da803
refactor(tasks): rename task property values to input
brunozoric Jan 6, 2024
192ff82
refactor(tasks): move logs to own model
brunozoric Jan 9, 2024
134ae77
fix(api-elasticsearch-tasks): test failing after added the logs model
brunozoric Jan 9, 2024
e704c1a
fix(tasks): only pending and running tasks can be aborted
brunozoric Jan 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,5 @@ lerna.json

# TODO remove after moving traffic splitting config to WPC
gateway.*.json

packages/tasks/tpl/*
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@
.webiny/**
packages/ui/src/RichTextEditor/editorjs/**
lerna.json
coverage/**
4 changes: 3 additions & 1 deletion apps/api/graphql/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"@webiny/api-apw": "0.0.0",
"@webiny/api-apw-scheduler-so-ddb": "0.0.0",
"@webiny/api-audit-logs": "0.0.0",
"@webiny/api-background-tasks-ddb": "0.0.0",
"@webiny/api-file-manager": "0.0.0",
"@webiny/api-file-manager-ddb": "0.0.0",
"@webiny/api-file-manager-s3": "0.0.0",
Expand Down Expand Up @@ -43,7 +44,8 @@
"@webiny/handler-db": "0.0.0",
"@webiny/handler-graphql": "0.0.0",
"@webiny/handler-logs": "0.0.0",
"@webiny/project-utils": "0.0.0"
"@webiny/project-utils": "0.0.0",
"@webiny/tasks": "0.0.0"
},
"devDependencies": {
"@webiny/cli-plugin-deploy-pulumi": "0.0.0",
Expand Down
8 changes: 7 additions & 1 deletion apps/api/graphql/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,13 @@ import { createStorageOperations as createApwSaStorageOperations } from "@webiny
import { createAco } from "@webiny/api-aco";
import { createAcoPageBuilderContext } from "@webiny/api-page-builder-aco";
import { createAuditLogs } from "@webiny/api-audit-logs";
import { createBackgroundTasks } from "@webiny/api-background-tasks-ddb";

// Imports plugins created via scaffolding utilities.
import scaffoldsPlugins from "./plugins/scaffolds";
import { createBenchmarkEnablePlugin } from "~/plugins/benchmarkEnable";
import { createCountDynamoDbTask } from "~/plugins/countDynamoDbTask";
import { createContinuingTask } from "~/plugins/continuingTask";

const debug = process.env.DEBUG === "true";
const documentClient = getDocumentClient();
Expand All @@ -65,6 +68,7 @@ export const handler = createHandler({
})
}),
createHeadlessCmsGraphQL(),
createBackgroundTasks(),
createFileManagerContext({
storageOperations: createFileManagerStorageOperations({
documentClient
Expand Down Expand Up @@ -119,7 +123,9 @@ export const handler = createHandler({
}
});
}),
createAuditLogs()
createAuditLogs(),
createCountDynamoDbTask(),
createContinuingTask()
],
debug
});
58 changes: 58 additions & 0 deletions apps/api/graphql/src/plugins/continuingTask.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { createTaskDefinition } from "@webiny/tasks";
import { Context } from "../types";
import { ITaskResponseContinueOptions } from "@webiny/tasks/response/abstractions";

const MAX_RUNS = 5;

const getMaxRuns = (input?: string | number) => {
const value = Number(input);
if (isNaN(value)) {
return MAX_RUNS;
}
return value > 0 && value < 50 ? value : MAX_RUNS;
};

interface TaskValues {
run?: number;
maxRuns?: string | number;
seconds?: number | string;
}

const getOptions = (values: TaskValues): ITaskResponseContinueOptions | undefined => {
if (!values.seconds || typeof values.seconds !== "number" || values.seconds < 1) {
return undefined;
}
return {
seconds: values.seconds
};
};

export const createContinuingTask = () => {
return createTaskDefinition<Context, TaskValues>({
id: "continuingTask",
title: "Mock Continuing Task",
description:
"This is a mock task which will continue to run until it reaches the defined run limit.",
async run(params) {
const { response, isAborted, input } = params;
const run = input.run || 0;
const maxRuns = getMaxRuns(input.maxRuns);
if (run >= maxRuns) {
return response.done("Got to the run limit.");
}
if (isAborted()) {
return response.aborted();
}

await new Promise(resolve => setTimeout(resolve, 10000));

return response.continue(
{
...(input || {}),
run: run + 1
},
getOptions(input)
);
}
});
};
25 changes: 25 additions & 0 deletions apps/api/graphql/src/plugins/countDynamoDbTask.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { createTaskDefinition } from "@webiny/tasks";
import { getDocumentClient } from "@webiny/aws-sdk/client-dynamodb";

export const createCountDynamoDbTask = () => {
return createTaskDefinition({
id: "countDdb",
title: "Count DynamoDB",
description: "Counts DynamoDB items.",
run: async params => {
const { response, isAborted, isCloseToTimeout } = params;
if (isAborted()) {
return response.aborted();
} else if (isCloseToTimeout()) {
return response.continue({});
}
const documentClient = getDocumentClient();

const results = await documentClient.scan({
TableName: process.env.DB_TABLE
});

return response.done(`Count: ${results.Count}`);
}
});
};
2 changes: 2 additions & 0 deletions apps/api/graphql/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { FormBuilderContext } from "@webiny/api-form-builder/types";
import { CmsContext } from "@webiny/api-headless-cms/types";
import { AcoContext } from "@webiny/api-aco/types";
import { PbAcoContext } from "@webiny/api-page-builder-aco/types";
import { Context as TasksContext } from "@webiny/tasks/types";

// When working with the `context` object (for example while defining a new GraphQL resolver function),
// you can import this interface and assign it to it. This will give you full autocomplete functionality
Expand All @@ -23,4 +24,5 @@ export interface Context
CmsContext,
FormBuilderContext,
AcoContext,
TasksContext,
PbAcoContext {}
12 changes: 11 additions & 1 deletion apps/api/graphql/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@
},
{
"path": "../../../packages/api-apw-scheduler-so-ddb"
},
{
"path": "../../../packages/api-background-tasks-ddb/tsconfig.build.json"
},
{
"path": "../../../packages/tasks/tsconfig.build.json"
}
],
"compilerOptions": {
Expand Down Expand Up @@ -188,7 +194,11 @@
"@webiny/handler-graphql/*": ["../../../packages/handler-graphql/src/*"],
"@webiny/handler-graphql": ["../../../packages/handler-graphql/src"],
"@webiny/handler-logs/*": ["../../../packages/handler-logs/src/*"],
"@webiny/handler-logs": ["../../../packages/handler-logs/src"]
"@webiny/handler-logs": ["../../../packages/handler-logs/src"],
"@webiny/api-background-tasks-ddb/*": ["../../../packages/api-background-tasks-ddb/src/*"],
"@webiny/api-background-tasks-ddb": ["../../../packages/api-background-tasks-ddb/src"],
"@webiny/tasks/*": ["../../../packages/tasks/src/*"],
"@webiny/tasks": ["../../../packages/tasks/src"]
},
"baseUrl": "."
}
Expand Down
1 change: 1 addition & 0 deletions packages/api-background-tasks-ddb/.babelrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require("@webiny/project-utils").createBabelConfigForNode({ path: __dirname });
21 changes: 21 additions & 0 deletions packages/api-background-tasks-ddb/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) Webiny

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
6 changes: 6 additions & 0 deletions packages/api-background-tasks-ddb/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# @webiny/api-background-tasks-ddb

[![](https://img.shields.io/npm/dw/@webiny/api-background-tasks-ddb.svg)](https://www.npmjs.com/package/@webiny/api-background-tasks-ddb)
[![](https://img.shields.io/npm/v/@webiny/api-background-tasks-ddb.svg)](https://www.npmjs.com/package/@webiny/api-background-tasks-ddb)
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
33 changes: 33 additions & 0 deletions packages/api-background-tasks-ddb/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"name": "@webiny/api-background-tasks-ddb",
"version": "0.0.0",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://github.com/webiny/webiny-js.git"
},
"description": "Wrapper for background tasks initialization for DynamoDB.",
"author": "Webiny LTD",
"license": "MIT",
"dependencies": {
"@webiny/plugins": "0.0.0",
"@webiny/tasks": "0.0.0"
},
"devDependencies": {
"@babel/cli": "^7.22.6",
"@babel/core": "^7.22.8",
"@webiny/cli": "0.0.0",
"@webiny/project-utils": "0.0.0",
"rimraf": "^3.0.2",
"ttypescript": "^1.5.12",
"typescript": "4.7.4"
},
"publishConfig": {
"access": "public",
"directory": "dist"
},
"scripts": {
"build": "yarn webiny run build",
"watch": "yarn webiny run watch"
}
}
6 changes: 6 additions & 0 deletions packages/api-background-tasks-ddb/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { Plugin } from "@webiny/plugins/types";
import { createBackgroundTaskContext, createBackgroundTaskGraphQL } from "@webiny/tasks";

export const createBackgroundTasks = (): Plugin[] => {
return [...createBackgroundTaskContext(), ...createBackgroundTaskGraphQL()];
};
15 changes: 15 additions & 0 deletions packages/api-background-tasks-ddb/tsconfig.build.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"extends": "../../tsconfig.build.json",
"include": ["src"],
"references": [
{ "path": "../plugins/tsconfig.build.json" },
{ "path": "../tasks/tsconfig.build.json" }
],
"compilerOptions": {
"rootDir": "./src",
"outDir": "./dist",
"declarationDir": "./dist",
"paths": { "~/*": ["./src/*"], "~tests/*": ["./__tests__/*"] },
"baseUrl": "."
}
}
19 changes: 19 additions & 0 deletions packages/api-background-tasks-ddb/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"extends": "../../tsconfig.json",
"include": ["src", "__tests__"],
"references": [{ "path": "../plugins" }, { "path": "../tasks" }],
"compilerOptions": {
"rootDirs": ["./src", "./__tests__"],
"outDir": "./dist",
"declarationDir": "./dist",
"paths": {
"~/*": ["./src/*"],
"~tests/*": ["./__tests__/*"],
"@webiny/plugins/*": ["../plugins/src/*"],
"@webiny/plugins": ["../plugins/src"],
"@webiny/tasks/*": ["../tasks/src/*"],
"@webiny/tasks": ["../tasks/src"]
},
"baseUrl": "."
}
}
8 changes: 8 additions & 0 deletions packages/api-background-tasks-ddb/webiny.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const { createWatchPackage, createBuildPackage } = require("@webiny/project-utils");

module.exports = {
commands: {
build: createBuildPackage({ cwd: __dirname }),
watch: createWatchPackage({ cwd: __dirname })
}
};
1 change: 1 addition & 0 deletions packages/api-background-tasks-es/.babelrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require("@webiny/project-utils").createBabelConfigForNode({ path: __dirname });
21 changes: 21 additions & 0 deletions packages/api-background-tasks-es/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) Webiny

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
6 changes: 6 additions & 0 deletions packages/api-background-tasks-es/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# @webiny/api-background-tasks-es

[![](https://img.shields.io/npm/dw/@webiny/api-background-tasks-es.svg)](https://www.npmjs.com/package/@webiny/api-background-tasks-es)
[![](https://img.shields.io/npm/v/@webiny/api-background-tasks-es.svg)](https://www.npmjs.com/package/@webiny/api-background-tasks-es)
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
34 changes: 34 additions & 0 deletions packages/api-background-tasks-es/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"name": "@webiny/api-background-tasks-es",
"version": "0.0.0",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://github.com/webiny/webiny-js.git"
},
"description": "Wrapper for background tasks initialization for Elasticsearch.",
"author": "Webiny LTD",
"license": "MIT",
"dependencies": {
"@webiny/api-elasticsearch-tasks": "0.0.0",
"@webiny/plugins": "0.0.0",
"@webiny/tasks": "0.0.0"
},
"devDependencies": {
"@babel/cli": "^7.22.6",
"@babel/core": "^7.22.8",
"@webiny/cli": "0.0.0",
"@webiny/project-utils": "0.0.0",
"rimraf": "^3.0.2",
"ttypescript": "^1.5.12",
"typescript": "4.7.4"
},
"publishConfig": {
"access": "public",
"directory": "dist"
},
"scripts": {
"build": "yarn webiny run build",
"watch": "yarn webiny run watch"
}
}
11 changes: 11 additions & 0 deletions packages/api-background-tasks-es/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Plugin } from "@webiny/plugins/types";
import { createBackgroundTaskGraphQL, createBackgroundTaskContext } from "@webiny/tasks";
import { createElasticsearchBackgroundTasks } from "@webiny/api-elasticsearch-tasks";

export const createBackgroundTasks = (): Plugin[] => {
return [
...createBackgroundTaskContext(),
...createBackgroundTaskGraphQL(),
...createElasticsearchBackgroundTasks()
];
};
16 changes: 16 additions & 0 deletions packages/api-background-tasks-es/tsconfig.build.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"extends": "../../tsconfig.build.json",
"include": ["src"],
"references": [
{ "path": "../api-elasticsearch-tasks/tsconfig.build.json" },
{ "path": "../plugins/tsconfig.build.json" },
{ "path": "../tasks/tsconfig.build.json" }
],
"compilerOptions": {
"rootDir": "./src",
"outDir": "./dist",
"declarationDir": "./dist",
"paths": { "~/*": ["./src/*"], "~tests/*": ["./__tests__/*"] },
"baseUrl": "."
}
}
Loading
Loading