hekireki 0.0.4 → 0.0.6
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/README.md +4 -4
- package/dist/common/format/index.js +6 -6
- package/dist/common/helper/get-camel-case-schema-name-helper.d.ts +1 -3
- package/dist/common/helper/get-camel-case-schema-name-helper.js +2 -2
- package/dist/common/helper/get-pascal-case-schema-name-helper.d.ts +1 -3
- package/dist/common/helper/get-pascal-case-schema-name-helper.js +2 -2
- package/dist/common/helper/get-variable-name-helper.d.ts +1 -4
- package/dist/common/helper/get-variable-name-helper.js +3 -3
- package/dist/common/helper/get-variable-schema-name-helper.d.ts +1 -4
- package/dist/common/helper/get-variable-schema-name-helper.js +3 -7
- package/dist/common/helper/group-by-model-helper.d.ts +1 -3
- package/dist/common/helper/group-by-model-helper.js +7 -7
- package/dist/common/text/capitalize.js +1 -1
- package/dist/common/text/decapitalize.js +1 -1
- package/dist/common/type/index.d.ts +8 -8
- package/dist/common/validator/is-fields-validation.d.ts +7 -9
- package/dist/common/validator/is-fields-validation.js +3 -1
- package/dist/generator/mermaid/generator/generate-er-content.js +8 -14
- package/dist/generator/mermaid/generator/generate-model-fields.js +16 -21
- package/dist/generator/mermaid/generator/generate-model-info.js +5 -5
- package/dist/generator/mermaid/generator/generate-relation-line.d.ts +2 -3
- package/dist/generator/mermaid/generator/generate-relation-line.js +7 -8
- package/dist/generator/mermaid/index.d.ts +3 -2
- package/dist/generator/mermaid/index.js +47 -52
- package/dist/generator/mermaid/output/index.js +13 -17
- package/dist/generator/mermaid/type/index.d.ts +6 -30
- package/dist/generator/mermaid/validator/exclude-many-to-one-relations.d.ts +1 -3
- package/dist/generator/mermaid/validator/exclude-many-to-one-relations.js +1 -1
- package/dist/generator/mermaid/validator/extract-relations.d.ts +2 -3
- package/dist/generator/mermaid/validator/extract-relations.js +15 -18
- package/dist/generator/mermaid/validator/is-relation.d.ts +5 -0
- package/dist/generator/mermaid/validator/is-relation.js +30 -25
- package/dist/generator/mermaid/validator/parse-relation.js +16 -17
- package/dist/generator/mermaid/validator/remove-duplicate-relations.d.ts +3 -6
- package/dist/generator/mermaid/validator/remove-duplicate-relations.js +3 -4
- package/dist/generator/valibot/generator/generate-valibot-infer-input.d.ts +1 -4
- package/dist/generator/valibot/generator/generate-valibot-infer-input.js +3 -10
- package/dist/generator/valibot/generator/generate-valibot-properties.d.ts +7 -10
- package/dist/generator/valibot/generator/generate-valibot-properties.js +15 -21
- package/dist/generator/valibot/generator/generate-valibot-schema.d.ts +1 -5
- package/dist/generator/valibot/generator/generate-valibot-schema.js +2 -6
- package/dist/generator/valibot/generator/generate-valibot-schemas.d.ts +7 -10
- package/dist/generator/valibot/generator/generate-valibot-schemas.js +7 -14
- package/dist/generator/valibot/generator/generate-valibot.d.ts +1 -4
- package/dist/generator/valibot/generator/generate-valibot.js +36 -51
- package/dist/generator/valibot/index.d.ts +7 -6
- package/dist/generator/valibot/index.js +41 -46
- package/dist/generator/valibot/validator/is-valibot-documentation.d.ts +1 -3
- package/dist/generator/valibot/validator/is-valibot-documentation.js +7 -8
- package/dist/generator/valibot/validator/is-valibot-validation.d.ts +1 -3
- package/dist/generator/valibot/validator/is-valibot-validation.js +4 -3
- package/dist/generator/zod/generator/generate-zod-infer.d.ts +1 -4
- package/dist/generator/zod/generator/generate-zod-infer.js +3 -10
- package/dist/generator/zod/generator/generate-zod-properties.d.ts +7 -10
- package/dist/generator/zod/generator/generate-zod-properties.js +15 -21
- package/dist/generator/zod/generator/generate-zod-schema.d.ts +1 -5
- package/dist/generator/zod/generator/generate-zod-schema.js +2 -6
- package/dist/generator/zod/generator/generate-zod-schemas.d.ts +7 -10
- package/dist/generator/zod/generator/generate-zod-schemas.js +7 -14
- package/dist/generator/zod/generator/generate-zod.d.ts +1 -4
- package/dist/generator/zod/generator/generate-zod.js +36 -51
- package/dist/generator/zod/index.d.ts +7 -6
- package/dist/generator/zod/index.js +41 -46
- package/dist/generator/zod/validator/is-zod-documentation.d.ts +1 -3
- package/dist/generator/zod/validator/is-zod-documentation.js +7 -8
- package/dist/generator/zod/validator/is-zod-validation.js +4 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -129,7 +129,7 @@ model Like {
|
|
|
129
129
|
|
|
130
130
|
## Generate
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
## Zod
|
|
133
133
|
|
|
134
134
|
```ts
|
|
135
135
|
import { z } from 'zod'
|
|
@@ -294,9 +294,9 @@ export type Like = v.InferInput<typeof LikeSchema>
|
|
|
294
294
|
|
|
295
295
|
```mermaid
|
|
296
296
|
erDiagram
|
|
297
|
-
User
|
|
298
|
-
Post
|
|
299
|
-
User
|
|
297
|
+
User ||--|{ Post : "(id) - (userId)"
|
|
298
|
+
Post ||--|{ Like : "(id) - (postId)"
|
|
299
|
+
User ||--|{ Like : "(id) - (userId)"
|
|
300
300
|
User {
|
|
301
301
|
String id "Unique identifier for the user."
|
|
302
302
|
String username "Username of the user."
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.formatCode = formatCode;
|
|
4
4
|
const prettier_1 = require("prettier");
|
|
5
5
|
async function formatCode(code) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
return await (0, prettier_1.format)(code, {
|
|
7
|
+
parser: "typescript",
|
|
8
|
+
printWidth: 100,
|
|
9
|
+
singleQuote: true,
|
|
10
|
+
semi: false,
|
|
11
|
+
});
|
|
12
12
|
}
|
|
@@ -9,6 +9,6 @@ const decapitalize_1 = require("../text/decapitalize");
|
|
|
9
9
|
* @returns The camelCase schema name.
|
|
10
10
|
*/
|
|
11
11
|
function getCamelCaseSchemaNameHelper(schemaName) {
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const decapitalizedSchemaName = (0, decapitalize_1.decapitalize)(schemaName);
|
|
13
|
+
return `${decapitalizedSchemaName}Schema`;
|
|
14
14
|
}
|
|
@@ -5,6 +5,4 @@
|
|
|
5
5
|
* @param schemaName - The original schema name.
|
|
6
6
|
* @returns The PascalCase schema name.
|
|
7
7
|
*/
|
|
8
|
-
export declare function getPascalCaseSchemaNameHelper(
|
|
9
|
-
schemaName: string,
|
|
10
|
-
): string;
|
|
8
|
+
export declare function getPascalCaseSchemaNameHelper(schemaName: string): string;
|
|
@@ -10,6 +10,6 @@ const capitalize_1 = require("../text/capitalize");
|
|
|
10
10
|
* @returns The PascalCase schema name.
|
|
11
11
|
*/
|
|
12
12
|
function getPascalCaseSchemaNameHelper(schemaName) {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
const capitalizedSchemaName = (0, capitalize_1.capitalize)(schemaName);
|
|
14
|
+
return `${capitalizedSchemaName}Schema`;
|
|
15
15
|
}
|
|
@@ -6,7 +6,4 @@ import type { Config } from "../../generator/zod";
|
|
|
6
6
|
* @param config - The configuration.
|
|
7
7
|
* @returns The variable name.
|
|
8
8
|
*/
|
|
9
|
-
export declare function getVariableNameHelper(
|
|
10
|
-
name: string,
|
|
11
|
-
config: Config,
|
|
12
|
-
): string;
|
|
9
|
+
export declare function getVariableNameHelper(name: string, config: Config): string;
|
|
@@ -11,7 +11,7 @@ const decapitalize_1 = require("../text/decapitalize");
|
|
|
11
11
|
* @returns The variable name.
|
|
12
12
|
*/
|
|
13
13
|
function getVariableNameHelper(name, config) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
return config.typeName === "camelCase"
|
|
15
|
+
? (0, decapitalize_1.decapitalize)(name)
|
|
16
|
+
: (0, capitalize_1.capitalize)(name);
|
|
17
17
|
}
|
|
@@ -6,7 +6,4 @@ import type { Config } from "../../generator/zod";
|
|
|
6
6
|
* @param config - The configuration.
|
|
7
7
|
* @returns The variable schema name.
|
|
8
8
|
*/
|
|
9
|
-
export declare function getVariableSchemaNameHelper(
|
|
10
|
-
name: string,
|
|
11
|
-
config: Config,
|
|
12
|
-
): string;
|
|
9
|
+
export declare function getVariableSchemaNameHelper(name: string, config: Config): string;
|
|
@@ -11,11 +11,7 @@ const get_pascal_case_schema_name_helper_1 = require("./get-pascal-case-schema-n
|
|
|
11
11
|
* @returns The variable schema name.
|
|
12
12
|
*/
|
|
13
13
|
function getVariableSchemaNameHelper(name, config) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
)
|
|
18
|
-
: (0, get_pascal_case_schema_name_helper_1.getPascalCaseSchemaNameHelper)(
|
|
19
|
-
name,
|
|
20
|
-
);
|
|
14
|
+
return config.schemaName === "camelCase"
|
|
15
|
+
? (0, get_camel_case_schema_name_helper_1.getCamelCaseSchemaNameHelper)(name)
|
|
16
|
+
: (0, get_pascal_case_schema_name_helper_1.getPascalCaseSchemaNameHelper)(name);
|
|
21
17
|
}
|
|
@@ -5,6 +5,4 @@ import type { GroupedFields, ValidField } from "../type";
|
|
|
5
5
|
* @param validFields - The array of valid fields.
|
|
6
6
|
* @returns The grouped fields.
|
|
7
7
|
*/
|
|
8
|
-
export declare function groupByModelHelper(
|
|
9
|
-
validFields: ValidField[],
|
|
10
|
-
): GroupedFields;
|
|
8
|
+
export declare function groupByModelHelper(validFields: ValidField[]): GroupedFields;
|
|
@@ -8,11 +8,11 @@ exports.groupByModelHelper = groupByModelHelper;
|
|
|
8
8
|
* @returns The grouped fields.
|
|
9
9
|
*/
|
|
10
10
|
function groupByModelHelper(validFields) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
return validFields.reduce((acc, field) => {
|
|
12
|
+
if (!acc[field.modelName]) {
|
|
13
|
+
acc[field.modelName] = [];
|
|
14
|
+
}
|
|
15
|
+
acc[field.modelName].push(field);
|
|
16
|
+
return acc;
|
|
17
|
+
}, {});
|
|
18
18
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import type { DMMF } from "@prisma/generator-helper";
|
|
2
2
|
export type Field = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
documentation: string;
|
|
4
|
+
modelName: string;
|
|
5
|
+
fieldName: string;
|
|
6
|
+
comment: string[];
|
|
7
|
+
validation: string | null;
|
|
8
8
|
};
|
|
9
9
|
export type ValidField = Required<Field>;
|
|
10
10
|
export type GroupedFields = Record<string, Field[]>;
|
|
11
11
|
export type Model = Readonly<DMMF.Model>;
|
|
12
12
|
export type ModelInfo = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
documentation: string;
|
|
14
|
+
name: string;
|
|
15
|
+
fields: Model["fields"];
|
|
16
16
|
};
|
|
@@ -4,12 +4,10 @@ import type { ReadonlyDeep } from "@prisma/generator-helper";
|
|
|
4
4
|
* @param modelFields - The model fields
|
|
5
5
|
* @returns The fields validation
|
|
6
6
|
*/
|
|
7
|
-
export declare function isFieldsValidation(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}[][],
|
|
15
|
-
): Required<import("../type").Field>[];
|
|
7
|
+
export declare function isFieldsValidation(modelFields: {
|
|
8
|
+
documentation: ReadonlyDeep<string | undefined>;
|
|
9
|
+
modelName: string;
|
|
10
|
+
fieldName: string;
|
|
11
|
+
comment: string[];
|
|
12
|
+
validation: string | null;
|
|
13
|
+
}[][]): Required<import("../type").Field>[];
|
|
@@ -7,5 +7,7 @@ exports.isFieldsValidation = isFieldsValidation;
|
|
|
7
7
|
* @returns The fields validation
|
|
8
8
|
*/
|
|
9
9
|
function isFieldsValidation(modelFields) {
|
|
10
|
-
|
|
10
|
+
return modelFields
|
|
11
|
+
.flat()
|
|
12
|
+
.filter((field) => field.validation !== null);
|
|
11
13
|
}
|
|
@@ -12,18 +12,12 @@ const remove_duplicate_relations_1 = require("../validator/remove-duplicate-rela
|
|
|
12
12
|
* @returns ER content
|
|
13
13
|
*/
|
|
14
14
|
function generateERContent(models) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return [
|
|
24
|
-
...__1.ER_HEADER,
|
|
25
|
-
...uniqueRelations,
|
|
26
|
-
...modelInfos,
|
|
27
|
-
...__1.ER_FOOTER,
|
|
28
|
-
];
|
|
15
|
+
// extract all relations
|
|
16
|
+
const allRelations = models.flatMap(extract_relations_1.extractRelations);
|
|
17
|
+
// remove duplicate relations
|
|
18
|
+
const uniqueRelations = (0, remove_duplicate_relations_1.removeDuplicateRelations)(allRelations);
|
|
19
|
+
// collect all model info
|
|
20
|
+
const modelInfos = models.flatMap(generate_model_info_1.generateModelInfo);
|
|
21
|
+
// build ER diagram
|
|
22
|
+
return [...__1.ER_HEADER, ...uniqueRelations, ...modelInfos, ...__1.ER_FOOTER];
|
|
29
23
|
}
|
|
@@ -10,25 +10,20 @@ const VALIBOT_ANNOTATION = "@v.";
|
|
|
10
10
|
* @returns
|
|
11
11
|
*/
|
|
12
12
|
function generateModelFields(model) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
.trim()
|
|
30
|
-
: "";
|
|
31
|
-
return ` ${field.type} ${field.name} ${commentPart ? `"${commentPart}"` : ""}`;
|
|
32
|
-
})
|
|
33
|
-
.filter((field) => field !== null);
|
|
13
|
+
return model.fields
|
|
14
|
+
.map((field) => {
|
|
15
|
+
if (field.relationName) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const commentPart = field.documentation
|
|
19
|
+
? field.documentation
|
|
20
|
+
.split("\n")
|
|
21
|
+
.filter((line) => !(line.includes(ZOD_ANNOTATION) ||
|
|
22
|
+
line.includes(VALIBOT_ANNOTATION)))
|
|
23
|
+
.join("\n")
|
|
24
|
+
.trim()
|
|
25
|
+
: "";
|
|
26
|
+
return ` ${field.type} ${field.name} ${commentPart ? `"${commentPart}"` : ""}`;
|
|
27
|
+
})
|
|
28
|
+
.filter((field) => field !== null);
|
|
34
29
|
}
|
|
@@ -9,9 +9,9 @@ const generate_model_fields_1 = require("./generate-model-fields");
|
|
|
9
9
|
* @returns
|
|
10
10
|
*/
|
|
11
11
|
function generateModelInfo(model) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
return [
|
|
13
|
+
` ${model.name} {`,
|
|
14
|
+
...(0, generate_model_fields_1.generateModelFields)(model),
|
|
15
|
+
" }",
|
|
16
|
+
];
|
|
17
17
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { Relation } from "../type";
|
|
2
2
|
/**
|
|
3
3
|
* generate relation line
|
|
4
|
-
* @
|
|
5
|
-
* @
|
|
6
|
-
* @returns string
|
|
4
|
+
* @param { Relation } relation
|
|
5
|
+
* @returns { string } relation line
|
|
7
6
|
*/
|
|
8
7
|
export declare function generateRelationLine(relation: Relation): string;
|
|
@@ -4,14 +4,13 @@ exports.generateRelationLine = generateRelationLine;
|
|
|
4
4
|
const __1 = require("..");
|
|
5
5
|
/**
|
|
6
6
|
* generate relation line
|
|
7
|
-
* @
|
|
8
|
-
* @
|
|
9
|
-
* @returns string
|
|
7
|
+
* @param { Relation } relation
|
|
8
|
+
* @returns { string } relation line
|
|
10
9
|
*/
|
|
11
10
|
function generateRelationLine(relation) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
const cardinality = __1.CARDINALITY_MAP[relation.type];
|
|
12
|
+
if (!cardinality) {
|
|
13
|
+
throw new Error(`Unknown relation type: ${relation.type}`);
|
|
14
|
+
}
|
|
15
|
+
return ` ${relation.fromModel} ${cardinality} ${relation.toModel} : "(${relation.fromField}) - (${relation.toField})"`;
|
|
17
16
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
import type { GeneratorOptions } from "@prisma/generator-helper";
|
|
2
3
|
import type { RelationType } from "./type";
|
|
3
4
|
export type Config = {
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
output?: string;
|
|
6
|
+
file?: string | string[];
|
|
6
7
|
};
|
|
7
8
|
export declare const CARDINALITY_MAP: Record<RelationType, string>;
|
|
8
9
|
export declare const ER_HEADER: readonly ["```mermaid", "erDiagram"];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
"use strict";
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
exports.ER_FOOTER = exports.ER_HEADER = exports.CARDINALITY_MAP = void 0;
|
|
@@ -6,43 +7,37 @@ const output_1 = require("./output");
|
|
|
6
7
|
const generator_helper_1 = require("@prisma/generator-helper");
|
|
7
8
|
const generate_er_content_1 = require("./generator/generate-er-content");
|
|
8
9
|
const DEFAULT_CONFIG = {
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
output: "./mermaid-er",
|
|
11
|
+
file: "ER.md",
|
|
11
12
|
};
|
|
12
13
|
exports.CARDINALITY_MAP = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"zero-one-to-many-optional": "o|..o{", // 0..1 --- * (optional)
|
|
41
|
-
"many-to-zero-one-optional": "}o..o|", // *..0..1
|
|
42
|
-
// Nuanced Patterns (Aliases)
|
|
43
|
-
"many-to-zero-many": "}o..o{", // * --- 0..* (equivalent to many-to-many-optional)
|
|
44
|
-
"zero-many-to-many": "o{..}o", // 0..* --- * (left side optional multiple, right side required multiple)
|
|
45
|
-
"zero-many-to-zero-many": "o{..o{", // both sides optional multiple
|
|
14
|
+
// Required Relationships
|
|
15
|
+
"one-to-one": "||--||", // 1 --- 1
|
|
16
|
+
"one-to-many": "||--|{", // 1 --- 0..*
|
|
17
|
+
"many-to-one": "}|--||", // * --- 1
|
|
18
|
+
"many-to-many": "}|--|{", // * --- *
|
|
19
|
+
"one-to-zero-one": "||--o|", // 1 --- 0..1
|
|
20
|
+
"zero-one-to-one": "o|--||", // 0..1 --- 1
|
|
21
|
+
"zero-to-one": "o|--o|", // 0..1 --- 0..1
|
|
22
|
+
"zero-to-zero-one": "o|--o|", // Alias for zero-to-one
|
|
23
|
+
"zero-to-many": "o|--o{", // 0..1 --- 0..*
|
|
24
|
+
"zero-one-to-many": "o|--o{", // 0..1 --- *
|
|
25
|
+
"many-to-zero-one": "}|--o|", // * --- 0..1
|
|
26
|
+
// Optional Relationships (dotted lines)
|
|
27
|
+
"one-to-one-optional": "||..||", // 1 --- 1 optional
|
|
28
|
+
"one-to-many-optional": "||..o{", // 1 --- 0..* optional
|
|
29
|
+
"many-to-one-optional": "}|..||", // * --- 1 optional
|
|
30
|
+
"many-to-many-optional": "}|..o{", // * --- 0..* optional
|
|
31
|
+
"one-to-zero-one-optional": "||..o|", // 1 --- 0..1 optional
|
|
32
|
+
"zero-one-to-one-optional": "o|..||", // 0..1 --- 1 optional
|
|
33
|
+
"zero-to-one-optional": "o|..o|", // 0..1 --- 0..1 optional
|
|
34
|
+
"zero-to-many-optional": "o|..o{", // 0..1 --- 0..* optional
|
|
35
|
+
"zero-one-to-many-optional": "o|..o{", // 0..1 --- * optional
|
|
36
|
+
"many-to-zero-one-optional": "}|..o|", // * --- 0..1 optional
|
|
37
|
+
// Nuanced Patterns (Aliases)
|
|
38
|
+
"many-to-zero-many": "}|..o{", // * --- 0..*
|
|
39
|
+
"zero-many-to-many": "o{--|{", // 0..* --- *
|
|
40
|
+
"zero-many-to-zero-many": "o{--o{", // 0..* --- 0..*
|
|
46
41
|
};
|
|
47
42
|
// ER diagram header
|
|
48
43
|
exports.ER_HEADER = ["```mermaid", "erDiagram"];
|
|
@@ -50,24 +45,24 @@ exports.ER_HEADER = ["```mermaid", "erDiagram"];
|
|
|
50
45
|
exports.ER_FOOTER = ["```"];
|
|
51
46
|
// main function
|
|
52
47
|
async function main(options) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
48
|
+
const config = {
|
|
49
|
+
output: options.generator.output?.value ?? DEFAULT_CONFIG.output,
|
|
50
|
+
file: options.generator.config?.file ?? DEFAULT_CONFIG.file,
|
|
51
|
+
};
|
|
52
|
+
const models = options.dmmf.datamodel.models;
|
|
53
|
+
const content = (0, generate_er_content_1.generateERContent)(models);
|
|
54
|
+
if (!config.output) {
|
|
55
|
+
throw new Error("output is required");
|
|
56
|
+
}
|
|
57
|
+
(0, output_1.OutputFile)(content, config);
|
|
63
58
|
}
|
|
64
59
|
// prisma generator handler
|
|
65
60
|
(0, generator_helper_1.generatorHandler)({
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
61
|
+
onManifest() {
|
|
62
|
+
return {
|
|
63
|
+
defaultOutput: "./mermaid-er",
|
|
64
|
+
prettyName: "ekireki-ER",
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
onGenerate: main,
|
|
73
68
|
});
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault =
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
return mod && mod.__esModule ? mod : { default: mod };
|
|
6
|
-
};
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
7
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
6
|
exports.OutputFile = OutputFile;
|
|
9
7
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
@@ -13,16 +11,14 @@ const node_fs_1 = __importDefault(require("node:fs"));
|
|
|
13
11
|
* @param config - The configuration
|
|
14
12
|
*/
|
|
15
13
|
function OutputFile(content, config) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
encoding: "utf-8",
|
|
27
|
-
});
|
|
14
|
+
const outputDir = config.output;
|
|
15
|
+
if (!outputDir) {
|
|
16
|
+
throw new Error("output is required");
|
|
17
|
+
}
|
|
18
|
+
if (!node_fs_1.default.existsSync(outputDir)) {
|
|
19
|
+
node_fs_1.default.mkdirSync(outputDir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
const file = config.file ?? "ER.md";
|
|
22
|
+
const filePath = `${outputDir}/${file}`;
|
|
23
|
+
node_fs_1.default.writeFileSync(filePath, content.join("\n"), { encoding: "utf-8" });
|
|
28
24
|
}
|
|
@@ -1,35 +1,11 @@
|
|
|
1
1
|
import type { DMMF } from "@prisma/generator-helper";
|
|
2
|
-
export type RelationType =
|
|
3
|
-
| "one-to-one"
|
|
4
|
-
| "one-to-many"
|
|
5
|
-
| "many-to-one"
|
|
6
|
-
| "many-to-many"
|
|
7
|
-
| "one-to-zero-one"
|
|
8
|
-
| "zero-one-to-one"
|
|
9
|
-
| "zero-to-one"
|
|
10
|
-
| "zero-to-zero-one"
|
|
11
|
-
| "zero-to-many"
|
|
12
|
-
| "zero-one-to-many"
|
|
13
|
-
| "many-to-zero-one"
|
|
14
|
-
| "one-to-one-optional"
|
|
15
|
-
| "one-to-many-optional"
|
|
16
|
-
| "many-to-one-optional"
|
|
17
|
-
| "many-to-many-optional"
|
|
18
|
-
| "one-to-zero-one-optional"
|
|
19
|
-
| "zero-one-to-one-optional"
|
|
20
|
-
| "zero-to-one-optional"
|
|
21
|
-
| "zero-to-many-optional"
|
|
22
|
-
| "zero-one-to-many-optional"
|
|
23
|
-
| "many-to-zero-one-optional"
|
|
24
|
-
| "many-to-zero-many"
|
|
25
|
-
| "zero-many-to-many"
|
|
26
|
-
| "zero-many-to-zero-many";
|
|
2
|
+
export type RelationType = "one-to-one" | "one-to-many" | "many-to-one" | "many-to-many" | "one-to-zero-one" | "zero-one-to-one" | "zero-to-one" | "zero-to-zero-one" | "zero-to-many" | "zero-one-to-many" | "many-to-zero-one" | "one-to-one-optional" | "one-to-many-optional" | "many-to-one-optional" | "many-to-many-optional" | "one-to-zero-one-optional" | "zero-one-to-one-optional" | "zero-to-one-optional" | "zero-to-many-optional" | "zero-one-to-many-optional" | "many-to-zero-one-optional" | "many-to-zero-many" | "zero-many-to-many" | "zero-many-to-zero-many";
|
|
27
3
|
export type Relation = {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
4
|
+
fromModel: string;
|
|
5
|
+
toModel: string;
|
|
6
|
+
fromField: string;
|
|
7
|
+
toField: string;
|
|
8
|
+
type: RelationType;
|
|
33
9
|
};
|
|
34
10
|
export type Model = Readonly<DMMF.Model>;
|
|
35
11
|
export type ERContent = readonly string[];
|
|
@@ -8,5 +8,5 @@ exports.excludeManyToOneRelations = excludeManyToOneRelations;
|
|
|
8
8
|
* @returns
|
|
9
9
|
*/
|
|
10
10
|
function excludeManyToOneRelations(relations) {
|
|
11
|
-
|
|
11
|
+
return [...new Set(relations)].filter((r) => !r.includes("many-to-one"));
|
|
12
12
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { Model } from "../type";
|
|
2
2
|
/**
|
|
3
3
|
* extract relations from model
|
|
4
|
-
* @
|
|
5
|
-
* @
|
|
6
|
-
* @returns
|
|
4
|
+
* @param { Model } model
|
|
5
|
+
* @returns { readonly string[] }
|
|
7
6
|
*/
|
|
8
7
|
export declare function extractRelations(model: Model): readonly string[];
|