@gzl10/osx-cli 4.0.4 → 4.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.
package/README.md CHANGED
@@ -51,8 +51,15 @@ osx extract TABLA --tns PROD_DB
51
51
  # Multiples tablas
52
52
  osx extract TABLA1,TABLA2,TABLA3 --tns PROD_DB
53
53
 
54
- # Guardar en archivo
55
- osx extract TABLA --tns PROD_DB -o output.json --pretty
54
+ # Wildcards: * (multiples caracteres), ? (un caracter)
55
+ osx extract "D21*" --tns PROD_DB -o --pretty
56
+ osx extract "A200?100" --tns PROD_DB -o
57
+
58
+ # Guardar en archivo (nombre auto: TABLA.json o extractYYYYMMDD.json)
59
+ osx extract TABLA --tns PROD_DB -o --pretty
60
+
61
+ # Guardar con nombre especifico
62
+ osx extract TABLA --tns PROD_DB -o output.json
56
63
 
57
64
  # Credenciales explicitas
58
65
  osx extract TABLA --tns PROD_DB -u USER -p PASS
@@ -64,6 +71,23 @@ osx extract TABLA --tns "servidor:1521/servicio" -u USER -p PASS
64
71
  osx extract TABLA --tns PROD_DB --schema OWNER_SCHEMA
65
72
  ```
66
73
 
74
+ ### Wildcards
75
+
76
+ Los wildcards permiten extraer multiples tablas con un patron:
77
+
78
+ - `*` - coincide con cualquier cantidad de caracteres
79
+ - `?` - coincide con un solo caracter
80
+
81
+ Cuando se usan wildcards, se aplica automaticamente un delay de 100ms entre tablas para no saturar la base de datos. Puedes ajustarlo con `-d`.
82
+
83
+ ```bash
84
+ # Todas las tablas que empiezan por D21
85
+ osx extract "D21*" --tns PROD_DB -o --pretty
86
+
87
+ # Con delay personalizado (500ms)
88
+ osx extract "D21*" --tns PROD_DB -o --pretty -d 500
89
+ ```
90
+
67
91
  ## Opciones
68
92
 
69
93
  | Opcion | Descripcion |
@@ -72,7 +96,7 @@ osx extract TABLA --tns PROD_DB --schema OWNER_SCHEMA
72
96
  | `-s, --schema` | Schema Oracle (default: mismo que usuario) |
73
97
  | `-u, --user` | Usuario (o env: OSX_USER, o ~/.env USER) |
74
98
  | `-p, --password` | Password (o env: OSX_PASSWORD, o ~/.env PWD) |
75
- | `-o, --output` | Fichero salida (default: stdout) |
99
+ | `-o, --output` | Fichero salida (sin nombre: auto, 1 tabla=TABLA.json, N tablas=extractYYYYMMDD.json) |
76
100
  | `--pretty` | JSON formateado |
77
101
  | `-d, --delay` | Delay entre tablas (ms) |
78
102
 
@@ -88,6 +88,16 @@ var TABLE_COMMENT = `
88
88
  WHERE owner = :schema AND table_name = :tableName
89
89
  `;
90
90
  var TABLE_COLUMNS = `
91
+ WITH PK_COLUMNS AS (
92
+ SELECT acc.COLUMN_NAME
93
+ FROM ALL_CONSTRAINTS ac
94
+ JOIN ALL_CONS_COLUMNS acc
95
+ ON ac.CONSTRAINT_NAME = acc.CONSTRAINT_NAME
96
+ AND ac.OWNER = acc.OWNER
97
+ WHERE ac.CONSTRAINT_TYPE = 'P'
98
+ AND ac.OWNER = :schema
99
+ AND ac.TABLE_NAME = :tableName
100
+ )
91
101
  SELECT
92
102
  COLS.COLUMN_NAME as "column_name",
93
103
  DESCRIP.COMMENTS as "comment",
@@ -96,28 +106,19 @@ var TABLE_COLUMNS = `
96
106
  COLS.DATA_PRECISION as "data_precision",
97
107
  COLS.NULLABLE as "nullable",
98
108
  CASE WHEN PK.COLUMN_NAME IS NOT NULL THEN 'Y' ELSE 'N' END AS "is_pk"
99
- FROM SYS.ALL_TAB_COLUMNS COLS
100
- JOIN SYS.ALL_COL_COMMENTS DESCRIP
109
+ FROM ALL_TAB_COLUMNS COLS
110
+ JOIN ALL_COL_COMMENTS DESCRIP
101
111
  ON DESCRIP.OWNER = COLS.OWNER
102
112
  AND DESCRIP.TABLE_NAME = COLS.TABLE_NAME
103
113
  AND DESCRIP.COLUMN_NAME = COLS.COLUMN_NAME
104
- LEFT JOIN (
105
- SELECT acc.COLUMN_NAME
106
- FROM ALL_CONSTRAINTS ac
107
- JOIN ALL_CONS_COLUMNS acc
108
- ON ac.OWNER = acc.OWNER
109
- AND ac.CONSTRAINT_NAME = acc.CONSTRAINT_NAME
110
- WHERE ac.CONSTRAINT_TYPE = 'P'
111
- AND ac.OWNER = :schema
112
- AND acc.TABLE_NAME = :tableName
113
- ) PK ON PK.COLUMN_NAME = COLS.COLUMN_NAME
114
+ LEFT JOIN PK_COLUMNS PK ON PK.COLUMN_NAME = COLS.COLUMN_NAME
114
115
  WHERE COLS.OWNER = :schema AND COLS.TABLE_NAME = :tableName
115
116
  ORDER BY COLS.COLUMN_ID
116
117
  `;
117
118
  var TABLE_CHILDREN = `
118
119
  SELECT DISTINCT ac_child.table_name AS "child_table"
119
- FROM all_constraints ac_parent
120
- JOIN all_constraints ac_child
120
+ FROM ALL_CONSTRAINTS ac_parent
121
+ JOIN ALL_CONSTRAINTS ac_child
121
122
  ON ac_parent.constraint_name = ac_child.r_constraint_name
122
123
  AND ac_parent.owner = ac_child.r_owner
123
124
  WHERE ac_parent.owner = :schema
@@ -126,16 +127,52 @@ var TABLE_CHILDREN = `
126
127
  AND ac_child.constraint_type = 'R'
127
128
  AND ac_child.status = 'ENABLED'
128
129
  `;
130
+ var TABLE_STATS = `
131
+ SELECT NUM_ROWS as "count", LAST_ANALYZED as "last_update"
132
+ FROM ALL_TABLES
133
+ WHERE OWNER = :schema AND TABLE_NAME = :tableName
134
+ `;
135
+ var ORACLE_IDENTIFIER_REGEX = /^[A-Z][A-Z0-9_#$]{0,127}$/i;
136
+ function validateOracleIdentifier(name, type) {
137
+ if (!ORACLE_IDENTIFIER_REGEX.test(name)) {
138
+ throw new Error(`Nombre de ${type} inv\xE1lido: ${name}`);
139
+ }
140
+ }
141
+ function buildExamplesQuery(schema, tableName, limit = 10) {
142
+ validateOracleIdentifier(schema, "schema");
143
+ validateOracleIdentifier(tableName, "tabla");
144
+ const safeLimit = Math.min(Math.max(1, limit), 100);
145
+ return `SELECT * FROM ${schema}.${tableName} FETCH FIRST ${safeLimit} ROWS ONLY`;
146
+ }
147
+ var LIST_TABLES = `
148
+ SELECT TABLE_NAME as "table_name"
149
+ FROM ALL_TABLES
150
+ WHERE OWNER = :schema
151
+ AND TABLE_NAME LIKE :pattern
152
+ ORDER BY TABLE_NAME
153
+ `;
129
154
 
130
155
  // src/services/SchemaExtractor.ts
131
156
  var SchemaExtractor = class {
132
157
  constructor(oracle) {
133
158
  this.oracle = oracle;
134
159
  }
160
+ /**
161
+ * Lista tablas que coinciden con un patrón
162
+ * Convierte wildcards: * → %, ? → _
163
+ */
164
+ async listTables(schema, pattern) {
165
+ const sqlPattern = pattern.replace(/\*/g, "%").replace(/\?/g, "_");
166
+ const rows = await this.oracle.query(LIST_TABLES, {
167
+ schema,
168
+ pattern: sqlPattern
169
+ });
170
+ return rows.map((r) => r.table_name);
171
+ }
135
172
  /**
136
173
  * Extrae el esquema completo de una tabla
137
174
  */
138
- async extractTable(schema, tableName) {
175
+ async extractTable(bbdd, schema, tableName) {
139
176
  const [commentRow] = await this.oracle.query(TABLE_COMMENT, {
140
177
  schema,
141
178
  tableName
@@ -148,21 +185,31 @@ var SchemaExtractor = class {
148
185
  schema,
149
186
  tableName
150
187
  });
188
+ const [statsRow] = await this.oracle.query(TABLE_STATS, {
189
+ schema,
190
+ tableName
191
+ });
192
+ const examplesQuery = buildExamplesQuery(schema, tableName, 10);
193
+ const examples = await this.oracle.query(examplesQuery, {});
151
194
  return {
195
+ bbdd,
152
196
  schema,
153
197
  name: tableName,
154
198
  comment: commentRow?.COMMENTS || "",
155
199
  columns,
156
- children: childrenRows.map((r) => r.child_table)
200
+ children: childrenRows.map((r) => r.child_table),
201
+ count: statsRow?.count ?? 0,
202
+ lastUpdate: statsRow?.last_update?.toISOString() ?? null,
203
+ examples
157
204
  };
158
205
  }
159
206
  /**
160
207
  * Extrae múltiples tablas con delay opcional entre ellas
161
208
  */
162
- async extractTables(schema, tableNames, delayMs = 0) {
209
+ async extractTables(bbdd, schema, tableNames, delayMs = 0) {
163
210
  const results = [];
164
211
  for (let i = 0; i < tableNames.length; i++) {
165
- const table = await this.extractTable(schema, tableNames[i]);
212
+ const table = await this.extractTable(bbdd, schema, tableNames[i]);
166
213
  results.push(table);
167
214
  if (delayMs > 0 && i < tableNames.length - 1) {
168
215
  await new Promise((r) => setTimeout(r, delayMs));
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  OracleService,
4
4
  SchemaExtractor
5
- } from "./chunk-AI3SXYL3.js";
5
+ } from "./chunk-XHMPD7KT.js";
6
6
 
7
7
  // src/cli.ts
8
8
  import { readFileSync as readFileSync2 } from "fs";
@@ -120,7 +120,6 @@ async function extractCommand(tables, options) {
120
120
  const homeEnv = loadHomeEnv();
121
121
  const user = options.user || process.env.OSX_USER || homeEnv.user;
122
122
  const password = options.password || process.env.OSX_PASSWORD || homeEnv.password;
123
- const schema = options.schema || user?.toUpperCase();
124
123
  if (!options.tns) {
125
124
  console.error(
126
125
  '\n\u274C Error: Debes especificar el TNS o conexi\xF3n\n\nUso:\n osx extract <TABLA> --tns <ALIAS> # Usa tnsnames.ora\n osx extract <TABLA> --tns host:port/sid # Easy Connect\n\nEjemplos:\n osx extract D0001 --tns MDI1\n osx extract D0001 --tns "BDMDI1:1523/MDI1"\n'
@@ -133,27 +132,69 @@ async function extractCommand(tables, options) {
133
132
  );
134
133
  process.exit(1);
135
134
  }
135
+ const schema = options.schema || user.toUpperCase();
136
136
  setupTnsAdmin();
137
137
  const oracle = new OracleService();
138
138
  try {
139
139
  console.error(`Conectando a ${options.tns}...`);
140
140
  await oracle.connect({ tns: options.tns, user, password });
141
- const tableNames = tables.split(",").map((t) => t.trim().toUpperCase()).filter(Boolean);
142
- if (tableNames.length === 0) {
141
+ const tablePatterns = tables.split(",").map((t) => t.trim().toUpperCase()).filter(Boolean);
142
+ if (tablePatterns.length === 0) {
143
143
  console.error(
144
- "\n\u274C Error: No se especificaron tablas a extraer\n\nUso: osx extract <TABLA> [--tns ALIAS]\n\nEjemplos:\n osx extract D0001 --tns TRON_LD\n osx extract D0001,D0002,D0003 --tns TRON_LD\n"
144
+ '\n\u274C Error: No se especificaron tablas a extraer\n\nUso: osx extract <TABLA> [--tns ALIAS]\n\nEjemplos:\n osx extract D0001 --tns TRON_LD\n osx extract D0001,D0002,D0003 --tns TRON_LD\n osx extract "D21*" --tns TRON_LD # Wildcards\n'
145
145
  );
146
146
  process.exit(1);
147
147
  }
148
- console.error(`Extrayendo ${tableNames.length} tabla(s) de ${schema}...`);
149
148
  const extractor = new SchemaExtractor(oracle);
150
- const delayMs = options.delay ? parseInt(options.delay, 10) : 0;
151
- const results = await extractor.extractTables(schema, tableNames, delayMs);
149
+ const hasWildcards = tablePatterns.some((p) => p.includes("*") || p.includes("?"));
150
+ let tableNames = [];
151
+ if (hasWildcards) {
152
+ console.error(`Buscando tablas en ${schema}...`);
153
+ for (const pattern of tablePatterns) {
154
+ if (pattern.includes("*") || pattern.includes("?")) {
155
+ const matched = await extractor.listTables(schema, pattern);
156
+ if (matched.length === 0) {
157
+ console.error(` \u26A0\uFE0F No se encontraron tablas para: ${pattern}`);
158
+ } else {
159
+ console.error(` \u2713 ${pattern} \u2192 ${matched.length} tabla(s)`);
160
+ tableNames.push(...matched);
161
+ }
162
+ } else {
163
+ tableNames.push(pattern);
164
+ }
165
+ }
166
+ tableNames = [...new Set(tableNames)].sort();
167
+ if (tableNames.length === 0) {
168
+ console.error("\n\u274C Error: No se encontraron tablas que coincidan con los patrones\n");
169
+ process.exit(1);
170
+ }
171
+ console.error(`
172
+ Tablas a extraer (${tableNames.length}):`);
173
+ tableNames.forEach((t) => console.error(` - ${t}`));
174
+ console.error("");
175
+ } else {
176
+ tableNames = tablePatterns;
177
+ }
178
+ console.error(`Extrayendo ${tableNames.length} tabla(s) de ${schema}...`);
179
+ const delayMs = options.delay ? parseInt(options.delay, 10) : hasWildcards ? 100 : 0;
180
+ const results = await extractor.extractTables(options.tns, schema, tableNames, delayMs);
152
181
  const output = results.length === 1 ? results[0] : results;
153
182
  const json = options.pretty ? JSON.stringify(output, null, 2) : JSON.stringify(output);
154
- if (options.output) {
155
- writeFileSync(options.output, json, "utf-8");
156
- console.error(`Escrito: ${options.output}`);
183
+ let outputFile;
184
+ if (options.output === true) {
185
+ if (tableNames.length === 1) {
186
+ outputFile = `${tableNames[0]}.json`;
187
+ } else {
188
+ const now = /* @__PURE__ */ new Date();
189
+ const ts = now.toISOString().replace(/[-:T]/g, "").slice(0, 15);
190
+ outputFile = `extract${ts}.json`;
191
+ }
192
+ } else if (typeof options.output === "string") {
193
+ outputFile = options.output;
194
+ }
195
+ if (outputFile) {
196
+ writeFileSync(outputFile, json, "utf-8");
197
+ console.error(`Escrito: ${outputFile}`);
157
198
  } else {
158
199
  console.log(json);
159
200
  }
@@ -171,5 +212,5 @@ async function extractCommand(tables, options) {
171
212
  var __dirname2 = dirname(fileURLToPath(import.meta.url));
172
213
  var pkg = JSON.parse(readFileSync2(join2(__dirname2, "..", "package.json"), "utf-8"));
173
214
  program.name("osx").description("Oracle Schema Extractor - Genera JSON compatible con Atlas OriginType=BBDD").version(pkg.version);
174
- program.command("extract <tables>").description("Extrae esquema de tabla(s) Oracle. Tablas separadas por coma.").option("-t, --tns <alias>", "Alias TNS o Easy Connect (host:port/service)").option("-s, --schema <name>", "Schema Oracle (default: mismo que TNS)").option("-u, --user <user>", "Usuario Oracle (o env: OSX_USER)").option("-p, --password <pass>", "Password Oracle (o env: OSX_PASSWORD)").option("-o, --output <file>", "Fichero de salida (default: stdout)").option("--pretty", "JSON formateado con indentacion").option("-d, --delay <ms>", "Delay entre tablas en ms", "0").action(extractCommand);
215
+ program.command("extract <tables>").description("Extrae esquema de tabla(s) Oracle. Tablas separadas por coma.").option("-t, --tns <alias>", "Alias TNS o Easy Connect (host:port/service)").option("-s, --schema <name>", "Schema Oracle (default: mismo que TNS)").option("-u, --user <user>", "Usuario Oracle (o env: OSX_USER)").option("-p, --password <pass>", "Password Oracle (o env: OSX_PASSWORD)").option("-o, --output [file]", "Fichero de salida (sin nombre: auto)").option("--pretty", "JSON formateado con indentacion").option("-d, --delay <ms>", "Delay entre tablas en ms", "0").action(extractCommand);
175
216
  program.parse();
package/dist/index.d.ts CHANGED
@@ -14,11 +14,15 @@ interface OracleColumn {
14
14
  * Esquema de tabla compatible con Atlas OriginType=BBDD
15
15
  */
16
16
  interface TableSchema {
17
+ bbdd: string;
17
18
  schema: string;
18
19
  name: string;
19
20
  comment: string;
20
21
  columns: OracleColumn[];
21
22
  children: string[];
23
+ count: number;
24
+ lastUpdate: string | null;
25
+ examples: Record<string, unknown>[];
22
26
  }
23
27
  /**
24
28
  * Opciones del comando extract
@@ -28,7 +32,7 @@ interface ExtractOptions {
28
32
  schema?: string;
29
33
  user?: string;
30
34
  password?: string;
31
- output?: string;
35
+ output?: string | true;
32
36
  pretty?: boolean;
33
37
  delay?: string;
34
38
  }
@@ -66,14 +70,19 @@ declare class OracleService {
66
70
  declare class SchemaExtractor {
67
71
  private oracle;
68
72
  constructor(oracle: OracleService);
73
+ /**
74
+ * Lista tablas que coinciden con un patrón
75
+ * Convierte wildcards: * → %, ? → _
76
+ */
77
+ listTables(schema: string, pattern: string): Promise<string[]>;
69
78
  /**
70
79
  * Extrae el esquema completo de una tabla
71
80
  */
72
- extractTable(schema: string, tableName: string): Promise<TableSchema>;
81
+ extractTable(bbdd: string, schema: string, tableName: string): Promise<TableSchema>;
73
82
  /**
74
83
  * Extrae múltiples tablas con delay opcional entre ellas
75
84
  */
76
- extractTables(schema: string, tableNames: string[], delayMs?: number): Promise<TableSchema[]>;
85
+ extractTables(bbdd: string, schema: string, tableNames: string[], delayMs?: number): Promise<TableSchema[]>;
77
86
  }
78
87
 
79
88
  /**
@@ -83,11 +92,12 @@ declare const TABLE_COMMENT = "\n SELECT comments\n FROM ALL_TAB_COMMENTS\n W
83
92
  /**
84
93
  * Query para obtener las columnas de una tabla con sus metadatos
85
94
  * Incluye: nombre, comentario, tipo de dato, nullable, si es PK
95
+ * Usa CTE para evaluar la subquery de PK una sola vez
86
96
  */
87
- declare const TABLE_COLUMNS = "\n SELECT\n COLS.COLUMN_NAME as \"column_name\",\n DESCRIP.COMMENTS as \"comment\",\n COLS.DATA_TYPE as \"data_type\",\n COLS.DATA_LENGTH as \"data_length\",\n COLS.DATA_PRECISION as \"data_precision\",\n COLS.NULLABLE as \"nullable\",\n CASE WHEN PK.COLUMN_NAME IS NOT NULL THEN 'Y' ELSE 'N' END AS \"is_pk\"\n FROM SYS.ALL_TAB_COLUMNS COLS\n JOIN SYS.ALL_COL_COMMENTS DESCRIP\n ON DESCRIP.OWNER = COLS.OWNER\n AND DESCRIP.TABLE_NAME = COLS.TABLE_NAME\n AND DESCRIP.COLUMN_NAME = COLS.COLUMN_NAME\n LEFT JOIN (\n SELECT acc.COLUMN_NAME\n FROM ALL_CONSTRAINTS ac\n JOIN ALL_CONS_COLUMNS acc\n ON ac.OWNER = acc.OWNER\n AND ac.CONSTRAINT_NAME = acc.CONSTRAINT_NAME\n WHERE ac.CONSTRAINT_TYPE = 'P'\n AND ac.OWNER = :schema\n AND acc.TABLE_NAME = :tableName\n ) PK ON PK.COLUMN_NAME = COLS.COLUMN_NAME\n WHERE COLS.OWNER = :schema AND COLS.TABLE_NAME = :tableName\n ORDER BY COLS.COLUMN_ID\n";
97
+ declare const TABLE_COLUMNS = "\n WITH PK_COLUMNS AS (\n SELECT acc.COLUMN_NAME\n FROM ALL_CONSTRAINTS ac\n JOIN ALL_CONS_COLUMNS acc\n ON ac.CONSTRAINT_NAME = acc.CONSTRAINT_NAME\n AND ac.OWNER = acc.OWNER\n WHERE ac.CONSTRAINT_TYPE = 'P'\n AND ac.OWNER = :schema\n AND ac.TABLE_NAME = :tableName\n )\n SELECT\n COLS.COLUMN_NAME as \"column_name\",\n DESCRIP.COMMENTS as \"comment\",\n COLS.DATA_TYPE as \"data_type\",\n COLS.DATA_LENGTH as \"data_length\",\n COLS.DATA_PRECISION as \"data_precision\",\n COLS.NULLABLE as \"nullable\",\n CASE WHEN PK.COLUMN_NAME IS NOT NULL THEN 'Y' ELSE 'N' END AS \"is_pk\"\n FROM ALL_TAB_COLUMNS COLS\n JOIN ALL_COL_COMMENTS DESCRIP\n ON DESCRIP.OWNER = COLS.OWNER\n AND DESCRIP.TABLE_NAME = COLS.TABLE_NAME\n AND DESCRIP.COLUMN_NAME = COLS.COLUMN_NAME\n LEFT JOIN PK_COLUMNS PK ON PK.COLUMN_NAME = COLS.COLUMN_NAME\n WHERE COLS.OWNER = :schema AND COLS.TABLE_NAME = :tableName\n ORDER BY COLS.COLUMN_ID\n";
88
98
  /**
89
99
  * Query para obtener las tablas hijas (que tienen FK hacia esta tabla)
90
100
  */
91
- declare const TABLE_CHILDREN = "\n SELECT DISTINCT ac_child.table_name AS \"child_table\"\n FROM all_constraints ac_parent\n JOIN all_constraints ac_child\n ON ac_parent.constraint_name = ac_child.r_constraint_name\n AND ac_parent.owner = ac_child.r_owner\n WHERE ac_parent.owner = :schema\n AND ac_parent.table_name = :tableName\n AND ac_parent.constraint_type = 'P'\n AND ac_child.constraint_type = 'R'\n AND ac_child.status = 'ENABLED'\n";
101
+ declare const TABLE_CHILDREN = "\n SELECT DISTINCT ac_child.table_name AS \"child_table\"\n FROM ALL_CONSTRAINTS ac_parent\n JOIN ALL_CONSTRAINTS ac_child\n ON ac_parent.constraint_name = ac_child.r_constraint_name\n AND ac_parent.owner = ac_child.r_owner\n WHERE ac_parent.owner = :schema\n AND ac_parent.table_name = :tableName\n AND ac_parent.constraint_type = 'P'\n AND ac_child.constraint_type = 'R'\n AND ac_child.status = 'ENABLED'\n";
92
102
 
93
103
  export { type ExtractOptions, type OracleColumn, type OracleConfig, OracleService, SchemaExtractor, TABLE_CHILDREN, TABLE_COLUMNS, TABLE_COMMENT, type TableSchema };
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  TABLE_CHILDREN,
5
5
  TABLE_COLUMNS,
6
6
  TABLE_COMMENT
7
- } from "./chunk-AI3SXYL3.js";
7
+ } from "./chunk-XHMPD7KT.js";
8
8
  export {
9
9
  OracleService,
10
10
  SchemaExtractor,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gzl10/osx-cli",
3
- "version": "4.0.4",
3
+ "version": "4.0.6",
4
4
  "description": "Oracle Schema Extractor CLI - Genera JSON compatible con Atlas OriginType=BBDD",
5
5
  "type": "module",
6
6
  "bin": {