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.
- package/build/EntityDbMetadata.d.ts +71 -23
- package/build/EntityDbMetadata.js +229 -63
- package/build/EntityDbMetadata.js.map +1 -1
- package/build/EntityDbMetadata.test.js +5 -5
- package/build/EntityDbMetadata.test.js.map +1 -1
- package/build/assignTags.d.ts +1 -1
- package/build/assignTags.js +2 -2
- package/build/assignTags.js.map +1 -1
- package/build/config.d.ts +8 -1
- package/build/config.js +25 -13
- package/build/config.js.map +1 -1
- package/build/config.test.d.ts +1 -0
- package/build/config.test.js +37 -0
- package/build/config.test.js.map +1 -0
- package/build/generateEntitiesFile.d.ts +2 -1
- package/build/generateEntitiesFile.js +6 -3
- package/build/generateEntitiesFile.js.map +1 -1
- package/build/generateEntityCodegenFile.d.ts +2 -4
- package/build/generateEntityCodegenFile.js +278 -90
- package/build/generateEntityCodegenFile.js.map +1 -1
- package/build/generateEnumFile.d.ts +2 -3
- package/build/generateEnumFile.js +15 -10
- package/build/generateEnumFile.js.map +1 -1
- package/build/generateFactoriesFiles.js +4 -4
- package/build/generateFactoriesFiles.js.map +1 -1
- package/build/generateInitialEntityFile.js +7 -2
- package/build/generateInitialEntityFile.js.map +1 -1
- package/build/generateMetadataFile.js +96 -69
- package/build/generateMetadataFile.js.map +1 -1
- package/build/generatePgEnumFile.d.ts +4 -0
- package/build/generatePgEnumFile.js +18 -0
- package/build/generatePgEnumFile.js.map +1 -0
- package/build/index.d.ts +24 -8
- package/build/index.js +116 -40
- package/build/index.js.map +1 -1
- package/build/symbols.d.ts +62 -51
- package/build/symbols.js +64 -52
- package/build/symbols.js.map +1 -1
- package/build/utils.d.ts +4 -2
- package/build/utils.js +20 -11
- package/build/utils.js.map +1 -1
- package/package.json +26 -14
- package/jest.config.js +0 -10
- package/package.json.bak +0 -28
- package/src/EntityDbMetadata.test.ts +0 -42
- package/src/EntityDbMetadata.ts +0 -322
- package/src/assignTags.ts +0 -45
- package/src/config.ts +0 -82
- package/src/generateEntitiesFile.ts +0 -26
- package/src/generateEntityCodegenFile.ts +0 -414
- package/src/generateEnumFile.ts +0 -63
- package/src/generateFactoriesFiles.ts +0 -29
- package/src/generateInitialEntityFile.ts +0 -12
- package/src/generateMetadataFile.ts +0 -175
- package/src/index.ts +0 -180
- package/src/symbols.ts +0 -53
- package/src/utils.ts +0 -88
- package/tsconfig.json +0 -21
- package/tsconfig.tsbuildinfo +0 -3377
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Table } from "pg-structure";
|
|
2
1
|
import { Code } from "ts-poet";
|
|
3
2
|
import { Config } from "./config";
|
|
4
|
-
import {
|
|
5
|
-
export declare function generateEnumFile(config: Config,
|
|
3
|
+
import { EnumTableData } from "./index";
|
|
4
|
+
export declare function generateEnumFile(config: Config, enumData: EnumTableData, enumName: string): Code;
|
|
@@ -7,21 +7,26 @@ exports.generateEnumFile = void 0;
|
|
|
7
7
|
const change_case_1 = require("change-case");
|
|
8
8
|
const pluralize_1 = __importDefault(require("pluralize"));
|
|
9
9
|
const ts_poet_1 = require("ts-poet");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const rows = enumRows[table.name];
|
|
10
|
+
function generateEnumFile(config, enumData, enumName) {
|
|
11
|
+
const { rows, extraPrimitives } = enumData;
|
|
13
12
|
const detailsName = `${enumName}Details`;
|
|
14
|
-
// We're not really an entity, but appropriate EntityDbMetadata's `primitives` filtering
|
|
15
|
-
const extraPrimitives = new index_1.EntityDbMetadata(config, table).primitives.filter((p) => !["code", "name"].includes(p.fieldName));
|
|
16
13
|
const detailsDefinition = [
|
|
17
14
|
"id: number;",
|
|
18
15
|
`code: ${enumName};`,
|
|
19
16
|
"name: string;",
|
|
20
|
-
...extraPrimitives.map((primitive) =>
|
|
17
|
+
...extraPrimitives.map((primitive) => {
|
|
18
|
+
// If the extra primitive values are all unique, then allow the type be only that set of values. Otherwise, use `fieldType`
|
|
19
|
+
const allValues = rows.map((r) => r[primitive.columnName]);
|
|
20
|
+
const uniqueValues = new Set(allValues);
|
|
21
|
+
if (uniqueValues.size === allValues.length) {
|
|
22
|
+
return `${primitive.fieldName}: ${primitive.fieldType === "string" ? `"${allValues.join('" | "')}"` : allValues.join(" | ")};`;
|
|
23
|
+
}
|
|
24
|
+
return `${primitive.fieldName}: ${primitive.fieldType};`;
|
|
25
|
+
}),
|
|
21
26
|
].join(" ");
|
|
22
|
-
return ts_poet_1.code `
|
|
27
|
+
return (0, ts_poet_1.code) `
|
|
23
28
|
export enum ${enumName} {
|
|
24
|
-
${rows.map((row) => `${change_case_1.pascalCase(row.code)} = '${row.code}'`).join(",\n")}
|
|
29
|
+
${rows.map((row) => `${(0, change_case_1.pascalCase)(row.code)} = '${row.code}'`).join(",\n")}
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
export type ${detailsName} = {${detailsDefinition}};
|
|
@@ -29,7 +34,7 @@ function generateEnumFile(config, table, enumRows, enumName) {
|
|
|
29
34
|
const details: Record<${enumName}, ${detailsName}> = {
|
|
30
35
|
${rows
|
|
31
36
|
.map((row) => {
|
|
32
|
-
const code = change_case_1.pascalCase(row.code);
|
|
37
|
+
const code = (0, change_case_1.pascalCase)(row.code);
|
|
33
38
|
const safeName = row.name.replace(/(["'])/g, "\\$1");
|
|
34
39
|
const extras = extraPrimitives
|
|
35
40
|
.map((p) => `${p.fieldName}: ${JSON.stringify(row[p.columnName])}`)
|
|
@@ -39,7 +44,7 @@ function generateEnumFile(config, table, enumRows, enumName) {
|
|
|
39
44
|
.join(",")}
|
|
40
45
|
};
|
|
41
46
|
|
|
42
|
-
export const ${pluralize_1.default(enumName)} = {
|
|
47
|
+
export const ${(0, pluralize_1.default)(enumName)} = {
|
|
43
48
|
getByCode(code: ${enumName}): ${detailsName} {
|
|
44
49
|
return details[code];
|
|
45
50
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateEnumFile.js","sourceRoot":"","sources":["../src/generateEnumFile.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAyC;
|
|
1
|
+
{"version":3,"file":"generateEnumFile.js","sourceRoot":"","sources":["../src/generateEnumFile.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAyC;AACzC,0DAAkC;AAClC,qCAAqC;AAIrC,SAAgB,gBAAgB,CAAC,MAAc,EAAE,QAAuB,EAAE,QAAgB;IACxF,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC;IAC3C,MAAM,WAAW,GAAG,GAAG,QAAQ,SAAS,CAAC;IACzC,MAAM,iBAAiB,GAAG;QACxB,aAAa;QACb,SAAS,QAAQ,GAAG;QACpB,eAAe;QACf,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACnC,2HAA2H;YAC3H,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,EAAE;gBAC1C,OAAO,GAAG,SAAS,CAAC,SAAS,KAC3B,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAC1F,GAAG,CAAC;aACL;YACD,OAAO,GAAG,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS,GAAG,CAAC;QAC3D,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,IAAA,cAAI,EAAA;kBACK,QAAQ;QAClB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;;kBAG9D,WAAW,OAAO,iBAAiB;;4BAEzB,QAAQ,KAAK,WAAW;QAC5C,IAAI;SACH,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,eAAe;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,CAAE,GAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;aAC3E,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,IAAI,QAAQ,IAAI,IAAI,YAAY,GAAG,CAAC,EAAE,WAAW,QAAQ,IAAI,IAAI,YAAY,QAAQ,MAAM,MAAM,IAAI,CAAC;IAC/G,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC;;;mBAGC,IAAA,mBAAS,EAAC,QAAQ,CAAC;wBACd,QAAQ,MAAM,WAAW;;;;kCAIf,WAAW;iCACZ,QAAQ;;;8BAGX,WAAW;;;;mCAIN,QAAQ;+BACZ,QAAQ;;;oCAGH,WAAW;;;;GAI5C,CAAC;AACJ,CAAC;AA7DD,4CA6DC"}
|
|
@@ -7,11 +7,11 @@ const symbols_1 = require("./symbols");
|
|
|
7
7
|
function generateFactoriesFiles(entities) {
|
|
8
8
|
// One-time create an Author.factories.ts for each entity
|
|
9
9
|
const entityFiles = entities.map(({ entity }) => {
|
|
10
|
-
const name = change_case_1.pascalCase(entity.name);
|
|
11
|
-
const contents = ts_poet_1.code `
|
|
10
|
+
const name = (0, change_case_1.pascalCase)(entity.name);
|
|
11
|
+
const contents = (0, ts_poet_1.code) `
|
|
12
12
|
export function new${name}(
|
|
13
13
|
em: ${symbols_1.EntityManager},
|
|
14
|
-
opts
|
|
14
|
+
opts: ${symbols_1.FactoryOpts}<${entity.type}> = {},
|
|
15
15
|
): ${symbols_1.New}<${entity.type}> {
|
|
16
16
|
return ${symbols_1.newTestInstance}(em, ${entity.type}, opts);
|
|
17
17
|
}`;
|
|
@@ -20,7 +20,7 @@ function generateFactoriesFiles(entities) {
|
|
|
20
20
|
// Everytime create a factories.ts that exports the others
|
|
21
21
|
const factoriesFile = {
|
|
22
22
|
name: "./factories.ts",
|
|
23
|
-
contents: ts_poet_1.code `${entities.map(({ entity }) => ts_poet_1.code `export * from "./${entity.name}.factories";`)}`,
|
|
23
|
+
contents: (0, ts_poet_1.code) `${entities.map(({ entity }) => (0, ts_poet_1.code) `export * from "./${entity.name}.factories";`)}`,
|
|
24
24
|
overwrite: true,
|
|
25
25
|
};
|
|
26
26
|
return [...entityFiles, factoriesFile];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateFactoriesFiles.js","sourceRoot":"","sources":["../src/generateFactoriesFiles.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AACzC,qCAA+B;AAG/B,uCAA6E;AAE7E,SAAgB,sBAAsB,CAAC,QAA4B;IACjE,yDAAyD;IACzD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC9C,MAAM,IAAI,GAAG,wBAAU,
|
|
1
|
+
{"version":3,"file":"generateFactoriesFiles.js","sourceRoot":"","sources":["../src/generateFactoriesFiles.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AACzC,qCAA+B;AAG/B,uCAA6E;AAE7E,SAAgB,sBAAsB,CAAC,QAA4B;IACjE,yDAAyD;IACzD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC9C,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,cAAI,EAAA;2BACE,IAAI;cACjB,uBAAa;gBACX,qBAAW,IAAI,MAAM,CAAC,IAAI;WAC/B,aAAG,IAAI,MAAM,CAAC,IAAI;iBACZ,yBAAe,QAAQ,MAAM,CAAC,IAAI;QAC3C,CAAC;QACL,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,aAAa,GAAG;QACpB,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,IAAA,cAAI,EAAA,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAA,cAAI,EAAA,oBAAoB,MAAM,CAAC,IAAI,cAAc,CAAC,EAAE;QAClG,SAAS,EAAE,IAAI;KAChB,CAAC;IAEF,OAAO,CAAC,GAAG,WAAW,EAAE,aAAa,CAAC,CAAC;AACzC,CAAC;AAtBD,wDAsBC"}
|
|
@@ -5,9 +5,14 @@ const ts_poet_1 = require("ts-poet");
|
|
|
5
5
|
/** Creates the placeholder file for our per-entity custom business logic in. */
|
|
6
6
|
function generateInitialEntityFile(meta) {
|
|
7
7
|
const entityName = meta.entity.name;
|
|
8
|
-
const codegenClass = ts_poet_1.imp(`${entityName}Codegen@./entities`);
|
|
9
|
-
return ts_poet_1.code `
|
|
8
|
+
const codegenClass = (0, ts_poet_1.imp)(`${entityName}Codegen@./entities`);
|
|
9
|
+
return (0, ts_poet_1.code) `
|
|
10
|
+
import { ${meta.entity.configConst.symbol} as config } from "./entities";
|
|
11
|
+
|
|
10
12
|
export class ${entityName} extends ${codegenClass} {}
|
|
13
|
+
|
|
14
|
+
// remove once you have actual rules/hooks
|
|
15
|
+
config.placeholder();
|
|
11
16
|
`;
|
|
12
17
|
}
|
|
13
18
|
exports.generateInitialEntityFile = generateInitialEntityFile;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateInitialEntityFile.js","sourceRoot":"","sources":["../src/generateInitialEntityFile.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;
|
|
1
|
+
{"version":3,"file":"generateInitialEntityFile.js","sourceRoot":"","sources":["../src/generateInitialEntityFile.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAG1C,gFAAgF;AAChF,SAAgB,yBAAyB,CAAC,IAAsB;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACpC,MAAM,YAAY,GAAG,IAAA,aAAG,EAAC,GAAG,UAAU,oBAAoB,CAAC,CAAC;IAC5D,OAAO,IAAA,cAAI,EAAA;eACE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM;;mBAE1B,UAAU,YAAY,YAAY;;;;GAIlD,CAAC;AACJ,CAAC;AAXD,8DAWC"}
|
|
@@ -5,69 +5,43 @@ const ts_poet_1 = require("ts-poet");
|
|
|
5
5
|
const symbols_1 = require("./symbols");
|
|
6
6
|
function generateMetadataFile(config, dbMetadata) {
|
|
7
7
|
const { entity } = dbMetadata;
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
return ts_poet_1.code `
|
|
8
|
+
const fields = generateFields(config, dbMetadata);
|
|
9
|
+
Object.values(fields).forEach((code) => code.asOneline());
|
|
10
|
+
return (0, ts_poet_1.code) `
|
|
11
11
|
export const ${entity.metaName}: ${symbols_1.EntityMetadata}<${entity.type}> = {
|
|
12
12
|
cstr: ${entity.type},
|
|
13
13
|
type: "${entity.name}",
|
|
14
|
-
|
|
14
|
+
idType: "${dbMetadata.idDbType}",
|
|
15
|
+
tagName: "${dbMetadata.tagName}",
|
|
15
16
|
tableName: "${dbMetadata.tableName}",
|
|
16
|
-
|
|
17
|
-
fields: [ ${primaryKeyField} ${enumFields} ${primitiveFields} ${m2oFields} ${o2mFields} ${m2mFields} ${o2oFields} ],
|
|
17
|
+
fields: ${fields},
|
|
18
18
|
config: ${entity.configConst},
|
|
19
|
-
factory: ${ts_poet_1.imp(`new${entity.name}@./entities`)},
|
|
19
|
+
factory: ${(0, ts_poet_1.imp)(`new${entity.name}@./entities`)},
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
(${entity.name} as any).metadata = ${entity.metaName};
|
|
23
23
|
`;
|
|
24
24
|
}
|
|
25
25
|
exports.generateMetadataFile = generateMetadataFile;
|
|
26
|
-
function generateColumns(dbMetadata) {
|
|
27
|
-
const primaryKey = ts_poet_1.code `
|
|
28
|
-
{ fieldName: "id", columnName: "id", dbType: "int", serde: new ${symbols_1.PrimaryKeySerde}(() => ${dbMetadata.entity.metaName}, "id", "id") },
|
|
29
|
-
`;
|
|
30
|
-
const primitives = dbMetadata.primitives.map((p) => {
|
|
31
|
-
const { fieldName, columnName, columnType } = p;
|
|
32
|
-
return ts_poet_1.code `
|
|
33
|
-
{
|
|
34
|
-
fieldName: "${fieldName}",
|
|
35
|
-
columnName: "${columnName}",
|
|
36
|
-
dbType: "${columnType}",
|
|
37
|
-
serde: new ${symbols_1.SimpleSerde}("${fieldName}", "${columnName}"),
|
|
38
|
-
},`;
|
|
39
|
-
});
|
|
40
|
-
const enums = dbMetadata.enums.map((e) => {
|
|
41
|
-
const { fieldName, columnName, enumDetailType } = e;
|
|
42
|
-
return ts_poet_1.code `
|
|
43
|
-
{
|
|
44
|
-
fieldName: "${fieldName}",
|
|
45
|
-
columnName: "${columnName}",
|
|
46
|
-
dbType: "int",
|
|
47
|
-
serde: new ${symbols_1.EnumFieldSerde}("${fieldName}", "${columnName}", ${enumDetailType}),
|
|
48
|
-
},
|
|
49
|
-
`;
|
|
50
|
-
});
|
|
51
|
-
const m2o = dbMetadata.manyToOnes.map((m2o) => {
|
|
52
|
-
const { fieldName, columnName, otherEntity } = m2o;
|
|
53
|
-
return ts_poet_1.code `
|
|
54
|
-
{
|
|
55
|
-
fieldName: "${fieldName}",
|
|
56
|
-
columnName: "${columnName}",
|
|
57
|
-
dbType: "int",
|
|
58
|
-
serde: new ${symbols_1.ForeignKeySerde}("${fieldName}", "${columnName}", () => ${otherEntity.metaName}),
|
|
59
|
-
},
|
|
60
|
-
`;
|
|
61
|
-
});
|
|
62
|
-
return { primaryKey, primitives, enums, m2o };
|
|
63
|
-
}
|
|
64
26
|
function generateFields(config, dbMetadata) {
|
|
65
|
-
const
|
|
66
|
-
|
|
27
|
+
const fields = {};
|
|
28
|
+
fields["id"] = (0, ts_poet_1.code) `
|
|
29
|
+
{
|
|
30
|
+
kind: "primaryKey",
|
|
31
|
+
fieldName: "id",
|
|
32
|
+
fieldIdName: undefined,
|
|
33
|
+
required: true,
|
|
34
|
+
serde: new ${symbols_1.KeySerde}("${dbMetadata.tagName}", "id", "id", "${dbMetadata.idDbType}"),
|
|
35
|
+
}
|
|
67
36
|
`;
|
|
68
|
-
|
|
69
|
-
const { fieldName, derived } = p;
|
|
70
|
-
|
|
37
|
+
dbMetadata.primitives.forEach((p) => {
|
|
38
|
+
const { fieldName, derived, columnName, columnType, superstruct } = p;
|
|
39
|
+
const serdeType = superstruct
|
|
40
|
+
? (0, ts_poet_1.code) `new ${symbols_1.SuperstructSerde}("${fieldName}", "${columnName}", ${superstruct})`
|
|
41
|
+
: columnType === "numeric"
|
|
42
|
+
? (0, ts_poet_1.code) `new ${symbols_1.DecimalToNumberSerde}("${fieldName}", "${columnName}")`
|
|
43
|
+
: (0, ts_poet_1.code) `new ${symbols_1.PrimitiveSerde}("${fieldName}", "${columnName}", "${columnType}")`;
|
|
44
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
71
45
|
{
|
|
72
46
|
kind: "primitive",
|
|
73
47
|
fieldName: "${fieldName}",
|
|
@@ -75,23 +49,40 @@ function generateFields(config, dbMetadata) {
|
|
|
75
49
|
derived: ${!derived ? false : `"${derived}"`},
|
|
76
50
|
required: ${!derived && p.notNull},
|
|
77
51
|
protected: ${p.protected},
|
|
78
|
-
type: ${typeof p.
|
|
79
|
-
|
|
52
|
+
type: ${typeof p.rawFieldType === "string" ? `"${p.rawFieldType}"` : p.rawFieldType},
|
|
53
|
+
serde: ${serdeType},
|
|
54
|
+
}`;
|
|
55
|
+
});
|
|
56
|
+
// Treat native enums as primitives
|
|
57
|
+
dbMetadata.pgEnums.forEach(({ columnName, fieldName, notNull }) => {
|
|
58
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
59
|
+
{
|
|
60
|
+
kind: "primitive",
|
|
61
|
+
fieldName: "${fieldName}",
|
|
62
|
+
fieldIdName: undefined,
|
|
63
|
+
derived: false,
|
|
64
|
+
required: ${notNull},
|
|
65
|
+
protected: false,
|
|
66
|
+
type: "string",
|
|
67
|
+
serde: new ${symbols_1.PrimitiveSerde}("${fieldName}", "${columnName}", "string"),
|
|
68
|
+
}`;
|
|
80
69
|
});
|
|
81
|
-
|
|
82
|
-
|
|
70
|
+
dbMetadata.enums.forEach(({ fieldName, enumDetailType, notNull, isArray, columnName }) => {
|
|
71
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
83
72
|
{
|
|
84
73
|
kind: "enum",
|
|
85
74
|
fieldName: "${fieldName}",
|
|
86
75
|
fieldIdName: undefined,
|
|
87
76
|
required: ${notNull},
|
|
88
77
|
enumDetailType: ${enumDetailType},
|
|
89
|
-
|
|
78
|
+
serde: new ${isArray ? symbols_1.EnumArrayFieldSerde : symbols_1.EnumFieldSerde}("${fieldName}", "${columnName}", ${enumDetailType}),
|
|
79
|
+
}
|
|
90
80
|
`;
|
|
91
81
|
});
|
|
92
|
-
|
|
93
|
-
const { fieldName, notNull, otherEntity, otherFieldName } = m2o;
|
|
94
|
-
|
|
82
|
+
dbMetadata.manyToOnes.forEach((m2o) => {
|
|
83
|
+
const { fieldName, columnName, notNull, otherEntity, otherFieldName, dbType } = m2o;
|
|
84
|
+
const otherTagName = config.entities[otherEntity.name].tag;
|
|
85
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
95
86
|
{
|
|
96
87
|
kind: "m2o",
|
|
97
88
|
fieldName: "${fieldName}",
|
|
@@ -99,12 +90,13 @@ function generateFields(config, dbMetadata) {
|
|
|
99
90
|
required: ${notNull},
|
|
100
91
|
otherMetadata: () => ${otherEntity.metaName},
|
|
101
92
|
otherFieldName: "${otherFieldName}",
|
|
102
|
-
|
|
93
|
+
serde: new ${symbols_1.KeySerde}("${otherTagName}", "${fieldName}", "${columnName}", "${dbType}"),
|
|
94
|
+
}
|
|
103
95
|
`;
|
|
104
96
|
});
|
|
105
|
-
|
|
97
|
+
dbMetadata.oneToManys.forEach((m2o) => {
|
|
106
98
|
const { fieldName, singularName, otherEntity, otherFieldName } = m2o;
|
|
107
|
-
|
|
99
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
108
100
|
{
|
|
109
101
|
kind: "o2m",
|
|
110
102
|
fieldName: "${fieldName}",
|
|
@@ -112,12 +104,27 @@ function generateFields(config, dbMetadata) {
|
|
|
112
104
|
required: false,
|
|
113
105
|
otherMetadata: () => ${otherEntity.metaName},
|
|
114
106
|
otherFieldName: "${otherFieldName}",
|
|
115
|
-
|
|
107
|
+
serde: undefined,
|
|
108
|
+
}
|
|
116
109
|
`;
|
|
117
110
|
});
|
|
118
|
-
|
|
111
|
+
dbMetadata.largeOneToManys.forEach((m2o) => {
|
|
119
112
|
const { fieldName, singularName, otherEntity, otherFieldName } = m2o;
|
|
120
|
-
|
|
113
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
114
|
+
{
|
|
115
|
+
kind: "lo2m",
|
|
116
|
+
fieldName: "${fieldName}",
|
|
117
|
+
fieldIdName: "${singularName}Ids",
|
|
118
|
+
required: false,
|
|
119
|
+
otherMetadata: () => ${otherEntity.metaName},
|
|
120
|
+
otherFieldName: "${otherFieldName}",
|
|
121
|
+
serde: undefined,
|
|
122
|
+
}
|
|
123
|
+
`;
|
|
124
|
+
});
|
|
125
|
+
dbMetadata.manyToManys.forEach((m2o) => {
|
|
126
|
+
const { fieldName, singularName, otherEntity, otherFieldName } = m2o;
|
|
127
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
121
128
|
{
|
|
122
129
|
kind: "m2m",
|
|
123
130
|
fieldName: "${fieldName}",
|
|
@@ -125,12 +132,13 @@ function generateFields(config, dbMetadata) {
|
|
|
125
132
|
required: false,
|
|
126
133
|
otherMetadata: () => ${otherEntity.metaName},
|
|
127
134
|
otherFieldName: "${otherFieldName}",
|
|
128
|
-
|
|
135
|
+
serde: undefined,
|
|
136
|
+
}
|
|
129
137
|
`;
|
|
130
138
|
});
|
|
131
|
-
|
|
139
|
+
dbMetadata.oneToOnes.forEach((o2o) => {
|
|
132
140
|
const { fieldName, otherEntity, otherFieldName } = o2o;
|
|
133
|
-
|
|
141
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
134
142
|
{
|
|
135
143
|
kind: "o2o",
|
|
136
144
|
fieldName: "${fieldName}",
|
|
@@ -138,9 +146,28 @@ function generateFields(config, dbMetadata) {
|
|
|
138
146
|
required: false,
|
|
139
147
|
otherMetadata: () => ${otherEntity.metaName},
|
|
140
148
|
otherFieldName: "${otherFieldName}",
|
|
141
|
-
|
|
149
|
+
serde: undefined,
|
|
150
|
+
}
|
|
151
|
+
`;
|
|
152
|
+
});
|
|
153
|
+
dbMetadata.polymorphics.forEach((p) => {
|
|
154
|
+
const { fieldName, notNull, components } = p;
|
|
155
|
+
fields[fieldName] = (0, ts_poet_1.code) `
|
|
156
|
+
{
|
|
157
|
+
kind: "poly",
|
|
158
|
+
fieldName: "${fieldName}",
|
|
159
|
+
fieldIdName: "${fieldName}Id",
|
|
160
|
+
required: ${notNull},
|
|
161
|
+
components: [${components.map(({ otherFieldName, otherEntity, columnName }) => (0, ts_poet_1.code) `
|
|
162
|
+
{
|
|
163
|
+
otherMetadata: () => ${otherEntity.metaName},
|
|
164
|
+
otherFieldName: "${otherFieldName}",
|
|
165
|
+
columnName: "${columnName}",
|
|
166
|
+
},`)}],
|
|
167
|
+
serde: new ${symbols_1.PolymorphicKeySerde}(() => ${dbMetadata.entity.metaName}, "${fieldName}"),
|
|
168
|
+
}
|
|
142
169
|
`;
|
|
143
170
|
});
|
|
144
|
-
return
|
|
171
|
+
return fields;
|
|
145
172
|
}
|
|
146
173
|
//# sourceMappingURL=generateMetadataFile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateMetadataFile.js","sourceRoot":"","sources":["../src/generateMetadataFile.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAG1C,
|
|
1
|
+
{"version":3,"file":"generateMetadataFile.js","sourceRoot":"","sources":["../src/generateMetadataFile.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAG1C,uCASmB;AAEnB,SAAgB,oBAAoB,CAAC,MAAc,EAAE,UAA4B;IAC/E,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;IAE9B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAElD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAE1D,OAAO,IAAA,cAAI,EAAA;mBACM,MAAM,CAAC,QAAQ,KAAK,wBAAc,IAAI,MAAM,CAAC,IAAI;cACtD,MAAM,CAAC,IAAI;eACV,MAAM,CAAC,IAAI;iBACT,UAAU,CAAC,QAAQ;kBAClB,UAAU,CAAC,OAAO;oBAChB,UAAU,CAAC,SAAS;gBACxB,MAAM;gBACN,MAAM,CAAC,WAAW;iBACjB,IAAA,aAAG,EAAC,MAAM,MAAM,CAAC,IAAI,aAAa,CAAC;;;OAG7C,MAAM,CAAC,IAAI,uBAAuB,MAAM,CAAC,QAAQ;GACrD,CAAC;AACJ,CAAC;AArBD,oDAqBC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,UAA4B;IAClE,MAAM,MAAM,GAAyB,EAAE,CAAC;IAExC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,cAAI,EAAA;;;;;;mBAMF,kBAAQ,KAAK,UAAU,CAAC,OAAO,mBAAmB,UAAU,CAAC,QAAQ;;GAErF,CAAC;IAEF,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,WAAW;YAC3B,CAAC,CAAC,IAAA,cAAI,EAAA,OAAO,0BAAgB,KAAK,SAAS,OAAO,UAAU,MAAM,WAAW,GAAG;YAChF,CAAC,CAAC,UAAU,KAAK,SAAS;gBAC1B,CAAC,CAAC,IAAA,cAAI,EAAA,OAAO,8BAAoB,KAAK,SAAS,OAAO,UAAU,IAAI;gBACpE,CAAC,CAAC,IAAA,cAAI,EAAA,OAAO,wBAAc,KAAK,SAAS,OAAO,UAAU,OAAO,UAAU,IAAI,CAAC;QAClF,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;;mBAEZ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG;oBAChC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO;qBACpB,CAAC,CAAC,SAAS;gBAChB,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;iBAC1E,SAAS;QAClB,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QAChE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;;;oBAGX,OAAO;;;qBAGN,wBAAc,KAAK,SAAS,OAAO,UAAU;QAC1D,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;QACvF,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;;oBAEX,OAAO;0BACD,cAAc;qBAE9B,OAAO,CAAC,CAAC,CAAC,6BAAmB,CAAC,CAAC,CAAC,wBAClC,KAAK,SAAS,OAAO,UAAU,MAAM,cAAc;;KAEtD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACpC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QACpF,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QAC3D,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;wBACP,SAAS;oBACb,OAAO;+BACI,WAAW,CAAC,QAAQ;2BACxB,cAAc;qBACpB,kBAAQ,KAAK,YAAY,OAAO,SAAS,OAAO,UAAU,OAAO,MAAM;;KAEvF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACpC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;wBACP,YAAY;;+BAEL,WAAW,CAAC,QAAQ;2BACxB,cAAc;;;KAGpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;wBACP,YAAY;;+BAEL,WAAW,CAAC,QAAQ;2BACxB,cAAc;;;KAGpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACrC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;wBACP,YAAY;;+BAEL,WAAW,CAAC,QAAQ;2BACxB,cAAc;;;KAGpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;wBACP,SAAS;;+BAEF,WAAW,CAAC,QAAQ;2BACxB,cAAc;;;KAGpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACpC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,cAAI,EAAA;;;sBAGN,SAAS;wBACP,SAAS;oBACb,OAAO;uBACJ,UAAU,CAAC,GAAG,CAC3B,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,IAAA,cAAI,EAAA;;mCAE5B,WAAW,CAAC,QAAQ;+BACxB,cAAc;2BAClB,UAAU;aACxB,CACJ;qBACY,6BAAmB,UAAU,UAAU,CAAC,MAAM,CAAC,QAAQ,MAAM,SAAS;;KAEtF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generatePgEnumFile = void 0;
|
|
4
|
+
const change_case_1 = require("change-case");
|
|
5
|
+
const ts_poet_1 = require("ts-poet");
|
|
6
|
+
function generatePgEnumFile(config, enumData) {
|
|
7
|
+
const { name, values } = enumData;
|
|
8
|
+
const detailsName = `${name}Details`;
|
|
9
|
+
return (0, ts_poet_1.code) `
|
|
10
|
+
export enum ${name} {
|
|
11
|
+
${values.map((value) => `${(0, change_case_1.pascalCase)(value)} = '${value}'`).join(",\n")}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
`;
|
|
16
|
+
}
|
|
17
|
+
exports.generatePgEnumFile = generatePgEnumFile;
|
|
18
|
+
//# sourceMappingURL=generatePgEnumFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generatePgEnumFile.js","sourceRoot":"","sources":["../src/generatePgEnumFile.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AACzC,qCAAqC;AAIrC,SAAgB,kBAAkB,CAAC,MAAc,EAAE,QAAoB;IACrE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAClC,MAAM,WAAW,GAAG,GAAG,IAAI,SAAS,CAAC;IACrC,OAAO,IAAA,cAAI,EAAA;kBACK,IAAI;QACd,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAA,wBAAU,EAAC,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;;;GAI3E,CAAC;AACJ,CAAC;AAVD,gDAUC"}
|
package/build/index.d.ts
CHANGED
|
@@ -1,31 +1,47 @@
|
|
|
1
1
|
import { Client } from "pg";
|
|
2
2
|
import { Db, Table } from "pg-structure";
|
|
3
|
+
import { Options } from "prettier";
|
|
3
4
|
import { Code } from "ts-poet";
|
|
4
5
|
import { Config } from "./config";
|
|
5
|
-
import { EntityDbMetadata } from "./EntityDbMetadata";
|
|
6
|
-
|
|
7
|
-
export {
|
|
6
|
+
import { EntityDbMetadata, PrimitiveField } from "./EntityDbMetadata";
|
|
7
|
+
import { mapSimpleDbTypeToTypescriptType } from "./utils";
|
|
8
|
+
export { EnumField, makeEntity, ManyToManyField, ManyToOneField, OneToManyField, OneToOneField, PrimitiveField, } from "./EntityDbMetadata";
|
|
9
|
+
export { Config, EntityDbMetadata, mapSimpleDbTypeToTypescriptType };
|
|
8
10
|
export interface CodeGenFile {
|
|
9
11
|
name: string;
|
|
10
12
|
contents: Code | string;
|
|
11
13
|
overwrite: boolean;
|
|
14
|
+
prettierOverrides?: Options;
|
|
12
15
|
}
|
|
13
16
|
/** A map from Enum table name to the rows currently in the table. */
|
|
14
|
-
export declare type
|
|
17
|
+
export declare type EnumTableData = {
|
|
18
|
+
table: Table;
|
|
19
|
+
name: string;
|
|
20
|
+
rows: EnumRow[];
|
|
21
|
+
extraPrimitives: PrimitiveField[];
|
|
22
|
+
};
|
|
23
|
+
export declare type PgEnumData = {
|
|
24
|
+
name: string;
|
|
25
|
+
values: string[];
|
|
26
|
+
};
|
|
27
|
+
export declare type EnumMetadata = Record<string, EnumTableData>;
|
|
28
|
+
export declare type PgEnumMetadata = Record<string, PgEnumData>;
|
|
15
29
|
export declare type EnumRow = {
|
|
16
30
|
id: number;
|
|
17
31
|
code: string;
|
|
18
32
|
name: string;
|
|
33
|
+
[key: string]: any;
|
|
19
34
|
};
|
|
20
35
|
/** Uses entities and enums from the `db` schema and saves them into our entities directory. */
|
|
21
36
|
export declare function generateAndSaveFiles(config: Config, dbMeta: DbMetadata): Promise<void>;
|
|
22
37
|
/** Generates our `${Entity}` and `${Entity}Codegen` files based on the `db` schema. */
|
|
23
38
|
export declare function generateFiles(config: Config, dbMeta: DbMetadata): Promise<CodeGenFile[]>;
|
|
24
|
-
export declare function
|
|
25
|
-
export declare function
|
|
39
|
+
export declare function loadEnumMetadata(db: Db, client: Client, config: Config): Promise<EnumMetadata>;
|
|
40
|
+
export declare function loadPgEnumMetadata(db: Db, client: Client, config: Config): Promise<PgEnumMetadata>;
|
|
41
|
+
export declare function contentToString(content: Code | string, fileName: string, prettierOverrides?: Options): Promise<string>;
|
|
26
42
|
export interface DbMetadata {
|
|
27
43
|
entityTables: Table[];
|
|
28
|
-
enumTables: Table[];
|
|
29
44
|
entities: EntityDbMetadata[];
|
|
30
|
-
|
|
45
|
+
enums: EnumMetadata;
|
|
46
|
+
pgEnums: PgEnumMetadata;
|
|
31
47
|
}
|