@cloudquery/plugin-sdk-javascript
Version:
This is the high-level package to use for developing CloudQuery plugins in JavaScript
54 lines • 2.26 kB
JavaScript
import { Field, Utf8, Int64, Float64, Bool, List } from '@apache-arrow/esnext-esm';
import { TransformError } from '../errors/errors.js';
import { createColumn } from '../schema/column.js';
import { JSONType } from '../types/json.js';
function defaultGetTypeFromValue(key, value) {
switch (typeof value) {
case 'string': {
return new Utf8();
}
case 'number': {
return value % 1 === 0 ? new Int64() : new Float64();
}
case 'boolean': {
return new Bool();
}
case 'object': {
if (Array.isArray(value)) {
if (value.length === 0)
return new JSONType(); // Empty array, can't infer type
// Assuming array of same type, getting type of first element
const elementType = defaultGetTypeFromValue(key + '.element', value[0]);
if (elementType === null)
return new JSONType();
const field = new Field('element', elementType); // 'element' can be any name as it's just for internal representation
return new List(field);
}
else {
return new JSONType();
}
}
default: {
throw new TransformError(`Unsupported type: ${typeof value}`, { props: { value } });
}
}
}
export function objectToColumns(object, { skipColumns = [], primaryKeys = [], getTypeFromValue = defaultGetTypeFromValue, overrides = new Map(), } = {}) {
return Object.entries(object)
.filter(([key]) => !skipColumns.includes(key))
.map(([key, value]) => {
if (overrides.has(key)) {
return overrides.get(key);
}
let type = getTypeFromValue(key, value);
if (type === undefined && getTypeFromValue !== defaultGetTypeFromValue) {
type = defaultGetTypeFromValue(key, value);
}
if (type === null || type === undefined)
return null;
const isPrimaryKey = primaryKeys.includes(key);
return createColumn({ name: key, type, primaryKey: isPrimaryKey });
})
.filter((column) => column !== null); // This is a type-guard
}
//# sourceMappingURL=transform.js.map