@an5/orm 1.0.7 → 1.0.8
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 +175 -153
- package/dist/an5Metadata.d.ts +10 -0
- package/dist/an5Metadata.js +29 -0
- package/dist/an5Orm.d.ts +4 -1
- package/dist/an5Orm.js +214 -409
- package/dist/config.d.ts +2 -0
- package/dist/config.js +24 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.js +16 -0
- package/dist/generator/src/code-generator.d.ts +13 -13
- package/dist/generator/src/code-generator.js +225 -225
- package/dist/generator/src/dotnet-generator.d.ts +11 -11
- package/dist/generator/src/dotnet-generator.js +546 -546
- package/dist/generator/src/index.d.ts +1 -1
- package/dist/generator/src/index.js +88 -88
- package/dist/generator/src/metadata-generator.d.ts +8 -8
- package/dist/generator/src/metadata-generator.js +90 -90
- package/dist/generator/src/parser.d.ts +11 -11
- package/dist/generator/src/parser.js +206 -206
- package/dist/generator/src/python-generator.d.ts +9 -9
- package/dist/generator/src/python-generator.js +105 -105
- package/dist/generator/src/types.d.ts +27 -27
- package/dist/generator/src/types.js +2 -2
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5 -1
- package/dist/logger.d.ts +53 -0
- package/dist/logger.js +117 -0
- package/dist/metadata.d.ts +24 -0
- package/dist/metadata.js +15 -0
- package/dist/scripts/release-cli.d.ts +2 -2
- package/dist/scripts/release-cli.js +115 -115
- package/dist/sql-utils.d.ts +29 -0
- package/dist/sql-utils.js +220 -0
- package/generator/src/code-generator.ts +230 -234
- package/generator/src/dotnet-generator.ts +544 -544
- package/generator/src/index.ts +116 -104
- package/generator/src/metadata-generator.ts +101 -99
- package/generator/src/parser.ts +202 -202
- package/generator/src/python-generator.ts +114 -114
- package/generator/src/types.ts +29 -29
- package/package.json +2 -6
- package/dist/cleanup.d.ts +0 -2
- package/dist/cleanup.js +0 -120
- package/dist/cli.js +0 -64
- package/dist/migrate.d.ts +0 -11
- package/dist/migrate.js +0 -301
- package/dist/pull.d.ts +0 -2
- package/dist/pull.js +0 -339
- package/dist/push.d.ts +0 -2
- package/dist/push.js +0 -281
- package/dist/seed.d.ts +0 -2
- package/dist/seed.js +0 -401
package/dist/config.d.ts
ADDED
package/dist/config.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Workspace Configuration for an5Orm
|
|
9
|
+
* Reads from an5Orm.config.js and environment variables.
|
|
10
|
+
*/
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
let workspaceConfig = {};
|
|
13
|
+
try {
|
|
14
|
+
const configPath = path_1.default.join(__dirname, '..', 'an5Orm.config.js');
|
|
15
|
+
workspaceConfig = require(configPath);
|
|
16
|
+
}
|
|
17
|
+
catch { /* ignore */ }
|
|
18
|
+
exports.config = {
|
|
19
|
+
...workspaceConfig,
|
|
20
|
+
llm: workspaceConfig.llm || {
|
|
21
|
+
providers: [],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=config.js.map
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core error types for AN5 ORM.
|
|
3
|
+
* Owned by @an5/orm so generated clients can re-export the same class and
|
|
4
|
+
* `instanceof` checks keep working across the ORM and its clients.
|
|
5
|
+
*/
|
|
6
|
+
export declare class An5ClientKnownRequestError extends Error {
|
|
7
|
+
code: string;
|
|
8
|
+
meta?: any;
|
|
9
|
+
constructor(message: string, { code, clientVersion }: {
|
|
10
|
+
code: string;
|
|
11
|
+
clientVersion: string;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Core error types for AN5 ORM.
|
|
4
|
+
* Owned by @an5/orm so generated clients can re-export the same class and
|
|
5
|
+
* `instanceof` checks keep working across the ORM and its clients.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.An5ClientKnownRequestError = void 0;
|
|
9
|
+
class An5ClientKnownRequestError extends Error {
|
|
10
|
+
constructor(message, { code, clientVersion }) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.An5ClientKnownRequestError = An5ClientKnownRequestError;
|
|
16
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { Model } from './types';
|
|
2
|
-
export declare class CodeGenerator {
|
|
3
|
-
private outputDir;
|
|
4
|
-
constructor(outputDir: string);
|
|
5
|
-
generate(models: Model[]): void;
|
|
6
|
-
private generateBaseTs;
|
|
7
|
-
private generateModelFile;
|
|
8
|
-
private generateIndexTs;
|
|
9
|
-
private getAllPropertyVariations;
|
|
10
|
-
private getFieldFilterType;
|
|
11
|
-
private normalizeType;
|
|
12
|
-
private toCamelCase;
|
|
13
|
-
}
|
|
1
|
+
import { Model } from './types';
|
|
2
|
+
export declare class CodeGenerator {
|
|
3
|
+
private outputDir;
|
|
4
|
+
constructor(outputDir: string);
|
|
5
|
+
generate(models: Model[]): void;
|
|
6
|
+
private generateBaseTs;
|
|
7
|
+
private generateModelFile;
|
|
8
|
+
private generateIndexTs;
|
|
9
|
+
private getAllPropertyVariations;
|
|
10
|
+
private getFieldFilterType;
|
|
11
|
+
private normalizeType;
|
|
12
|
+
private toCamelCase;
|
|
13
|
+
}
|
|
@@ -1,225 +1,225 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.CodeGenerator = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
class CodeGenerator {
|
|
10
|
-
constructor(outputDir) {
|
|
11
|
-
this.outputDir = outputDir;
|
|
12
|
-
if (!fs_1.default.existsSync(this.outputDir)) {
|
|
13
|
-
fs_1.default.mkdirSync(this.outputDir, { recursive: true });
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
generate(models) {
|
|
17
|
-
this.generateBaseTs();
|
|
18
|
-
for (const model of models) {
|
|
19
|
-
this.generateModelFile(model);
|
|
20
|
-
}
|
|
21
|
-
this.generateIndexTs(models);
|
|
22
|
-
}
|
|
23
|
-
generateBaseTs() {
|
|
24
|
-
const baseTs = `
|
|
25
|
-
export namespace An5 {
|
|
26
|
-
export class An5ClientKnownRequestError extends Error {
|
|
27
|
-
code!: string;
|
|
28
|
-
meta?: any;
|
|
29
|
-
constructor(message: string, { code, clientVersion }: { code: string; clientVersion: string }) {
|
|
30
|
-
super(message);
|
|
31
|
-
this.code = code;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
export type SortOrder = 'asc' | 'desc';
|
|
35
|
-
export type StringFilter = { equals?: string; in?: string[]; notIn?: string[]; lt?: string; lte?: string; gt?: string; gte?: string; contains?: string; startsWith?: string; endsWith?: string; not?: string | StringFilter; };
|
|
36
|
-
export type StringNullableFilter = { equals?: string | null; in?: (string | null)[]; notIn?: (string | null)[]; lt?: string; lte?: string; gt?: string; gte?: string; contains?: string; startsWith?: string; endsWith?: string; not?: string | StringNullableFilter | null; };
|
|
37
|
-
export type NumberFilter = { equals?: number; in?: number[]; notIn?: number[]; lt?: number; lte?: number; gt?: number; gte?: number; not?: number | NumberFilter; };
|
|
38
|
-
export type IntFieldUpdateOperationsInput = { set?: number; increment?: number; decrement?: number; multiply?: number; divide?: number; };
|
|
39
|
-
export type FloatFieldUpdateOperationsInput = { set?: number; increment?: number; decrement?: number; multiply?: number; divide?: number; };
|
|
40
|
-
export type NumberNullableFilter = { equals?: number | null; in?: (number | null)[]; notIn?: (number | null)[]; lt?: number; lte?: number; gt?: number; gte?: number; not?: number | NumberNullableFilter | null; };
|
|
41
|
-
export type BooleanFilter = { equals?: boolean; not?: boolean | BooleanFilter; };
|
|
42
|
-
export type BooleanNullableFilter = { equals?: boolean | null; not?: boolean | BooleanNullableFilter | null; };
|
|
43
|
-
export type DateTimeFilter = { equals?: Date; in?: Date[]; notIn?: Date[]; lt?: Date; lte?: Date; gt?: Date; gte?: Date; not?: Date | DateTimeFilter; };
|
|
44
|
-
export type DateTimeNullableFilter = { equals?: Date | null; in?: (Date | null)[]; notIn?: (Date | null)[]; lt?: Date; lte?: Date; gt?: Date; gte?: Date; not?: Date | DateTimeNullableFilter | null; };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface TableClient<T, WhereInput = any, Select = any, Include = any, CreateInput = any, UpdateInput = any, FindManyArgs = any, FindFirstArgs = any, FindUniqueArgs = any, CreateArgs = any, UpdateArgs = any, UpsertArgs = any, DeleteArgs = any> {
|
|
48
|
-
findMany(args?: FindManyArgs): Promise<T[]>;
|
|
49
|
-
vectorSearch(args: { vector: number[]; take?: number; where?: WhereInput; include?: Include; vectorField?: string; distanceMetric?: 'cosine' | 'euclidean' | 'dot'; }): Promise<(T & { distance: number })[]>;
|
|
50
|
-
findFirst(args?: FindFirstArgs): Promise<T | null>;
|
|
51
|
-
findUnique(args?: FindUniqueArgs): Promise<T | null>;
|
|
52
|
-
count(args?: { where?: WhereInput; }): Promise<number>;
|
|
53
|
-
create(args: CreateArgs): Promise<T>;
|
|
54
|
-
createMany(args: { data: CreateInput[]; skipDuplicates?: boolean; }): Promise<{ count: number }>;
|
|
55
|
-
update(args: UpdateArgs): Promise<T>;
|
|
56
|
-
updateMany(args: { where?: WhereInput; data: UpdateInput; }): Promise<{ count: number }>;
|
|
57
|
-
delete(args: DeleteArgs): Promise<T>;
|
|
58
|
-
deleteMany(args?: { where?: WhereInput; }): Promise<{ count: number }>;
|
|
59
|
-
aggregate(args: any): Promise<any>;
|
|
60
|
-
groupBy(args: any): Promise<any[]>;
|
|
61
|
-
upsert(args: UpsertArgs): Promise<T>;
|
|
62
|
-
}
|
|
63
|
-
`;
|
|
64
|
-
fs_1.default.writeFileSync(path_1.default.join(this.outputDir, 'base.ts'), baseTs);
|
|
65
|
-
}
|
|
66
|
-
generateModelFile(model) {
|
|
67
|
-
let content = `import { An5, TableClient } from './base';\n`;
|
|
68
|
-
const relModels = [...new Set(model.relations.map(r => r.type))];
|
|
69
|
-
for (const relModel of relModels) {
|
|
70
|
-
if (relModel !== model.name) {
|
|
71
|
-
content += `import { ${relModel}, ${relModel}WhereInput, ${relModel}FindManyArgs, ${relModel}CreateInput, ${relModel}UpdateInput } from './${relModel}';\n`;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
content += `\nexport interface ${model.name} {\n`;
|
|
75
|
-
for (const field of model.fields) {
|
|
76
|
-
content += ` ${field.name}: ${this.normalizeType(field.type)}${field.isOptional ? ' | null' : ''};\n`;
|
|
77
|
-
}
|
|
78
|
-
for (const rel of model.relations) {
|
|
79
|
-
content += ` ${rel.name}?: ${rel.type}${rel.isArray ? '[]' : ''}${rel.isOptional ? ' | null' : ''};\n`;
|
|
80
|
-
}
|
|
81
|
-
if (model.relations.length > 0) {
|
|
82
|
-
content += ` _count?: { ${model.relations.map(r => `${r.name}: number`).join('; ')} };\n`;
|
|
83
|
-
}
|
|
84
|
-
content += `}\n\n`;
|
|
85
|
-
content += `export type ${model.name}WhereInput = {\n`;
|
|
86
|
-
content += ` AND?: ${model.name}WhereInput | ${model.name}WhereInput[];\n`;
|
|
87
|
-
content += ` OR?: ${model.name}WhereInput[];\n`;
|
|
88
|
-
content += ` NOT?: ${model.name}WhereInput | ${model.name}WhereInput[];\n`;
|
|
89
|
-
for (const field of model.fields) {
|
|
90
|
-
const filter = this.getFieldFilterType(field);
|
|
91
|
-
content += ` ${field.name}?: ${field.type} | ${filter}${field.isOptional ? ' | null' : ''};\n`;
|
|
92
|
-
}
|
|
93
|
-
for (const rel of model.relations) {
|
|
94
|
-
if (rel.isArray) {
|
|
95
|
-
content += ` ${rel.name}?: { some?: ${rel.type}WhereInput; none?: ${rel.type}WhereInput; every?: ${rel.type}WhereInput; };\n`;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
content += ` ${rel.name}?: ${rel.type}WhereInput${rel.isOptional ? ' | null' : ''};\n`;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
if (model.compoundUniques) {
|
|
102
|
-
for (const compound of model.compoundUniques) {
|
|
103
|
-
const keyName = compound.join('_');
|
|
104
|
-
content += ` ${keyName}?: { ${compound.map(f => `${f}: ${model.fields.find(mf => mf.name === f)?.type || 'any'}`).join('; ')} };\n`;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
content += `};\n\n`;
|
|
108
|
-
const selectFields = model.fields.map(f => `${f.name}?: boolean`);
|
|
109
|
-
const selectRels = model.relations.map(r => `${r.name}?: boolean | ${r.type}FindManyArgs`);
|
|
110
|
-
if (model.relations.length > 0) {
|
|
111
|
-
selectRels.push(`_count?: boolean | { select?: { ${model.relations.map(r => `${r.name}?: boolean`).join('; ')} } }`);
|
|
112
|
-
}
|
|
113
|
-
content += `export type ${model.name}Select = { ${[...selectFields, ...selectRels].join('; ')}${[...selectFields, ...selectRels].length > 0 ? ';' : ''} };\n`;
|
|
114
|
-
const includeRels = model.relations.map(r => `${r.name}?: boolean | ${r.type}FindManyArgs`);
|
|
115
|
-
if (model.relations.length > 0) {
|
|
116
|
-
includeRels.push(`_count?: boolean | { select?: { ${model.relations.map(r => `${r.name}?: boolean`).join('; ')} } }`);
|
|
117
|
-
}
|
|
118
|
-
content += `export type ${model.name}Include = { ${includeRels.join('; ')}${includeRels.length > 0 ? ';' : ''} };\n`;
|
|
119
|
-
content += `export type ${model.name}CreateInput = { ${model.fields.map(f => `${f.name}${f.isOptional || f.hasDefault ? '?' : ''}: ${f.type}${f.isOptional ? ' | null' : ''}`).join('; ')}; ${model.relations.map(r => `${r.name}?: { create?: ${r.type}CreateInput | ${r.type}CreateInput[]; connect?: ${r.type}WhereInput | ${r.type}WhereInput[]; }`).join('; ')} };\n`;
|
|
120
|
-
content += `export type ${model.name}UpdateInput = { ${model.fields.filter(f => !f.isId).map(f => `${f.name}?: ${f.type === 'number' ? 'number | An5.IntFieldUpdateOperationsInput' : f.type}${f.isOptional ? ' | null' : ''}`).join('; ')}; ${model.relations.map(r => `${r.name}?: { create?: ${r.type}CreateInput | ${r.type}CreateInput[]; connect?: ${r.type}WhereInput | ${r.type}WhereInput[]; set?: ${r.type}WhereInput | ${r.type}WhereInput[]; disconnect?: ${r.type}WhereInput | ${r.type}WhereInput[]; delete?: ${r.type}WhereInput | ${r.type}WhereInput[]; update?: { where: ${r.type}WhereInput; data: ${r.type}UpdateInput; } | { where: ${r.type}WhereInput; data: ${r.type}UpdateInput; }[]; upsert?: { where: ${r.type}WhereInput; create: ${r.type}CreateInput; update: ${r.type}UpdateInput; } | { where: ${r.type}WhereInput; create: ${r.type}CreateInput; update: ${r.type}UpdateInput; }[]; }`).join('; ')} };\n`;
|
|
121
|
-
content += `export type ${model.name}FindManyArgs = { where?: ${model.name}WhereInput; orderBy?: any; take?: number; skip?: number; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
122
|
-
content += `export type ${model.name}FindFirstArgs = { where?: ${model.name}WhereInput; orderBy?: any; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
123
|
-
content += `export type ${model.name}FindUniqueArgs = { where?: ${model.name}WhereInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
124
|
-
content += `export type ${model.name}CreateArgs = { data: ${model.name}CreateInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
125
|
-
content += `export type ${model.name}UpdateArgs = { where: ${model.name}WhereInput; data: ${model.name}UpdateInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
126
|
-
content += `export type ${model.name}UpsertArgs = { where: ${model.name}WhereInput; create: ${model.name}CreateInput; update: ${model.name}UpdateInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
127
|
-
content += `export type ${model.name}DeleteArgs = { where: ${model.name}WhereInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
128
|
-
content += `export type ${model.name}TableClient = TableClient<\n ${model.name},\n ${model.name}WhereInput,\n ${model.name}Select,\n ${model.name}Include,\n ${model.name}CreateInput,\n ${model.name}UpdateInput,\n ${model.name}FindManyArgs,\n ${model.name}FindFirstArgs,\n ${model.name}FindUniqueArgs,\n ${model.name}CreateArgs,\n ${model.name}UpdateArgs,\n ${model.name}UpsertArgs,\n ${model.name}DeleteArgs\n>;\n`;
|
|
129
|
-
fs_1.default.writeFileSync(path_1.default.join(this.outputDir, `${model.name}.ts`), content);
|
|
130
|
-
}
|
|
131
|
-
generateIndexTs(models) {
|
|
132
|
-
let content = `export * from './base';\n`;
|
|
133
|
-
for (const model of models) {
|
|
134
|
-
content += `export * from './${model.name}';\n`;
|
|
135
|
-
}
|
|
136
|
-
content += `\nimport { An5 as BaseAn5 } from './base';\n`;
|
|
137
|
-
for (const model of models) {
|
|
138
|
-
content += `import * as ${model.name}Types from './${model.name}';\n`;
|
|
139
|
-
}
|
|
140
|
-
content += `\nexport namespace An5 {\n`;
|
|
141
|
-
content += ` export type SortOrder = BaseAn5.SortOrder;\n`;
|
|
142
|
-
content += ` export type StringFilter = BaseAn5.StringFilter;\n`;
|
|
143
|
-
content += ` export type StringNullableFilter = BaseAn5.StringNullableFilter;\n`;
|
|
144
|
-
content += ` export type NumberFilter = BaseAn5.NumberFilter;\n`;
|
|
145
|
-
content += ` export type NumberNullableFilter = BaseAn5.NumberNullableFilter;\n`;
|
|
146
|
-
content += ` export type BooleanFilter = BaseAn5.BooleanFilter;\n`;
|
|
147
|
-
content += ` export type BooleanNullableFilter = BaseAn5.BooleanNullableFilter;\n`;
|
|
148
|
-
content += ` export type DateTimeFilter = BaseAn5.DateTimeFilter;\n`;
|
|
149
|
-
content += ` export type DateTimeNullableFilter = BaseAn5.DateTimeNullableFilter;\n`;
|
|
150
|
-
content += ` export type IntFieldUpdateOperationsInput = BaseAn5.IntFieldUpdateOperationsInput;\n`;
|
|
151
|
-
content += ` export type FloatFieldUpdateOperationsInput = BaseAn5.FloatFieldUpdateOperationsInput;\n`;
|
|
152
|
-
content += ` export const An5ClientKnownRequestError = BaseAn5.An5ClientKnownRequestError;\n`;
|
|
153
|
-
for (const model of models) {
|
|
154
|
-
content += ` export type ${model.name} = ${model.name}Types.${model.name};\n`;
|
|
155
|
-
content += ` export type ${model.name}WhereInput = ${model.name}Types.${model.name}WhereInput;\n`;
|
|
156
|
-
content += ` export type ${model.name}Select = ${model.name}Types.${model.name}Select;\n`;
|
|
157
|
-
content += ` export type ${model.name}Include = ${model.name}Types.${model.name}Include;\n`;
|
|
158
|
-
content += ` export type ${model.name}CreateInput = ${model.name}Types.${model.name}CreateInput;\n`;
|
|
159
|
-
content += ` export type ${model.name}UpdateInput = ${model.name}Types.${model.name}UpdateInput;\n`;
|
|
160
|
-
}
|
|
161
|
-
content += `}\n`;
|
|
162
|
-
content += `\nexport class An5Client {\n $connect(): Promise<void> { return Promise.resolve(); }\n $disconnect(): Promise<void> { return Promise.resolve(); }\n $transaction<R>(fn: (tx: An5Client) => Promise<R>, options?: { timeout?: number }): Promise<R>;\n $transaction<R>(list: Promise<R>[]): Promise<R[]>;\n $transaction(fn: any, options?: any): Promise<any> { return typeof fn === 'function' ? fn(this) : Promise.all(fn); }\n $queryRaw<T = any>(queryParts: TemplateStringsArray | string, ...values: any[]): Promise<T> { return Promise.resolve([] as any); }\n $queryRawUnsafe<R = any>(query: string, ...values: any[]): Promise<R> { return Promise.resolve([] as any); }\n $executeRaw<T = any>(queryParts: TemplateStringsArray | string, ...values: any[]): Promise<any> { return Promise.resolve(0 as any); }\n $executeRawUnsafe(query: string, ...values: any[]): Promise<number> { return Promise.resolve(0); }\n`;
|
|
163
|
-
const addedProps = new Set();
|
|
164
|
-
for (const model of models) {
|
|
165
|
-
const props = this.getAllPropertyVariations(model.name);
|
|
166
|
-
for (const prop of props) {
|
|
167
|
-
if (!addedProps.has(prop)) {
|
|
168
|
-
content += ` ${prop}!: ${model.name}Types.${model.name}TableClient;\n`;
|
|
169
|
-
addedProps.add(prop);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
content += `}\n`;
|
|
174
|
-
fs_1.default.writeFileSync(path_1.default.join(this.outputDir, 'index.ts'), content);
|
|
175
|
-
}
|
|
176
|
-
getAllPropertyVariations(modelName) {
|
|
177
|
-
const variations = new Set();
|
|
178
|
-
variations.add(this.toCamelCase(modelName));
|
|
179
|
-
const acronyms = ['LLM', 'AI', 'MCP', 'IT', 'QC', 'HR', 'MR', 'WH', 'SSIS', 'API', 'URL', 'ID', 'JSON'];
|
|
180
|
-
for (const acronym of acronyms) {
|
|
181
|
-
if (modelName.startsWith(acronym)) {
|
|
182
|
-
variations.add(acronym.toLowerCase() + modelName.slice(acronym.length));
|
|
183
|
-
variations.add(acronym[0].toLowerCase() + acronym.slice(1) + modelName.slice(acronym.length));
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return Array.from(variations);
|
|
187
|
-
}
|
|
188
|
-
getFieldFilterType(field) {
|
|
189
|
-
const normalizedType = this.normalizeType(field.type);
|
|
190
|
-
if (normalizedType === 'string')
|
|
191
|
-
return field.isOptional ? 'An5.StringNullableFilter' : 'An5.StringFilter';
|
|
192
|
-
if (normalizedType === 'number')
|
|
193
|
-
return field.isOptional ? 'An5.NumberNullableFilter' : 'An5.NumberFilter';
|
|
194
|
-
if (normalizedType === 'boolean')
|
|
195
|
-
return field.isOptional ? 'An5.BooleanNullableFilter' : 'An5.BooleanFilter';
|
|
196
|
-
if (normalizedType === 'Date')
|
|
197
|
-
return field.isOptional ? 'An5.DateTimeNullableFilter' : 'An5.DateTimeFilter';
|
|
198
|
-
return 'any';
|
|
199
|
-
}
|
|
200
|
-
normalizeType(type) {
|
|
201
|
-
const lowerType = type.toLowerCase();
|
|
202
|
-
if (['string', 'varchar', 'nvarchar', 'char', 'nchar', 'text', 'ntext', 'xml', 'guid', 'uuid', 'uniqueidentifier', 'sysname', 'hierarchyid', 'geography', 'geometry', 'sql_variant', 'sqlvariant', 'rowversion', 'variant'].includes(lowerType)) {
|
|
203
|
-
return 'string';
|
|
204
|
-
}
|
|
205
|
-
if (['int', 'integer', 'smallint', 'tinyint', 'bigint', 'long', 'number', 'decimal', 'numeric', 'money', 'smallmoney', 'float', 'real', 'double'].includes(lowerType)) {
|
|
206
|
-
return 'number';
|
|
207
|
-
}
|
|
208
|
-
if (['bool', 'boolean', 'bit'].includes(lowerType)) {
|
|
209
|
-
return 'boolean';
|
|
210
|
-
}
|
|
211
|
-
if (['datetime', 'datetime2', 'datetimeoffset', 'smalldatetime', 'date', 'time', 'timestamp'].includes(lowerType)) {
|
|
212
|
-
return 'Date';
|
|
213
|
-
}
|
|
214
|
-
if (['bytes', 'binary', 'varbinary', 'image'].includes(lowerType)) {
|
|
215
|
-
return 'string';
|
|
216
|
-
}
|
|
217
|
-
return 'any';
|
|
218
|
-
}
|
|
219
|
-
toCamelCase(str) {
|
|
220
|
-
if (!str)
|
|
221
|
-
return '';
|
|
222
|
-
return str[0].toLowerCase() + str.slice(1);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
exports.CodeGenerator = CodeGenerator;
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CodeGenerator = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
class CodeGenerator {
|
|
10
|
+
constructor(outputDir) {
|
|
11
|
+
this.outputDir = outputDir;
|
|
12
|
+
if (!fs_1.default.existsSync(this.outputDir)) {
|
|
13
|
+
fs_1.default.mkdirSync(this.outputDir, { recursive: true });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
generate(models) {
|
|
17
|
+
this.generateBaseTs();
|
|
18
|
+
for (const model of models) {
|
|
19
|
+
this.generateModelFile(model);
|
|
20
|
+
}
|
|
21
|
+
this.generateIndexTs(models);
|
|
22
|
+
}
|
|
23
|
+
generateBaseTs() {
|
|
24
|
+
const baseTs = `
|
|
25
|
+
export namespace An5 {
|
|
26
|
+
export class An5ClientKnownRequestError extends Error {
|
|
27
|
+
code!: string;
|
|
28
|
+
meta?: any;
|
|
29
|
+
constructor(message: string, { code, clientVersion }: { code: string; clientVersion: string }) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.code = code;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export type SortOrder = 'asc' | 'desc';
|
|
35
|
+
export type StringFilter = { equals?: string; in?: string[]; notIn?: string[]; lt?: string; lte?: string; gt?: string; gte?: string; contains?: string; startsWith?: string; endsWith?: string; not?: string | StringFilter; };
|
|
36
|
+
export type StringNullableFilter = { equals?: string | null; in?: (string | null)[]; notIn?: (string | null)[]; lt?: string; lte?: string; gt?: string; gte?: string; contains?: string; startsWith?: string; endsWith?: string; not?: string | StringNullableFilter | null; };
|
|
37
|
+
export type NumberFilter = { equals?: number; in?: number[]; notIn?: number[]; lt?: number; lte?: number; gt?: number; gte?: number; not?: number | NumberFilter; };
|
|
38
|
+
export type IntFieldUpdateOperationsInput = { set?: number; increment?: number; decrement?: number; multiply?: number; divide?: number; };
|
|
39
|
+
export type FloatFieldUpdateOperationsInput = { set?: number; increment?: number; decrement?: number; multiply?: number; divide?: number; };
|
|
40
|
+
export type NumberNullableFilter = { equals?: number | null; in?: (number | null)[]; notIn?: (number | null)[]; lt?: number; lte?: number; gt?: number; gte?: number; not?: number | NumberNullableFilter | null; };
|
|
41
|
+
export type BooleanFilter = { equals?: boolean; not?: boolean | BooleanFilter; };
|
|
42
|
+
export type BooleanNullableFilter = { equals?: boolean | null; not?: boolean | BooleanNullableFilter | null; };
|
|
43
|
+
export type DateTimeFilter = { equals?: Date; in?: Date[]; notIn?: Date[]; lt?: Date; lte?: Date; gt?: Date; gte?: Date; not?: Date | DateTimeFilter; };
|
|
44
|
+
export type DateTimeNullableFilter = { equals?: Date | null; in?: (Date | null)[]; notIn?: (Date | null)[]; lt?: Date; lte?: Date; gt?: Date; gte?: Date; not?: Date | DateTimeNullableFilter | null; };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface TableClient<T, WhereInput = any, Select = any, Include = any, CreateInput = any, UpdateInput = any, FindManyArgs = any, FindFirstArgs = any, FindUniqueArgs = any, CreateArgs = any, UpdateArgs = any, UpsertArgs = any, DeleteArgs = any> {
|
|
48
|
+
findMany(args?: FindManyArgs): Promise<T[]>;
|
|
49
|
+
vectorSearch(args: { vector: number[]; take?: number; where?: WhereInput; include?: Include; vectorField?: string; distanceMetric?: 'cosine' | 'euclidean' | 'dot'; }): Promise<(T & { distance: number })[]>;
|
|
50
|
+
findFirst(args?: FindFirstArgs): Promise<T | null>;
|
|
51
|
+
findUnique(args?: FindUniqueArgs): Promise<T | null>;
|
|
52
|
+
count(args?: { where?: WhereInput; }): Promise<number>;
|
|
53
|
+
create(args: CreateArgs): Promise<T>;
|
|
54
|
+
createMany(args: { data: CreateInput[]; skipDuplicates?: boolean; }): Promise<{ count: number }>;
|
|
55
|
+
update(args: UpdateArgs): Promise<T>;
|
|
56
|
+
updateMany(args: { where?: WhereInput; data: UpdateInput; }): Promise<{ count: number }>;
|
|
57
|
+
delete(args: DeleteArgs): Promise<T>;
|
|
58
|
+
deleteMany(args?: { where?: WhereInput; }): Promise<{ count: number }>;
|
|
59
|
+
aggregate(args: any): Promise<any>;
|
|
60
|
+
groupBy(args: any): Promise<any[]>;
|
|
61
|
+
upsert(args: UpsertArgs): Promise<T>;
|
|
62
|
+
}
|
|
63
|
+
`;
|
|
64
|
+
fs_1.default.writeFileSync(path_1.default.join(this.outputDir, 'base.ts'), baseTs);
|
|
65
|
+
}
|
|
66
|
+
generateModelFile(model) {
|
|
67
|
+
let content = `import { An5, TableClient } from './base';\n`;
|
|
68
|
+
const relModels = [...new Set(model.relations.map(r => r.type))];
|
|
69
|
+
for (const relModel of relModels) {
|
|
70
|
+
if (relModel !== model.name) {
|
|
71
|
+
content += `import { ${relModel}, ${relModel}WhereInput, ${relModel}FindManyArgs, ${relModel}CreateInput, ${relModel}UpdateInput } from './${relModel}';\n`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
content += `\nexport interface ${model.name} {\n`;
|
|
75
|
+
for (const field of model.fields) {
|
|
76
|
+
content += ` ${field.name}: ${this.normalizeType(field.type)}${field.isOptional ? ' | null' : ''};\n`;
|
|
77
|
+
}
|
|
78
|
+
for (const rel of model.relations) {
|
|
79
|
+
content += ` ${rel.name}?: ${rel.type}${rel.isArray ? '[]' : ''}${rel.isOptional ? ' | null' : ''};\n`;
|
|
80
|
+
}
|
|
81
|
+
if (model.relations.length > 0) {
|
|
82
|
+
content += ` _count?: { ${model.relations.map(r => `${r.name}: number`).join('; ')} };\n`;
|
|
83
|
+
}
|
|
84
|
+
content += `}\n\n`;
|
|
85
|
+
content += `export type ${model.name}WhereInput = {\n`;
|
|
86
|
+
content += ` AND?: ${model.name}WhereInput | ${model.name}WhereInput[];\n`;
|
|
87
|
+
content += ` OR?: ${model.name}WhereInput[];\n`;
|
|
88
|
+
content += ` NOT?: ${model.name}WhereInput | ${model.name}WhereInput[];\n`;
|
|
89
|
+
for (const field of model.fields) {
|
|
90
|
+
const filter = this.getFieldFilterType(field);
|
|
91
|
+
content += ` ${field.name}?: ${field.type} | ${filter}${field.isOptional ? ' | null' : ''};\n`;
|
|
92
|
+
}
|
|
93
|
+
for (const rel of model.relations) {
|
|
94
|
+
if (rel.isArray) {
|
|
95
|
+
content += ` ${rel.name}?: { some?: ${rel.type}WhereInput; none?: ${rel.type}WhereInput; every?: ${rel.type}WhereInput; };\n`;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
content += ` ${rel.name}?: ${rel.type}WhereInput${rel.isOptional ? ' | null' : ''};\n`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (model.compoundUniques) {
|
|
102
|
+
for (const compound of model.compoundUniques) {
|
|
103
|
+
const keyName = compound.join('_');
|
|
104
|
+
content += ` ${keyName}?: { ${compound.map(f => `${f}: ${model.fields.find(mf => mf.name === f)?.type || 'any'}`).join('; ')} };\n`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
content += `};\n\n`;
|
|
108
|
+
const selectFields = model.fields.map(f => `${f.name}?: boolean`);
|
|
109
|
+
const selectRels = model.relations.map(r => `${r.name}?: boolean | ${r.type}FindManyArgs`);
|
|
110
|
+
if (model.relations.length > 0) {
|
|
111
|
+
selectRels.push(`_count?: boolean | { select?: { ${model.relations.map(r => `${r.name}?: boolean`).join('; ')} } }`);
|
|
112
|
+
}
|
|
113
|
+
content += `export type ${model.name}Select = { ${[...selectFields, ...selectRels].join('; ')}${[...selectFields, ...selectRels].length > 0 ? ';' : ''} };\n`;
|
|
114
|
+
const includeRels = model.relations.map(r => `${r.name}?: boolean | ${r.type}FindManyArgs`);
|
|
115
|
+
if (model.relations.length > 0) {
|
|
116
|
+
includeRels.push(`_count?: boolean | { select?: { ${model.relations.map(r => `${r.name}?: boolean`).join('; ')} } }`);
|
|
117
|
+
}
|
|
118
|
+
content += `export type ${model.name}Include = { ${includeRels.join('; ')}${includeRels.length > 0 ? ';' : ''} };\n`;
|
|
119
|
+
content += `export type ${model.name}CreateInput = { ${model.fields.map(f => `${f.name}${f.isOptional || f.hasDefault ? '?' : ''}: ${f.type}${f.isOptional ? ' | null' : ''}`).join('; ')}; ${model.relations.map(r => `${r.name}?: { create?: ${r.type}CreateInput | ${r.type}CreateInput[]; connect?: ${r.type}WhereInput | ${r.type}WhereInput[]; }`).join('; ')} };\n`;
|
|
120
|
+
content += `export type ${model.name}UpdateInput = { ${model.fields.filter(f => !f.isId).map(f => `${f.name}?: ${f.type === 'number' ? 'number | An5.IntFieldUpdateOperationsInput' : f.type}${f.isOptional ? ' | null' : ''}`).join('; ')}; ${model.relations.map(r => `${r.name}?: { create?: ${r.type}CreateInput | ${r.type}CreateInput[]; connect?: ${r.type}WhereInput | ${r.type}WhereInput[]; set?: ${r.type}WhereInput | ${r.type}WhereInput[]; disconnect?: ${r.type}WhereInput | ${r.type}WhereInput[]; delete?: ${r.type}WhereInput | ${r.type}WhereInput[]; update?: { where: ${r.type}WhereInput; data: ${r.type}UpdateInput; } | { where: ${r.type}WhereInput; data: ${r.type}UpdateInput; }[]; upsert?: { where: ${r.type}WhereInput; create: ${r.type}CreateInput; update: ${r.type}UpdateInput; } | { where: ${r.type}WhereInput; create: ${r.type}CreateInput; update: ${r.type}UpdateInput; }[]; }`).join('; ')} };\n`;
|
|
121
|
+
content += `export type ${model.name}FindManyArgs = { where?: ${model.name}WhereInput; orderBy?: any; take?: number; skip?: number; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
122
|
+
content += `export type ${model.name}FindFirstArgs = { where?: ${model.name}WhereInput; orderBy?: any; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
123
|
+
content += `export type ${model.name}FindUniqueArgs = { where?: ${model.name}WhereInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
124
|
+
content += `export type ${model.name}CreateArgs = { data: ${model.name}CreateInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
125
|
+
content += `export type ${model.name}UpdateArgs = { where: ${model.name}WhereInput; data: ${model.name}UpdateInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
126
|
+
content += `export type ${model.name}UpsertArgs = { where: ${model.name}WhereInput; create: ${model.name}CreateInput; update: ${model.name}UpdateInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
127
|
+
content += `export type ${model.name}DeleteArgs = { where: ${model.name}WhereInput; include?: ${model.name}Include; select?: ${model.name}Select; };\n`;
|
|
128
|
+
content += `export type ${model.name}TableClient = TableClient<\n ${model.name},\n ${model.name}WhereInput,\n ${model.name}Select,\n ${model.name}Include,\n ${model.name}CreateInput,\n ${model.name}UpdateInput,\n ${model.name}FindManyArgs,\n ${model.name}FindFirstArgs,\n ${model.name}FindUniqueArgs,\n ${model.name}CreateArgs,\n ${model.name}UpdateArgs,\n ${model.name}UpsertArgs,\n ${model.name}DeleteArgs\n>;\n`;
|
|
129
|
+
fs_1.default.writeFileSync(path_1.default.join(this.outputDir, `${model.name}.ts`), content);
|
|
130
|
+
}
|
|
131
|
+
generateIndexTs(models) {
|
|
132
|
+
let content = `export * from './base';\n`;
|
|
133
|
+
for (const model of models) {
|
|
134
|
+
content += `export * from './${model.name}';\n`;
|
|
135
|
+
}
|
|
136
|
+
content += `\nimport { An5 as BaseAn5 } from './base';\n`;
|
|
137
|
+
for (const model of models) {
|
|
138
|
+
content += `import * as ${model.name}Types from './${model.name}';\n`;
|
|
139
|
+
}
|
|
140
|
+
content += `\nexport namespace An5 {\n`;
|
|
141
|
+
content += ` export type SortOrder = BaseAn5.SortOrder;\n`;
|
|
142
|
+
content += ` export type StringFilter = BaseAn5.StringFilter;\n`;
|
|
143
|
+
content += ` export type StringNullableFilter = BaseAn5.StringNullableFilter;\n`;
|
|
144
|
+
content += ` export type NumberFilter = BaseAn5.NumberFilter;\n`;
|
|
145
|
+
content += ` export type NumberNullableFilter = BaseAn5.NumberNullableFilter;\n`;
|
|
146
|
+
content += ` export type BooleanFilter = BaseAn5.BooleanFilter;\n`;
|
|
147
|
+
content += ` export type BooleanNullableFilter = BaseAn5.BooleanNullableFilter;\n`;
|
|
148
|
+
content += ` export type DateTimeFilter = BaseAn5.DateTimeFilter;\n`;
|
|
149
|
+
content += ` export type DateTimeNullableFilter = BaseAn5.DateTimeNullableFilter;\n`;
|
|
150
|
+
content += ` export type IntFieldUpdateOperationsInput = BaseAn5.IntFieldUpdateOperationsInput;\n`;
|
|
151
|
+
content += ` export type FloatFieldUpdateOperationsInput = BaseAn5.FloatFieldUpdateOperationsInput;\n`;
|
|
152
|
+
content += ` export const An5ClientKnownRequestError = BaseAn5.An5ClientKnownRequestError;\n`;
|
|
153
|
+
for (const model of models) {
|
|
154
|
+
content += ` export type ${model.name} = ${model.name}Types.${model.name};\n`;
|
|
155
|
+
content += ` export type ${model.name}WhereInput = ${model.name}Types.${model.name}WhereInput;\n`;
|
|
156
|
+
content += ` export type ${model.name}Select = ${model.name}Types.${model.name}Select;\n`;
|
|
157
|
+
content += ` export type ${model.name}Include = ${model.name}Types.${model.name}Include;\n`;
|
|
158
|
+
content += ` export type ${model.name}CreateInput = ${model.name}Types.${model.name}CreateInput;\n`;
|
|
159
|
+
content += ` export type ${model.name}UpdateInput = ${model.name}Types.${model.name}UpdateInput;\n`;
|
|
160
|
+
}
|
|
161
|
+
content += `}\n`;
|
|
162
|
+
content += `\nexport class An5Client {\n $connect(): Promise<void> { return Promise.resolve(); }\n $disconnect(): Promise<void> { return Promise.resolve(); }\n $transaction<R>(fn: (tx: An5Client) => Promise<R>, options?: { timeout?: number }): Promise<R>;\n $transaction<R>(list: Promise<R>[]): Promise<R[]>;\n $transaction(fn: any, options?: any): Promise<any> { return typeof fn === 'function' ? fn(this) : Promise.all(fn); }\n $queryRaw<T = any>(queryParts: TemplateStringsArray | string, ...values: any[]): Promise<T> { return Promise.resolve([] as any); }\n $queryRawUnsafe<R = any>(query: string, ...values: any[]): Promise<R> { return Promise.resolve([] as any); }\n $executeRaw<T = any>(queryParts: TemplateStringsArray | string, ...values: any[]): Promise<any> { return Promise.resolve(0 as any); }\n $executeRawUnsafe(query: string, ...values: any[]): Promise<number> { return Promise.resolve(0); }\n`;
|
|
163
|
+
const addedProps = new Set();
|
|
164
|
+
for (const model of models) {
|
|
165
|
+
const props = this.getAllPropertyVariations(model.name);
|
|
166
|
+
for (const prop of props) {
|
|
167
|
+
if (!addedProps.has(prop)) {
|
|
168
|
+
content += ` ${prop}!: ${model.name}Types.${model.name}TableClient;\n`;
|
|
169
|
+
addedProps.add(prop);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
content += `}\n`;
|
|
174
|
+
fs_1.default.writeFileSync(path_1.default.join(this.outputDir, 'index.ts'), content);
|
|
175
|
+
}
|
|
176
|
+
getAllPropertyVariations(modelName) {
|
|
177
|
+
const variations = new Set();
|
|
178
|
+
variations.add(this.toCamelCase(modelName));
|
|
179
|
+
const acronyms = ['LLM', 'AI', 'MCP', 'IT', 'QC', 'HR', 'MR', 'WH', 'SSIS', 'API', 'URL', 'ID', 'JSON'];
|
|
180
|
+
for (const acronym of acronyms) {
|
|
181
|
+
if (modelName.startsWith(acronym)) {
|
|
182
|
+
variations.add(acronym.toLowerCase() + modelName.slice(acronym.length));
|
|
183
|
+
variations.add(acronym[0].toLowerCase() + acronym.slice(1) + modelName.slice(acronym.length));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return Array.from(variations);
|
|
187
|
+
}
|
|
188
|
+
getFieldFilterType(field) {
|
|
189
|
+
const normalizedType = this.normalizeType(field.type);
|
|
190
|
+
if (normalizedType === 'string')
|
|
191
|
+
return field.isOptional ? 'An5.StringNullableFilter' : 'An5.StringFilter';
|
|
192
|
+
if (normalizedType === 'number')
|
|
193
|
+
return field.isOptional ? 'An5.NumberNullableFilter' : 'An5.NumberFilter';
|
|
194
|
+
if (normalizedType === 'boolean')
|
|
195
|
+
return field.isOptional ? 'An5.BooleanNullableFilter' : 'An5.BooleanFilter';
|
|
196
|
+
if (normalizedType === 'Date')
|
|
197
|
+
return field.isOptional ? 'An5.DateTimeNullableFilter' : 'An5.DateTimeFilter';
|
|
198
|
+
return 'any';
|
|
199
|
+
}
|
|
200
|
+
normalizeType(type) {
|
|
201
|
+
const lowerType = type.toLowerCase();
|
|
202
|
+
if (['string', 'varchar', 'nvarchar', 'char', 'nchar', 'text', 'ntext', 'xml', 'guid', 'uuid', 'uniqueidentifier', 'sysname', 'hierarchyid', 'geography', 'geometry', 'sql_variant', 'sqlvariant', 'rowversion', 'variant'].includes(lowerType)) {
|
|
203
|
+
return 'string';
|
|
204
|
+
}
|
|
205
|
+
if (['int', 'integer', 'smallint', 'tinyint', 'bigint', 'long', 'number', 'decimal', 'numeric', 'money', 'smallmoney', 'float', 'real', 'double'].includes(lowerType)) {
|
|
206
|
+
return 'number';
|
|
207
|
+
}
|
|
208
|
+
if (['bool', 'boolean', 'bit'].includes(lowerType)) {
|
|
209
|
+
return 'boolean';
|
|
210
|
+
}
|
|
211
|
+
if (['datetime', 'datetime2', 'datetimeoffset', 'smalldatetime', 'date', 'time', 'timestamp'].includes(lowerType)) {
|
|
212
|
+
return 'Date';
|
|
213
|
+
}
|
|
214
|
+
if (['bytes', 'binary', 'varbinary', 'image'].includes(lowerType)) {
|
|
215
|
+
return 'string';
|
|
216
|
+
}
|
|
217
|
+
return 'any';
|
|
218
|
+
}
|
|
219
|
+
toCamelCase(str) {
|
|
220
|
+
if (!str)
|
|
221
|
+
return '';
|
|
222
|
+
return str[0].toLowerCase() + str.slice(1);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.CodeGenerator = CodeGenerator;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { Model } from './types';
|
|
2
|
-
export declare class DotnetGenerator {
|
|
3
|
-
private outputDir;
|
|
4
|
-
constructor(outputDir: string);
|
|
5
|
-
generate(models: Model[]): void;
|
|
6
|
-
private generateConfigClass;
|
|
7
|
-
private mapType;
|
|
8
|
-
private generateEntityClass;
|
|
9
|
-
private generateDbContext;
|
|
10
|
-
private capitalize;
|
|
11
|
-
}
|
|
1
|
+
import { Model } from './types';
|
|
2
|
+
export declare class DotnetGenerator {
|
|
3
|
+
private outputDir;
|
|
4
|
+
constructor(outputDir: string);
|
|
5
|
+
generate(models: Model[]): void;
|
|
6
|
+
private generateConfigClass;
|
|
7
|
+
private mapType;
|
|
8
|
+
private generateEntityClass;
|
|
9
|
+
private generateDbContext;
|
|
10
|
+
private capitalize;
|
|
11
|
+
}
|