@whaly/connector-sdk 0.3.1 → 0.3.3
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/dist/index.d.mts +7 -8
- package/dist/index.d.ts +7 -8
- package/dist/index.js +21 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1550,6 +1550,9 @@ var MissingSchemaError = class extends Error {
|
|
|
1550
1550
|
}
|
|
1551
1551
|
};
|
|
1552
1552
|
|
|
1553
|
+
// src/sdk/models/target/models.ts
|
|
1554
|
+
var DEFAULT_SYNCED_AT_COLUMN = "_wly_synced_at";
|
|
1555
|
+
|
|
1553
1556
|
// src/sdk/models/target/record.ts
|
|
1554
1557
|
var removeParasiteProperties = (record, schema) => {
|
|
1555
1558
|
const schemaKeys = Object.keys(schema);
|
|
@@ -1560,10 +1563,10 @@ var removeParasiteProperties = (record, schema) => {
|
|
|
1560
1563
|
});
|
|
1561
1564
|
return record;
|
|
1562
1565
|
};
|
|
1563
|
-
var addWhalyFields = (record, batchDate) => {
|
|
1566
|
+
var addWhalyFields = (record, batchDate, columnName = DEFAULT_SYNCED_AT_COLUMN) => {
|
|
1564
1567
|
return {
|
|
1565
1568
|
...record,
|
|
1566
|
-
|
|
1569
|
+
[columnName]: batchDate
|
|
1567
1570
|
};
|
|
1568
1571
|
};
|
|
1569
1572
|
|
|
@@ -1832,6 +1835,7 @@ import Bluebird3 from "bluebird";
|
|
|
1832
1835
|
var semaphore = new Semaphore(1);
|
|
1833
1836
|
var ITarget = class _ITarget {
|
|
1834
1837
|
config;
|
|
1838
|
+
syncedAtColumnName;
|
|
1835
1839
|
schemaHooks;
|
|
1836
1840
|
syncTime;
|
|
1837
1841
|
stateProvider;
|
|
@@ -1847,6 +1851,7 @@ var ITarget = class _ITarget {
|
|
|
1847
1851
|
ajv;
|
|
1848
1852
|
constructor(config, stateProvider) {
|
|
1849
1853
|
this.config = config;
|
|
1854
|
+
this.syncedAtColumnName = config.syncedAtColumnName ?? DEFAULT_SYNCED_AT_COLUMN;
|
|
1850
1855
|
this.stateProvider = stateProvider;
|
|
1851
1856
|
this.schemaHooks = [];
|
|
1852
1857
|
this.streams = {};
|
|
@@ -1867,8 +1872,8 @@ var ITarget = class _ITarget {
|
|
|
1867
1872
|
analyzeSchemaChanges = (previousSchema, newSchema, streamId) => {
|
|
1868
1873
|
const changes = [];
|
|
1869
1874
|
let hasBreakingChanges = false;
|
|
1870
|
-
const prevColumns = new Set(Object.keys(previousSchema).filter((col) =>
|
|
1871
|
-
const newColumns = new Set(Object.keys(newSchema).filter((col) =>
|
|
1875
|
+
const prevColumns = new Set(Object.keys(previousSchema).filter((col) => col !== this.syncedAtColumnName));
|
|
1876
|
+
const newColumns = new Set(Object.keys(newSchema).filter((col) => col !== this.syncedAtColumnName));
|
|
1872
1877
|
for (const columnName of newColumns) {
|
|
1873
1878
|
if (!prevColumns.has(columnName)) {
|
|
1874
1879
|
changes.push(`Added column '${columnName}'`);
|
|
@@ -1926,7 +1931,7 @@ var ITarget = class _ITarget {
|
|
|
1926
1931
|
return;
|
|
1927
1932
|
}
|
|
1928
1933
|
const recordWithoutParasiteProperties = removeParasiteProperties(record, schema);
|
|
1929
|
-
const recordWithWhalyFields = addWhalyFields(recordWithoutParasiteProperties, stream.getBatchDate());
|
|
1934
|
+
const recordWithWhalyFields = addWhalyFields(recordWithoutParasiteProperties, stream.getBatchDate(), this.syncedAtColumnName);
|
|
1930
1935
|
const validateFn = stream.getCompiledValidateFn();
|
|
1931
1936
|
if (validateFn && !validateFn(recordWithWhalyFields)) {
|
|
1932
1937
|
throw new SchemaValidationError(`Stream: ${streamId} - Record is not valid according to schema.
|
|
@@ -2009,7 +2014,7 @@ var ITarget = class _ITarget {
|
|
|
2009
2014
|
throw new MissingSchemaError(`Stream: ${streamId} - Received SCHEMA message before stream state was initialized.`, streamId);
|
|
2010
2015
|
}
|
|
2011
2016
|
const schema = flattenSchema(streamId, message.schema);
|
|
2012
|
-
schema[
|
|
2017
|
+
schema[this.syncedAtColumnName] = {
|
|
2013
2018
|
format: "date-time",
|
|
2014
2019
|
type: ["null", "string"]
|
|
2015
2020
|
};
|
|
@@ -2305,10 +2310,10 @@ var extractSingleSheetRows = async (fileName, conf) => {
|
|
|
2305
2310
|
if (!variables) {
|
|
2306
2311
|
throw new Error(`No variables extracted from filename, cannot extract derived field ${key}`);
|
|
2307
2312
|
}
|
|
2308
|
-
acc[key] = variables[column.variableName] ||
|
|
2313
|
+
acc[key] = variables[column.variableName] || null;
|
|
2309
2314
|
} else {
|
|
2310
2315
|
const colIndex = excelColumnToIndex(column.column);
|
|
2311
|
-
acc[key] = row[colIndex]?.v ||
|
|
2316
|
+
acc[key] = row[colIndex]?.v || null;
|
|
2312
2317
|
}
|
|
2313
2318
|
return acc;
|
|
2314
2319
|
}, {});
|
|
@@ -2514,7 +2519,6 @@ async function* rowGeneratorFromCsv(path2, fileConfig) {
|
|
|
2514
2519
|
csvOptions.headers = false;
|
|
2515
2520
|
}
|
|
2516
2521
|
const csvStream = csv(csvOptions);
|
|
2517
|
-
const syncedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
2518
2522
|
let initialReadStream;
|
|
2519
2523
|
let finalInputStream;
|
|
2520
2524
|
const encodingToUse = fileConfig.encoding ? fileConfig.encoding.toLowerCase() : null;
|
|
@@ -2529,20 +2533,22 @@ async function* rowGeneratorFromCsv(path2, fileConfig) {
|
|
|
2529
2533
|
try {
|
|
2530
2534
|
for await (const row of Readable.from(csvStream)) {
|
|
2531
2535
|
if (!isGeneratorConfigArray) {
|
|
2532
|
-
const rowData =
|
|
2536
|
+
const rowData = {};
|
|
2533
2537
|
for (const key of configKeys) {
|
|
2534
2538
|
const keyGenerator = fileConfig.fields[key.trim()];
|
|
2535
2539
|
if (!keyGenerator) continue;
|
|
2536
|
-
|
|
2540
|
+
const rawValue = keyGenerator.valueTransformer ? keyGenerator.valueTransformer(row[key]) : row[key];
|
|
2541
|
+
rowData[keyGenerator.key] = rawValue === "" ? null : rawValue;
|
|
2537
2542
|
}
|
|
2538
2543
|
yield rowData;
|
|
2539
2544
|
} else {
|
|
2540
2545
|
const rowKeys = Object.keys(row);
|
|
2541
|
-
const rowData =
|
|
2546
|
+
const rowData = {};
|
|
2542
2547
|
for (let i = 0; i < rowKeys.length; i++) {
|
|
2543
2548
|
const keyGenerator = fileConfig.fields[i];
|
|
2544
2549
|
if (!keyGenerator) continue;
|
|
2545
|
-
|
|
2550
|
+
const rawValue = keyGenerator.valueTransformer ? keyGenerator.valueTransformer(row[i]) : row[i];
|
|
2551
|
+
rowData[keyGenerator.key] = rawValue === "" ? null : rawValue;
|
|
2546
2552
|
}
|
|
2547
2553
|
yield rowData;
|
|
2548
2554
|
}
|
|
@@ -2840,7 +2846,6 @@ async function processFileStreams(entries, tapState, target) {
|
|
|
2840
2846
|
var CsvExtractionConfigBuilder = class _CsvExtractionConfigBuilder {
|
|
2841
2847
|
_separator = ",";
|
|
2842
2848
|
_encoding;
|
|
2843
|
-
_addSyncedAtColumn;
|
|
2844
2849
|
_fields;
|
|
2845
2850
|
_fieldsMode;
|
|
2846
2851
|
_replicationMethod;
|
|
@@ -2856,10 +2861,6 @@ var CsvExtractionConfigBuilder = class _CsvExtractionConfigBuilder {
|
|
|
2856
2861
|
this._encoding = enc;
|
|
2857
2862
|
return this;
|
|
2858
2863
|
}
|
|
2859
|
-
addSyncedAtColumn(enabled = true) {
|
|
2860
|
-
this._addSyncedAtColumn = enabled;
|
|
2861
|
-
return this;
|
|
2862
|
-
}
|
|
2863
2864
|
fieldsFromDict(mapping) {
|
|
2864
2865
|
if (this._fieldsMode === "array") {
|
|
2865
2866
|
throw new Error("Cannot use fieldsFromDict after fieldsFromArray");
|
|
@@ -2901,9 +2902,6 @@ var CsvExtractionConfigBuilder = class _CsvExtractionConfigBuilder {
|
|
|
2901
2902
|
if (this._encoding !== void 0) {
|
|
2902
2903
|
config.encoding = this._encoding;
|
|
2903
2904
|
}
|
|
2904
|
-
if (this._addSyncedAtColumn !== void 0) {
|
|
2905
|
-
config.addSyncedAtColumn = this._addSyncedAtColumn;
|
|
2906
|
-
}
|
|
2907
2905
|
return config;
|
|
2908
2906
|
}
|
|
2909
2907
|
buildStreamConfig(streamId) {
|
|
@@ -3789,6 +3787,7 @@ export {
|
|
|
3789
3787
|
CounterMetric,
|
|
3790
3788
|
CsvExtractionConfigBuilder,
|
|
3791
3789
|
DEFAULT_MAX_CONCURRENT_STREAMS,
|
|
3790
|
+
DEFAULT_SYNCED_AT_COLUMN,
|
|
3792
3791
|
EXECUTION_TIME_METRIC_NAME,
|
|
3793
3792
|
ExcelExtractionConfigBuilder,
|
|
3794
3793
|
FileFormat,
|