@datacapy/migrate 0.1.0
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/LICENSE +29 -0
- package/README.md +658 -0
- package/dist/cli/command-parser.d.ts +18 -0
- package/dist/cli/command-parser.d.ts.map +1 -0
- package/dist/cli/command-parser.js +159 -0
- package/dist/cli/command-parser.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +22 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/runner.d.ts +6 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +141 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/executor/patch-executor.d.ts +13 -0
- package/dist/executor/patch-executor.d.ts.map +1 -0
- package/dist/executor/patch-executor.js +58 -0
- package/dist/executor/patch-executor.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/interface/context-resolver.d.ts +4 -0
- package/dist/interface/context-resolver.d.ts.map +1 -0
- package/dist/interface/context-resolver.js +3 -0
- package/dist/interface/context-resolver.js.map +1 -0
- package/dist/interface/database-patch.d.ts +8 -0
- package/dist/interface/database-patch.d.ts.map +1 -0
- package/dist/interface/database-patch.js +3 -0
- package/dist/interface/database-patch.js.map +1 -0
- package/dist/interface/index.d.ts +4 -0
- package/dist/interface/index.d.ts.map +1 -0
- package/dist/interface/index.js +20 -0
- package/dist/interface/index.js.map +1 -0
- package/dist/interface/migration-config.d.ts +26 -0
- package/dist/interface/migration-config.d.ts.map +1 -0
- package/dist/interface/migration-config.js +3 -0
- package/dist/interface/migration-config.js.map +1 -0
- package/dist/interface/migration-result.d.ts +31 -0
- package/dist/interface/migration-result.d.ts.map +1 -0
- package/dist/interface/migration-result.js +3 -0
- package/dist/interface/migration-result.js.map +1 -0
- package/dist/logger/migration-logger.d.ts +21 -0
- package/dist/logger/migration-logger.d.ts.map +1 -0
- package/dist/logger/migration-logger.js +78 -0
- package/dist/logger/migration-logger.js.map +1 -0
- package/dist/manager/migration-manager.d.ts +12 -0
- package/dist/manager/migration-manager.d.ts.map +1 -0
- package/dist/manager/migration-manager.js +262 -0
- package/dist/manager/migration-manager.js.map +1 -0
- package/dist/meta/meta-table.d.ts +22 -0
- package/dist/meta/meta-table.d.ts.map +1 -0
- package/dist/meta/meta-table.js +86 -0
- package/dist/meta/meta-table.js.map +1 -0
- package/dist/scanner/patch-scanner.d.ts +11 -0
- package/dist/scanner/patch-scanner.d.ts.map +1 -0
- package/dist/scanner/patch-scanner.js +166 -0
- package/dist/scanner/patch-scanner.js.map +1 -0
- package/dist/version/version-manager.d.ts +11 -0
- package/dist/version/version-manager.d.ts.map +1 -0
- package/dist/version/version-manager.js +90 -0
- package/dist/version/version-manager.js.map +1 -0
- package/package.json +51 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PatchScanner = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class PatchScanner {
|
|
40
|
+
constructor(patchDirectory) {
|
|
41
|
+
this.patchDirectory = path.resolve(patchDirectory);
|
|
42
|
+
}
|
|
43
|
+
async scanPatches() {
|
|
44
|
+
if (!fs.existsSync(this.patchDirectory)) {
|
|
45
|
+
throw new Error(`Patch directory does not exist: ${this.patchDirectory}`);
|
|
46
|
+
}
|
|
47
|
+
const patchFiles = [];
|
|
48
|
+
const yearDirs = this.getDirectories(this.patchDirectory);
|
|
49
|
+
for (const yearDir of yearDirs) {
|
|
50
|
+
if (!/^\d{4}$/.test(yearDir)) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const yearPath = path.join(this.patchDirectory, yearDir);
|
|
54
|
+
const monthDirs = this.getDirectories(yearPath);
|
|
55
|
+
for (const monthDir of monthDirs) {
|
|
56
|
+
if (!/^\d{2}$/.test(monthDir)) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const monthPath = path.join(yearPath, monthDir);
|
|
60
|
+
const files = this.getFiles(monthPath);
|
|
61
|
+
for (const file of files) {
|
|
62
|
+
const filePath = path.join(monthPath, file);
|
|
63
|
+
const patchFile = await this.loadPatchFile(filePath);
|
|
64
|
+
if (patchFile) {
|
|
65
|
+
patchFiles.push(patchFile);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
patchFiles.sort((a, b) => a.version.localeCompare(b.version));
|
|
71
|
+
return patchFiles;
|
|
72
|
+
}
|
|
73
|
+
async loadPatchFile(filePath) {
|
|
74
|
+
const fileName = path.basename(filePath);
|
|
75
|
+
const ext = path.extname(fileName);
|
|
76
|
+
if (![".ts", ".tsx", ".js"].includes(ext) || fileName.endsWith(".d.ts")) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const versionMatch = fileName.match(/^(\d{4}-\d{2}-\d{2}_\d{4})_/);
|
|
80
|
+
if (!versionMatch) {
|
|
81
|
+
throw new Error(`Invalid patch filename format: ${fileName}. Expected format: YYYY-MM-DD_HHMM_label.(ts|tsx|js)`);
|
|
82
|
+
}
|
|
83
|
+
const version = versionMatch[1];
|
|
84
|
+
let patchModule;
|
|
85
|
+
try {
|
|
86
|
+
delete require.cache[require.resolve(filePath)];
|
|
87
|
+
patchModule = require(filePath);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
throw new Error(`Failed to load patch file ${filePath}: ${error}`);
|
|
91
|
+
}
|
|
92
|
+
const PatchClass = patchModule.default || patchModule;
|
|
93
|
+
if (!PatchClass) {
|
|
94
|
+
throw new Error(`Patch file ${filePath} has no default export`);
|
|
95
|
+
}
|
|
96
|
+
let patch;
|
|
97
|
+
try {
|
|
98
|
+
patch = new PatchClass();
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw new Error(`Failed to instantiate patch class from ${filePath}: ${error}`);
|
|
102
|
+
}
|
|
103
|
+
this.validatePatch(patch, filePath);
|
|
104
|
+
if (patch.version !== version) {
|
|
105
|
+
throw new Error(`Version mismatch in ${filePath}: filename version "${version}" does not match class version "${patch.version}"`);
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
version,
|
|
109
|
+
filePath,
|
|
110
|
+
patch,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
validatePatch(patch, filePath) {
|
|
114
|
+
const requiredProps = [
|
|
115
|
+
"version",
|
|
116
|
+
"description",
|
|
117
|
+
"dataSourceName",
|
|
118
|
+
"update",
|
|
119
|
+
];
|
|
120
|
+
for (const prop of requiredProps) {
|
|
121
|
+
if (!(prop in patch)) {
|
|
122
|
+
throw new Error(`Patch ${filePath} is missing required property: ${prop}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (typeof patch.version !== "string") {
|
|
126
|
+
throw new Error(`Patch ${filePath}: version must be a string`);
|
|
127
|
+
}
|
|
128
|
+
if (typeof patch.description !== "string") {
|
|
129
|
+
throw new Error(`Patch ${filePath}: description must be a string`);
|
|
130
|
+
}
|
|
131
|
+
if (typeof patch.dataSourceName !== "string") {
|
|
132
|
+
throw new Error(`Patch ${filePath}: dataSourceName must be a string`);
|
|
133
|
+
}
|
|
134
|
+
if (typeof patch.update !== "function") {
|
|
135
|
+
throw new Error(`Patch ${filePath}: update must be a function`);
|
|
136
|
+
}
|
|
137
|
+
const versionRegex = /^\d{4}-\d{2}-\d{2}_\d{4}$/;
|
|
138
|
+
if (!versionRegex.test(patch.version)) {
|
|
139
|
+
throw new Error(`Patch ${filePath}: invalid version format "${patch.version}". Expected YYYY-MM-DD_HHMM`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
getDirectories(dirPath) {
|
|
143
|
+
try {
|
|
144
|
+
return fs
|
|
145
|
+
.readdirSync(dirPath, { withFileTypes: true })
|
|
146
|
+
.filter((dirent) => dirent.isDirectory())
|
|
147
|
+
.map((dirent) => dirent.name);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
getFiles(dirPath) {
|
|
154
|
+
try {
|
|
155
|
+
return fs
|
|
156
|
+
.readdirSync(dirPath, { withFileTypes: true })
|
|
157
|
+
.filter((dirent) => dirent.isFile())
|
|
158
|
+
.map((dirent) => dirent.name);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
exports.PatchScanner = PatchScanner;
|
|
166
|
+
//# sourceMappingURL=patch-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-scanner.js","sourceRoot":"","sources":["../../src/scanner/patch-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class VersionManager {
|
|
2
|
+
private static readonly VERSION_REGEX;
|
|
3
|
+
static parseVersion(version: string): number;
|
|
4
|
+
static compareVersions(v1: string, v2: string): number;
|
|
5
|
+
static sortVersions(versions: string[]): string[];
|
|
6
|
+
static getVersionsToApply(allVersions: string[], currentVersion?: string, targetVersion?: string): string[];
|
|
7
|
+
static isValidVersion(version: string): boolean;
|
|
8
|
+
static generateVersion(date?: Date): string;
|
|
9
|
+
static getLatestVersion(versions: string[]): string | undefined;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=version-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-manager.d.ts","sourceRoot":"","sources":["../../src/version/version-manager.ts"],"names":[],"mappings":"AAOA,qBAAa,cAAc;IAIzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAA+B;IASpE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IA0C5C,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAetD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAYjD,MAAM,CAAC,kBAAkB,CACvB,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,GAAE,MAA0B,EAC1C,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,EAAE;IAyBX,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IA2C/C,MAAM,CAAC,eAAe,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM;IAgBvD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS;CAQhE"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VersionManager = void 0;
|
|
4
|
+
class VersionManager {
|
|
5
|
+
static parseVersion(version) {
|
|
6
|
+
if (version === "0000-00-00_0000") {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
if (!this.isValidVersion(version)) {
|
|
10
|
+
throw new Error(`Invalid version format: ${version}. Expected YYYY-MM-DD_HHMM`);
|
|
11
|
+
}
|
|
12
|
+
const [datePart, timePart] = version.split("_");
|
|
13
|
+
const [year, month, day] = datePart.split("-").map(Number);
|
|
14
|
+
const hours = parseInt(timePart.substring(0, 2), 10);
|
|
15
|
+
const minutes = parseInt(timePart.substring(2, 4), 10);
|
|
16
|
+
const date = new Date(year, month - 1, day, hours, minutes, 0, 0);
|
|
17
|
+
if (date.getFullYear() !== year ||
|
|
18
|
+
date.getMonth() !== month - 1 ||
|
|
19
|
+
date.getDate() !== day ||
|
|
20
|
+
date.getHours() !== hours ||
|
|
21
|
+
date.getMinutes() !== minutes) {
|
|
22
|
+
throw new Error(`Invalid date in version: ${version}`);
|
|
23
|
+
}
|
|
24
|
+
return date.getTime();
|
|
25
|
+
}
|
|
26
|
+
static compareVersions(v1, v2) {
|
|
27
|
+
const t1 = this.parseVersion(v1);
|
|
28
|
+
const t2 = this.parseVersion(v2);
|
|
29
|
+
if (t1 < t2)
|
|
30
|
+
return -1;
|
|
31
|
+
if (t1 > t2)
|
|
32
|
+
return 1;
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
static sortVersions(versions) {
|
|
36
|
+
return [...versions].sort((a, b) => this.compareVersions(a, b));
|
|
37
|
+
}
|
|
38
|
+
static getVersionsToApply(allVersions, currentVersion = "0000-00-00_0000", targetVersion) {
|
|
39
|
+
const sorted = this.sortVersions(allVersions);
|
|
40
|
+
const afterCurrent = sorted.filter((v) => this.compareVersions(v, currentVersion) > 0);
|
|
41
|
+
if (!targetVersion) {
|
|
42
|
+
return afterCurrent;
|
|
43
|
+
}
|
|
44
|
+
return afterCurrent.filter((v) => this.compareVersions(v, targetVersion) <= 0);
|
|
45
|
+
}
|
|
46
|
+
static isValidVersion(version) {
|
|
47
|
+
if (version === "0000-00-00_0000") {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
if (!this.VERSION_REGEX.test(version)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const [datePart, timePart] = version.split("_");
|
|
55
|
+
const [year, month, day] = datePart.split("-").map(Number);
|
|
56
|
+
const hours = parseInt(timePart.substring(0, 2), 10);
|
|
57
|
+
const minutes = parseInt(timePart.substring(2, 4), 10);
|
|
58
|
+
const date = new Date(year, month - 1, day, hours, minutes, 0, 0);
|
|
59
|
+
if (date.getFullYear() !== year ||
|
|
60
|
+
date.getMonth() !== month - 1 ||
|
|
61
|
+
date.getDate() !== day ||
|
|
62
|
+
date.getHours() !== hours ||
|
|
63
|
+
date.getMinutes() !== minutes) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
static generateVersion(date = new Date()) {
|
|
73
|
+
const year = date.getFullYear();
|
|
74
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
75
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
76
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
77
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
78
|
+
return `${year}-${month}-${day}_${hours}${minutes}`;
|
|
79
|
+
}
|
|
80
|
+
static getLatestVersion(versions) {
|
|
81
|
+
if (versions.length === 0) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
const sorted = this.sortVersions(versions);
|
|
85
|
+
return sorted[sorted.length - 1];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.VersionManager = VersionManager;
|
|
89
|
+
VersionManager.VERSION_REGEX = /^\d{4}-\d{2}-\d{2}_\d{4}$/;
|
|
90
|
+
//# sourceMappingURL=version-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-manager.js","sourceRoot":"","sources":["../../src/version/version-manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@datacapy/migrate",
|
|
3
|
+
"type": "commonjs",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Datacapy migrate: database migration runner",
|
|
6
|
+
"main": "./dist/index",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"@datacapy/migrate": "./dist/cli/index.js"
|
|
10
|
+
},
|
|
11
|
+
"author": "Kevin Foster <kevin.foster.uk@gmail.com>",
|
|
12
|
+
"license": "BSD-3-Clause",
|
|
13
|
+
"homepage": "https://github.com/datacapy/datacapy#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/datacapy/datacapy/issues"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/datacapy/datacapy.git",
|
|
20
|
+
"directory": "package/migrate"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@datacapy/id": "0.1.0",
|
|
24
|
+
"@datacapy/om": "0.1.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/jest": "^30.0.0",
|
|
28
|
+
"@types/node": "^25.9.8",
|
|
29
|
+
"jest": "^30.5.2",
|
|
30
|
+
"prettier": "^3.9.9",
|
|
31
|
+
"ts-jest": "^29.4.14",
|
|
32
|
+
"ts-node": "^10.9.2",
|
|
33
|
+
"tsc-alias": "1.9.5",
|
|
34
|
+
"typescript": "^6.0.3"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"/dist",
|
|
38
|
+
"/tsconfig.json"
|
|
39
|
+
],
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "pnpm run clean && tsc && tsc-alias -p tsconfig.json && pnpm run build-minimise",
|
|
45
|
+
"build-minimise": "find ./dist -type d -name '__tests__' -exec rm -rf {} +",
|
|
46
|
+
"clean": "rm -rf ./dist/*",
|
|
47
|
+
"test": "jest",
|
|
48
|
+
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json}\"",
|
|
49
|
+
"typecheck": "tsc --noEmit"
|
|
50
|
+
}
|
|
51
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2020",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"allowJs": false,
|
|
6
|
+
"strict": false,
|
|
7
|
+
"noImplicitAny": false,
|
|
8
|
+
"outDir": "./dist",
|
|
9
|
+
"rootDir": "./src",
|
|
10
|
+
"baseUrl": "./src",
|
|
11
|
+
"ignoreDeprecations": "6.0",
|
|
12
|
+
"paths": {
|
|
13
|
+
"*": ["*"]
|
|
14
|
+
},
|
|
15
|
+
"removeComments": true,
|
|
16
|
+
"esModuleInterop": true,
|
|
17
|
+
"declaration": true,
|
|
18
|
+
"declarationMap": true,
|
|
19
|
+
"sourceMap": true,
|
|
20
|
+
"skipLibCheck": true,
|
|
21
|
+
"allowSyntheticDefaultImports": true,
|
|
22
|
+
"forceConsistentCasingInFileNames": true,
|
|
23
|
+
"types": ["node"]
|
|
24
|
+
},
|
|
25
|
+
"include": ["src"],
|
|
26
|
+
"exclude": ["node_modules", "**/*.test.ts", "**/*.spec.ts", "src/test-utils"]
|
|
27
|
+
}
|