sizuku 0.0.7 → 0.2.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/README.md +96 -344
- package/dist/cli/main.d.ts +10 -0
- package/dist/cli/main.js +61 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +51 -0
- package/dist/config/index.d.ts +18 -0
- package/dist/config/index.js +13 -0
- package/dist/config/loader.d.ts +19 -0
- package/dist/config/loader.js +30 -0
- package/dist/generator/engine.d.ts +3 -0
- package/dist/generator/engine.js +63 -0
- package/dist/generator/mermaid-er/config/index.d.ts +4 -4
- package/dist/generator/mermaid-er/config/index.js +4 -10
- package/dist/generator/mermaid-er/core/extract-relations.d.ts +1 -1
- package/dist/generator/mermaid-er/core/extract-relations.js +3 -6
- package/dist/generator/mermaid-er/core.d.ts +6 -0
- package/dist/generator/mermaid-er/core.js +54 -0
- package/dist/generator/mermaid-er/generator/er-content.d.ts +20 -0
- package/dist/generator/mermaid-er/generator/{generate-er-content.js → er-content.js} +3 -7
- package/dist/generator/mermaid-er/generator/index.d.ts +2 -0
- package/dist/generator/mermaid-er/generator/index.js +2 -0
- package/dist/generator/mermaid-er/generator/relation-line.d.ts +12 -0
- package/dist/generator/mermaid-er/generator/{generate-relation-line.js → relation-line.js} +3 -6
- package/dist/generator/mermaid-er/generator.d.ts +3 -0
- package/dist/generator/mermaid-er/generator.js +14 -0
- package/dist/generator/mermaid-er/index.d.ts +12 -5
- package/dist/generator/mermaid-er/index.js +30 -74
- package/dist/generator/mermaid-er/relationship/build-relation-line.js +3 -6
- package/dist/generator/mermaid-er/types.js +1 -0
- package/dist/generator/mermaid-er/validator/index.d.ts +8 -0
- package/dist/generator/mermaid-er/validator/index.js +71 -0
- package/dist/generator/mermaid-er/validator/is-relationship.d.ts +1 -1
- package/dist/generator/mermaid-er/validator/is-relationship.js +1 -4
- package/dist/generator/mermaid-er/validator/parse-relation-line.js +1 -4
- package/dist/generator/mermaid-er/validator/parse-table-info.d.ts +1 -7
- package/dist/generator/mermaid-er/validator/parse-table-info.js +69 -89
- package/dist/generator/mermaid-er/validator/remove-duplicate-relations.js +1 -4
- package/dist/generator/valibot/config/index.d.ts +2 -2
- package/dist/generator/valibot/config/index.js +6 -12
- package/dist/generator/valibot/core/extract-schema.d.ts +2 -5
- package/dist/generator/valibot/core/extract-schema.js +162 -81
- package/dist/generator/valibot/core.d.ts +5 -0
- package/dist/generator/valibot/core.js +39 -0
- package/dist/generator/valibot/generator/infer-input.d.ts +5 -0
- package/dist/generator/valibot/generator/infer-input.js +8 -0
- package/dist/generator/valibot/generator/relation-valibot-code.d.ts +13 -0
- package/dist/generator/valibot/generator/relation-valibot-code.js +19 -0
- package/dist/generator/valibot/generator/valibot-code.d.ts +15 -0
- package/dist/generator/valibot/generator/valibot-code.js +16 -0
- package/dist/generator/valibot/generator/valibot.d.ts +14 -0
- package/dist/generator/valibot/generator/valibot.js +15 -0
- package/dist/generator/valibot/generator.d.ts +3 -0
- package/dist/generator/valibot/generator.js +14 -0
- package/dist/generator/valibot/index.d.ts +14 -3
- package/dist/generator/valibot/index.js +46 -73
- package/dist/generator/zod/config/index.d.ts +2 -2
- package/dist/generator/zod/config/index.js +6 -12
- package/dist/generator/zod/core/extract-schema.d.ts +1 -2
- package/dist/generator/zod/core/extract-schema.js +228 -81
- package/dist/generator/zod/core.d.ts +5 -0
- package/dist/generator/zod/core.js +39 -0
- package/dist/generator/zod/generator/infer.d.ts +5 -0
- package/dist/generator/zod/generator/infer.js +8 -0
- package/dist/generator/zod/generator/relation-zod-code.d.ts +13 -0
- package/dist/generator/zod/generator/relation-zod-code.js +19 -0
- package/dist/generator/zod/generator/zod-code.d.ts +17 -0
- package/dist/generator/zod/generator/zod-code.js +18 -0
- package/dist/generator/zod/generator/zod.d.ts +16 -0
- package/dist/generator/zod/generator/zod.js +16 -0
- package/dist/generator/zod/generator.d.ts +3 -0
- package/dist/generator/zod/generator.js +14 -0
- package/dist/generator/zod/index.d.ts +15 -3
- package/dist/generator/zod/index.js +50 -73
- package/dist/index.d.ts +8 -0
- package/dist/index.js +71 -0
- package/dist/shared/config/index.d.ts +13 -0
- package/dist/{common → shared}/config/index.js +1 -4
- package/dist/shared/format/index.d.ts +15 -0
- package/dist/shared/format/index.js +24 -0
- package/dist/shared/fs/index.d.ts +7 -0
- package/dist/shared/fs/index.js +16 -0
- package/dist/shared/fsp/index.d.ts +27 -0
- package/dist/shared/fsp/index.js +38 -0
- package/dist/shared/generator/field-definitions.d.ts +12 -0
- package/dist/shared/generator/field-definitions.js +12 -0
- package/dist/shared/helper/ast-parser.d.ts +3 -0
- package/dist/shared/helper/ast-parser.js +202 -0
- package/dist/shared/helper/build-schema-extractor.d.ts +25 -0
- package/dist/shared/helper/build-schema-extractor.js +33 -0
- package/dist/shared/helper/create-extract-field-from-property.d.ts +15 -0
- package/dist/shared/helper/create-extract-field-from-property.js +20 -0
- package/dist/shared/helper/create-extract-fields-from-call-expression.d.ts +14 -0
- package/dist/shared/helper/create-extract-fields-from-call-expression.js +14 -0
- package/dist/shared/helper/create-extract-relation-field-from-property.d.ts +12 -0
- package/dist/shared/helper/create-extract-relation-field-from-property.js +27 -0
- package/dist/shared/helper/extract-schemas.d.ts +133 -0
- package/dist/shared/helper/extract-schemas.js +445 -0
- package/dist/shared/helper/file-writer.d.ts +3 -0
- package/dist/shared/helper/file-writer.js +25 -0
- package/dist/shared/helper/find-object-literal-expression.d.ts +12 -0
- package/dist/shared/helper/find-object-literal-expression.js +31 -0
- package/dist/shared/helper/find-object-literalIn-args.d.ts +2 -0
- package/dist/shared/helper/find-object-literalIn-args.js +8 -0
- package/dist/shared/helper/is-relation-function.d.ts +10 -0
- package/dist/shared/helper/is-relation-function.js +16 -0
- package/dist/shared/types.js +1 -0
- package/dist/{common/text → shared/utils}/capitalize.js +1 -4
- package/dist/shared/utils/compose.d.ts +101 -0
- package/dist/shared/utils/compose.js +124 -0
- package/dist/shared/utils/file.d.ts +92 -0
- package/dist/shared/utils/file.js +177 -0
- package/dist/shared/utils/functional.d.ts +118 -0
- package/dist/shared/utils/functional.js +96 -0
- package/dist/shared/utils/index.d.ts +20 -0
- package/dist/shared/utils/index.js +48 -0
- package/dist/shared/utils/string-utils.d.ts +8 -0
- package/dist/shared/utils/string-utils.js +28 -0
- package/dist/shared/utils/types.d.ts +32 -0
- package/dist/shared/utils/types.js +2 -0
- package/dist/shared/utils/validation-utils.d.ts +8 -0
- package/dist/shared/utils/validation-utils.js +25 -0
- package/dist/src/config/index.d.ts +18 -0
- package/dist/src/config/index.js +13 -0
- package/dist/src/generator/mermaid-er/core/extract-relations.d.ts +8 -0
- package/dist/src/generator/mermaid-er/core/extract-relations.js +12 -0
- package/dist/src/generator/mermaid-er/generator/er-content.d.ts +9 -0
- package/dist/src/generator/mermaid-er/generator/er-content.js +25 -0
- package/dist/src/generator/mermaid-er/generator/index.d.ts +2 -0
- package/dist/src/generator/mermaid-er/generator/index.js +2 -0
- package/dist/src/generator/mermaid-er/generator/relation-line.d.ts +8 -0
- package/dist/src/generator/mermaid-er/generator/relation-line.js +14 -0
- package/dist/src/generator/mermaid-er/index.d.ts +6 -0
- package/dist/src/generator/mermaid-er/index.js +16 -0
- package/dist/src/generator/mermaid-er/relationship/build-relation-line.d.ts +15 -0
- package/dist/src/generator/mermaid-er/relationship/build-relation-line.js +35 -0
- package/dist/src/generator/mermaid-er/types.d.ts +21 -0
- package/dist/src/generator/mermaid-er/types.js +1 -0
- package/dist/src/generator/mermaid-er/validator/index.d.ts +4 -0
- package/dist/src/generator/mermaid-er/validator/index.js +4 -0
- package/dist/src/generator/mermaid-er/validator/is-relationship.d.ts +8 -0
- package/dist/src/generator/mermaid-er/validator/is-relationship.js +9 -0
- package/dist/src/generator/mermaid-er/validator/parse-relation-line.d.ts +13 -0
- package/dist/src/generator/mermaid-er/validator/parse-relation-line.js +21 -0
- package/dist/src/generator/mermaid-er/validator/parse-table-info.d.ts +8 -0
- package/dist/src/generator/mermaid-er/validator/parse-table-info.js +91 -0
- package/dist/src/generator/mermaid-er/validator/remove-duplicate-relations.d.ts +7 -0
- package/dist/src/generator/mermaid-er/validator/remove-duplicate-relations.js +9 -0
- package/dist/src/generator/valibot/generator/infer-input.d.ts +5 -0
- package/dist/src/generator/valibot/generator/infer-input.js +8 -0
- package/dist/src/generator/valibot/generator/valibot-code.d.ts +14 -0
- package/dist/src/generator/valibot/generator/valibot-code.js +16 -0
- package/dist/src/generator/valibot/generator/valibot.d.ts +13 -0
- package/dist/src/generator/valibot/generator/valibot.js +11 -0
- package/dist/src/generator/valibot/index.d.ts +9 -0
- package/dist/src/generator/valibot/index.js +34 -0
- package/dist/src/generator/zod/generator/infer.d.ts +5 -0
- package/dist/src/generator/zod/generator/infer.js +8 -0
- package/dist/{generator/zod/generator/generate-zod-code.d.ts → src/generator/zod/generator/zod-code.d.ts} +8 -3
- package/dist/src/generator/zod/generator/zod-code.js +18 -0
- package/dist/{generator/zod/generator/generate-zod-schema.d.ts → src/generator/zod/generator/zod.d.ts} +8 -4
- package/dist/src/generator/zod/generator/zod.js +12 -0
- package/dist/src/generator/zod/index.d.ts +10 -0
- package/dist/src/generator/zod/index.js +40 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +35 -0
- package/dist/src/shared/format/index.d.ts +2 -0
- package/dist/src/shared/format/index.js +10 -0
- package/dist/src/shared/fs/index.d.ts +2 -0
- package/dist/src/shared/fs/index.js +10 -0
- package/dist/src/shared/fsp/index.d.ts +3 -0
- package/dist/src/shared/fsp/index.js +8 -0
- package/dist/src/shared/generator/field-definitions.d.ts +12 -0
- package/dist/src/shared/generator/field-definitions.js +12 -0
- package/dist/src/shared/helper/build-schema-extractor.d.ts +25 -0
- package/dist/src/shared/helper/build-schema-extractor.js +33 -0
- package/dist/src/shared/helper/create-extract-field-from-property.d.ts +15 -0
- package/dist/src/shared/helper/create-extract-field-from-property.js +20 -0
- package/dist/src/shared/helper/create-extract-fields-from-call-expression.d.ts +14 -0
- package/dist/src/shared/helper/create-extract-fields-from-call-expression.js +14 -0
- package/dist/src/shared/helper/create-extract-relation-field-from-property.d.ts +12 -0
- package/dist/src/shared/helper/create-extract-relation-field-from-property.js +27 -0
- package/dist/src/shared/helper/extract-schemas.d.ts +16 -0
- package/dist/src/shared/helper/extract-schemas.js +19 -0
- package/dist/src/shared/helper/find-object-literal-expression.d.ts +12 -0
- package/dist/src/shared/helper/find-object-literal-expression.js +31 -0
- package/dist/src/shared/helper/find-object-literalIn-args.d.ts +2 -0
- package/dist/src/shared/helper/find-object-literalIn-args.js +8 -0
- package/dist/src/shared/helper/is-relation-function.d.ts +10 -0
- package/dist/src/shared/helper/is-relation-function.js +16 -0
- package/dist/src/shared/utils/index.d.ts +33 -0
- package/dist/src/shared/utils/index.js +61 -0
- package/dist/utils/index.d.ts +144 -0
- package/dist/utils/index.js +301 -0
- package/package.json +10 -13
- package/dist/common/config/index.d.ts +0 -13
- package/dist/common/format/index.d.ts +0 -1
- package/dist/common/format/index.js +0 -12
- package/dist/common/generator/generate-field-definitions.d.ts +0 -8
- package/dist/common/generator/generate-field-definitions.js +0 -16
- package/dist/common/helper/get-camel-case-schema-name-helper.d.ts +0 -7
- package/dist/common/helper/get-camel-case-schema-name-helper.js +0 -14
- package/dist/common/helper/get-pascal-case-schema-name-helper.d.ts +0 -8
- package/dist/common/helper/get-pascal-case-schema-name-helper.js +0 -15
- package/dist/common/helper/get-variable-name-helper.d.ts +0 -9
- package/dist/common/helper/get-variable-name-helper.js +0 -15
- package/dist/common/helper/get-variable-schema-name-helper.d.ts +0 -9
- package/dist/common/helper/get-variable-schema-name-helper.js +0 -17
- package/dist/common/text/decapitalize.d.ts +0 -17
- package/dist/common/text/decapitalize.js +0 -22
- package/dist/common/type/index.js +0 -2
- package/dist/generator/mermaid-er/generator/generate-er-content.d.ts +0 -9
- package/dist/generator/mermaid-er/generator/generate-relation-line.d.ts +0 -7
- package/dist/generator/mermaid-er/type/index.js +0 -2
- package/dist/generator/mermaid-er/validator/is-relation.d.ts +0 -7
- package/dist/generator/mermaid-er/validator/is-relation.js +0 -40
- package/dist/generator/valibot/generator/generate-valibot-code.d.ts +0 -11
- package/dist/generator/valibot/generator/generate-valibot-code.js +0 -21
- package/dist/generator/valibot/generator/generate-valibot-infer-input.d.ts +0 -9
- package/dist/generator/valibot/generator/generate-valibot-infer-input.js +0 -16
- package/dist/generator/valibot/generator/generate-valibot-schema.d.ts +0 -9
- package/dist/generator/valibot/generator/generate-valibot-schema.js +0 -16
- package/dist/generator/zod/generator/generate-z-infer.d.ts +0 -11
- package/dist/generator/zod/generator/generate-z-infer.js +0 -18
- package/dist/generator/zod/generator/generate-zod-code.js +0 -21
- package/dist/generator/zod/generator/generate-zod-schema.js +0 -17
- /package/dist/generator/mermaid-er/{type/index.d.ts → types.d.ts} +0 -0
- /package/dist/{common/type/index.d.ts → shared/types.d.ts} +0 -0
- /package/dist/{common/text → shared/utils}/capitalize.d.ts +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates Zod code for a given schema and config.
|
|
3
|
+
*
|
|
4
|
+
* @function generateZodCode
|
|
5
|
+
* @param schema - The schema to generate code for.
|
|
6
|
+
* @param config - The configuration for the code generation.
|
|
7
|
+
* @returns The generated Zod code.
|
|
8
|
+
*/
|
|
9
|
+
export declare function zodCode(schema: {
|
|
10
|
+
name: string;
|
|
11
|
+
fields: {
|
|
12
|
+
name: string;
|
|
13
|
+
definition: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}[];
|
|
16
|
+
objectType?: 'strict' | 'loose';
|
|
17
|
+
}, comment: boolean, type: boolean): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { infer } from '../../../utils/index.js';
|
|
2
|
+
import { zod } from './zod.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generates Zod code for a given schema and config.
|
|
5
|
+
*
|
|
6
|
+
* @function generateZodCode
|
|
7
|
+
* @param schema - The schema to generate code for.
|
|
8
|
+
* @param config - The configuration for the code generation.
|
|
9
|
+
* @returns The generated Zod code.
|
|
10
|
+
*/
|
|
11
|
+
export function zodCode(schema, comment, type) {
|
|
12
|
+
const zodSchema = zod(schema, comment);
|
|
13
|
+
if (type) {
|
|
14
|
+
const zInfer = infer(schema.name);
|
|
15
|
+
return `${zodSchema}\n\n${zInfer}\n`;
|
|
16
|
+
}
|
|
17
|
+
return `${zodSchema}\n`;
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a Zod schema for a given schema and config.
|
|
3
|
+
*
|
|
4
|
+
* @param schema - The schema to generate code for.
|
|
5
|
+
* @param config - The configuration for the code generation.
|
|
6
|
+
* @returns The generated Zod schema.
|
|
7
|
+
*/
|
|
8
|
+
export declare function zod(schema: {
|
|
9
|
+
name: string;
|
|
10
|
+
fields: {
|
|
11
|
+
name: string;
|
|
12
|
+
definition: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
}[];
|
|
15
|
+
objectType?: 'strict' | 'loose';
|
|
16
|
+
}, comment: boolean): string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { capitalize, fieldDefinitions } from '../../../utils/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates a Zod schema for a given schema and config.
|
|
4
|
+
*
|
|
5
|
+
* @param schema - The schema to generate code for.
|
|
6
|
+
* @param config - The configuration for the code generation.
|
|
7
|
+
* @returns The generated Zod schema.
|
|
8
|
+
*/
|
|
9
|
+
export function zod(schema, comment) {
|
|
10
|
+
const objectType = schema.objectType === 'strict'
|
|
11
|
+
? 'strictObject'
|
|
12
|
+
: schema.objectType === 'loose'
|
|
13
|
+
? 'looseObject'
|
|
14
|
+
: 'object';
|
|
15
|
+
return `export const ${capitalize(schema.name)}Schema = z.${objectType}({${fieldDefinitions(schema, comment)}})`;
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Result, err, ok } from 'neverthrow';
|
|
2
|
+
import { generateZodFile } from './core.js';
|
|
3
|
+
export const generateZodSchemas = (schema) => {
|
|
4
|
+
try {
|
|
5
|
+
if (schema.tables.length === 0) {
|
|
6
|
+
return err(new Error('No tables found in schema'));
|
|
7
|
+
}
|
|
8
|
+
const zodContent = generateZodFile(schema.tables);
|
|
9
|
+
return ok(zodContent);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
return err(new Error(`Failed to generate Zod schemas: ${error instanceof Error ? error.message : String(error)}`));
|
|
13
|
+
}
|
|
14
|
+
};
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Generate Zod schema
|
|
3
|
+
* @param code - The code to generate Zod schema from
|
|
4
|
+
* @param output - The output file path
|
|
5
|
+
* @param comment - Whether to include comments in the generated code
|
|
6
|
+
* @param type - Whether to include type information in the generated code
|
|
7
|
+
* @param zod - The Zod version to use
|
|
8
|
+
*/
|
|
9
|
+
export declare function sizukuZod(code: string[], output: `${string}.ts`, comment?: boolean, type?: boolean, zod?: 'v4' | 'mini' | '@hono/zod-openapi', relations?: boolean): Promise<{
|
|
10
|
+
ok: true;
|
|
11
|
+
value: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
error: string;
|
|
15
|
+
}>;
|
|
@@ -1,77 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fmt } from '../../shared/format/index.js';
|
|
3
|
+
import { mkdir, writeFile } from '../../shared/fsp/index.js';
|
|
4
|
+
import { extractRelationSchemas, extractSchemas } from '../../shared/helper/extract-schemas.js';
|
|
5
|
+
import { relationZodCode } from './generator/relation-zod-code.js';
|
|
6
|
+
import { zodCode } from './generator/zod-code.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate Zod schema
|
|
9
|
+
* @param code - The code to generate Zod schema from
|
|
10
|
+
* @param output - The output file path
|
|
11
|
+
* @param comment - Whether to include comments in the generated code
|
|
12
|
+
* @param type - Whether to include type information in the generated code
|
|
13
|
+
* @param zod - The Zod version to use
|
|
14
|
+
*/
|
|
15
|
+
export async function sizukuZod(code, output, comment, type, zod, relations) {
|
|
16
|
+
const importLine = zod === 'mini'
|
|
17
|
+
? `import * as z from 'zod/mini'`
|
|
18
|
+
: zod === '@hono/zod-openapi'
|
|
19
|
+
? `import { z } from '@hono/zod-openapi'`
|
|
20
|
+
: `import * as z from 'zod'`;
|
|
21
|
+
const baseSchemas = extractSchemas(code, 'zod');
|
|
22
|
+
const relationSchemas = extractRelationSchemas(code, 'zod');
|
|
23
|
+
const zodGeneratedCode = [
|
|
24
|
+
importLine,
|
|
25
|
+
'',
|
|
26
|
+
...baseSchemas.map((schema) => zodCode(schema, comment ?? false, type ?? false)),
|
|
27
|
+
...(relations ? relationSchemas.map((schema) => relationZodCode(schema, type ?? false)) : []),
|
|
28
|
+
].join('\n');
|
|
29
|
+
const mkdirResult = await mkdir(path.dirname(output));
|
|
30
|
+
if (!mkdirResult.ok) {
|
|
31
|
+
return {
|
|
32
|
+
ok: false,
|
|
33
|
+
error: mkdirResult.error,
|
|
34
|
+
};
|
|
21
35
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const output = config.output ?? args[args.indexOf('-o') + 1];
|
|
29
|
-
config.output = output;
|
|
30
|
-
try {
|
|
31
|
-
// 5. read db/schema.ts
|
|
32
|
-
const content = (0, node_fs_1.readFileSync)(input, 'utf-8');
|
|
33
|
-
// 6. split lines
|
|
34
|
-
const lines = content.split('\n');
|
|
35
|
-
// 7. create output directory
|
|
36
|
-
const outputDir = node_path_1.default.dirname(output);
|
|
37
|
-
if (!(0, node_fs_1.existsSync)(outputDir)) {
|
|
38
|
-
(0, node_fs_1.mkdirSync)(outputDir, { recursive: true });
|
|
39
|
-
}
|
|
40
|
-
// 8. skip import section
|
|
41
|
-
const codeStart = lines.findIndex((line) => !line.trim().startsWith('import') && line.trim() !== '');
|
|
42
|
-
// 9. extract schemas
|
|
43
|
-
const schemas = (0, extract_schema_1.extractSchemas)(lines.slice(codeStart));
|
|
44
|
-
// 10. generate zod code
|
|
45
|
-
const generatedCode = [
|
|
46
|
-
IMPORT_ZOD,
|
|
47
|
-
'',
|
|
48
|
-
...schemas.map((schema) => (0, generate_zod_code_1.generateZodCode)(schema, config)),
|
|
49
|
-
].join('\n');
|
|
50
|
-
// 11. format code
|
|
51
|
-
const code = await (0, format_1.formatCode)(generatedCode);
|
|
52
|
-
// 12. write to output file
|
|
53
|
-
(0, node_fs_1.writeFileSync)(output, code);
|
|
54
|
-
console.log(`Generated Zod schema at: ${output}`);
|
|
55
|
-
return true;
|
|
36
|
+
const fmtResult = await fmt(zodGeneratedCode);
|
|
37
|
+
if (!fmtResult.ok) {
|
|
38
|
+
return {
|
|
39
|
+
ok: false,
|
|
40
|
+
error: fmtResult.error,
|
|
41
|
+
};
|
|
56
42
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
process.exit(1);
|
|
64
|
-
}
|
|
65
|
-
if (dev) {
|
|
66
|
-
throw new Error('Unknown error occurred');
|
|
67
|
-
}
|
|
68
|
-
return false;
|
|
43
|
+
const writeFileResult = await writeFile(output, fmtResult.value);
|
|
44
|
+
if (!writeFileResult.ok) {
|
|
45
|
+
return {
|
|
46
|
+
ok: false,
|
|
47
|
+
error: writeFileResult.error,
|
|
48
|
+
};
|
|
69
49
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
50
|
+
return {
|
|
51
|
+
ok: true,
|
|
52
|
+
value: undefined,
|
|
53
|
+
};
|
|
77
54
|
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// #!/usr/bin/env node
|
|
2
|
+
import { getConfig } from './config/index.js';
|
|
3
|
+
import { sizukuMermaidER } from './generator/mermaid-er/index.js';
|
|
4
|
+
import { sizukuValibot } from './generator/valibot/index.js';
|
|
5
|
+
import { sizukuZod } from './generator/zod/index.js';
|
|
6
|
+
import { readFileSync } from './shared/fs/index.js';
|
|
7
|
+
export async function main(config = getConfig()) {
|
|
8
|
+
if (!config.input) {
|
|
9
|
+
return {
|
|
10
|
+
ok: false,
|
|
11
|
+
error: 'input is not found',
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const contentResult = readFileSync(config.input);
|
|
15
|
+
if (!contentResult.ok) {
|
|
16
|
+
return {
|
|
17
|
+
ok: false,
|
|
18
|
+
error: contentResult.error,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const content = contentResult.value;
|
|
22
|
+
const lines = content.split('\n');
|
|
23
|
+
const codeStart = lines.findIndex((line) => !line.trim().startsWith('import') && line.trim() !== '');
|
|
24
|
+
const code = lines.slice(codeStart);
|
|
25
|
+
const results = [];
|
|
26
|
+
/* zod */
|
|
27
|
+
if (config.zod?.output) {
|
|
28
|
+
const zodResult = await sizukuZod(code, config.zod.output, config.zod.comment, config.zod.type, config.zod.zod, true);
|
|
29
|
+
if (!zodResult.ok) {
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
error: zodResult.error,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
results.push(`Generated Zod schema at: ${config.zod?.output}`);
|
|
36
|
+
}
|
|
37
|
+
/* valibot */
|
|
38
|
+
if (config.valibot?.output) {
|
|
39
|
+
const valibotResult = await sizukuValibot(code, config.valibot.output, config.valibot.comment, config.valibot.type, true);
|
|
40
|
+
if (!valibotResult.ok) {
|
|
41
|
+
return {
|
|
42
|
+
ok: false,
|
|
43
|
+
error: valibotResult.error,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
results.push(`Generated Valibot schema at: ${config.valibot?.output}`);
|
|
47
|
+
}
|
|
48
|
+
/* mermaid */
|
|
49
|
+
if (config.mermaid?.output) {
|
|
50
|
+
const mermaidResult = await sizukuMermaidER(code, config.mermaid.output);
|
|
51
|
+
if (!mermaidResult.ok) {
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
error: mermaidResult.error,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
results.push(`Generated Mermaid ER at: ${config.mermaid?.output}`);
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
ok: true,
|
|
61
|
+
value: results.join('\n'),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
main().then((result) => {
|
|
65
|
+
if (result?.ok) {
|
|
66
|
+
console.log(result.value);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.error(result?.error);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats TypeScript source with Prettier.
|
|
3
|
+
*
|
|
4
|
+
* @param code - Source code to format.
|
|
5
|
+
* @returns A `Result` containing the formatted code or an error message.
|
|
6
|
+
*/
|
|
7
|
+
export declare function fmt(code: string): Promise<{
|
|
8
|
+
ok: true;
|
|
9
|
+
value: string;
|
|
10
|
+
error?: undefined;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
error: string;
|
|
14
|
+
value?: undefined;
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { format } from 'prettier';
|
|
2
|
+
/**
|
|
3
|
+
* Formats TypeScript source with Prettier.
|
|
4
|
+
*
|
|
5
|
+
* @param code - Source code to format.
|
|
6
|
+
* @returns A `Result` containing the formatted code or an error message.
|
|
7
|
+
*/
|
|
8
|
+
export async function fmt(code) {
|
|
9
|
+
try {
|
|
10
|
+
const formatted = await format(code, {
|
|
11
|
+
parser: 'typescript',
|
|
12
|
+
printWidth: 100,
|
|
13
|
+
singleQuote: true,
|
|
14
|
+
semi: false,
|
|
15
|
+
});
|
|
16
|
+
return { ok: true, value: formatted };
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
return {
|
|
20
|
+
ok: false,
|
|
21
|
+
error: e instanceof Error ? e.message : String(e),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
export function readFileSync(path) {
|
|
3
|
+
try {
|
|
4
|
+
const result = fs.readFileSync(path, 'utf-8');
|
|
5
|
+
return {
|
|
6
|
+
ok: true,
|
|
7
|
+
value: result,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
return {
|
|
12
|
+
ok: false,
|
|
13
|
+
error: e instanceof Error ? e.message : String(e),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a directory if it does not already exist.
|
|
3
|
+
*
|
|
4
|
+
* @param dir - Directory path to create.
|
|
5
|
+
* @returns A `Result` that is `ok` on success, otherwise an error message.
|
|
6
|
+
*/
|
|
7
|
+
export declare function mkdir(dir: string): Promise<{
|
|
8
|
+
ok: false;
|
|
9
|
+
error: string;
|
|
10
|
+
} | {
|
|
11
|
+
ok: true;
|
|
12
|
+
value: undefined;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Writes UTF-8 text to a file, creating it if necessary.
|
|
16
|
+
*
|
|
17
|
+
* @param path - File path to write.
|
|
18
|
+
* @param data - Text data to write.
|
|
19
|
+
* @returns A `Result` that is `ok` on success, otherwise an error message.
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeFile(path: string, data: string): Promise<{
|
|
22
|
+
ok: true;
|
|
23
|
+
value: undefined;
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
error: string;
|
|
27
|
+
}>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fsp from 'node:fs/promises';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a directory if it does not already exist.
|
|
4
|
+
*
|
|
5
|
+
* @param dir - Directory path to create.
|
|
6
|
+
* @returns A `Result` that is `ok` on success, otherwise an error message.
|
|
7
|
+
*/
|
|
8
|
+
export async function mkdir(dir) {
|
|
9
|
+
try {
|
|
10
|
+
await fsp.mkdir(dir, { recursive: true });
|
|
11
|
+
return {
|
|
12
|
+
ok: true,
|
|
13
|
+
value: undefined,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
return {
|
|
18
|
+
ok: false,
|
|
19
|
+
error: e instanceof Error ? e.message : String(e),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Writes UTF-8 text to a file, creating it if necessary.
|
|
25
|
+
*
|
|
26
|
+
* @param path - File path to write.
|
|
27
|
+
* @param data - Text data to write.
|
|
28
|
+
* @returns A `Result` that is `ok` on success, otherwise an error message.
|
|
29
|
+
*/
|
|
30
|
+
export async function writeFile(path, data) {
|
|
31
|
+
try {
|
|
32
|
+
await fsp.writeFile(path, data, 'utf-8');
|
|
33
|
+
return { ok: true, value: undefined };
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
return { ok: false, error: e instanceof Error ? e.message : String(e) };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param schema
|
|
3
|
+
* @returns
|
|
4
|
+
*/
|
|
5
|
+
export function fieldDefinitions(schema, comment) {
|
|
6
|
+
return schema.fields
|
|
7
|
+
.map(({ name, definition, description }) => {
|
|
8
|
+
const commentCode = description && comment ? `/**\n* ${description}\n*/\n` : '';
|
|
9
|
+
return `${commentCode}${name}:${definition}`;
|
|
10
|
+
})
|
|
11
|
+
.join(',\n');
|
|
12
|
+
}
|