@an5/orm 1.0.0 → 1.0.2

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 CHANGED
@@ -1,4 +1,4 @@
1
- # an5Orm
1
+ # @an5/orm
2
2
 
3
3
  SQL Server ORM. Proxy client. CRUD. Vector search. Middleware. Raw queries. Transactions.
4
4
 
@@ -13,7 +13,13 @@ SQL Server ORM. Proxy client. CRUD. Vector search. Middleware. Raw queries. Tran
13
13
  - **Transactions.** `$transaction`. Rollback support.
14
14
  - **Schema Generator.** Parse `.an5` files. Generate TypeScript/Python/.NET code.
15
15
 
16
- ## Quick Start
16
+ ## Quick Start
17
+
18
+ ### Installation
19
+
20
+ ```bash
21
+ npm install @an5/orm
22
+ ```
17
23
 
18
24
  ### Configuration
19
25
 
@@ -25,17 +31,20 @@ cp .env.example .env
25
31
  ### Development Commands
26
32
 
27
33
  ```bash
28
- # Generate code from schema
29
- npm run generate
30
-
31
- # Push schema to database
32
- npm run db:push
33
-
34
- # Pull schema from database
35
- npm run db:pull
36
-
37
- # Seed database
38
- npm run db:seed
34
+ # Generate code from schema
35
+ npx an5 generate
36
+
37
+ # Push schema to database
38
+ npx an5 db:push
39
+
40
+ # Pull schema from database
41
+ npx an5 db:pull
42
+
43
+ # Seed database
44
+ npx an5 db:seed
45
+
46
+ # Compare schema with database
47
+ npx an5 db:migrate diff
39
48
 
40
49
  # Run tests
41
50
  npm test
@@ -44,7 +53,7 @@ npm test
44
53
  ## Usage
45
54
 
46
55
  ```typescript
47
- import { An5ORM } from './an5Orm';
56
+ import { An5ORM } from '@an5/orm';
48
57
 
49
58
  const db = new An5ORM();
50
59
 
@@ -135,4 +144,4 @@ npm test
135
144
 
136
145
  ## License
137
146
 
138
- MIT
147
+ MIT
package/dist/an5Orm.js CHANGED
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.an5Orm = exports.An5ORM = void 0;
7
7
  const mssql_1 = __importDefault(require("mssql"));
8
- const an5_adapters_1 = require("an5-adapters");
8
+ const an5_adapters_1 = require("@an5/adapters");
9
9
  const crypto_1 = require("crypto");
10
10
  const logger_1 = require("@an5/lib/logger");
11
11
  const typescript_1 = require("an5-client/typescript");
@@ -1345,4 +1345,4 @@ class An5ORM {
1345
1345
  exports.An5ORM = An5ORM;
1346
1346
  exports.an5Orm = new An5ORM();
1347
1347
  exports.default = exports.an5Orm;
1348
- //# sourceMappingURL=an5Orm.js.map
1348
+ //# sourceMappingURL=an5Orm.js.map
package/dist/cleanup.js CHANGED
@@ -4,10 +4,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  require("dotenv/config");
7
- const an5_adapters_1 = require("an5-adapters");
7
+ const an5_adapters_1 = require("@an5/adapters");
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const path_1 = __importDefault(require("path"));
10
- const rootDir = path_1.default.join(__dirname, "../");
10
+ const rootDir = process.cwd();
11
11
  let config = {};
12
12
  try {
13
13
  const configPath = path_1.default.join(rootDir, "an5Orm.config.js");
@@ -114,4 +114,4 @@ cleanup().catch(err => {
114
114
  console.error("❌ Cleanup failed:", err);
115
115
  process.exit(1);
116
116
  });
117
- //# sourceMappingURL=cleanup.js.map
117
+ //# sourceMappingURL=cleanup.js.map
package/dist/cli.js ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ const path = require('path');
3
+ const { spawnSync } = require('child_process');
4
+
5
+ const root = path.resolve(__dirname, '..');
6
+ const command = process.argv[2];
7
+ const args = process.argv.slice(3);
8
+
9
+ const commands = {
10
+ generate: path.join(__dirname, 'generator', 'src', 'index.js'),
11
+ 'db:generate': path.join(__dirname, 'generator', 'src', 'index.js'),
12
+ 'db:push': path.join(__dirname, 'push.js'),
13
+ 'db:pull': path.join(__dirname, 'pull.js'),
14
+ 'db:seed': path.join(__dirname, 'seed.js'),
15
+ 'db:cleanup': path.join(__dirname, 'cleanup.js'),
16
+ 'db:migrate': path.join(__dirname, 'migrate.js'),
17
+ };
18
+
19
+ function help() {
20
+ console.log(`AN5 ORM CLI
21
+
22
+ Usage:
23
+ an5 <command>
24
+ an5-orm <command>
25
+
26
+ Commands:
27
+ generate Generate clients from an5Schema
28
+ db:generate Alias for generate
29
+ db:push Push schema to database
30
+ db:pull Pull schema from database
31
+ db:seed Seed database
32
+ db:cleanup Drop tables not in schema
33
+ db:migrate Migration commands: diff, generate, status
34
+
35
+ Examples:
36
+ npx an5 generate
37
+ npx an5 db:migrate diff
38
+ `);
39
+ }
40
+
41
+ if (!command || command === '-h' || command === '--help' || command === 'help') {
42
+ help();
43
+ process.exit(0);
44
+ }
45
+
46
+ const script = commands[command];
47
+ if (!script) {
48
+ console.error(`Unknown command: ${command}`);
49
+ help();
50
+ process.exit(1);
51
+ }
52
+
53
+ const result = spawnSync(process.execPath, [script, ...args], {
54
+ cwd: process.cwd(),
55
+ env: process.env,
56
+ stdio: 'inherit',
57
+ });
58
+
59
+ if (result.error) {
60
+ console.error(result.error.message);
61
+ process.exit(1);
62
+ }
63
+
64
+ process.exit(result.status ?? 0);
@@ -0,0 +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
+ }
@@ -0,0 +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;
@@ -0,0 +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
+ }