datera 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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/api/clean.d.ts +138 -0
  4. package/dist/api/clean.js +138 -0
  5. package/dist/api/formats.d.ts +19 -0
  6. package/dist/api/formats.js +106 -0
  7. package/dist/api/index.d.ts +8 -0
  8. package/dist/api/index.js +27 -0
  9. package/dist/api/inspect.d.ts +13 -0
  10. package/dist/api/inspect.js +44 -0
  11. package/dist/api/parse.d.ts +2 -0
  12. package/dist/api/parse.js +19 -0
  13. package/dist/api/rows.d.ts +23 -0
  14. package/dist/api/rows.js +63 -0
  15. package/dist/cli.d.ts +62 -0
  16. package/dist/cli.js +225 -0
  17. package/dist/commands.d.ts +3 -0
  18. package/dist/commands.js +169 -0
  19. package/dist/config/check.d.ts +11 -0
  20. package/dist/config/check.js +99 -0
  21. package/dist/config/index.d.ts +7 -0
  22. package/dist/config/index.js +16 -0
  23. package/dist/config/ioSchema.d.ts +97 -0
  24. package/dist/config/ioSchema.js +111 -0
  25. package/dist/config/load.d.ts +5 -0
  26. package/dist/config/load.js +68 -0
  27. package/dist/config/mergeSchema.d.ts +36 -0
  28. package/dist/config/mergeSchema.js +46 -0
  29. package/dist/config/messages.d.ts +7 -0
  30. package/dist/config/messages.js +33 -0
  31. package/dist/config/prepareSchema.d.ts +12 -0
  32. package/dist/config/prepareSchema.js +15 -0
  33. package/dist/config/schema.d.ts +195 -0
  34. package/dist/config/schema.js +44 -0
  35. package/dist/config/validationSchema.d.ts +27 -0
  36. package/dist/config/validationSchema.js +50 -0
  37. package/dist/env.d.ts +2 -0
  38. package/dist/env.js +15 -0
  39. package/dist/filters/combine.d.ts +10 -0
  40. package/dist/filters/combine.js +60 -0
  41. package/dist/filters/combineTypes.d.ts +6 -0
  42. package/dist/filters/combineTypes.js +2 -0
  43. package/dist/filters/dedupe.d.ts +12 -0
  44. package/dist/filters/dedupe.js +45 -0
  45. package/dist/filters/fillEmpty.d.ts +9 -0
  46. package/dist/filters/fillEmpty.js +32 -0
  47. package/dist/filters/fillEmptyTypes.d.ts +5 -0
  48. package/dist/filters/fillEmptyTypes.js +2 -0
  49. package/dist/filters/merge.d.ts +15 -0
  50. package/dist/filters/merge.js +113 -0
  51. package/dist/filters/mergeStrategies.d.ts +10 -0
  52. package/dist/filters/mergeStrategies.js +69 -0
  53. package/dist/filters/mergeTypes.d.ts +32 -0
  54. package/dist/filters/mergeTypes.js +2 -0
  55. package/dist/filters/mergeUnkeyed.d.ts +3 -0
  56. package/dist/filters/mergeUnkeyed.js +21 -0
  57. package/dist/filters/types.d.ts +3 -0
  58. package/dist/filters/types.js +2 -0
  59. package/dist/filters/validate.d.ts +16 -0
  60. package/dist/filters/validate.js +79 -0
  61. package/dist/filters/validateTypes.d.ts +28 -0
  62. package/dist/filters/validateTypes.js +2 -0
  63. package/dist/index.d.ts +13 -0
  64. package/dist/index.js +40 -0
  65. package/dist/io/csv/csvFormat.d.ts +4 -0
  66. package/dist/io/csv/csvFormat.js +94 -0
  67. package/dist/io/csv/csvSink.d.ts +14 -0
  68. package/dist/io/csv/csvSink.js +32 -0
  69. package/dist/io/csv/csvSource.d.ts +13 -0
  70. package/dist/io/csv/csvSource.js +29 -0
  71. package/dist/io/custom/loader.d.ts +1 -0
  72. package/dist/io/custom/loader.js +36 -0
  73. package/dist/io/custom/registry.d.ts +13 -0
  74. package/dist/io/custom/registry.js +50 -0
  75. package/dist/io/excel/excelCell.d.ts +4 -0
  76. package/dist/io/excel/excelCell.js +29 -0
  77. package/dist/io/excel/excelSink.d.ts +14 -0
  78. package/dist/io/excel/excelSink.js +57 -0
  79. package/dist/io/excel/excelSource.d.ts +11 -0
  80. package/dist/io/excel/excelSource.js +47 -0
  81. package/dist/io/excel/workbook.d.ts +4 -0
  82. package/dist/io/excel/workbook.js +20 -0
  83. package/dist/io/factory.d.ts +5 -0
  84. package/dist/io/factory.js +106 -0
  85. package/dist/io/files.d.ts +7 -0
  86. package/dist/io/files.js +48 -0
  87. package/dist/io/header.d.ts +2 -0
  88. package/dist/io/header.js +42 -0
  89. package/dist/io/json/jsonSink.d.ts +12 -0
  90. package/dist/io/json/jsonSink.js +19 -0
  91. package/dist/io/json/jsonSource.d.ts +11 -0
  92. package/dist/io/json/jsonSource.js +66 -0
  93. package/dist/io/mysql/client.d.ts +13 -0
  94. package/dist/io/mysql/client.js +73 -0
  95. package/dist/io/mysql/mysqlSource.d.ts +13 -0
  96. package/dist/io/mysql/mysqlSource.js +25 -0
  97. package/dist/io/optional.d.ts +2 -0
  98. package/dist/io/optional.js +36 -0
  99. package/dist/io/parquet/parquetLibrary.d.ts +11 -0
  100. package/dist/io/parquet/parquetLibrary.js +20 -0
  101. package/dist/io/parquet/parquetSink.d.ts +15 -0
  102. package/dist/io/parquet/parquetSink.js +58 -0
  103. package/dist/io/parquet/parquetSource.d.ts +13 -0
  104. package/dist/io/parquet/parquetSource.js +68 -0
  105. package/dist/io/postgres/postgresSource.d.ts +26 -0
  106. package/dist/io/postgres/postgresSource.js +42 -0
  107. package/dist/io/safety.d.ts +4 -0
  108. package/dist/io/safety.js +83 -0
  109. package/dist/io/sheets/client.d.ts +10 -0
  110. package/dist/io/sheets/client.js +141 -0
  111. package/dist/io/sheets/sheetsSink.d.ts +12 -0
  112. package/dist/io/sheets/sheetsSink.js +24 -0
  113. package/dist/io/sheets/sheetsSource.d.ts +10 -0
  114. package/dist/io/sheets/sheetsSource.js +47 -0
  115. package/dist/io/sql/cell.d.ts +5 -0
  116. package/dist/io/sql/cell.js +38 -0
  117. package/dist/io/sql/driver.d.ts +1 -0
  118. package/dist/io/sql/driver.js +15 -0
  119. package/dist/io/sql/names.d.ts +1 -0
  120. package/dist/io/sql/names.js +12 -0
  121. package/dist/io/sqlite/sqliteSource.d.ts +11 -0
  122. package/dist/io/sqlite/sqliteSource.js +52 -0
  123. package/dist/io/sqlserver/sqlServerSource.d.ts +24 -0
  124. package/dist/io/sqlserver/sqlServerSource.js +49 -0
  125. package/dist/io/types.d.ts +11 -0
  126. package/dist/io/types.js +2 -0
  127. package/dist/io/xml/xmlParse.d.ts +9 -0
  128. package/dist/io/xml/xmlParse.js +178 -0
  129. package/dist/io/xml/xmlSink.d.ts +18 -0
  130. package/dist/io/xml/xmlSink.js +79 -0
  131. package/dist/io/xml/xmlSource.d.ts +11 -0
  132. package/dist/io/xml/xmlSource.js +93 -0
  133. package/dist/logger.d.ts +11 -0
  134. package/dist/logger.js +29 -0
  135. package/dist/main.d.ts +2 -0
  136. package/dist/main.js +18 -0
  137. package/dist/normalizers/builtin.d.ts +5 -0
  138. package/dist/normalizers/builtin.js +23 -0
  139. package/dist/normalizers/index.d.ts +2 -0
  140. package/dist/normalizers/index.js +14 -0
  141. package/dist/normalizers/loader.d.ts +1 -0
  142. package/dist/normalizers/loader.js +30 -0
  143. package/dist/normalizers/registry.d.ts +9 -0
  144. package/dist/normalizers/registry.js +29 -0
  145. package/dist/pipeline/index.d.ts +7 -0
  146. package/dist/pipeline/index.js +17 -0
  147. package/dist/pipeline/modes.d.ts +6 -0
  148. package/dist/pipeline/modes.js +48 -0
  149. package/dist/pipeline/report.d.ts +3 -0
  150. package/dist/pipeline/report.js +32 -0
  151. package/dist/pipeline/runEtl.d.ts +24 -0
  152. package/dist/pipeline/runEtl.js +98 -0
  153. package/dist/pipeline/steps.d.ts +4 -0
  154. package/dist/pipeline/steps.js +36 -0
  155. package/dist/pipeline/types.d.ts +34 -0
  156. package/dist/pipeline/types.js +2 -0
  157. package/dist/types.d.ts +3 -0
  158. package/dist/types.js +2 -0
  159. package/package.json +128 -0
@@ -0,0 +1,7 @@
1
+ export { etlConfigSchema } from "./schema";
2
+ export type { EtlConfig } from "./schema";
3
+ export type { SourceConfig, DestinationConfig } from "./ioSchema";
4
+ export { loadConfig, loadJsonConfig, parseConfig, withEnv } from "./load";
5
+ export { checkConfigFile, checkConfigText, formatCheck } from "./check";
6
+ export type { ConfigCheck, ConfigProblem } from "./check";
7
+ export { translateIssue } from "./messages";
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.translateIssue = exports.formatCheck = exports.checkConfigText = exports.checkConfigFile = exports.withEnv = exports.parseConfig = exports.loadJsonConfig = exports.loadConfig = exports.etlConfigSchema = void 0;
4
+ var schema_1 = require("./schema");
5
+ Object.defineProperty(exports, "etlConfigSchema", { enumerable: true, get: function () { return schema_1.etlConfigSchema; } });
6
+ var load_1 = require("./load");
7
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return load_1.loadConfig; } });
8
+ Object.defineProperty(exports, "loadJsonConfig", { enumerable: true, get: function () { return load_1.loadJsonConfig; } });
9
+ Object.defineProperty(exports, "parseConfig", { enumerable: true, get: function () { return load_1.parseConfig; } });
10
+ Object.defineProperty(exports, "withEnv", { enumerable: true, get: function () { return load_1.withEnv; } });
11
+ var check_1 = require("./check");
12
+ Object.defineProperty(exports, "checkConfigFile", { enumerable: true, get: function () { return check_1.checkConfigFile; } });
13
+ Object.defineProperty(exports, "checkConfigText", { enumerable: true, get: function () { return check_1.checkConfigText; } });
14
+ Object.defineProperty(exports, "formatCheck", { enumerable: true, get: function () { return check_1.formatCheck; } });
15
+ var messages_1 = require("./messages");
16
+ Object.defineProperty(exports, "translateIssue", { enumerable: true, get: function () { return messages_1.translateIssue; } });
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ export declare const sourceSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
3
+ host: z.ZodOptional<z.ZodString>;
4
+ port: z.ZodOptional<z.ZodNumber>;
5
+ user: z.ZodOptional<z.ZodString>;
6
+ password: z.ZodOptional<z.ZodString>;
7
+ database: z.ZodOptional<z.ZodString>;
8
+ table: z.ZodOptional<z.ZodString>;
9
+ type: z.ZodLiteral<"mysql">;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ host: z.ZodOptional<z.ZodString>;
12
+ port: z.ZodOptional<z.ZodNumber>;
13
+ user: z.ZodOptional<z.ZodString>;
14
+ password: z.ZodOptional<z.ZodString>;
15
+ database: z.ZodOptional<z.ZodString>;
16
+ table: z.ZodOptional<z.ZodString>;
17
+ type: z.ZodLiteral<"postgres">;
18
+ ssl: z.ZodOptional<z.ZodBoolean>;
19
+ }, z.core.$strip>, z.ZodObject<{
20
+ host: z.ZodOptional<z.ZodString>;
21
+ port: z.ZodOptional<z.ZodNumber>;
22
+ user: z.ZodOptional<z.ZodString>;
23
+ password: z.ZodOptional<z.ZodString>;
24
+ database: z.ZodOptional<z.ZodString>;
25
+ table: z.ZodOptional<z.ZodString>;
26
+ type: z.ZodLiteral<"sqlserver">;
27
+ encrypt: z.ZodOptional<z.ZodBoolean>;
28
+ trustServerCertificate: z.ZodOptional<z.ZodBoolean>;
29
+ }, z.core.$strip>, z.ZodObject<{
30
+ type: z.ZodLiteral<"sqlite">;
31
+ path: z.ZodString;
32
+ table: z.ZodString;
33
+ }, z.core.$strip>, z.ZodObject<{
34
+ type: z.ZodLiteral<"csv">;
35
+ path: z.ZodString;
36
+ delimiter: z.ZodOptional<z.ZodString>;
37
+ encoding: z.ZodOptional<z.ZodEnum<{
38
+ latin1: "latin1";
39
+ "utf-8": "utf-8";
40
+ }>>;
41
+ }, z.core.$strip>, z.ZodObject<{
42
+ type: z.ZodLiteral<"json">;
43
+ path: z.ZodString;
44
+ recordsPath: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$strip>, z.ZodObject<{
46
+ type: z.ZodLiteral<"xml">;
47
+ path: z.ZodString;
48
+ recordsPath: z.ZodOptional<z.ZodString>;
49
+ }, z.core.$strip>, z.ZodObject<{
50
+ type: z.ZodLiteral<"parquet">;
51
+ path: z.ZodString;
52
+ }, z.core.$strip>, z.ZodObject<{
53
+ type: z.ZodLiteral<"excel">;
54
+ path: z.ZodString;
55
+ sheet: z.ZodOptional<z.ZodString>;
56
+ }, z.core.$strip>, z.ZodObject<{
57
+ type: z.ZodLiteral<"sheets">;
58
+ spreadsheetId: z.ZodString;
59
+ credentialsPath: z.ZodOptional<z.ZodString>;
60
+ sheet: z.ZodOptional<z.ZodString>;
61
+ }, z.core.$strip>, z.ZodObject<{
62
+ type: z.ZodLiteral<"custom">;
63
+ adapter: z.ZodString;
64
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
65
+ }, z.core.$strip>], "type">;
66
+ export declare const destinationSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
67
+ type: z.ZodLiteral<"sheets">;
68
+ spreadsheetId: z.ZodOptional<z.ZodString>;
69
+ credentialsPath: z.ZodOptional<z.ZodString>;
70
+ sheet: z.ZodOptional<z.ZodString>;
71
+ }, z.core.$strip>, z.ZodObject<{
72
+ type: z.ZodLiteral<"csv">;
73
+ path: z.ZodString;
74
+ delimiter: z.ZodOptional<z.ZodString>;
75
+ bom: z.ZodOptional<z.ZodBoolean>;
76
+ }, z.core.$strip>, z.ZodObject<{
77
+ type: z.ZodLiteral<"json">;
78
+ path: z.ZodString;
79
+ }, z.core.$strip>, z.ZodObject<{
80
+ type: z.ZodLiteral<"xml">;
81
+ path: z.ZodString;
82
+ root: z.ZodOptional<z.ZodString>;
83
+ record: z.ZodOptional<z.ZodString>;
84
+ }, z.core.$strip>, z.ZodObject<{
85
+ type: z.ZodLiteral<"parquet">;
86
+ path: z.ZodString;
87
+ }, z.core.$strip>, z.ZodObject<{
88
+ type: z.ZodLiteral<"excel">;
89
+ path: z.ZodString;
90
+ sheet: z.ZodOptional<z.ZodString>;
91
+ }, z.core.$strip>, z.ZodObject<{
92
+ type: z.ZodLiteral<"custom">;
93
+ adapter: z.ZodString;
94
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
95
+ }, z.core.$strip>], "type">;
96
+ export type SourceConfig = z.infer<typeof sourceSchema>;
97
+ export type DestinationConfig = z.infer<typeof destinationSchema>;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.destinationSchema = exports.sourceSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const xmlName = zod_1.z
6
+ .string()
7
+ .regex(/^[\p{L}_][\p{L}\p{N}_.-]*$/u, "Nome de elemento XML inválido: use letras, números, _ . ou -, começando com letra.");
8
+ const serverFields = {
9
+ host: zod_1.z.string().optional(),
10
+ port: zod_1.z.number().optional(),
11
+ user: zod_1.z.string().optional(),
12
+ password: zod_1.z.string().optional(),
13
+ database: zod_1.z.string().optional(),
14
+ table: zod_1.z.string().optional(),
15
+ };
16
+ exports.sourceSchema = zod_1.z.discriminatedUnion("type", [
17
+ zod_1.z.object({
18
+ type: zod_1.z.literal("mysql"),
19
+ ...serverFields,
20
+ }),
21
+ zod_1.z.object({
22
+ type: zod_1.z.literal("postgres"),
23
+ ...serverFields,
24
+ ssl: zod_1.z.boolean().optional(),
25
+ }),
26
+ zod_1.z.object({
27
+ type: zod_1.z.literal("sqlserver"),
28
+ ...serverFields,
29
+ encrypt: zod_1.z.boolean().optional(),
30
+ trustServerCertificate: zod_1.z.boolean().optional(),
31
+ }),
32
+ zod_1.z.object({
33
+ type: zod_1.z.literal("sqlite"),
34
+ path: zod_1.z.string(),
35
+ table: zod_1.z.string().min(1),
36
+ }),
37
+ zod_1.z.object({
38
+ type: zod_1.z.literal("csv"),
39
+ path: zod_1.z.string(),
40
+ delimiter: zod_1.z.string().min(1).optional(),
41
+ encoding: zod_1.z.enum(["utf-8", "latin1"]).optional(),
42
+ }),
43
+ zod_1.z.object({
44
+ type: zod_1.z.literal("json"),
45
+ path: zod_1.z.string(),
46
+ recordsPath: zod_1.z.string().optional(),
47
+ }),
48
+ zod_1.z.object({
49
+ type: zod_1.z.literal("xml"),
50
+ path: zod_1.z.string(),
51
+ recordsPath: zod_1.z.string().min(1).optional(),
52
+ }),
53
+ zod_1.z.object({
54
+ type: zod_1.z.literal("parquet"),
55
+ path: zod_1.z.string(),
56
+ }),
57
+ zod_1.z.object({
58
+ type: zod_1.z.literal("excel"),
59
+ path: zod_1.z.string(),
60
+ sheet: zod_1.z.string().min(1).optional(),
61
+ }),
62
+ zod_1.z.object({
63
+ type: zod_1.z.literal("sheets"),
64
+ spreadsheetId: zod_1.z.string().min(1),
65
+ credentialsPath: zod_1.z.string().optional(),
66
+ sheet: zod_1.z.string().min(1).optional(),
67
+ }),
68
+ zod_1.z.object({
69
+ type: zod_1.z.literal("custom"),
70
+ adapter: zod_1.z.string().min(1),
71
+ options: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
72
+ }),
73
+ ]);
74
+ exports.destinationSchema = zod_1.z.discriminatedUnion("type", [
75
+ zod_1.z.object({
76
+ type: zod_1.z.literal("sheets"),
77
+ spreadsheetId: zod_1.z.string().optional(),
78
+ credentialsPath: zod_1.z.string().optional(),
79
+ sheet: zod_1.z.string().min(1).optional(),
80
+ }),
81
+ zod_1.z.object({
82
+ type: zod_1.z.literal("csv"),
83
+ path: zod_1.z.string(),
84
+ delimiter: zod_1.z.string().min(1).optional(),
85
+ bom: zod_1.z.boolean().optional(),
86
+ }),
87
+ zod_1.z.object({
88
+ type: zod_1.z.literal("json"),
89
+ path: zod_1.z.string(),
90
+ }),
91
+ zod_1.z.object({
92
+ type: zod_1.z.literal("xml"),
93
+ path: zod_1.z.string(),
94
+ root: xmlName.optional(),
95
+ record: xmlName.optional(),
96
+ }),
97
+ zod_1.z.object({
98
+ type: zod_1.z.literal("parquet"),
99
+ path: zod_1.z.string(),
100
+ }),
101
+ zod_1.z.object({
102
+ type: zod_1.z.literal("excel"),
103
+ path: zod_1.z.string(),
104
+ sheet: zod_1.z.string().min(1).optional(),
105
+ }),
106
+ zod_1.z.object({
107
+ type: zod_1.z.literal("custom"),
108
+ adapter: zod_1.z.string().min(1),
109
+ options: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
110
+ }),
111
+ ]);
@@ -0,0 +1,5 @@
1
+ import { EtlConfig } from "./schema";
2
+ export declare function loadJsonConfig(filePath: string): EtlConfig;
3
+ export declare function withEnv(jsonConfig: EtlConfig): EtlConfig;
4
+ export declare function loadConfig(jsonPath: string): EtlConfig;
5
+ export declare function parseConfig(value: unknown): EtlConfig;
@@ -0,0 +1,68 @@
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.loadJsonConfig = loadJsonConfig;
7
+ exports.withEnv = withEnv;
8
+ exports.loadConfig = loadConfig;
9
+ exports.parseConfig = parseConfig;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const env_1 = require("../env");
12
+ const schema_1 = require("./schema");
13
+ function loadJsonConfig(filePath) {
14
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
15
+ const parsedData = JSON.parse(content);
16
+ return schema_1.etlConfigSchema.parse(parsedData);
17
+ }
18
+ function withDatabaseEnv(source) {
19
+ if (source?.type !== "mysql" &&
20
+ source?.type !== "postgres" &&
21
+ source?.type !== "sqlserver")
22
+ return source;
23
+ const port = (0, env_1.getOptionalEnv)("DB_PORT");
24
+ return {
25
+ ...source,
26
+ host: (0, env_1.getOptionalEnv)("DB_HOST") ?? source.host,
27
+ port: port !== undefined ? Number(port) : source.port,
28
+ user: (0, env_1.getOptionalEnv)("DB_USER") ?? source.user,
29
+ password: (0, env_1.getOptionalEnv)("DB_PASSWORD") ?? source.password,
30
+ database: (0, env_1.getOptionalEnv)("DB_NAME") ?? source.database,
31
+ table: (0, env_1.getOptionalEnv)("DB_TABLE") ?? source.table,
32
+ };
33
+ }
34
+ function withSheetsEnv(destination) {
35
+ if (destination?.type !== "sheets")
36
+ return destination;
37
+ return {
38
+ ...destination,
39
+ spreadsheetId: (0, env_1.getOptionalEnv)("GOOGLE_SPREADSHEET_ID") ??
40
+ destination.spreadsheetId,
41
+ credentialsPath: (0, env_1.getOptionalEnv)("GOOGLE_SERVICE_ACCOUNT_KEY_PATH") ??
42
+ destination.credentialsPath,
43
+ };
44
+ }
45
+ function withEnv(jsonConfig) {
46
+ const dbPort = (0, env_1.getOptionalEnv)("DB_PORT");
47
+ const finalConfig = {
48
+ ...jsonConfig,
49
+ source: withDatabaseEnv(jsonConfig.source),
50
+ destination: withSheetsEnv(jsonConfig.destination),
51
+ tableName: (0, env_1.getOptionalEnv)("DB_TABLE") ?? jsonConfig.tableName,
52
+ spreadsheetId: (0, env_1.getOptionalEnv)("GOOGLE_SPREADSHEET_ID") ?? jsonConfig.spreadsheetId,
53
+ credentialsPath: (0, env_1.getOptionalEnv)("GOOGLE_SERVICE_ACCOUNT_KEY_PATH") ??
54
+ jsonConfig.credentialsPath,
55
+ dbHost: (0, env_1.getOptionalEnv)("DB_HOST") ?? jsonConfig.dbHost,
56
+ dbPort: dbPort !== undefined ? Number(dbPort) : jsonConfig.dbPort,
57
+ dbUser: (0, env_1.getOptionalEnv)("DB_USER") ?? jsonConfig.dbUser,
58
+ dbPassword: (0, env_1.getOptionalEnv)("DB_PASSWORD") ?? jsonConfig.dbPassword,
59
+ dbName: (0, env_1.getOptionalEnv)("DB_NAME") ?? jsonConfig.dbName,
60
+ };
61
+ return schema_1.etlConfigSchema.parse(finalConfig);
62
+ }
63
+ function loadConfig(jsonPath) {
64
+ return withEnv(loadJsonConfig(jsonPath));
65
+ }
66
+ function parseConfig(value) {
67
+ return withEnv(schema_1.etlConfigSchema.parse(value));
68
+ }
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ export declare const mergeColumnSchema: z.ZodObject<{
3
+ column: z.ZodString;
4
+ strategy: z.ZodEnum<{
5
+ concat: "concat";
6
+ "extra-column": "extra-column";
7
+ overwrite: "overwrite";
8
+ }>;
9
+ separator: z.ZodOptional<z.ZodString>;
10
+ distribute: z.ZodOptional<z.ZodObject<{
11
+ columns: z.ZodArray<z.ZodString>;
12
+ overflowInto: z.ZodOptional<z.ZodString>;
13
+ sources: z.ZodOptional<z.ZodArray<z.ZodString>>;
14
+ }, z.core.$strip>>;
15
+ byGroup: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
16
+ strategy: z.ZodEnum<{
17
+ concat: "concat";
18
+ "extra-column": "extra-column";
19
+ overwrite: "overwrite";
20
+ }>;
21
+ separator: z.ZodOptional<z.ZodString>;
22
+ into: z.ZodOptional<z.ZodString>;
23
+ distribute: z.ZodOptional<z.ZodObject<{
24
+ columns: z.ZodArray<z.ZodString>;
25
+ overflowInto: z.ZodOptional<z.ZodString>;
26
+ sources: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ }, z.core.$strip>>;
28
+ }, z.core.$strip>>>;
29
+ unkeyed: z.ZodOptional<z.ZodObject<{
30
+ strategy: z.ZodEnum<{
31
+ "collapse-column": "collapse-column";
32
+ }>;
33
+ into: z.ZodOptional<z.ZodString>;
34
+ separator: z.ZodOptional<z.ZodString>;
35
+ }, z.core.$strip>>;
36
+ }, z.core.$strip>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeColumnSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const mergeColumnStrategySchema = zod_1.z.enum([
6
+ "concat",
7
+ "overwrite",
8
+ "extra-column",
9
+ ]);
10
+ const distributeSchema = zod_1.z.object({
11
+ columns: zod_1.z.array(zod_1.z.string()).min(1),
12
+ overflowInto: zod_1.z.string().optional(),
13
+ sources: zod_1.z.array(zod_1.z.string()).optional(),
14
+ });
15
+ const distributeOnlyOnConcat = {
16
+ message: 'distribute só é permitido quando strategy é "concat".',
17
+ path: ["distribute"],
18
+ };
19
+ const groupOverrideSchema = zod_1.z
20
+ .object({
21
+ strategy: mergeColumnStrategySchema,
22
+ separator: zod_1.z.string().optional(),
23
+ into: zod_1.z.string().optional(),
24
+ distribute: distributeSchema.optional(),
25
+ })
26
+ .refine((value) => value.strategy === "concat" || value.distribute === undefined, distributeOnlyOnConcat)
27
+ .refine((value) => value.into === undefined || value.distribute === undefined, {
28
+ message: "into e distribute não podem ser usados juntos, o distribute já define as colunas de destino.",
29
+ path: ["into"],
30
+ });
31
+ exports.mergeColumnSchema = zod_1.z
32
+ .object({
33
+ column: zod_1.z.string(),
34
+ strategy: mergeColumnStrategySchema,
35
+ separator: zod_1.z.string().optional(),
36
+ distribute: distributeSchema.optional(),
37
+ byGroup: zod_1.z.record(zod_1.z.string(), groupOverrideSchema).optional(),
38
+ unkeyed: zod_1.z
39
+ .object({
40
+ strategy: zod_1.z.enum(["collapse-column"]),
41
+ into: zod_1.z.string().optional(),
42
+ separator: zod_1.z.string().optional(),
43
+ })
44
+ .optional(),
45
+ })
46
+ .refine((value) => value.strategy === "concat" || value.distribute === undefined, distributeOnlyOnConcat);
@@ -0,0 +1,7 @@
1
+ export interface IssueLike {
2
+ code: string;
3
+ message: string;
4
+ expected?: unknown;
5
+ values?: unknown;
6
+ }
7
+ export declare function translateIssue(issue: IssueLike): string;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.translateIssue = translateIssue;
4
+ const TYPE_NAMES = {
5
+ string: "texto",
6
+ number: "número",
7
+ boolean: "true ou false",
8
+ array: "lista",
9
+ object: "objeto",
10
+ };
11
+ function translateIssue(issue) {
12
+ const expected = typeof issue.expected === "string"
13
+ ? (TYPE_NAMES[issue.expected] ?? issue.expected)
14
+ : "";
15
+ switch (issue.code) {
16
+ case "invalid_type":
17
+ return /received undefined/.test(issue.message)
18
+ ? `Campo obrigatório (${expected}).`
19
+ : `Tipo errado: aqui vai ${expected}.`;
20
+ case "invalid_value":
21
+ return Array.isArray(issue.values)
22
+ ? `Valor não aceito. Use um destes: ${issue.values.map((value) => JSON.stringify(value)).join(", ")}.`
23
+ : "Valor não aceito.";
24
+ case "invalid_union":
25
+ return "Valor não aceito aqui. Confira o type e os campos obrigatórios.";
26
+ case "too_small":
27
+ return "Não pode ficar vazio.";
28
+ case "unrecognized_keys":
29
+ return "Tem campos que o Datera não conhece.";
30
+ default:
31
+ return issue.message;
32
+ }
33
+ }
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ export declare const fillEmptySchema: z.ZodObject<{
3
+ column: z.ZodString;
4
+ fallbackColumns: z.ZodOptional<z.ZodArray<z.ZodString>>;
5
+ default: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>;
7
+ export declare const combineColumnsSchema: z.ZodObject<{
8
+ into: z.ZodString;
9
+ columns: z.ZodArray<z.ZodString>;
10
+ separator: z.ZodOptional<z.ZodString>;
11
+ keepSources: z.ZodOptional<z.ZodBoolean>;
12
+ }, z.core.$strip>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.combineColumnsSchema = exports.fillEmptySchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.fillEmptySchema = zod_1.z.object({
6
+ column: zod_1.z.string(),
7
+ fallbackColumns: zod_1.z.array(zod_1.z.string()).optional(),
8
+ default: zod_1.z.string().optional(),
9
+ });
10
+ exports.combineColumnsSchema = zod_1.z.object({
11
+ into: zod_1.z.string(),
12
+ columns: zod_1.z.array(zod_1.z.string()).min(1),
13
+ separator: zod_1.z.string().optional(),
14
+ keepSources: zod_1.z.boolean().optional(),
15
+ });
@@ -0,0 +1,195 @@
1
+ import { z } from "zod";
2
+ export declare const etlConfigSchema: z.ZodObject<{
3
+ source: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
4
+ host: z.ZodOptional<z.ZodString>;
5
+ port: z.ZodOptional<z.ZodNumber>;
6
+ user: z.ZodOptional<z.ZodString>;
7
+ password: z.ZodOptional<z.ZodString>;
8
+ database: z.ZodOptional<z.ZodString>;
9
+ table: z.ZodOptional<z.ZodString>;
10
+ type: z.ZodLiteral<"mysql">;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ host: z.ZodOptional<z.ZodString>;
13
+ port: z.ZodOptional<z.ZodNumber>;
14
+ user: z.ZodOptional<z.ZodString>;
15
+ password: z.ZodOptional<z.ZodString>;
16
+ database: z.ZodOptional<z.ZodString>;
17
+ table: z.ZodOptional<z.ZodString>;
18
+ type: z.ZodLiteral<"postgres">;
19
+ ssl: z.ZodOptional<z.ZodBoolean>;
20
+ }, z.core.$strip>, z.ZodObject<{
21
+ host: z.ZodOptional<z.ZodString>;
22
+ port: z.ZodOptional<z.ZodNumber>;
23
+ user: z.ZodOptional<z.ZodString>;
24
+ password: z.ZodOptional<z.ZodString>;
25
+ database: z.ZodOptional<z.ZodString>;
26
+ table: z.ZodOptional<z.ZodString>;
27
+ type: z.ZodLiteral<"sqlserver">;
28
+ encrypt: z.ZodOptional<z.ZodBoolean>;
29
+ trustServerCertificate: z.ZodOptional<z.ZodBoolean>;
30
+ }, z.core.$strip>, z.ZodObject<{
31
+ type: z.ZodLiteral<"sqlite">;
32
+ path: z.ZodString;
33
+ table: z.ZodString;
34
+ }, z.core.$strip>, z.ZodObject<{
35
+ type: z.ZodLiteral<"csv">;
36
+ path: z.ZodString;
37
+ delimiter: z.ZodOptional<z.ZodString>;
38
+ encoding: z.ZodOptional<z.ZodEnum<{
39
+ latin1: "latin1";
40
+ "utf-8": "utf-8";
41
+ }>>;
42
+ }, z.core.$strip>, z.ZodObject<{
43
+ type: z.ZodLiteral<"json">;
44
+ path: z.ZodString;
45
+ recordsPath: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>, z.ZodObject<{
47
+ type: z.ZodLiteral<"xml">;
48
+ path: z.ZodString;
49
+ recordsPath: z.ZodOptional<z.ZodString>;
50
+ }, z.core.$strip>, z.ZodObject<{
51
+ type: z.ZodLiteral<"parquet">;
52
+ path: z.ZodString;
53
+ }, z.core.$strip>, z.ZodObject<{
54
+ type: z.ZodLiteral<"excel">;
55
+ path: z.ZodString;
56
+ sheet: z.ZodOptional<z.ZodString>;
57
+ }, z.core.$strip>, z.ZodObject<{
58
+ type: z.ZodLiteral<"sheets">;
59
+ spreadsheetId: z.ZodString;
60
+ credentialsPath: z.ZodOptional<z.ZodString>;
61
+ sheet: z.ZodOptional<z.ZodString>;
62
+ }, z.core.$strip>, z.ZodObject<{
63
+ type: z.ZodLiteral<"custom">;
64
+ adapter: z.ZodString;
65
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
66
+ }, z.core.$strip>], "type">>;
67
+ destination: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
68
+ type: z.ZodLiteral<"sheets">;
69
+ spreadsheetId: z.ZodOptional<z.ZodString>;
70
+ credentialsPath: z.ZodOptional<z.ZodString>;
71
+ sheet: z.ZodOptional<z.ZodString>;
72
+ }, z.core.$strip>, z.ZodObject<{
73
+ type: z.ZodLiteral<"csv">;
74
+ path: z.ZodString;
75
+ delimiter: z.ZodOptional<z.ZodString>;
76
+ bom: z.ZodOptional<z.ZodBoolean>;
77
+ }, z.core.$strip>, z.ZodObject<{
78
+ type: z.ZodLiteral<"json">;
79
+ path: z.ZodString;
80
+ }, z.core.$strip>, z.ZodObject<{
81
+ type: z.ZodLiteral<"xml">;
82
+ path: z.ZodString;
83
+ root: z.ZodOptional<z.ZodString>;
84
+ record: z.ZodOptional<z.ZodString>;
85
+ }, z.core.$strip>, z.ZodObject<{
86
+ type: z.ZodLiteral<"parquet">;
87
+ path: z.ZodString;
88
+ }, z.core.$strip>, z.ZodObject<{
89
+ type: z.ZodLiteral<"excel">;
90
+ path: z.ZodString;
91
+ sheet: z.ZodOptional<z.ZodString>;
92
+ }, z.core.$strip>, z.ZodObject<{
93
+ type: z.ZodLiteral<"custom">;
94
+ adapter: z.ZodString;
95
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
96
+ }, z.core.$strip>], "type">>;
97
+ tableName: z.ZodOptional<z.ZodString>;
98
+ spreadsheetId: z.ZodOptional<z.ZodString>;
99
+ credentialsPath: z.ZodOptional<z.ZodString>;
100
+ mode: z.ZodEnum<{
101
+ dedupe: "dedupe";
102
+ merge: "merge";
103
+ raw: "raw";
104
+ }>;
105
+ dbHost: z.ZodOptional<z.ZodString>;
106
+ dbPort: z.ZodOptional<z.ZodNumber>;
107
+ dbUser: z.ZodOptional<z.ZodString>;
108
+ dbPassword: z.ZodOptional<z.ZodString>;
109
+ dbName: z.ZodOptional<z.ZodString>;
110
+ dedupeColumn: z.ZodOptional<z.ZodString>;
111
+ dedupeStrategy: z.ZodOptional<z.ZodEnum<{
112
+ "keep-first": "keep-first";
113
+ "keep-last": "keep-last";
114
+ }>>;
115
+ dedupeKeyNormalizer: z.ZodOptional<z.ZodString>;
116
+ mergeKeyColumn: z.ZodOptional<z.ZodString>;
117
+ mergeColumns: z.ZodOptional<z.ZodArray<z.ZodObject<{
118
+ column: z.ZodString;
119
+ strategy: z.ZodEnum<{
120
+ concat: "concat";
121
+ "extra-column": "extra-column";
122
+ overwrite: "overwrite";
123
+ }>;
124
+ separator: z.ZodOptional<z.ZodString>;
125
+ distribute: z.ZodOptional<z.ZodObject<{
126
+ columns: z.ZodArray<z.ZodString>;
127
+ overflowInto: z.ZodOptional<z.ZodString>;
128
+ sources: z.ZodOptional<z.ZodArray<z.ZodString>>;
129
+ }, z.core.$strip>>;
130
+ byGroup: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
131
+ strategy: z.ZodEnum<{
132
+ concat: "concat";
133
+ "extra-column": "extra-column";
134
+ overwrite: "overwrite";
135
+ }>;
136
+ separator: z.ZodOptional<z.ZodString>;
137
+ into: z.ZodOptional<z.ZodString>;
138
+ distribute: z.ZodOptional<z.ZodObject<{
139
+ columns: z.ZodArray<z.ZodString>;
140
+ overflowInto: z.ZodOptional<z.ZodString>;
141
+ sources: z.ZodOptional<z.ZodArray<z.ZodString>>;
142
+ }, z.core.$strip>>;
143
+ }, z.core.$strip>>>;
144
+ unkeyed: z.ZodOptional<z.ZodObject<{
145
+ strategy: z.ZodEnum<{
146
+ "collapse-column": "collapse-column";
147
+ }>;
148
+ into: z.ZodOptional<z.ZodString>;
149
+ separator: z.ZodOptional<z.ZodString>;
150
+ }, z.core.$strip>>;
151
+ }, z.core.$strip>>>;
152
+ mergeEmptyKeyLabel: z.ZodOptional<z.ZodString>;
153
+ mergeRejectedKeyLabel: z.ZodOptional<z.ZodString>;
154
+ mergeKeyNormalizer: z.ZodOptional<z.ZodString>;
155
+ normalizerModules: z.ZodOptional<z.ZodArray<z.ZodString>>;
156
+ adapterModules: z.ZodOptional<z.ZodArray<z.ZodString>>;
157
+ fillEmpty: z.ZodOptional<z.ZodArray<z.ZodObject<{
158
+ column: z.ZodString;
159
+ fallbackColumns: z.ZodOptional<z.ZodArray<z.ZodString>>;
160
+ default: z.ZodOptional<z.ZodString>;
161
+ }, z.core.$strip>>>;
162
+ combineColumns: z.ZodOptional<z.ZodArray<z.ZodObject<{
163
+ into: z.ZodString;
164
+ columns: z.ZodArray<z.ZodString>;
165
+ separator: z.ZodOptional<z.ZodString>;
166
+ keepSources: z.ZodOptional<z.ZodBoolean>;
167
+ }, z.core.$strip>>>;
168
+ validation: z.ZodOptional<z.ZodObject<{
169
+ rules: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
170
+ message: z.ZodOptional<z.ZodString>;
171
+ column: z.ZodString;
172
+ rule: z.ZodLiteral<"required">;
173
+ }, z.core.$strip>, z.ZodObject<{
174
+ message: z.ZodOptional<z.ZodString>;
175
+ column: z.ZodString;
176
+ rule: z.ZodLiteral<"pattern">;
177
+ pattern: z.ZodString;
178
+ flags: z.ZodOptional<z.ZodString>;
179
+ }, z.core.$strip>, z.ZodObject<{
180
+ message: z.ZodOptional<z.ZodString>;
181
+ column: z.ZodString;
182
+ rule: z.ZodLiteral<"oneOf">;
183
+ values: z.ZodArray<z.ZodString>;
184
+ ignoreCase: z.ZodOptional<z.ZodBoolean>;
185
+ }, z.core.$strip>, z.ZodObject<{
186
+ message: z.ZodOptional<z.ZodString>;
187
+ column: z.ZodString;
188
+ rule: z.ZodLiteral<"normalizer">;
189
+ normalizer: z.ZodString;
190
+ }, z.core.$strip>], "rule">>;
191
+ pendingSheet: z.ZodOptional<z.ZodString>;
192
+ reasonColumn: z.ZodOptional<z.ZodString>;
193
+ }, z.core.$strip>>;
194
+ }, z.core.$strip>;
195
+ export type EtlConfig = z.infer<typeof etlConfigSchema>;