@an5/orm 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,13 +29,16 @@ async function main() {
29
29
  const rootDir = process.cwd();
30
30
  let config = {};
31
31
  try {
32
- const configPath = path_1.default.join(rootDir, 'an5Orm.config.js');
32
+ let configPath = path_1.default.join(rootDir, 'an5Orm.config.js');
33
+ if (!fs_1.default.existsSync(configPath)) {
34
+ configPath = path_1.default.join(rootDir, 'an5Orm.config.cjs');
35
+ }
33
36
  if (fs_1.default.existsSync(configPath)) {
34
37
  config = require(configPath);
35
38
  }
36
39
  }
37
40
  catch (err) {
38
- console.warn('⚠️ Could not load an5Orm.config.js, using defaults.', err);
41
+ console.warn('⚠️ Could not load an5Orm.config.js/.cjs, using defaults.', err);
39
42
  }
40
43
  const schemaDir = path_1.default.resolve(rootDir, config.schemaDir || 'an5Schema');
41
44
  const outputTypesDir = path_1.default.resolve(rootDir, config.outputs?.typescript?.outputDir || 'an5Client/typescript');
@@ -20,10 +20,18 @@ class MetadataGenerator {
20
20
  }
21
21
  }
22
22
  metaContent += '};\n\n';
23
- metaContent += 'export const modelFields: Record<string, Record<string, { ts: string; sql: string }>> = {\n';
23
+ metaContent += 'export const modelDescriptions: Record<string, string | undefined> = {\n';
24
24
  for (const model of models) {
25
25
  const props = this.getAllPropertyVariations(model.name);
26
- const fieldsStr = `{ ${model.fields.map(f => `${f.name}: { ts: "${f.type}${f.isOptional ? '?' : ''}", sql: "${f.sqlType}" }`).join(', ')} }`;
26
+ for (const prop of props) {
27
+ metaContent += ` ${prop}: ${model.description ? JSON.stringify(model.description) : 'undefined'},\n`;
28
+ }
29
+ }
30
+ metaContent += '};\n\n';
31
+ metaContent += 'export const modelFields: Record<string, Record<string, { ts: string; sql: string; description?: string }>> = {\n';
32
+ for (const model of models) {
33
+ const props = this.getAllPropertyVariations(model.name);
34
+ const fieldsStr = `{ ${model.fields.map(f => `${f.name}: ${this.formatFieldMetadata(f)}`).join(', ')} }`;
27
35
  for (const prop of props) {
28
36
  metaContent += ` ${prop}: ${fieldsStr},\n`;
29
37
  }
@@ -63,6 +71,16 @@ class MetadataGenerator {
63
71
  }
64
72
  return Array.from(variations);
65
73
  }
74
+ formatFieldMetadata(field) {
75
+ const entries = [
76
+ `ts: ${JSON.stringify(`${field.type}${field.isOptional ? '?' : ''}`)}`,
77
+ `sql: ${JSON.stringify(field.sqlType)}`,
78
+ ];
79
+ if (field.description) {
80
+ entries.push(`description: ${JSON.stringify(field.description)}`);
81
+ }
82
+ return `{ ${entries.join(', ')} }`;
83
+ }
66
84
  toCamelCase(str) {
67
85
  if (!str)
68
86
  return '';
@@ -21,7 +21,16 @@ class PythonGenerator {
21
21
  }
22
22
  }
23
23
  pyContent += '}\n\n';
24
- // 2. MODEL_FIELDS
24
+ // 2. MODEL_DESCRIPTIONS
25
+ pyContent += 'MODEL_DESCRIPTIONS = {\n';
26
+ for (const model of models) {
27
+ const props = this.getAllPropertyVariations(model.name);
28
+ for (const prop of props) {
29
+ pyContent += ` "${prop}": ${this.pyString(model.description)},\n`;
30
+ }
31
+ }
32
+ pyContent += '}\n\n';
33
+ // 3. MODEL_FIELDS
25
34
  pyContent += 'MODEL_FIELDS = {\n';
26
35
  for (const model of models) {
27
36
  const props = this.getAllPropertyVariations(model.name);
@@ -31,7 +40,7 @@ class PythonGenerator {
31
40
  }
32
41
  }
33
42
  pyContent += '}\n\n';
34
- // 3. RELATION_MAP
43
+ // 4. RELATION_MAP
35
44
  pyContent += 'RELATION_MAP = {\n';
36
45
  for (const model of models) {
37
46
  const props = this.getAllPropertyVariations(model.name);
@@ -72,10 +81,13 @@ class PythonGenerator {
72
81
  if (model.fields.length === 0)
73
82
  return '[]';
74
83
  const fields = model.fields.map(f => {
75
- return ` { "name": "${f.name}", "type": "${f.type}${f.isOptional ? '?' : ''}", "sql": "${f.sqlType}", "isOptional": ${f.isOptional ? 'True' : 'False'}, "hasDefault": ${f.hasDefault ? 'True' : 'False'}, "isId": ${f.isId ? 'True' : 'False'} }`;
84
+ return ` { "name": "${f.name}", "type": "${f.type}${f.isOptional ? '?' : ''}", "sql": "${f.sqlType}", "isOptional": ${f.isOptional ? 'True' : 'False'}, "hasDefault": ${f.hasDefault ? 'True' : 'False'}, "isId": ${f.isId ? 'True' : 'False'}, "description": ${this.pyString(f.description)} }`;
76
85
  });
77
86
  return `[\n${fields.join(',\n')}\n ]`;
78
87
  }
88
+ pyString(value) {
89
+ return value ? JSON.stringify(value) : 'None';
90
+ }
79
91
  toCamelCase(str) {
80
92
  if (!str)
81
93
  return '';
package/dist/migrate.js CHANGED
@@ -19,7 +19,10 @@ const an5_adapters_1 = require("@an5/adapters");
19
19
  const rootDir = process.cwd();
20
20
  let config = {};
21
21
  try {
22
- const configPath = path_1.default.join(rootDir, 'an5Orm.config.js');
22
+ let configPath = path_1.default.join(rootDir, 'an5Orm.config.js');
23
+ if (!fs_1.default.existsSync(configPath)) {
24
+ configPath = path_1.default.join(rootDir, 'an5Orm.config.cjs');
25
+ }
23
26
  if (fs_1.default.existsSync(configPath)) {
24
27
  config = require(configPath);
25
28
  }
@@ -125,30 +128,30 @@ function parseSchema() {
125
128
  return models;
126
129
  }
127
130
  async function introspectTable(tableName) {
128
- return (await getDb()).$queryRawUnsafe(`
129
- SELECT
130
- c.name AS columnName,
131
- ty.name AS dataType,
132
- c.is_nullable AS isNullable,
133
- pk.is_primary_key AS isPrimaryKey,
134
- c.is_identity AS isIdentity,
135
- d.definition AS defaultValue
136
- FROM sys.columns c
137
- JOIN sys.types ty ON c.user_type_id = ty.user_type_id
138
- LEFT JOIN (
139
- SELECT ic.object_id, ic.column_id, i.is_primary_key
140
- FROM sys.index_columns ic
141
- JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
142
- WHERE i.is_primary_key = 1
143
- ) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
144
- LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
145
- WHERE c.object_id = OBJECT_ID(@p_0)
146
- ORDER BY c.column_id
131
+ return (await getDb()).$queryRawUnsafe(`
132
+ SELECT
133
+ c.name AS columnName,
134
+ ty.name AS dataType,
135
+ c.is_nullable AS isNullable,
136
+ pk.is_primary_key AS isPrimaryKey,
137
+ c.is_identity AS isIdentity,
138
+ d.definition AS defaultValue
139
+ FROM sys.columns c
140
+ JOIN sys.types ty ON c.user_type_id = ty.user_type_id
141
+ LEFT JOIN (
142
+ SELECT ic.object_id, ic.column_id, i.is_primary_key
143
+ FROM sys.index_columns ic
144
+ JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
145
+ WHERE i.is_primary_key = 1
146
+ ) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
147
+ LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
148
+ WHERE c.object_id = OBJECT_ID(@p_0)
149
+ ORDER BY c.column_id
147
150
  `, tableName);
148
151
  }
149
152
  async function getExistingTables() {
150
- const rows = await (await getDb()).$queryRawUnsafe(`
151
- SELECT name FROM sys.tables WHERE is_ms_shipped = 0 ORDER BY name
153
+ const rows = await (await getDb()).$queryRawUnsafe(`
154
+ SELECT name FROM sys.tables WHERE is_ms_shipped = 0 ORDER BY name
152
155
  `);
153
156
  return rows.map(r => r.name);
154
157
  }
package/dist/pull.js CHANGED
@@ -10,7 +10,10 @@ const an5_adapters_1 = require("@an5/adapters");
10
10
  const rootDir = process.cwd();
11
11
  let config = {};
12
12
  try {
13
- const configPath = path_1.default.join(rootDir, "an5Orm.config.js");
13
+ let configPath = path_1.default.join(rootDir, "an5Orm.config.js");
14
+ if (!fs_1.default.existsSync(configPath)) {
15
+ configPath = path_1.default.join(rootDir, "an5Orm.config.cjs");
16
+ }
14
17
  if (fs_1.default.existsSync(configPath)) {
15
18
  config = require(configPath);
16
19
  }
@@ -32,12 +35,12 @@ function capitalize(str) {
32
35
  }
33
36
  async function pull() {
34
37
  console.log("🔍 Pulling schema from database...");
35
- const tables = await (await getDb()).$queryRawUnsafe(`
36
- SELECT s.name AS schemaName, t.name AS tableName
37
- FROM sys.tables t
38
- JOIN sys.schemas s ON t.schema_id = s.schema_id
39
- WHERE t.is_ms_shipped = 0
40
- ORDER BY t.name
38
+ const tables = await (await getDb()).$queryRawUnsafe(`
39
+ SELECT s.name AS schemaName, t.name AS tableName
40
+ FROM sys.tables t
41
+ JOIN sys.schemas s ON t.schema_id = s.schema_id
42
+ WHERE t.is_ms_shipped = 0
43
+ ORDER BY t.name
41
44
  `);
42
45
  // Load existing schema files
43
46
  const fileContents = {};
@@ -84,42 +87,42 @@ async function pull() {
84
87
  const { tableName } = table;
85
88
  console.log(`Introspecting table [${tableName}]...`);
86
89
  // Get columns
87
- const columns = await (await getDb()).$queryRawUnsafe(`
88
- SELECT
89
- c.name AS columnName,
90
- ty.name AS dataType,
91
- c.max_length AS maxLength,
92
- c.precision AS precision,
93
- c.scale AS scale,
94
- c.is_nullable AS isNullable,
95
- c.is_identity AS isIdentity,
96
- pk.is_primary_key AS isPrimaryKey,
97
- d.definition AS defaultValue
98
- FROM sys.columns c
99
- JOIN sys.types ty ON c.user_type_id = ty.user_type_id
100
- LEFT JOIN (
101
- SELECT ic.object_id, ic.column_id, i.is_primary_key
102
- FROM sys.index_columns ic
103
- JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
104
- WHERE i.is_primary_key = 1
105
- ) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
106
- LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
107
- WHERE c.object_id = OBJECT_ID(@p_0)
108
- ORDER BY c.column_id
90
+ const columns = await (await getDb()).$queryRawUnsafe(`
91
+ SELECT
92
+ c.name AS columnName,
93
+ ty.name AS dataType,
94
+ c.max_length AS maxLength,
95
+ c.precision AS precision,
96
+ c.scale AS scale,
97
+ c.is_nullable AS isNullable,
98
+ c.is_identity AS isIdentity,
99
+ pk.is_primary_key AS isPrimaryKey,
100
+ d.definition AS defaultValue
101
+ FROM sys.columns c
102
+ JOIN sys.types ty ON c.user_type_id = ty.user_type_id
103
+ LEFT JOIN (
104
+ SELECT ic.object_id, ic.column_id, i.is_primary_key
105
+ FROM sys.index_columns ic
106
+ JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
107
+ WHERE i.is_primary_key = 1
108
+ ) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
109
+ LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id
110
+ WHERE c.object_id = OBJECT_ID(@p_0)
111
+ ORDER BY c.column_id
109
112
  `, tableName);
110
113
  // Get indexes
111
- const indexes = await (await getDb()).$queryRawUnsafe(`
112
- SELECT
113
- i.name AS indexName,
114
- i.is_unique AS isUnique,
115
- i.is_primary_key AS isPrimaryKey,
116
- c.name AS columnName,
117
- ic.key_ordinal AS keyOrdinal
118
- FROM sys.indexes i
119
- JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
120
- JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
121
- WHERE i.object_id = OBJECT_ID(@p_0) AND i.is_hypothetical = 0 AND i.name IS NOT NULL
122
- ORDER BY i.name, ic.key_ordinal
114
+ const indexes = await (await getDb()).$queryRawUnsafe(`
115
+ SELECT
116
+ i.name AS indexName,
117
+ i.is_unique AS isUnique,
118
+ i.is_primary_key AS isPrimaryKey,
119
+ c.name AS columnName,
120
+ ic.key_ordinal AS keyOrdinal
121
+ FROM sys.indexes i
122
+ JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
123
+ JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
124
+ WHERE i.object_id = OBJECT_ID(@p_0) AND i.is_hypothetical = 0 AND i.name IS NOT NULL
125
+ ORDER BY i.name, ic.key_ordinal
123
126
  `, tableName);
124
127
  const indexGroups = {};
125
128
  for (const idx of indexes) {
package/dist/push.js CHANGED
@@ -10,7 +10,10 @@ const adapters_1 = require("@an5/adapters");
10
10
  const rootDir = process.cwd();
11
11
  let config = {};
12
12
  try {
13
- const configPath = path_1.default.join(rootDir, "an5Orm.config.js");
13
+ let configPath = path_1.default.join(rootDir, "an5Orm.config.js");
14
+ if (!fs_1.default.existsSync(configPath)) {
15
+ configPath = path_1.default.join(rootDir, "an5Orm.config.cjs");
16
+ }
14
17
  if (fs_1.default.existsSync(configPath)) {
15
18
  config = require(configPath);
16
19
  }
package/dist/seed.js CHANGED
@@ -31,60 +31,60 @@ async function main() {
31
31
  if (db) {
32
32
  await db.lLMProvider.findMany({ take: 1 });
33
33
  // Ensure mcp_servers table exists
34
- await db.$executeRawUnsafe(`
35
- IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'mcp_servers')
36
- BEGIN
37
- CREATE TABLE [mcp_servers] (
38
- [id] NVARCHAR(255) NOT NULL PRIMARY KEY,
39
- [name] NVARCHAR(255) NOT NULL,
40
- [command] NVARCHAR(255) NOT NULL,
41
- [args] NVARCHAR(MAX) NOT NULL,
42
- [env] NVARCHAR(MAX) NULL,
43
- [isActive] BIT NOT NULL DEFAULT 1,
44
- [createdAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
45
- [updatedAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
46
- );
47
- END
34
+ await db.$executeRawUnsafe(`
35
+ IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'mcp_servers')
36
+ BEGIN
37
+ CREATE TABLE [mcp_servers] (
38
+ [id] NVARCHAR(255) NOT NULL PRIMARY KEY,
39
+ [name] NVARCHAR(255) NOT NULL,
40
+ [command] NVARCHAR(255) NOT NULL,
41
+ [args] NVARCHAR(MAX) NOT NULL,
42
+ [env] NVARCHAR(MAX) NULL,
43
+ [isActive] BIT NOT NULL DEFAULT 1,
44
+ [createdAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
45
+ [updatedAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
46
+ );
47
+ END
48
48
  `);
49
49
  console.log("✅ Verified mcp_servers table exists or created.");
50
50
  // Ensure pipeline_packages table exists
51
- await db.$executeRawUnsafe(`
52
- IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_packages')
53
- BEGIN
54
- CREATE TABLE [pipeline_packages] (
55
- [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
56
- [name] NVARCHAR(255) NOT NULL UNIQUE,
57
- [description] NVARCHAR(MAX) NULL,
58
- [definition] NVARCHAR(MAX) NOT NULL,
59
- [generatedSql] NVARCHAR(MAX) NULL,
60
- [lastRunAt] DATETIME2 NULL,
61
- [lastStatus] NVARCHAR(50) NOT NULL DEFAULT 'idle',
62
- [createdAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
63
- [updatedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME()
64
- );
65
- END
51
+ await db.$executeRawUnsafe(`
52
+ IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_packages')
53
+ BEGIN
54
+ CREATE TABLE [pipeline_packages] (
55
+ [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
56
+ [name] NVARCHAR(255) NOT NULL UNIQUE,
57
+ [description] NVARCHAR(MAX) NULL,
58
+ [definition] NVARCHAR(MAX) NOT NULL,
59
+ [generatedSql] NVARCHAR(MAX) NULL,
60
+ [lastRunAt] DATETIME2 NULL,
61
+ [lastStatus] NVARCHAR(50) NOT NULL DEFAULT 'idle',
62
+ [createdAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
63
+ [updatedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME()
64
+ );
65
+ END
66
66
  `);
67
67
  console.log("✅ Verified pipeline_packages table exists or created.");
68
68
  // Ensure pipeline_execution_logs table exists
69
- await db.$executeRawUnsafe(`
70
- IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_execution_logs')
71
- BEGIN
72
- CREATE TABLE [pipeline_execution_logs] (
73
- [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
74
- [packageId] UNIQUEIDENTIFIER NOT NULL,
75
- [packageName] NVARCHAR(255) NOT NULL,
76
- [status] NVARCHAR(50) NOT NULL DEFAULT 'running',
77
- [rowsAffected] INT NULL,
78
- [durationMs] INT NULL,
79
- [errorMessage] NVARCHAR(MAX) NULL,
80
- [executedSql] NVARCHAR(MAX) NULL,
81
- [connectionId] NVARCHAR(255) NULL,
82
- [startedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
83
- [finishedAt] DATETIME2 NULL
84
- );
85
- CREATE INDEX [idx_ssis_exec_logs_packageId] ON [pipeline_execution_logs] ([packageId]);
86
- CREATE INDEX [idx_ssis_exec_logs_startedAt] ON [pipeline_execution_logs] ([startedAt] DESC);
87
- END
69
+ await db.$executeRawUnsafe(`
70
+ IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_execution_logs')
71
+ BEGIN
72
+ CREATE TABLE [pipeline_execution_logs] (
73
+ [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
74
+ [packageId] UNIQUEIDENTIFIER NOT NULL,
75
+ [packageName] NVARCHAR(255) NOT NULL,
76
+ [status] NVARCHAR(50) NOT NULL DEFAULT 'running',
77
+ [rowsAffected] INT NULL,
78
+ [durationMs] INT NULL,
79
+ [errorMessage] NVARCHAR(MAX) NULL,
80
+ [executedSql] NVARCHAR(MAX) NULL,
81
+ [connectionId] NVARCHAR(255) NULL,
82
+ [startedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
83
+ [finishedAt] DATETIME2 NULL
84
+ );
85
+ CREATE INDEX [idx_ssis_exec_logs_packageId] ON [pipeline_execution_logs] ([packageId]);
86
+ CREATE INDEX [idx_ssis_exec_logs_startedAt] ON [pipeline_execution_logs] ([startedAt] DESC);
87
+ END
88
88
  `);
89
89
  console.log("✅ Verified pipeline_execution_logs table exists or created.");
90
90
  }
@@ -253,60 +253,60 @@ async function runFallbackAn5Seed(config) {
253
253
  try {
254
254
  await pool.connect();
255
255
  // Ensure mcp_servers table exists in fallback seeder
256
- await pool.request().query(`
257
- IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'mcp_servers')
258
- BEGIN
259
- CREATE TABLE [mcp_servers] (
260
- [id] NVARCHAR(255) NOT NULL PRIMARY KEY,
261
- [name] NVARCHAR(255) NOT NULL,
262
- [command] NVARCHAR(255) NOT NULL,
263
- [args] NVARCHAR(MAX) NOT NULL,
264
- [env] NVARCHAR(MAX) NULL,
265
- [isActive] BIT NOT NULL DEFAULT 1,
266
- [createdAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
267
- [updatedAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
268
- );
269
- END
256
+ await pool.request().query(`
257
+ IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'mcp_servers')
258
+ BEGIN
259
+ CREATE TABLE [mcp_servers] (
260
+ [id] NVARCHAR(255) NOT NULL PRIMARY KEY,
261
+ [name] NVARCHAR(255) NOT NULL,
262
+ [command] NVARCHAR(255) NOT NULL,
263
+ [args] NVARCHAR(MAX) NOT NULL,
264
+ [env] NVARCHAR(MAX) NULL,
265
+ [isActive] BIT NOT NULL DEFAULT 1,
266
+ [createdAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP,
267
+ [updatedAt] DATETIME2 NOT NULL DEFAULT CURRENT_TIMESTAMP
268
+ );
269
+ END
270
270
  `);
271
271
  console.log("✅ Fallback: Verified mcp_servers table exists or created.");
272
272
  // Ensure pipeline_packages table exists in fallback seeder
273
- await pool.request().query(`
274
- IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_packages')
275
- BEGIN
276
- CREATE TABLE [pipeline_packages] (
277
- [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
278
- [name] NVARCHAR(255) NOT NULL UNIQUE,
279
- [description] NVARCHAR(MAX) NULL,
280
- [definition] NVARCHAR(MAX) NOT NULL,
281
- [generatedSql] NVARCHAR(MAX) NULL,
282
- [lastRunAt] DATETIME2 NULL,
283
- [lastStatus] NVARCHAR(50) NOT NULL DEFAULT 'idle',
284
- [createdAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
285
- [updatedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME()
286
- );
287
- END
273
+ await pool.request().query(`
274
+ IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_packages')
275
+ BEGIN
276
+ CREATE TABLE [pipeline_packages] (
277
+ [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
278
+ [name] NVARCHAR(255) NOT NULL UNIQUE,
279
+ [description] NVARCHAR(MAX) NULL,
280
+ [definition] NVARCHAR(MAX) NOT NULL,
281
+ [generatedSql] NVARCHAR(MAX) NULL,
282
+ [lastRunAt] DATETIME2 NULL,
283
+ [lastStatus] NVARCHAR(50) NOT NULL DEFAULT 'idle',
284
+ [createdAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
285
+ [updatedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME()
286
+ );
287
+ END
288
288
  `);
289
289
  console.log("✅ Fallback: Verified pipeline_packages table exists or created.");
290
290
  // Ensure pipeline_execution_logs table exists in fallback seeder
291
- await pool.request().query(`
292
- IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_execution_logs')
293
- BEGIN
294
- CREATE TABLE [pipeline_execution_logs] (
295
- [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
296
- [packageId] UNIQUEIDENTIFIER NOT NULL,
297
- [packageName] NVARCHAR(255) NOT NULL,
298
- [status] NVARCHAR(50) NOT NULL DEFAULT 'running',
299
- [rowsAffected] INT NULL,
300
- [durationMs] INT NULL,
301
- [errorMessage] NVARCHAR(MAX) NULL,
302
- [executedSql] NVARCHAR(MAX) NULL,
303
- [connectionId] NVARCHAR(255) NULL,
304
- [startedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
305
- [finishedAt] DATETIME2 NULL
306
- );
307
- CREATE INDEX [idx_ssis_exec_logs_packageId] ON [pipeline_execution_logs] ([packageId]);
308
- CREATE INDEX [idx_ssis_exec_logs_startedAt] ON [pipeline_execution_logs] ([startedAt] DESC);
309
- END
291
+ await pool.request().query(`
292
+ IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'pipeline_execution_logs')
293
+ BEGIN
294
+ CREATE TABLE [pipeline_execution_logs] (
295
+ [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
296
+ [packageId] UNIQUEIDENTIFIER NOT NULL,
297
+ [packageName] NVARCHAR(255) NOT NULL,
298
+ [status] NVARCHAR(50) NOT NULL DEFAULT 'running',
299
+ [rowsAffected] INT NULL,
300
+ [durationMs] INT NULL,
301
+ [errorMessage] NVARCHAR(MAX) NULL,
302
+ [executedSql] NVARCHAR(MAX) NULL,
303
+ [connectionId] NVARCHAR(255) NULL,
304
+ [startedAt] DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
305
+ [finishedAt] DATETIME2 NULL
306
+ );
307
+ CREATE INDEX [idx_ssis_exec_logs_packageId] ON [pipeline_execution_logs] ([packageId]);
308
+ CREATE INDEX [idx_ssis_exec_logs_startedAt] ON [pipeline_execution_logs] ([startedAt] DESC);
309
+ END
310
310
  `);
311
311
  console.log("✅ Fallback: Verified pipeline_execution_logs table exists or created.");
312
312
  // Seed providers
@@ -323,15 +323,15 @@ async function runFallbackAn5Seed(config) {
323
323
  req.input('isDefault', sql.Bit, provider.isDefault ? 1 : 0);
324
324
  req.input('description', sql.NVarChar(sql.MAX), provider.description ?? null);
325
325
  req.input('dimensions', sql.Int, provider.dimensions ?? null);
326
- const upsertSql = `
327
- IF EXISTS (SELECT 1 FROM llm_providers WHERE name = @name)
328
- BEGIN
329
- UPDATE llm_providers SET provider=@provider, model=@model, modelType=@modelType, apiKey=@apiKey, apiEndpoint=@apiEndpoint, supportsVision=@supportsVision, isActive=@isActive, isDefault=@isDefault, description=@description, dimensions=@dimensions WHERE name=@name;
330
- END
331
- ELSE
332
- BEGIN
333
- INSERT INTO llm_providers (name, provider, model, modelType, apiKey, apiEndpoint, supportsVision, isActive, isDefault, description, dimensions)
334
- VALUES (@name,@provider,@model,@modelType,@apiKey,@apiEndpoint,@supportsVision,@isActive,@isDefault,@description,@dimensions);
326
+ const upsertSql = `
327
+ IF EXISTS (SELECT 1 FROM llm_providers WHERE name = @name)
328
+ BEGIN
329
+ UPDATE llm_providers SET provider=@provider, model=@model, modelType=@modelType, apiKey=@apiKey, apiEndpoint=@apiEndpoint, supportsVision=@supportsVision, isActive=@isActive, isDefault=@isDefault, description=@description, dimensions=@dimensions WHERE name=@name;
330
+ END
331
+ ELSE
332
+ BEGIN
333
+ INSERT INTO llm_providers (name, provider, model, modelType, apiKey, apiEndpoint, supportsVision, isActive, isDefault, description, dimensions)
334
+ VALUES (@name,@provider,@model,@modelType,@apiKey,@apiEndpoint,@supportsVision,@isActive,@isDefault,@description,@dimensions);
335
335
  END`;
336
336
  await req.query(upsertSql);
337
337
  console.log(`✅ Fallback Created/Updated provider: ${provider.name}`);
@@ -342,15 +342,15 @@ END`;
342
342
  const reqUser = pool.request();
343
343
  reqUser.input('email', sql.NVarChar(sql.MAX), adminEmail);
344
344
  reqUser.input('password', sql.NVarChar(sql.MAX), hashedPassword);
345
- const userSql = `
346
- IF EXISTS (SELECT 1 FROM users WHERE email = @email)
347
- BEGIN
348
- UPDATE users SET password=@password, type='admin', name='Admin', isActive=1, updatedAt=SYSDATETIME() WHERE email=@email;
349
- END
350
- ELSE
351
- BEGIN
352
- INSERT INTO users (id, email, password, type, name, isActive, createdAt, updatedAt)
353
- VALUES (NEWID(), @email, @password, 'admin', 'Admin', 1, SYSDATETIME(), SYSDATETIME());
345
+ const userSql = `
346
+ IF EXISTS (SELECT 1 FROM users WHERE email = @email)
347
+ BEGIN
348
+ UPDATE users SET password=@password, type='admin', name='Admin', isActive=1, updatedAt=SYSDATETIME() WHERE email=@email;
349
+ END
350
+ ELSE
351
+ BEGIN
352
+ INSERT INTO users (id, email, password, type, name, isActive, createdAt, updatedAt)
353
+ VALUES (NEWID(), @email, @password, 'admin', 'Admin', 1, SYSDATETIME(), SYSDATETIME());
354
354
  END`;
355
355
  await reqUser.query(userSql);
356
356
  // Get admin id
@@ -373,15 +373,15 @@ END`;
373
373
  r.input('username', sql.NVarChar(sql.MAX), conn.username);
374
374
  r.input('password', sql.NVarChar(sql.MAX), conn.password);
375
375
  r.input('type', sql.NVarChar(sql.MAX), conn.type);
376
- const upsertConn = `
377
- IF EXISTS (SELECT 1 FROM database_connections WHERE name = @name)
378
- BEGIN
379
- UPDATE database_connections SET host=@host, database=@database, username=@username, password=@password, type=@type, isActive=1 WHERE name=@name;
380
- END
381
- ELSE
382
- BEGIN
383
- INSERT INTO database_connections (id, name, host, port, database, username, password, type, isActive, createdAt, updatedAt)
384
- VALUES (NEWID(), @name, @host, 1433, @database, @username, @password, @type, 1, SYSDATETIME(), SYSDATETIME());
376
+ const upsertConn = `
377
+ IF EXISTS (SELECT 1 FROM database_connections WHERE name = @name)
378
+ BEGIN
379
+ UPDATE database_connections SET host=@host, database=@database, username=@username, password=@password, type=@type, isActive=1 WHERE name=@name;
380
+ END
381
+ ELSE
382
+ BEGIN
383
+ INSERT INTO database_connections (id, name, host, port, database, username, password, type, isActive, createdAt, updatedAt)
384
+ VALUES (NEWID(), @name, @host, 1433, @database, @username, @password, @type, 1, SYSDATETIME(), SYSDATETIME());
385
385
  END`;
386
386
  await r.query(upsertConn);
387
387
  console.log(`✅ Fallback Created/Updated connection: ${conn.name}`);