joist-codegen 0.1.538 → 1.0.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.
Files changed (59) hide show
  1. package/build/EntityDbMetadata.d.ts +71 -23
  2. package/build/EntityDbMetadata.js +229 -63
  3. package/build/EntityDbMetadata.js.map +1 -1
  4. package/build/EntityDbMetadata.test.js +5 -5
  5. package/build/EntityDbMetadata.test.js.map +1 -1
  6. package/build/assignTags.d.ts +1 -1
  7. package/build/assignTags.js +2 -2
  8. package/build/assignTags.js.map +1 -1
  9. package/build/config.d.ts +8 -1
  10. package/build/config.js +25 -13
  11. package/build/config.js.map +1 -1
  12. package/build/config.test.d.ts +1 -0
  13. package/build/config.test.js +37 -0
  14. package/build/config.test.js.map +1 -0
  15. package/build/generateEntitiesFile.d.ts +2 -1
  16. package/build/generateEntitiesFile.js +6 -3
  17. package/build/generateEntitiesFile.js.map +1 -1
  18. package/build/generateEntityCodegenFile.d.ts +2 -4
  19. package/build/generateEntityCodegenFile.js +278 -90
  20. package/build/generateEntityCodegenFile.js.map +1 -1
  21. package/build/generateEnumFile.d.ts +2 -3
  22. package/build/generateEnumFile.js +15 -10
  23. package/build/generateEnumFile.js.map +1 -1
  24. package/build/generateFactoriesFiles.js +4 -4
  25. package/build/generateFactoriesFiles.js.map +1 -1
  26. package/build/generateInitialEntityFile.js +7 -2
  27. package/build/generateInitialEntityFile.js.map +1 -1
  28. package/build/generateMetadataFile.js +96 -69
  29. package/build/generateMetadataFile.js.map +1 -1
  30. package/build/generatePgEnumFile.d.ts +4 -0
  31. package/build/generatePgEnumFile.js +18 -0
  32. package/build/generatePgEnumFile.js.map +1 -0
  33. package/build/index.d.ts +24 -8
  34. package/build/index.js +116 -40
  35. package/build/index.js.map +1 -1
  36. package/build/symbols.d.ts +62 -51
  37. package/build/symbols.js +64 -52
  38. package/build/symbols.js.map +1 -1
  39. package/build/utils.d.ts +4 -2
  40. package/build/utils.js +20 -11
  41. package/build/utils.js.map +1 -1
  42. package/package.json +26 -14
  43. package/jest.config.js +0 -10
  44. package/package.json.bak +0 -28
  45. package/src/EntityDbMetadata.test.ts +0 -42
  46. package/src/EntityDbMetadata.ts +0 -322
  47. package/src/assignTags.ts +0 -45
  48. package/src/config.ts +0 -82
  49. package/src/generateEntitiesFile.ts +0 -26
  50. package/src/generateEntityCodegenFile.ts +0 -414
  51. package/src/generateEnumFile.ts +0 -63
  52. package/src/generateFactoriesFiles.ts +0 -29
  53. package/src/generateInitialEntityFile.ts +0 -12
  54. package/src/generateMetadataFile.ts +0 -175
  55. package/src/index.ts +0 -180
  56. package/src/symbols.ts +0 -53
  57. package/src/utils.ts +0 -88
  58. package/tsconfig.json +0 -21
  59. package/tsconfig.tsbuildinfo +0 -3377
@@ -1,175 +0,0 @@
1
- import { code, Code, imp } from "ts-poet";
2
- import { Config } from "./config";
3
- import { EntityDbMetadata } from "./EntityDbMetadata";
4
- import { EntityMetadata, EnumFieldSerde, ForeignKeySerde, PrimaryKeySerde, SimpleSerde } from "./symbols";
5
-
6
- export function generateMetadataFile(config: Config, dbMetadata: EntityDbMetadata): Code {
7
- const { entity } = dbMetadata;
8
-
9
- const { primaryKey, primitives, enums, m2o } = generateColumns(dbMetadata);
10
- const { primaryKeyField, primitiveFields, enumFields, m2oFields, o2mFields, m2mFields, o2oFields } = generateFields(
11
- config,
12
- dbMetadata,
13
- );
14
-
15
- return code`
16
- export const ${entity.metaName}: ${EntityMetadata}<${entity.type}> = {
17
- cstr: ${entity.type},
18
- type: "${entity.name}",
19
- tagName: "${config.entities[entity.name].tag}",
20
- tableName: "${dbMetadata.tableName}",
21
- columns: [ ${primaryKey} ${enums} ${primitives} ${m2o} ],
22
- fields: [ ${primaryKeyField} ${enumFields} ${primitiveFields} ${m2oFields} ${o2mFields} ${m2mFields} ${o2oFields} ],
23
- config: ${entity.configConst},
24
- factory: ${imp(`new${entity.name}@./entities`)},
25
- };
26
-
27
- (${entity.name} as any).metadata = ${entity.metaName};
28
- `;
29
- }
30
-
31
- function generateColumns(
32
- dbMetadata: EntityDbMetadata,
33
- ): { primaryKey: Code; primitives: Code[]; enums: Code[]; m2o: Code[] } {
34
- const primaryKey = code`
35
- { fieldName: "id", columnName: "id", dbType: "int", serde: new ${PrimaryKeySerde}(() => ${dbMetadata.entity.metaName}, "id", "id") },
36
- `;
37
-
38
- const primitives = dbMetadata.primitives.map((p) => {
39
- const { fieldName, columnName, columnType } = p;
40
- return code`
41
- {
42
- fieldName: "${fieldName}",
43
- columnName: "${columnName}",
44
- dbType: "${columnType}",
45
- serde: new ${SimpleSerde}("${fieldName}", "${columnName}"),
46
- },`;
47
- });
48
-
49
- const enums = dbMetadata.enums.map((e) => {
50
- const { fieldName, columnName, enumDetailType } = e;
51
- return code`
52
- {
53
- fieldName: "${fieldName}",
54
- columnName: "${columnName}",
55
- dbType: "int",
56
- serde: new ${EnumFieldSerde}("${fieldName}", "${columnName}", ${enumDetailType}),
57
- },
58
- `;
59
- });
60
-
61
- const m2o = dbMetadata.manyToOnes.map((m2o) => {
62
- const { fieldName, columnName, otherEntity } = m2o;
63
- return code`
64
- {
65
- fieldName: "${fieldName}",
66
- columnName: "${columnName}",
67
- dbType: "int",
68
- serde: new ${ForeignKeySerde}("${fieldName}", "${columnName}", () => ${otherEntity.metaName}),
69
- },
70
- `;
71
- });
72
-
73
- return { primaryKey, primitives, enums, m2o };
74
- }
75
-
76
- function generateFields(
77
- config: Config,
78
- dbMetadata: EntityDbMetadata,
79
- ): {
80
- primaryKeyField: Code;
81
- primitiveFields: Code[];
82
- enumFields: Code[];
83
- m2oFields: Code[];
84
- o2mFields: Code[];
85
- m2mFields: Code[];
86
- o2oFields: Code[];
87
- } {
88
- const primaryKeyField = code`
89
- { kind: "primaryKey", fieldName: "id", fieldIdName: undefined, required: true },
90
- `;
91
-
92
- const primitiveFields = dbMetadata.primitives.map((p) => {
93
- const { fieldName, derived } = p;
94
- return code`
95
- {
96
- kind: "primitive",
97
- fieldName: "${fieldName}",
98
- fieldIdName: undefined,
99
- derived: ${!derived ? false : `"${derived}"`},
100
- required: ${!derived && p.notNull},
101
- protected: ${p.protected},
102
- type: ${typeof p.fieldType === "string" ? `"${p.fieldType}"` : p.fieldType},
103
- },`;
104
- });
105
-
106
- const enumFields = dbMetadata.enums.map(({ fieldName, enumDetailType, notNull }) => {
107
- return code`
108
- {
109
- kind: "enum",
110
- fieldName: "${fieldName}",
111
- fieldIdName: undefined,
112
- required: ${notNull},
113
- enumDetailType: ${enumDetailType},
114
- },
115
- `;
116
- });
117
-
118
- const m2oFields = dbMetadata.manyToOnes.map((m2o) => {
119
- const { fieldName, notNull, otherEntity, otherFieldName } = m2o;
120
- return code`
121
- {
122
- kind: "m2o",
123
- fieldName: "${fieldName}",
124
- fieldIdName: "${fieldName}Id",
125
- required: ${notNull},
126
- otherMetadata: () => ${otherEntity.metaName},
127
- otherFieldName: "${otherFieldName}",
128
- },
129
- `;
130
- });
131
-
132
- const o2mFields = dbMetadata.oneToManys.map((m2o) => {
133
- const { fieldName, singularName, otherEntity, otherFieldName } = m2o;
134
- return code`
135
- {
136
- kind: "o2m",
137
- fieldName: "${fieldName}",
138
- fieldIdName: "${singularName}Ids",
139
- required: false,
140
- otherMetadata: () => ${otherEntity.metaName},
141
- otherFieldName: "${otherFieldName}",
142
- },
143
- `;
144
- });
145
-
146
- const m2mFields = dbMetadata.manyToManys.map((m2o) => {
147
- const { fieldName, singularName, otherEntity, otherFieldName } = m2o;
148
- return code`
149
- {
150
- kind: "m2m",
151
- fieldName: "${fieldName}",
152
- fieldIdName: "${singularName}Ids",
153
- required: false,
154
- otherMetadata: () => ${otherEntity.metaName},
155
- otherFieldName: "${otherFieldName}",
156
- },
157
- `;
158
- });
159
-
160
- const o2oFields = dbMetadata.oneToOnes.map((o2o) => {
161
- const { fieldName, otherEntity, otherFieldName } = o2o;
162
- return code`
163
- {
164
- kind: "o2o",
165
- fieldName: "${fieldName}",
166
- fieldIdName: "${fieldName}Id",
167
- required: false,
168
- otherMetadata: () => ${otherEntity.metaName},
169
- otherFieldName: "${otherFieldName}",
170
- },
171
- `;
172
- });
173
-
174
- return { primaryKeyField, primitiveFields, enumFields, m2oFields, o2mFields, m2mFields, o2oFields };
175
- }
package/src/index.ts DELETED
@@ -1,180 +0,0 @@
1
- import { promises as fs } from "fs";
2
- import { newPgConnectionConfig } from "joist-utils";
3
- import { Client } from "pg";
4
- import pgStructure, { Db, Table } from "pg-structure";
5
- import { code, Code, def, imp } from "ts-poet";
6
- import { assignTags } from "./assignTags";
7
- import { Config, loadConfig, writeConfig } from "./config";
8
- import { EntityDbMetadata } from "./EntityDbMetadata";
9
- import { generateEntitiesFile } from "./generateEntitiesFile";
10
- import { generateEntityCodegenFile } from "./generateEntityCodegenFile";
11
- import { generateEnumFile } from "./generateEnumFile";
12
- import { generateFactoriesFiles } from "./generateFactoriesFiles";
13
- import { generateInitialEntityFile } from "./generateInitialEntityFile";
14
- import { generateMetadataFile } from "./generateMetadataFile";
15
- import { configureMetadata, EntityManager } from "./symbols";
16
- import { isEntityTable, isEnumTable, merge, tableToEntityName, trueIfResolved } from "./utils";
17
-
18
- export { EntityDbMetadata };
19
- export {
20
- PrimitiveField,
21
- EnumField,
22
- ManyToOneField,
23
- OneToManyField,
24
- ManyToManyField,
25
- OneToOneField,
26
- makeEntity,
27
- } from "./EntityDbMetadata";
28
-
29
- export interface CodeGenFile {
30
- name: string;
31
- contents: Code | string;
32
- overwrite: boolean;
33
- }
34
-
35
- /** A map from Enum table name to the rows currently in the table. */
36
- export type EnumRows = Record<string, EnumRow[]>;
37
- export type EnumRow = { id: number; code: string; name: string };
38
-
39
- /** Uses entities and enums from the `db` schema and saves them into our entities directory. */
40
- export async function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void> {
41
- const files = await generateFiles(config, dbMeta);
42
- await fs.mkdir(config.entitiesDirectory, { recursive: true });
43
- for await (const file of files) {
44
- const path = `${config.entitiesDirectory}/${file.name}`;
45
- if (file.overwrite) {
46
- await fs.writeFile(path, await contentToString(file.contents, file.name));
47
- } else {
48
- const exists = await trueIfResolved(fs.access(path));
49
- if (!exists) {
50
- await fs.writeFile(path, await contentToString(file.contents, file.name));
51
- }
52
- }
53
- }
54
- }
55
-
56
- /** Generates our `${Entity}` and `${Entity}Codegen` files based on the `db` schema. */
57
- export async function generateFiles(config: Config, dbMeta: DbMetadata): Promise<CodeGenFile[]> {
58
- const { entities, enumTables: enums, enumRows } = dbMeta;
59
- const entityFiles = entities
60
- .map((meta) => {
61
- const entityName = meta.entity.name;
62
- return [
63
- {
64
- name: `${entityName}Codegen.ts`,
65
- contents: generateEntityCodegenFile(config, meta),
66
- overwrite: true,
67
- },
68
- { name: `${entityName}.ts`, contents: generateInitialEntityFile(meta), overwrite: false },
69
- ];
70
- })
71
- .reduce(merge, []);
72
-
73
- const enumFiles = enums
74
- .map((table) => {
75
- const enumName = tableToEntityName(config, table);
76
- return [
77
- {
78
- name: `${enumName}.ts`,
79
- contents: generateEnumFile(config, table, enumRows, enumName),
80
- overwrite: true,
81
- },
82
- ];
83
- })
84
- .reduce(merge, []);
85
-
86
- const contextType = config.contextType ? imp(config.contextType) : "{}";
87
-
88
- const metadataFile: CodeGenFile = {
89
- name: "./metadata.ts",
90
- contents: code`
91
- export class ${def("EntityManager")} extends ${EntityManager}<${contextType}> {}
92
-
93
- ${entities.map((meta) => generateMetadataFile(config, meta))}
94
-
95
- const allMetadata = [${entities.map((meta) => meta.entity.metaName).join(", ")}];
96
- ${configureMetadata}(allMetadata);
97
- `,
98
- overwrite: true,
99
- };
100
-
101
- const entitiesFile: CodeGenFile = {
102
- name: "./entities.ts",
103
- contents: generateEntitiesFile(config, entities, enums),
104
- overwrite: true,
105
- };
106
-
107
- const factoriesFiles: CodeGenFile[] = generateFactoriesFiles(entities);
108
-
109
- const indexFile: CodeGenFile = {
110
- name: "./index.ts",
111
- contents: code`export * from "./entities"`,
112
- overwrite: false,
113
- };
114
-
115
- // Look for modules to require and call the exported `.run(EntityDbMetadata[], Table[])` method
116
-
117
- const pluginFiles: CodeGenFile[] = (
118
- await Promise.all(
119
- config.codegenPlugins.map((p) => {
120
- const plugin = require(p);
121
- return plugin.run(entities, enumRows);
122
- }),
123
- )
124
- ).flat();
125
-
126
- return [...entityFiles, ...enumFiles, entitiesFile, ...factoriesFiles, metadataFile, indexFile, ...pluginFiles];
127
- }
128
-
129
- export async function loadEnumRows(db: Db, client: Client): Promise<EnumRows> {
130
- const promises = db.tables.filter(isEnumTable).map(async (table) => {
131
- const result = await client.query(`SELECT * FROM ${table.name} ORDER BY id`);
132
- const rows = result.rows.map((row) => row as EnumRow);
133
- return [table.name, rows] as [string, EnumRow[]];
134
- });
135
- return Object.fromEntries(await Promise.all(promises));
136
- }
137
-
138
- export async function contentToString(content: Code | string, fileName: string): Promise<string> {
139
- if (typeof content === "string") {
140
- return content;
141
- }
142
- return await content.toStringWithImports(fileName);
143
- }
144
-
145
- if (require.main === module) {
146
- if (Object.fromEntries === undefined) {
147
- throw new Error("Joist requires Node v12.4.0+");
148
- }
149
- (async function () {
150
- const pgConfig = newPgConnectionConfig();
151
- const db = await pgStructure(pgConfig);
152
-
153
- const client = new Client(pgConfig);
154
- await client.connect();
155
- const enumRows = await loadEnumRows(db, client);
156
- await client.end();
157
-
158
- const config = await loadConfig();
159
-
160
- const entityTables = db.tables.filter(isEntityTable).sortBy("name");
161
- const enumTables = db.tables.filter(isEnumTable).sortBy("name");
162
- const entities = entityTables.map((table) => new EntityDbMetadata(config, table));
163
- const dbMetadata: DbMetadata = { entityTables, enumTables, entities, enumRows };
164
-
165
- assignTags(config, dbMetadata);
166
- await writeConfig(config);
167
-
168
- await generateAndSaveFiles(config, dbMetadata);
169
- })().catch((err) => {
170
- console.error(err);
171
- process.exit(1);
172
- });
173
- }
174
-
175
- export interface DbMetadata {
176
- entityTables: Table[];
177
- enumTables: Table[];
178
- entities: EntityDbMetadata[];
179
- enumRows: EnumRows;
180
- }
package/src/symbols.ts DELETED
@@ -1,53 +0,0 @@
1
- import { imp } from "ts-poet";
2
-
3
- export const ConfigApi = imp("ConfigApi@joist-orm");
4
- export const FieldStatus = imp("FieldStatus@joist-orm");
5
- export const Entity = imp("Entity@joist-orm");
6
- export const BaseEntity = imp("BaseEntity@joist-orm");
7
- export const Flavor = imp("Flavor@joist-orm");
8
- export const Reference = imp("Reference@joist-orm");
9
- export const Collection = imp("Collection@joist-orm");
10
- export const OneToManyCollection = imp("OneToManyCollection@joist-orm");
11
- export const EntityOrmField = imp("EntityOrmField@joist-orm");
12
- export const EntityManager = imp("EntityManager@joist-orm");
13
- export const EntityMetadata = imp("EntityMetadata@joist-orm");
14
- export const Lens = imp("Lens@joist-orm");
15
- export const PrimaryKeySerde = imp("PrimaryKeySerde@joist-orm");
16
- export const ManyToOneReference = imp("ManyToOneReference@joist-orm");
17
- export const OneToOneReference = imp("OneToOneReference@joist-orm");
18
- export const ManyToManyCollection = imp("ManyToManyCollection@joist-orm");
19
- export const EnumFieldSerde = imp("EnumFieldSerde@joist-orm");
20
- export const ForeignKeySerde = imp("ForeignKeySerde@joist-orm");
21
- export const SimpleSerde = imp("SimpleSerde@joist-orm");
22
- export const fail = imp("fail@joist-orm");
23
- export const setOpts = imp("setOpts@joist-orm");
24
- export const setField = imp("setField@joist-orm");
25
- export const OrderBy = imp("OrderBy@joist-orm");
26
- export const OptsOf = imp("OptsOf@joist-orm");
27
- export const IdOf = imp("IdOf@joist-orm");
28
- export const PartialOrNull = imp("PartialOrNull@joist-orm");
29
- export const BooleanFilter = imp("BooleanFilter@joist-orm");
30
- export const ValueFilter = imp("ValueFilter@joist-orm");
31
- export const EntityFilter = imp("EntityFilter@joist-orm");
32
- export const BooleanGraphQLFilter = imp("BooleanGraphQLFilter@joist-orm");
33
- export const EntityGraphQLFilter = imp("EntityGraphQLFilter@joist-orm");
34
- export const EnumGraphQLFilter = imp("EnumGraphQLFilter@joist-orm");
35
- export const ValueGraphQLFilter = imp("ValueGraphQLFilter@joist-orm");
36
- export const FilterOf = imp("FilterOf@joist-orm");
37
- export const GraphQLFilterOf = imp("GraphQLFilterOf@joist-orm");
38
- export const configureMetadata = imp("configureMetadata@joist-orm");
39
- export const newRequiredRule = imp("newRequiredRule@joist-orm");
40
- export const Changes = imp("Changes@joist-orm");
41
- export const newChangesProxy = imp("newChangesProxy@joist-orm");
42
- export const LoadHint = imp("LoadHint@joist-orm");
43
- export const Loaded = imp("Loaded@joist-orm");
44
- export const getEm = imp("getEm@joist-orm");
45
- export const loadLens = imp("loadLens@joist-orm");
46
- export const hasOneThrough = imp("hasOneThrough@joist-orm");
47
- export const hasMany = imp("hasMany@joist-orm");
48
- export const hasOne = imp("hasOne@joist-orm");
49
- export const hasOneToOne = imp("hasOneToOne@joist-orm");
50
- export const hasManyToMany = imp("hasManyToMany@joist-orm");
51
- export const newTestInstance = imp("newTestInstance@joist-orm");
52
- export const New = imp("New@joist-orm");
53
- export const FactoryOpts = imp("FactoryOpts@joist-orm");
package/src/utils.ts DELETED
@@ -1,88 +0,0 @@
1
- import isPlainObject from "is-plain-object";
2
- import { Config } from "./config";
3
- import { Table } from "pg-structure";
4
- import pluralize from "pluralize";
5
- import { pascalCase } from "change-case";
6
-
7
- export function isEntityTable(t: Table): boolean {
8
- const columnNames = t.columns.map((c) => c.name);
9
- return includesAllOf(columnNames, ["id", "created_at", "updated_at"]);
10
- }
11
-
12
- export function isEnumTable(t: Table): boolean {
13
- const columnNames = t.columns.map((c) => c.name);
14
- return includesAllOf(columnNames, ["id", "code", "name"]) && !isEntityTable(t);
15
- }
16
-
17
- export function isJoinTable(t: Table): boolean {
18
- const { columns } = t;
19
- const hasOnePk = columns.filter((c) => c.isPrimaryKey).length === 1;
20
- const hasTwoFks = columns.filter((c) => c.isForeignKey).length === 2;
21
- const hasThreeColumns = columns.length === 3;
22
- const hasFourColumnsOneIsCreatedAt =
23
- columns.length === 4 && columns.filter((c) => c.name === "created_at").length === 1;
24
- return hasOnePk && hasTwoFks && (hasThreeColumns || hasFourColumnsOneIsCreatedAt);
25
- }
26
-
27
- function includesAllOf(set: string[], subset: string[]): boolean {
28
- return subset.find((e) => !set.includes(e)) === undefined;
29
- }
30
-
31
- /** Converts `projects` to `Project`. */
32
- export function tableToEntityName(config: Config, table: Table): string {
33
- let entityName = config.__tableToEntityName[table.name];
34
- if (!entityName) {
35
- const configEntityName = Object.entries(config.entities)
36
- .filter(([, conf]) => conf.tableName === table.name)
37
- .map(([entityName]) => entityName)[0];
38
- entityName = configEntityName || pascalCase(pluralize.singular(table.name));
39
- config.__tableToEntityName[table.name] = entityName;
40
- }
41
- return entityName;
42
- }
43
-
44
- /** Maps db types, i.e. `int`, to JS types, i.e. `number`. */
45
- export function mapSimpleDbType(dbType: string): string {
46
- switch (dbType) {
47
- case "bool":
48
- return "boolean";
49
- case "int":
50
- case "numeric":
51
- return "number";
52
- case "text":
53
- case "varchar":
54
- return "string";
55
- case "timestamptz":
56
- case "date":
57
- return "Date";
58
- default:
59
- throw new Error(`Unrecognized type ${dbType}`);
60
- }
61
- }
62
-
63
- export function merge<T>(a: T[], b: T[]): T[] {
64
- return [...a, ...b];
65
- }
66
-
67
- /** Returns true if `p` is resolved, otherwise false if it is rejected. */
68
- export async function trueIfResolved(p: Promise<unknown>): Promise<boolean> {
69
- return p.then(
70
- () => true,
71
- () => false,
72
- );
73
- }
74
-
75
- export function fail(message?: string): never {
76
- throw new Error(message || "Failed");
77
- }
78
-
79
- export function sortKeys<T extends object>(o: T): T {
80
- return Object.keys(o)
81
- .sort()
82
- .reduce((acc, key) => {
83
- const value = o[key as keyof T];
84
- const newValue = typeof value === "object" && isPlainObject(value) ? sortKeys((value as any) as object) : value;
85
- acc[key as keyof T] = newValue as any;
86
- return acc;
87
- }, ({} as any) as T);
88
- }
package/tsconfig.json DELETED
@@ -1,21 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2019",
4
- "module": "commonjs",
5
- "lib": ["es2019"],
6
- "strict": true,
7
- "noImplicitReturns": true,
8
- "types": ["jest", "node"],
9
- "esModuleInterop": true,
10
- "skipLibCheck": true,
11
- "composite": true,
12
- "sourceMap": true,
13
- "outDir": "./build",
14
- "rootDir": "./src",
15
- "baseUrl": "./src",
16
- "paths": {
17
- "joist-utils": ["../../utils/src"]
18
- }
19
- },
20
- "references": [{ "path": "../utils" }]
21
- }