orasql-gen 0.1.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.
Files changed (72) hide show
  1. package/.orasql.example +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +320 -0
  4. package/dist/commands/gen.d.ts +3 -0
  5. package/dist/commands/gen.d.ts.map +1 -0
  6. package/dist/commands/gen.js +281 -0
  7. package/dist/commands/gen.js.map +1 -0
  8. package/dist/commands/history.d.ts +3 -0
  9. package/dist/commands/history.d.ts.map +1 -0
  10. package/dist/commands/history.js +65 -0
  11. package/dist/commands/history.js.map +1 -0
  12. package/dist/commands/inspect.d.ts +3 -0
  13. package/dist/commands/inspect.d.ts.map +1 -0
  14. package/dist/commands/inspect.js +80 -0
  15. package/dist/commands/inspect.js.map +1 -0
  16. package/dist/commands/profile.d.ts +3 -0
  17. package/dist/commands/profile.d.ts.map +1 -0
  18. package/dist/commands/profile.js +86 -0
  19. package/dist/commands/profile.js.map +1 -0
  20. package/dist/commands/schemas.d.ts +3 -0
  21. package/dist/commands/schemas.d.ts.map +1 -0
  22. package/dist/commands/schemas.js +62 -0
  23. package/dist/commands/schemas.js.map +1 -0
  24. package/dist/core/connection.d.ts +6 -0
  25. package/dist/core/connection.d.ts.map +1 -0
  26. package/dist/core/connection.js +54 -0
  27. package/dist/core/connection.js.map +1 -0
  28. package/dist/core/inspector.d.ts +27 -0
  29. package/dist/core/inspector.d.ts.map +1 -0
  30. package/dist/core/inspector.js +135 -0
  31. package/dist/core/inspector.js.map +1 -0
  32. package/dist/generators/insert.d.ts +3 -0
  33. package/dist/generators/insert.d.ts.map +1 -0
  34. package/dist/generators/insert.js +51 -0
  35. package/dist/generators/insert.js.map +1 -0
  36. package/dist/generators/interactive.d.ts +3 -0
  37. package/dist/generators/interactive.d.ts.map +1 -0
  38. package/dist/generators/interactive.js +118 -0
  39. package/dist/generators/interactive.js.map +1 -0
  40. package/dist/generators/select.d.ts +3 -0
  41. package/dist/generators/select.d.ts.map +1 -0
  42. package/dist/generators/select.js +63 -0
  43. package/dist/generators/select.js.map +1 -0
  44. package/dist/generators/update.d.ts +3 -0
  45. package/dist/generators/update.d.ts.map +1 -0
  46. package/dist/generators/update.js +39 -0
  47. package/dist/generators/update.js.map +1 -0
  48. package/dist/index.d.ts +3 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +22 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/utils/clipboard.d.ts +2 -0
  53. package/dist/utils/clipboard.d.ts.map +1 -0
  54. package/dist/utils/clipboard.js +13 -0
  55. package/dist/utils/clipboard.js.map +1 -0
  56. package/dist/utils/config.d.ts +12 -0
  57. package/dist/utils/config.d.ts.map +1 -0
  58. package/dist/utils/config.js +42 -0
  59. package/dist/utils/config.js.map +1 -0
  60. package/dist/utils/history.d.ts +11 -0
  61. package/dist/utils/history.d.ts.map +1 -0
  62. package/dist/utils/history.js +51 -0
  63. package/dist/utils/history.js.map +1 -0
  64. package/dist/utils/profiles.d.ts +11 -0
  65. package/dist/utils/profiles.d.ts.map +1 -0
  66. package/dist/utils/profiles.js +47 -0
  67. package/dist/utils/profiles.js.map +1 -0
  68. package/dist/utils/topology.d.ts +8 -0
  69. package/dist/utils/topology.d.ts.map +1 -0
  70. package/dist/utils/topology.js +63 -0
  71. package/dist/utils/topology.js.map +1 -0
  72. package/package.json +61 -0
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateInsert = generateInsert;
4
+ const DATE_TYPES = new Set(['DATE', 'TIMESTAMP', 'TIMESTAMP WITH TIME ZONE', 'TIMESTAMP WITH LOCAL TIME ZONE']);
5
+ const NUMBER_TYPES = new Set(['NUMBER', 'INTEGER', 'FLOAT', 'BINARY_FLOAT', 'BINARY_DOUBLE']);
6
+ function generateInsert(table) {
7
+ const columns = table.columns.map((c) => c.name).join(',\n ');
8
+ const values = table.columns.map((c) => resolveValue(c)).join(',\n ');
9
+ return (`-- INSERT generado para ${table.schema}.${table.name}\n` +
10
+ `INSERT INTO ${table.schema}.${table.name} (\n` +
11
+ ` ${columns}\n` +
12
+ `) VALUES (\n` +
13
+ ` ${values}\n` +
14
+ `);\n`);
15
+ }
16
+ function resolveValue(col) {
17
+ // PK con secuencia → SEQ.NEXTVAL
18
+ if (col.isPrimaryKey && col.sequence) {
19
+ return `${col.sequence}.NEXTVAL -- PK`;
20
+ }
21
+ // FK → placeholder con referencia
22
+ if (col.isForeignKey) {
23
+ return `/* :${col.name} — FK → ${col.referencedTable}.${col.referencedColumn} */`;
24
+ }
25
+ // Valor por defecto del schema (ej. SYSDATE, 1, 'ACTIVO')
26
+ if (col.dataDefault) {
27
+ const def = col.dataDefault.trim().toUpperCase();
28
+ // Si el default ya es SYSDATE o similar, usarlo directamente
29
+ if (def === 'SYSDATE' || def.startsWith('SYSTIMESTAMP')) {
30
+ return `${col.dataDefault.trim()} -- default`;
31
+ }
32
+ // Otros defaults como números o strings
33
+ return `${col.dataDefault.trim()} -- default`;
34
+ }
35
+ // Columnas de fecha sin default → SYSDATE
36
+ if (DATE_TYPES.has(col.dataType)) {
37
+ return col.nullable ? `NULL -- fecha opcional` : `SYSDATE -- completar`;
38
+ }
39
+ // Nullable → NULL
40
+ if (col.nullable) {
41
+ return `NULL`;
42
+ }
43
+ // Número requerido
44
+ if (NUMBER_TYPES.has(col.dataType)) {
45
+ return `/* :${col.name} (${col.dataType}) */`;
46
+ }
47
+ // String requerido → placeholder con tipo y longitud
48
+ const lengthHint = col.dataLength ? `max ${col.dataLength}` : '';
49
+ return `/* ':${col.name}' (${col.dataType}${lengthHint ? ` ${lengthHint}` : ''}) */`;
50
+ }
51
+ //# sourceMappingURL=insert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert.js","sourceRoot":"","sources":["../../src/generators/insert.ts"],"names":[],"mappings":";;;AAEA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,0BAA0B,EAAE,gCAAgC,CAAC,CAAC,CAAC;AAChH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;AAE9F,wBAA+B,KAAgB;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEvE,OAAO,CACL,2BAA2B,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI;QACzD,eAAe,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,MAAM;QAC/C,KAAK,OAAO,IAAI;QAChB,cAAc;QACd,KAAK,MAAM,IAAI;QACf,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,GAAe;IACnC,iCAAiC;IACjC,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,GAAG,GAAG,CAAC,QAAQ,iBAAiB,CAAC;IAC1C,CAAC;IAED,kCAAkC;IAClC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACrB,OAAO,OAAO,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,gBAAgB,KAAK,CAAC;IACpF,CAAC;IAED,0DAA0D;IAC1D,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjD,6DAA6D;QAC7D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACxD,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC;QACjD,CAAC;QACD,wCAAwC;QACxC,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC;IACjD,CAAC;IAED,0CAA0C;IAC1C,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAC5E,CAAC;IAED,kBAAkB;IAClB,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,mBAAmB;IACnB,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,QAAQ,MAAM,CAAC;IAChD,CAAC;IAED,qDAAqD;IACrD,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,OAAO,QAAQ,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;AACvF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TableInfo } from '../core/inspector';
2
+ export declare function generateInsertInteractive(table: TableInfo): Promise<string>;
3
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/generators/interactive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAK1D,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CA2CjF"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generateInsertInteractive = generateInsertInteractive;
40
+ const readline = __importStar(require("readline"));
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const DATE_TYPES = new Set(['DATE', 'TIMESTAMP', 'TIMESTAMP WITH TIME ZONE', 'TIMESTAMP WITH LOCAL TIME ZONE']);
43
+ const NUMBER_TYPES = new Set(['NUMBER', 'INTEGER', 'FLOAT', 'BINARY_FLOAT', 'BINARY_DOUBLE']);
44
+ async function generateInsertInteractive(table) {
45
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
46
+ const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
47
+ console.log(chalk_1.default.bold.cyan(`\nModo interactivo — ${table.schema}.${table.name}`));
48
+ console.log(chalk_1.default.gray('Presiona Enter para aceptar el valor por defecto entre [ ]\n'));
49
+ const values = [];
50
+ const columnNames = table.columns.map((c) => c.name);
51
+ for (const col of table.columns) {
52
+ const defaultValue = getDefaultValue(col);
53
+ const typeHint = formatTypeHint(col);
54
+ const flagHint = buildFlagHint(col);
55
+ // Columnas automáticas no necesitan input
56
+ if (isAutomatic(col)) {
57
+ console.log(` ${chalk_1.default.gray(col.name.padEnd(25))} ${chalk_1.default.magenta(defaultValue)} ${chalk_1.default.gray('(automático)')}`);
58
+ values.push(defaultValue);
59
+ continue;
60
+ }
61
+ const prompt = ` ${chalk_1.default.white(col.name.padEnd(25))} ${chalk_1.default.gray(typeHint)} ${flagHint} [${chalk_1.default.yellow(defaultValue)}]: `;
62
+ const input = (await ask(prompt)).trim();
63
+ const finalValue = input === '' ? defaultValue : formatInput(input, col);
64
+ values.push(finalValue);
65
+ }
66
+ rl.close();
67
+ // Construir el INSERT con los valores ingresados
68
+ const columns = columnNames.join(',\n ');
69
+ const vals = values.join(',\n ');
70
+ return (`-- INSERT interactivo para ${table.schema}.${table.name}\n` +
71
+ `INSERT INTO ${table.schema}.${table.name} (\n` +
72
+ ` ${columns}\n` +
73
+ `) VALUES (\n` +
74
+ ` ${vals}\n` +
75
+ `);\n`);
76
+ }
77
+ function isAutomatic(col) {
78
+ return (col.isPrimaryKey && !!col.sequence) ||
79
+ (!!col.dataDefault && col.dataDefault.trim().toUpperCase().startsWith('SYS'));
80
+ }
81
+ function getDefaultValue(col) {
82
+ if (col.isPrimaryKey && col.sequence)
83
+ return `${col.sequence}.NEXTVAL`;
84
+ if (col.dataDefault)
85
+ return col.dataDefault.trim();
86
+ if (DATE_TYPES.has(col.dataType))
87
+ return col.nullable ? 'NULL' : 'SYSDATE';
88
+ if (col.nullable)
89
+ return 'NULL';
90
+ return '';
91
+ }
92
+ function formatTypeHint(col) {
93
+ if (col.dataType === 'NUMBER' && col.dataPrecision)
94
+ return `(NUMBER)`;
95
+ if (['VARCHAR2', 'CHAR'].includes(col.dataType))
96
+ return `(VARCHAR2)`;
97
+ return `(${col.dataType})`;
98
+ }
99
+ function buildFlagHint(col) {
100
+ const flags = [];
101
+ if (col.isForeignKey)
102
+ flags.push(chalk_1.default.blue(`FK→${col.referencedTable}`));
103
+ if (!col.nullable)
104
+ flags.push(chalk_1.default.red('requerido'));
105
+ return flags.join(' ');
106
+ }
107
+ function formatInput(input, col) {
108
+ if (input.toUpperCase() === 'NULL')
109
+ return 'NULL';
110
+ if (input.toUpperCase() === 'SYSDATE')
111
+ return 'SYSDATE';
112
+ // Si es número, no agregar comillas
113
+ if (NUMBER_TYPES.has(col.dataType) && !isNaN(Number(input)))
114
+ return input;
115
+ // Strings → agregar comillas simples
116
+ return `'${input.replace(/'/g, "''")}'`;
117
+ }
118
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/generators/interactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TableInfo } from '../core/inspector';
2
+ export declare function generateSelect(table: TableInfo, relatedTables?: TableInfo[]): string;
3
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/generators/select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,GAAE,SAAS,EAAO,GAAG,MAAM,CAkDxF"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSelect = generateSelect;
4
+ function generateSelect(table, relatedTables = []) {
5
+ const allTables = [table, ...relatedTables];
6
+ const alias = buildAliasMap(allTables);
7
+ const mainAlias = alias.get(table.name);
8
+ // Columnas: tabla principal + relacionadas
9
+ const columns = [];
10
+ for (const t of allTables) {
11
+ const a = alias.get(t.name);
12
+ for (const col of t.columns) {
13
+ columns.push(` ${a}.${col.name}`);
14
+ }
15
+ }
16
+ // JOINs: cada tabla relacionada se agrega con JOIN.
17
+ // La condición se determina por la FK que esa tabla tenga hacia alguna tabla del conjunto.
18
+ const joins = [];
19
+ for (const relTable of relatedTables) {
20
+ const relAlias = alias.get(relTable.name);
21
+ // Buscar FK en la tabla relacionada que apunte a alguna tabla del conjunto
22
+ const fkCol = relTable.columns.find((c) => c.isForeignKey && c.referencedTable && alias.has(c.referencedTable));
23
+ if (fkCol && fkCol.referencedTable && fkCol.referencedColumn) {
24
+ const refAlias = alias.get(fkCol.referencedTable);
25
+ joins.push(`JOIN ${relTable.schema}.${relTable.name} ${relAlias} ON ${relAlias}.${fkCol.name} = ${refAlias}.${fkCol.referencedColumn}`);
26
+ }
27
+ else {
28
+ // Sin FK detectada, agregar JOIN con placeholder
29
+ joins.push(`JOIN ${relTable.schema}.${relTable.name} ${relAlias} ON /* condición de join */`);
30
+ }
31
+ }
32
+ // WHERE por PK de la tabla principal
33
+ const pkCol = table.columns.find((c) => c.isPrimaryKey);
34
+ const whereClause = pkCol
35
+ ? `WHERE ${mainAlias}.${pkCol.name} = /* :${pkCol.name} */`
36
+ : `/* agregar filtros */`;
37
+ let sql = `-- SELECT generado para ${table.schema}.${table.name}\n`;
38
+ sql += `SELECT\n${columns.join(',\n')}\n`;
39
+ sql += `FROM ${table.schema}.${table.name} ${mainAlias}\n`;
40
+ if (joins.length > 0)
41
+ sql += joins.join('\n') + '\n';
42
+ sql += `${whereClause};\n`;
43
+ return sql;
44
+ }
45
+ function buildAliasMap(tables) {
46
+ const map = new Map();
47
+ const used = new Set();
48
+ for (const t of tables) {
49
+ // Usar primeras letras del nombre como alias (ej: USUARIO_ROL → UR)
50
+ const parts = t.name.split('_');
51
+ let alias = parts.map((p) => p[0]).join('').toLowerCase();
52
+ // Si el alias ya está en uso, agregar número
53
+ let candidate = alias;
54
+ let i = 2;
55
+ while (used.has(candidate)) {
56
+ candidate = alias + i++;
57
+ }
58
+ map.set(t.name, candidate);
59
+ used.add(candidate);
60
+ }
61
+ return map;
62
+ }
63
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/generators/select.ts"],"names":[],"mappings":";;;AAEA,wBAA+B,KAAgB,EAAE,aAAa,GAAgB,EAAE;IAC9E,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,GAAG,aAAa,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;IAEzC,2CAA2C;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,2FAA2F;IAC3F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAE,CAAC;QAE3C,2EAA2E;QAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAC3E,CAAC;QAEF,IAAI,KAAK,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CACR,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,OAAO,QAAQ,IAAI,KAAK,CAAC,IAAI,MAAM,QAAQ,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAC5H,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,KAAK,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,6BAA6B,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,KAAK;QACvB,CAAC,CAAC,SAAS,SAAS,IAAI,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,IAAI,KAAK;QAC3D,CAAC,CAAC,uBAAuB,CAAC;IAE5B,IAAI,GAAG,GAAG,2BAA2B,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC;IACpE,GAAG,IAAI,WAAW,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1C,GAAG,IAAI,QAAQ,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,SAAS,IAAI,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,GAAG,IAAI,GAAG,WAAW,KAAK,CAAC;IAE3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,MAAmB;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,oEAAoE;QACpE,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAE1D,6CAA6C;QAC7C,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,SAAS,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1B,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TableInfo } from '../core/inspector';
2
+ export declare function generateUpdate(table: TableInfo): string;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/generators/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAI1D,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAuBvD"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateUpdate = generateUpdate;
4
+ const DATE_TYPES = new Set(['DATE', 'TIMESTAMP', 'TIMESTAMP WITH TIME ZONE', 'TIMESTAMP WITH LOCAL TIME ZONE']);
5
+ function generateUpdate(table) {
6
+ const pkCols = table.columns.filter((c) => c.isPrimaryKey);
7
+ const updatableCols = table.columns.filter((c) => !c.isPrimaryKey);
8
+ if (updatableCols.length === 0) {
9
+ return `-- ADVERTENCIA: ${table.name} solo tiene columnas PK, no se puede generar UPDATE.\n`;
10
+ }
11
+ const setClauses = updatableCols
12
+ .map((c) => ` ${c.name} = ${resolveUpdateValue(c)}`)
13
+ .join(',\n');
14
+ const whereClauses = pkCols.length > 0
15
+ ? pkCols.map((c) => `${c.name} = /* :${c.name} */`).join('\n AND ')
16
+ : '/* agregar condicion WHERE */';
17
+ return (`-- UPDATE generado para ${table.schema}.${table.name}\n` +
18
+ `UPDATE ${table.schema}.${table.name}\n` +
19
+ `SET\n${setClauses}\n` +
20
+ `WHERE ${whereClauses};\n`);
21
+ }
22
+ function resolveUpdateValue(col) {
23
+ if (col.isForeignKey) {
24
+ return `/* :${col.name} — FK → ${col.referencedTable}.${col.referencedColumn} */`;
25
+ }
26
+ if (col.dataDefault) {
27
+ const def = col.dataDefault.trim().toUpperCase();
28
+ if (def === 'SYSDATE' || def.startsWith('SYSTIMESTAMP')) {
29
+ return `${col.dataDefault.trim()} -- default`;
30
+ }
31
+ }
32
+ if (DATE_TYPES.has(col.dataType)) {
33
+ return col.nullable ? `NULL -- o SYSDATE` : `SYSDATE -- completar`;
34
+ }
35
+ if (col.nullable)
36
+ return `NULL -- o ':${col.name}'`;
37
+ return `/* ':${col.name}' */`;
38
+ }
39
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/generators/update.ts"],"names":[],"mappings":";;;AAEA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,0BAA0B,EAAE,gCAAgC,CAAC,CAAC,CAAC;AAEhH,wBAA+B,KAAgB;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAEnE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,mBAAmB,KAAK,CAAC,IAAI,wDAAwD,CAAC;IAC/F,CAAC;IAED,MAAM,UAAU,GAAG,aAAa;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,MAAM,YAAY,GAChB,MAAM,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QACpE,CAAC,CAAC,+BAA+B,CAAC;IAEtC,OAAO,CACL,2BAA2B,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI;QACzD,UAAU,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI;QACxC,QAAQ,UAAU,IAAI;QACtB,SAAS,YAAY,KAAK,CAC3B,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAe;IACzC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACrB,OAAO,OAAO,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,gBAAgB,KAAK,CAAC;IACpF,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACxD,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC;QACjD,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ;QAAE,OAAO,gBAAgB,GAAG,CAAC,IAAI,GAAG,CAAC;IACrD,OAAO,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC;AAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const inspect_1 = require("./commands/inspect");
6
+ const gen_1 = require("./commands/gen");
7
+ const schemas_1 = require("./commands/schemas");
8
+ const history_1 = require("./commands/history");
9
+ const profile_1 = require("./commands/profile");
10
+ const program = new commander_1.Command();
11
+ program
12
+ .name('orasql-gen')
13
+ .description('CLI para generar sentencias SQL automáticamente a partir de tablas Oracle')
14
+ .version('0.1.0');
15
+ // Registrar comandos
16
+ (0, inspect_1.registerInspect)(program);
17
+ (0, gen_1.registerGen)(program);
18
+ (0, schemas_1.registerSchemas)(program);
19
+ (0, history_1.registerHistory)(program);
20
+ (0, profile_1.registerProfile)(program);
21
+ program.parse(process.argv);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,gDAAqD;AACrD,wCAA6C;AAC7C,gDAAqD;AACrD,gDAAqD;AACrD,gDAAqD;AAErD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,2EAA2E,CAAC;KACxF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,qBAAqB;AACrB,IAAA,yBAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,iBAAW,EAAC,OAAO,CAAC,CAAC;AACrB,IAAA,yBAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,yBAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,yBAAe,EAAC,OAAO,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function copyToClipboard(text: string): void;
2
+ //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMlD"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.copyToClipboard = copyToClipboard;
4
+ const child_process_1 = require("child_process");
5
+ function copyToClipboard(text) {
6
+ try {
7
+ (0, child_process_1.execSync)('pbcopy', { input: text });
8
+ }
9
+ catch {
10
+ throw new Error('No se pudo copiar al portapapeles. Asegúrate de estar en macOS.');
11
+ }
12
+ }
13
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":";;;AAAA,iDAAyC;AAEzC,yBAAgC,IAAY;IAC1C,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface OraConfig {
2
+ host: string;
3
+ port: number;
4
+ sid?: string;
5
+ serviceName?: string;
6
+ user: string;
7
+ password: string;
8
+ schema: string;
9
+ instantClientDir?: string;
10
+ }
11
+ export declare function loadConfig(): OraConfig;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,wBAAgB,UAAU,IAAI,SAAS,CAqBtC"}
@@ -0,0 +1,42 @@
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.loadConfig = loadConfig;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const CONFIG_FILE = '.orasql';
10
+ function loadConfig() {
11
+ const configPath = path_1.default.resolve(process.cwd(), CONFIG_FILE);
12
+ if (!fs_1.default.existsSync(configPath)) {
13
+ throw new Error(`No se encontró el archivo de configuración "${CONFIG_FILE}".\n` +
14
+ `Copia ".orasql.example" a ".orasql" y completa tus credenciales.`);
15
+ }
16
+ try {
17
+ const raw = fs_1.default.readFileSync(configPath, 'utf-8');
18
+ const config = JSON.parse(raw);
19
+ validateConfig(config);
20
+ return config;
21
+ }
22
+ catch (err) {
23
+ if (err.message.includes('JSON')) {
24
+ throw new Error(`El archivo "${CONFIG_FILE}" tiene un formato JSON inválido.`);
25
+ }
26
+ throw err;
27
+ }
28
+ }
29
+ function validateConfig(config) {
30
+ const required = ['host', 'port', 'user', 'password', 'schema'];
31
+ // sid o serviceName: al menos uno es requerido
32
+ if (!config.sid && !config.serviceName) {
33
+ throw new Error('Debes especificar "sid" o "serviceName" en el archivo de configuración.');
34
+ }
35
+ // instantClientDir es opcional
36
+ for (const field of required) {
37
+ if (!config[field]) {
38
+ throw new Error(`Falta el campo requerido "${field}" en el archivo de configuración.`);
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAaxB,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B;IACE,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,+CAA+C,WAAW,MAAM;YAChE,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAc,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,eAAe,WAAW,mCAAmC,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAiB;IACvC,MAAM,QAAQ,GAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACrF,+CAA+C;IAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,+BAA+B;IAC/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,mCAAmC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface HistoryEntry {
2
+ id: number;
3
+ timestamp: string;
4
+ command: string;
5
+ table: string;
6
+ sql: string;
7
+ }
8
+ export declare function readHistory(): HistoryEntry[];
9
+ export declare function saveToHistory(command: string, table: string, sql: string): void;
10
+ export declare function clearHistory(): void;
11
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAMD,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAQ5C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAc/E;AAED,wBAAgB,YAAY,IAAI,IAAI,CAGnC"}
@@ -0,0 +1,51 @@
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.readHistory = readHistory;
7
+ exports.saveToHistory = saveToHistory;
8
+ exports.clearHistory = clearHistory;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const HISTORY_DIR = path_1.default.join(os_1.default.homedir(), '.orasql-gen');
13
+ const HISTORY_FILE = path_1.default.join(HISTORY_DIR, 'history.json');
14
+ const MAX_HISTORY = 100;
15
+ function ensureDir() {
16
+ if (!fs_1.default.existsSync(HISTORY_DIR))
17
+ fs_1.default.mkdirSync(HISTORY_DIR, { recursive: true });
18
+ }
19
+ function readHistory() {
20
+ ensureDir();
21
+ if (!fs_1.default.existsSync(HISTORY_FILE))
22
+ return [];
23
+ try {
24
+ return JSON.parse(fs_1.default.readFileSync(HISTORY_FILE, 'utf-8'));
25
+ }
26
+ catch {
27
+ return [];
28
+ }
29
+ }
30
+ function saveToHistory(command, table, sql) {
31
+ var _a;
32
+ var _b;
33
+ ensureDir();
34
+ const entries = readHistory();
35
+ const newEntry = {
36
+ id: ((_b = (_a = entries[entries.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : 0) + 1,
37
+ timestamp: new Date().toISOString(),
38
+ command,
39
+ table: table.toUpperCase(),
40
+ sql,
41
+ };
42
+ entries.push(newEntry);
43
+ // Mantener solo los últimos MAX_HISTORY
44
+ const trimmed = entries.slice(-MAX_HISTORY);
45
+ fs_1.default.writeFileSync(HISTORY_FILE, JSON.stringify(trimmed, null, 2), 'utf-8');
46
+ }
47
+ function clearHistory() {
48
+ ensureDir();
49
+ fs_1.default.writeFileSync(HISTORY_FILE, '[]', 'utf-8');
50
+ }
51
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":";;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3D,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAC5D,MAAM,WAAW,GAAG,GAAG,CAAC;AAUxB,SAAS,SAAS;IAChB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,YAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;IACE,SAAS,EAAE,CAAC;IACZ,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,uBAA8B,OAAe,EAAE,KAAa,EAAE,GAAW;;;IACvE,SAAS,EAAE,CAAC;IACZ,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAiB;QAC7B,EAAE,EAAE,OAAC,MAAA,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,EAAE,mCAAI,CAAC,CAAC,GAAG,CAAC;QAC9C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;QAC1B,GAAG;KACJ,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,wCAAwC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;IAC5C,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED;IACE,SAAS,EAAE,CAAC;IACZ,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { OraConfig } from './config';
2
+ export interface Profile {
3
+ name: string;
4
+ savedAt: string;
5
+ config: OraConfig;
6
+ }
7
+ export declare function readProfiles(): Profile[];
8
+ export declare function saveProfile(name: string, config: OraConfig): void;
9
+ export declare function getProfile(name: string): Profile | undefined;
10
+ export declare function deleteProfile(name: string): boolean;
11
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/utils/profiles.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;CACnB;AAMD,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAQxC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAKjE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMnD"}
@@ -0,0 +1,47 @@
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.readProfiles = readProfiles;
7
+ exports.saveProfile = saveProfile;
8
+ exports.getProfile = getProfile;
9
+ exports.deleteProfile = deleteProfile;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const os_1 = __importDefault(require("os"));
13
+ const PROFILES_DIR = path_1.default.join(os_1.default.homedir(), '.orasql-gen');
14
+ const PROFILES_FILE = path_1.default.join(PROFILES_DIR, 'profiles.json');
15
+ function ensureDir() {
16
+ if (!fs_1.default.existsSync(PROFILES_DIR))
17
+ fs_1.default.mkdirSync(PROFILES_DIR, { recursive: true });
18
+ }
19
+ function readProfiles() {
20
+ ensureDir();
21
+ if (!fs_1.default.existsSync(PROFILES_FILE))
22
+ return [];
23
+ try {
24
+ return JSON.parse(fs_1.default.readFileSync(PROFILES_FILE, 'utf-8'));
25
+ }
26
+ catch {
27
+ return [];
28
+ }
29
+ }
30
+ function saveProfile(name, config) {
31
+ ensureDir();
32
+ const profiles = readProfiles().filter((p) => p.name !== name);
33
+ profiles.push({ name, savedAt: new Date().toISOString(), config });
34
+ fs_1.default.writeFileSync(PROFILES_FILE, JSON.stringify(profiles, null, 2), 'utf-8');
35
+ }
36
+ function getProfile(name) {
37
+ return readProfiles().find((p) => p.name === name);
38
+ }
39
+ function deleteProfile(name) {
40
+ const profiles = readProfiles();
41
+ const filtered = profiles.filter((p) => p.name !== name);
42
+ if (filtered.length === profiles.length)
43
+ return false;
44
+ fs_1.default.writeFileSync(PROFILES_FILE, JSON.stringify(filtered, null, 2), 'utf-8');
45
+ return true;
46
+ }
47
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/utils/profiles.ts"],"names":[],"mappings":";;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAGpB,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC5D,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAQ/D,SAAS,SAAS;IAChB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,YAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpF,CAAC;AAED;IACE,SAAS,EAAE,CAAC;IACZ,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,qBAA4B,IAAY,EAAE,MAAiB;IACzD,SAAS,EAAE,CAAC;IACZ,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,YAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,oBAA2B,IAAY;IACrC,OAAO,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,uBAA8B,IAAY;IACxC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACtD,YAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { TableInfo } from '../core/inspector';
2
+ /**
3
+ * Ordena un conjunto de tablas respetando dependencias FK.
4
+ * Las tablas sin dependencias van primero; las que referencian a otras van después.
5
+ * Usa el algoritmo de Kahn (BFS topológico).
6
+ */
7
+ export declare function sortByDependencies(tables: TableInfo[]): TableInfo[];
8
+ //# sourceMappingURL=topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology.d.ts","sourceRoot":"","sources":["../../src/utils/topology.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAqDnE"}