@frictionless-ts/table 1.0.1
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/LICENSE.md +9 -0
- package/README.md +3 -0
- package/build/assets/geojson.json +216 -0
- package/build/assets/topojson.json +259 -0
- package/build/data/index.d.ts +2 -0
- package/build/data/index.js +2 -0
- package/build/data/record.d.ts +4 -0
- package/build/data/record.js +84 -0
- package/build/data/record.spec.d.ts +1 -0
- package/build/data/record.spec.js +269 -0
- package/build/dialect/Options.d.ts +3 -0
- package/build/dialect/Options.js +3 -0
- package/build/dialect/index.d.ts +2 -0
- package/build/dialect/index.js +2 -0
- package/build/dialect/infer.d.ts +4 -0
- package/build/dialect/infer.js +2 -0
- package/build/field/Field.d.ts +5 -0
- package/build/field/Field.js +2 -0
- package/build/field/Mapping.d.ts +11 -0
- package/build/field/Mapping.js +2 -0
- package/build/field/checks/enum.d.ts +8 -0
- package/build/field/checks/enum.js +71 -0
- package/build/field/checks/enum.spec.d.ts +1 -0
- package/build/field/checks/enum.spec.js +327 -0
- package/build/field/checks/maxLength.d.ts +7 -0
- package/build/field/checks/maxLength.js +17 -0
- package/build/field/checks/maxLength.spec.d.ts +1 -0
- package/build/field/checks/maxLength.spec.js +49 -0
- package/build/field/checks/maximum.d.ts +11 -0
- package/build/field/checks/maximum.js +73 -0
- package/build/field/checks/maximum.spec.d.ts +1 -0
- package/build/field/checks/maximum.spec.js +476 -0
- package/build/field/checks/minLength.d.ts +7 -0
- package/build/field/checks/minLength.js +17 -0
- package/build/field/checks/minLength.spec.d.ts +1 -0
- package/build/field/checks/minLength.spec.js +56 -0
- package/build/field/checks/minimum.d.ts +11 -0
- package/build/field/checks/minimum.js +73 -0
- package/build/field/checks/minimum.spec.d.ts +1 -0
- package/build/field/checks/minimum.spec.js +476 -0
- package/build/field/checks/pattern.d.ts +7 -0
- package/build/field/checks/pattern.js +17 -0
- package/build/field/checks/pattern.spec.d.ts +1 -0
- package/build/field/checks/pattern.spec.js +66 -0
- package/build/field/checks/required.d.ts +7 -0
- package/build/field/checks/required.js +14 -0
- package/build/field/checks/required.spec.d.ts +1 -0
- package/build/field/checks/required.spec.js +24 -0
- package/build/field/checks/type.d.ts +7 -0
- package/build/field/checks/type.js +14 -0
- package/build/field/checks/type.spec.d.ts +1 -0
- package/build/field/checks/type.spec.js +255 -0
- package/build/field/checks/unique.d.ts +7 -0
- package/build/field/checks/unique.js +17 -0
- package/build/field/checks/unique.spec.d.ts +1 -0
- package/build/field/checks/unique.spec.js +97 -0
- package/build/field/denormalize.d.ts +6 -0
- package/build/field/denormalize.js +13 -0
- package/build/field/desubstitute.d.ts +3 -0
- package/build/field/desubstitute.js +13 -0
- package/build/field/index.d.ts +8 -0
- package/build/field/index.js +6 -0
- package/build/field/inspect.d.ts +6 -0
- package/build/field/inspect.js +131 -0
- package/build/field/inspect.spec.d.ts +1 -0
- package/build/field/inspect.spec.js +385 -0
- package/build/field/narrow.d.ts +3 -0
- package/build/field/narrow.js +14 -0
- package/build/field/narrow.spec.d.ts +1 -0
- package/build/field/narrow.spec.js +52 -0
- package/build/field/normalize.d.ts +5 -0
- package/build/field/normalize.js +14 -0
- package/build/field/parse.d.ts +3 -0
- package/build/field/parse.js +47 -0
- package/build/field/parse.spec.d.ts +1 -0
- package/build/field/parse.spec.js +33 -0
- package/build/field/stringify.d.ts +3 -0
- package/build/field/stringify.js +43 -0
- package/build/field/stringify.spec.d.ts +1 -0
- package/build/field/stringify.spec.js +41 -0
- package/build/field/substitute.d.ts +3 -0
- package/build/field/substitute.js +16 -0
- package/build/field/types/array.d.ts +3 -0
- package/build/field/types/array.js +5 -0
- package/build/field/types/array.spec.d.ts +1 -0
- package/build/field/types/array.spec.js +358 -0
- package/build/field/types/boolean.d.ts +4 -0
- package/build/field/types/boolean.js +31 -0
- package/build/field/types/boolean.spec.d.ts +1 -0
- package/build/field/types/boolean.spec.js +76 -0
- package/build/field/types/date.d.ts +4 -0
- package/build/field/types/date.js +14 -0
- package/build/field/types/date.spec.d.ts +1 -0
- package/build/field/types/date.spec.js +52 -0
- package/build/field/types/datetime.d.ts +4 -0
- package/build/field/types/datetime.js +15 -0
- package/build/field/types/datetime.spec.d.ts +1 -0
- package/build/field/types/datetime.spec.js +62 -0
- package/build/field/types/duration.d.ts +4 -0
- package/build/field/types/duration.js +9 -0
- package/build/field/types/duration.spec.d.ts +1 -0
- package/build/field/types/duration.spec.js +37 -0
- package/build/field/types/geojson.d.ts +3 -0
- package/build/field/types/geojson.js +9 -0
- package/build/field/types/geojson.spec.d.ts +1 -0
- package/build/field/types/geojson.spec.js +522 -0
- package/build/field/types/geopoint.d.ts +4 -0
- package/build/field/types/geopoint.js +59 -0
- package/build/field/types/geopoint.spec.d.ts +1 -0
- package/build/field/types/geopoint.spec.js +173 -0
- package/build/field/types/integer.d.ts +4 -0
- package/build/field/types/integer.js +41 -0
- package/build/field/types/integer.spec.d.ts +1 -0
- package/build/field/types/integer.spec.js +102 -0
- package/build/field/types/json.d.ts +6 -0
- package/build/field/types/json.js +68 -0
- package/build/field/types/list.d.ts +4 -0
- package/build/field/types/list.js +30 -0
- package/build/field/types/list.spec.d.ts +1 -0
- package/build/field/types/list.spec.js +230 -0
- package/build/field/types/number.d.ts +4 -0
- package/build/field/types/number.js +50 -0
- package/build/field/types/number.spec.d.ts +1 -0
- package/build/field/types/number.spec.js +101 -0
- package/build/field/types/object.d.ts +3 -0
- package/build/field/types/object.js +5 -0
- package/build/field/types/object.spec.d.ts +1 -0
- package/build/field/types/object.spec.js +393 -0
- package/build/field/types/string.d.ts +4 -0
- package/build/field/types/string.js +32 -0
- package/build/field/types/string.spec.d.ts +1 -0
- package/build/field/types/string.spec.js +162 -0
- package/build/field/types/time.d.ts +4 -0
- package/build/field/types/time.js +18 -0
- package/build/field/types/time.spec.d.ts +1 -0
- package/build/field/types/time.spec.js +53 -0
- package/build/field/types/year.d.ts +4 -0
- package/build/field/types/year.js +16 -0
- package/build/field/types/year.spec.d.ts +1 -0
- package/build/field/types/year.spec.js +50 -0
- package/build/field/types/yearmonth.d.ts +4 -0
- package/build/field/types/yearmonth.js +14 -0
- package/build/field/types/yearmonth.spec.d.ts +1 -0
- package/build/field/types/yearmonth.spec.js +36 -0
- package/build/helpers.d.ts +4 -0
- package/build/helpers.js +12 -0
- package/build/index.d.ts +40 -0
- package/build/index.js +27 -0
- package/build/plugin.d.ts +27 -0
- package/build/plugin.js +2 -0
- package/build/plugins/arrow/index.d.ts +2 -0
- package/build/plugins/arrow/index.js +3 -0
- package/build/plugins/arrow/plugin.d.ts +7 -0
- package/build/plugins/arrow/plugin.js +22 -0
- package/build/plugins/arrow/plugin.spec.d.ts +1 -0
- package/build/plugins/arrow/plugin.spec.js +161 -0
- package/build/plugins/arrow/table/index.d.ts +2 -0
- package/build/plugins/arrow/table/index.js +3 -0
- package/build/plugins/arrow/table/load.d.ts +4 -0
- package/build/plugins/arrow/table/load.js +23 -0
- package/build/plugins/arrow/table/load.spec.d.ts +1 -0
- package/build/plugins/arrow/table/load.spec.js +56 -0
- package/build/plugins/arrow/table/save.d.ts +3 -0
- package/build/plugins/arrow/table/save.js +31 -0
- package/build/plugins/arrow/table/save.spec.d.ts +1 -0
- package/build/plugins/arrow/table/save.spec.js +81 -0
- package/build/plugins/csv/dialect/index.d.ts +1 -0
- package/build/plugins/csv/dialect/index.js +2 -0
- package/build/plugins/csv/dialect/infer.d.ts +4 -0
- package/build/plugins/csv/dialect/infer.js +44 -0
- package/build/plugins/csv/dialect/infer.spec.d.ts +1 -0
- package/build/plugins/csv/dialect/infer.spec.js +54 -0
- package/build/plugins/csv/index.d.ts +2 -0
- package/build/plugins/csv/index.js +3 -0
- package/build/plugins/csv/plugin.d.ts +8 -0
- package/build/plugins/csv/plugin.js +22 -0
- package/build/plugins/csv/plugin.spec.d.ts +1 -0
- package/build/plugins/csv/plugin.spec.js +161 -0
- package/build/plugins/csv/table/index.d.ts +2 -0
- package/build/plugins/csv/table/index.js +3 -0
- package/build/plugins/csv/table/load.d.ts +6 -0
- package/build/plugins/csv/table/load.js +86 -0
- package/build/plugins/csv/table/load.spec.d.ts +1 -0
- package/build/plugins/csv/table/load.spec.js +293 -0
- package/build/plugins/csv/table/save.d.ts +5 -0
- package/build/plugins/csv/table/save.js +29 -0
- package/build/plugins/csv/table/save.spec.d.ts +1 -0
- package/build/plugins/csv/table/save.spec.js +137 -0
- package/build/plugins/inline/index.d.ts +2 -0
- package/build/plugins/inline/index.js +3 -0
- package/build/plugins/inline/plugin.d.ts +7 -0
- package/build/plugins/inline/plugin.js +14 -0
- package/build/plugins/inline/table/index.d.ts +1 -0
- package/build/plugins/inline/table/index.js +2 -0
- package/build/plugins/inline/table/load.d.ts +6 -0
- package/build/plugins/inline/table/load.js +24 -0
- package/build/plugins/inline/table/load.spec.d.ts +1 -0
- package/build/plugins/inline/table/load.spec.js +160 -0
- package/build/plugins/json/buffer/decode.d.ts +4 -0
- package/build/plugins/json/buffer/decode.js +10 -0
- package/build/plugins/json/buffer/encode.d.ts +4 -0
- package/build/plugins/json/buffer/encode.js +8 -0
- package/build/plugins/json/buffer/index.d.ts +2 -0
- package/build/plugins/json/buffer/index.js +3 -0
- package/build/plugins/json/index.d.ts +2 -0
- package/build/plugins/json/index.js +3 -0
- package/build/plugins/json/plugin.d.ts +7 -0
- package/build/plugins/json/plugin.js +25 -0
- package/build/plugins/json/plugin.spec.d.ts +1 -0
- package/build/plugins/json/plugin.spec.js +163 -0
- package/build/plugins/json/table/index.d.ts +2 -0
- package/build/plugins/json/table/index.js +3 -0
- package/build/plugins/json/table/load.d.ts +6 -0
- package/build/plugins/json/table/load.js +55 -0
- package/build/plugins/json/table/load.spec.d.ts +1 -0
- package/build/plugins/json/table/load.spec.js +200 -0
- package/build/plugins/json/table/parse.d.ts +3 -0
- package/build/plugins/json/table/parse.js +6 -0
- package/build/plugins/json/table/save.d.ts +5 -0
- package/build/plugins/json/table/save.js +45 -0
- package/build/plugins/json/table/save.spec.d.ts +1 -0
- package/build/plugins/json/table/save.spec.js +147 -0
- package/build/plugins/ods/index.d.ts +2 -0
- package/build/plugins/ods/index.js +3 -0
- package/build/plugins/ods/plugin.d.ts +7 -0
- package/build/plugins/ods/plugin.js +23 -0
- package/build/plugins/ods/plugin.spec.d.ts +1 -0
- package/build/plugins/ods/plugin.spec.js +142 -0
- package/build/plugins/ods/table/index.d.ts +2 -0
- package/build/plugins/ods/table/index.js +3 -0
- package/build/plugins/ods/table/load.d.ts +4 -0
- package/build/plugins/ods/table/load.js +41 -0
- package/build/plugins/ods/table/load.spec.d.ts +1 -0
- package/build/plugins/ods/table/load.spec.js +167 -0
- package/build/plugins/ods/table/save.d.ts +3 -0
- package/build/plugins/ods/table/save.js +26 -0
- package/build/plugins/ods/table/save.spec.d.ts +1 -0
- package/build/plugins/ods/table/save.spec.js +75 -0
- package/build/plugins/ods/table/test.d.ts +5 -0
- package/build/plugins/ods/table/test.js +23 -0
- package/build/plugins/parquet/index.d.ts +2 -0
- package/build/plugins/parquet/index.js +3 -0
- package/build/plugins/parquet/plugin.d.ts +7 -0
- package/build/plugins/parquet/plugin.js +23 -0
- package/build/plugins/parquet/plugin.spec.d.ts +1 -0
- package/build/plugins/parquet/plugin.spec.js +142 -0
- package/build/plugins/parquet/table/index.d.ts +2 -0
- package/build/plugins/parquet/table/index.js +3 -0
- package/build/plugins/parquet/table/load.d.ts +4 -0
- package/build/plugins/parquet/table/load.js +23 -0
- package/build/plugins/parquet/table/load.spec.d.ts +1 -0
- package/build/plugins/parquet/table/load.spec.js +56 -0
- package/build/plugins/parquet/table/save.d.ts +3 -0
- package/build/plugins/parquet/table/save.js +32 -0
- package/build/plugins/parquet/table/save.spec.d.ts +1 -0
- package/build/plugins/parquet/table/save.spec.js +81 -0
- package/build/plugins/xlxs/index.d.ts +2 -0
- package/build/plugins/xlxs/index.js +3 -0
- package/build/plugins/xlxs/plugin.d.ts +7 -0
- package/build/plugins/xlxs/plugin.js +23 -0
- package/build/plugins/xlxs/plugin.spec.d.ts +1 -0
- package/build/plugins/xlxs/plugin.spec.js +142 -0
- package/build/plugins/xlxs/table/index.d.ts +2 -0
- package/build/plugins/xlxs/table/index.js +3 -0
- package/build/plugins/xlxs/table/load.d.ts +4 -0
- package/build/plugins/xlxs/table/load.js +43 -0
- package/build/plugins/xlxs/table/load.spec.d.ts +1 -0
- package/build/plugins/xlxs/table/load.spec.js +167 -0
- package/build/plugins/xlxs/table/save.d.ts +3 -0
- package/build/plugins/xlxs/table/save.js +28 -0
- package/build/plugins/xlxs/table/save.spec.d.ts +1 -0
- package/build/plugins/xlxs/table/save.spec.js +75 -0
- package/build/plugins/xlxs/table/test.d.ts +5 -0
- package/build/plugins/xlxs/table/test.js +23 -0
- package/build/schema/Mapping.d.ts +6 -0
- package/build/schema/Mapping.js +2 -0
- package/build/schema/Options.d.ts +22 -0
- package/build/schema/Options.js +2 -0
- package/build/schema/Schema.d.ts +4 -0
- package/build/schema/Schema.js +2 -0
- package/build/schema/helpers.d.ts +3 -0
- package/build/schema/helpers.js +6 -0
- package/build/schema/index.d.ts +8 -0
- package/build/schema/index.js +5 -0
- package/build/schema/infer.d.ts +13 -0
- package/build/schema/infer.js +199 -0
- package/build/schema/infer.spec.d.ts +1 -0
- package/build/schema/infer.spec.js +304 -0
- package/build/schema/match.d.ts +6 -0
- package/build/schema/match.js +8 -0
- package/build/table/Frame.d.ts +2 -0
- package/build/table/Frame.js +2 -0
- package/build/table/Table.d.ts +2 -0
- package/build/table/Table.js +2 -0
- package/build/table/checks/unique.d.ts +7 -0
- package/build/table/checks/unique.js +23 -0
- package/build/table/checks/unique.spec.d.ts +1 -0
- package/build/table/checks/unique.spec.js +187 -0
- package/build/table/denormalize.d.ts +6 -0
- package/build/table/denormalize.js +15 -0
- package/build/table/helpers.d.ts +19 -0
- package/build/table/helpers.js +62 -0
- package/build/table/helpers.spec.d.ts +1 -0
- package/build/table/helpers.spec.js +352 -0
- package/build/table/index.d.ts +9 -0
- package/build/table/index.js +8 -0
- package/build/table/inspect.d.ts +8 -0
- package/build/table/inspect.js +165 -0
- package/build/table/inspect.spec.d.ts +1 -0
- package/build/table/inspect.spec.js +335 -0
- package/build/table/normalize.d.ts +6 -0
- package/build/table/normalize.js +27 -0
- package/build/table/normalize.spec.d.ts +1 -0
- package/build/table/normalize.spec.js +222 -0
- package/build/table/query.d.ts +3 -0
- package/build/table/query.js +6 -0
- package/package.json +45 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from "./table/index.js";
|
|
2
|
+
export * from "./plugin.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2Nzdi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFBO0FBQ2hDLGNBQWMsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luLnRzXCJcbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { LoadTableOptions, SaveTableOptions } from "../../plugin.ts";
|
|
3
|
+
import type { TablePlugin } from "../../plugin.ts";
|
|
4
|
+
import type { Table } from "../../table/index.ts";
|
|
5
|
+
export declare class CsvPlugin implements TablePlugin {
|
|
6
|
+
loadTable(resource: Partial<Resource>, options?: LoadTableOptions): Promise<import("nodejs-polars").LazyDataFrame<any> | undefined>;
|
|
7
|
+
saveTable(table: Table, options: SaveTableOptions): Promise<string | undefined>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { inferFormat } from "@frictionless-ts/metadata";
|
|
2
|
+
import { loadCsvTable, saveCsvTable } from "./table/index.js";
|
|
3
|
+
export class CsvPlugin {
|
|
4
|
+
async loadTable(resource, options) {
|
|
5
|
+
const csvFormat = getCsvFormat(resource);
|
|
6
|
+
if (!csvFormat)
|
|
7
|
+
return undefined;
|
|
8
|
+
return await loadCsvTable({ ...resource, format: csvFormat }, options);
|
|
9
|
+
}
|
|
10
|
+
async saveTable(table, options) {
|
|
11
|
+
const { path, format } = options;
|
|
12
|
+
const csvFormat = getCsvFormat({ path, format });
|
|
13
|
+
if (!csvFormat)
|
|
14
|
+
return undefined;
|
|
15
|
+
return await saveCsvTable(table, { ...options, format: csvFormat });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function getCsvFormat(resource) {
|
|
19
|
+
const format = inferFormat(resource);
|
|
20
|
+
return format === "csv" || format === "tsv" ? format : undefined;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy9jc3YvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUl2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTdELE1BQU0sT0FBTyxTQUFTO0lBQ3BCLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBMkIsRUFBRSxPQUEwQjtRQUNyRSxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUVoQyxPQUFPLE1BQU0sWUFBWSxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQVksRUFBRSxPQUF5QjtRQUNyRCxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQTtRQUVoQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNoRCxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFBO1FBRWhDLE9BQU8sTUFBTSxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDckUsQ0FBQztDQUNGO0FBRUQsU0FBUyxZQUFZLENBQUMsUUFBMkI7SUFDL0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3BDLE9BQU8sTUFBTSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGluZmVyRm9ybWF0IH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBMb2FkVGFibGVPcHRpb25zLCBTYXZlVGFibGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3BsdWdpbi50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlUGx1Z2luIH0gZnJvbSBcIi4uLy4uL3BsdWdpbi50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IGxvYWRDc3ZUYWJsZSwgc2F2ZUNzdlRhYmxlIH0gZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuXG5leHBvcnQgY2xhc3MgQ3N2UGx1Z2luIGltcGxlbWVudHMgVGFibGVQbHVnaW4ge1xuICBhc3luYyBsb2FkVGFibGUocmVzb3VyY2U6IFBhcnRpYWw8UmVzb3VyY2U+LCBvcHRpb25zPzogTG9hZFRhYmxlT3B0aW9ucykge1xuICAgIGNvbnN0IGNzdkZvcm1hdCA9IGdldENzdkZvcm1hdChyZXNvdXJjZSlcbiAgICBpZiAoIWNzdkZvcm1hdCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRDc3ZUYWJsZSh7IC4uLnJlc291cmNlLCBmb3JtYXQ6IGNzdkZvcm1hdCB9LCBvcHRpb25zKVxuICB9XG5cbiAgYXN5bmMgc2F2ZVRhYmxlKHRhYmxlOiBUYWJsZSwgb3B0aW9uczogU2F2ZVRhYmxlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgcGF0aCwgZm9ybWF0IH0gPSBvcHRpb25zXG5cbiAgICBjb25zdCBjc3ZGb3JtYXQgPSBnZXRDc3ZGb3JtYXQoeyBwYXRoLCBmb3JtYXQgfSlcbiAgICBpZiAoIWNzdkZvcm1hdCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIGF3YWl0IHNhdmVDc3ZUYWJsZSh0YWJsZSwgeyAuLi5vcHRpb25zLCBmb3JtYXQ6IGNzdkZvcm1hdCB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldENzdkZvcm1hdChyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgY29uc3QgZm9ybWF0ID0gaW5mZXJGb3JtYXQocmVzb3VyY2UpXG4gIHJldHVybiBmb3JtYXQgPT09IFwiY3N2XCIgfHwgZm9ybWF0ID09PSBcInRzdlwiID8gZm9ybWF0IDogdW5kZWZpbmVkXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { CsvPlugin } from "./plugin.js";
|
|
4
|
+
import * as tableModule from "./table/index.js";
|
|
5
|
+
vi.mock("./table/index.ts", () => ({
|
|
6
|
+
loadCsvTable: vi.fn(),
|
|
7
|
+
saveCsvTable: vi.fn(),
|
|
8
|
+
}));
|
|
9
|
+
describe("CsvPlugin", () => {
|
|
10
|
+
let plugin;
|
|
11
|
+
let mockLoadCsvTable;
|
|
12
|
+
let mockSaveCsvTable;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
plugin = new CsvPlugin();
|
|
15
|
+
mockLoadCsvTable = vi.mocked(tableModule.loadCsvTable);
|
|
16
|
+
mockSaveCsvTable = vi.mocked(tableModule.saveCsvTable);
|
|
17
|
+
vi.clearAllMocks();
|
|
18
|
+
});
|
|
19
|
+
describe("loadTable", () => {
|
|
20
|
+
it("should load table from csv file", async () => {
|
|
21
|
+
const resource = {
|
|
22
|
+
path: "test.csv",
|
|
23
|
+
};
|
|
24
|
+
const mockTable = pl.DataFrame().lazy();
|
|
25
|
+
mockLoadCsvTable.mockResolvedValue(mockTable);
|
|
26
|
+
const result = await plugin.loadTable(resource);
|
|
27
|
+
expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "csv" }, undefined);
|
|
28
|
+
expect(result).toEqual(mockTable);
|
|
29
|
+
});
|
|
30
|
+
it("should load table from tsv file", async () => {
|
|
31
|
+
const resource = {
|
|
32
|
+
path: "test.tsv",
|
|
33
|
+
};
|
|
34
|
+
const mockTable = pl.DataFrame().lazy();
|
|
35
|
+
mockLoadCsvTable.mockResolvedValue(mockTable);
|
|
36
|
+
const result = await plugin.loadTable(resource);
|
|
37
|
+
expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "tsv" }, undefined);
|
|
38
|
+
expect(result).toEqual(mockTable);
|
|
39
|
+
});
|
|
40
|
+
it("should return undefined for non-csv files", async () => {
|
|
41
|
+
const resource = {
|
|
42
|
+
path: "test.json",
|
|
43
|
+
};
|
|
44
|
+
const result = await plugin.loadTable(resource);
|
|
45
|
+
expect(mockLoadCsvTable).not.toHaveBeenCalled();
|
|
46
|
+
expect(result).toBeUndefined();
|
|
47
|
+
});
|
|
48
|
+
it("should handle explicit format specification", async () => {
|
|
49
|
+
const resource = {
|
|
50
|
+
path: "test.txt",
|
|
51
|
+
format: "csv",
|
|
52
|
+
};
|
|
53
|
+
const mockTable = pl.DataFrame().lazy();
|
|
54
|
+
mockLoadCsvTable.mockResolvedValue(mockTable);
|
|
55
|
+
const result = await plugin.loadTable(resource);
|
|
56
|
+
expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "csv" }, undefined);
|
|
57
|
+
expect(result).toEqual(mockTable);
|
|
58
|
+
});
|
|
59
|
+
it("should pass through load options", async () => {
|
|
60
|
+
const resource = {
|
|
61
|
+
path: "test.csv",
|
|
62
|
+
};
|
|
63
|
+
const options = { denormalized: true };
|
|
64
|
+
const mockTable = pl.DataFrame().lazy();
|
|
65
|
+
mockLoadCsvTable.mockResolvedValue(mockTable);
|
|
66
|
+
await plugin.loadTable(resource, options);
|
|
67
|
+
expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "csv" }, options);
|
|
68
|
+
});
|
|
69
|
+
it("should handle paths with directories", async () => {
|
|
70
|
+
const resource = {
|
|
71
|
+
path: "/path/to/data.csv",
|
|
72
|
+
};
|
|
73
|
+
const mockTable = pl.DataFrame().lazy();
|
|
74
|
+
mockLoadCsvTable.mockResolvedValue(mockTable);
|
|
75
|
+
await plugin.loadTable(resource);
|
|
76
|
+
expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "csv" }, undefined);
|
|
77
|
+
});
|
|
78
|
+
it("should handle explicit tsv format specification", async () => {
|
|
79
|
+
const resource = {
|
|
80
|
+
path: "test.txt",
|
|
81
|
+
format: "tsv",
|
|
82
|
+
};
|
|
83
|
+
const mockTable = pl.DataFrame().lazy();
|
|
84
|
+
mockLoadCsvTable.mockResolvedValue(mockTable);
|
|
85
|
+
const result = await plugin.loadTable(resource);
|
|
86
|
+
expect(mockLoadCsvTable).toHaveBeenCalledWith({ ...resource, format: "tsv" }, undefined);
|
|
87
|
+
expect(result).toEqual(mockTable);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe("saveTable", () => {
|
|
91
|
+
it("should save table to csv file", async () => {
|
|
92
|
+
const table = pl.DataFrame().lazy();
|
|
93
|
+
const options = { path: "output.csv" };
|
|
94
|
+
mockSaveCsvTable.mockResolvedValue("output.csv");
|
|
95
|
+
const result = await plugin.saveTable(table, options);
|
|
96
|
+
expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
|
|
97
|
+
...options,
|
|
98
|
+
format: "csv",
|
|
99
|
+
});
|
|
100
|
+
expect(result).toBe("output.csv");
|
|
101
|
+
});
|
|
102
|
+
it("should save table to tsv file", async () => {
|
|
103
|
+
const table = pl.DataFrame().lazy();
|
|
104
|
+
const options = { path: "output.tsv" };
|
|
105
|
+
mockSaveCsvTable.mockResolvedValue("output.tsv");
|
|
106
|
+
const result = await plugin.saveTable(table, options);
|
|
107
|
+
expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
|
|
108
|
+
...options,
|
|
109
|
+
format: "tsv",
|
|
110
|
+
});
|
|
111
|
+
expect(result).toBe("output.tsv");
|
|
112
|
+
});
|
|
113
|
+
it("should return undefined for non-csv files", async () => {
|
|
114
|
+
const table = pl.DataFrame().lazy();
|
|
115
|
+
const options = { path: "output.json" };
|
|
116
|
+
const result = await plugin.saveTable(table, options);
|
|
117
|
+
expect(mockSaveCsvTable).not.toHaveBeenCalled();
|
|
118
|
+
expect(result).toBeUndefined();
|
|
119
|
+
});
|
|
120
|
+
it("should handle explicit format specification", async () => {
|
|
121
|
+
const table = pl.DataFrame().lazy();
|
|
122
|
+
const options = { path: "output.txt", format: "csv" };
|
|
123
|
+
mockSaveCsvTable.mockResolvedValue("output.txt");
|
|
124
|
+
const result = await plugin.saveTable(table, options);
|
|
125
|
+
expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
|
|
126
|
+
...options,
|
|
127
|
+
format: "csv",
|
|
128
|
+
});
|
|
129
|
+
expect(result).toBe("output.txt");
|
|
130
|
+
});
|
|
131
|
+
it("should handle paths with directories", async () => {
|
|
132
|
+
const table = pl.DataFrame().lazy();
|
|
133
|
+
const options = { path: "/path/to/output.csv" };
|
|
134
|
+
mockSaveCsvTable.mockResolvedValue("/path/to/output.csv");
|
|
135
|
+
await plugin.saveTable(table, options);
|
|
136
|
+
expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
|
|
137
|
+
...options,
|
|
138
|
+
format: "csv",
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
it("should return undefined for files without extension", async () => {
|
|
142
|
+
const table = pl.DataFrame().lazy();
|
|
143
|
+
const options = { path: "output" };
|
|
144
|
+
const result = await plugin.saveTable(table, options);
|
|
145
|
+
expect(mockSaveCsvTable).not.toHaveBeenCalled();
|
|
146
|
+
expect(result).toBeUndefined();
|
|
147
|
+
});
|
|
148
|
+
it("should handle explicit tsv format specification", async () => {
|
|
149
|
+
const table = pl.DataFrame().lazy();
|
|
150
|
+
const options = { path: "output.txt", format: "tsv" };
|
|
151
|
+
mockSaveCsvTable.mockResolvedValue("output.txt");
|
|
152
|
+
const result = await plugin.saveTable(table, options);
|
|
153
|
+
expect(mockSaveCsvTable).toHaveBeenCalledWith(table, {
|
|
154
|
+
...options,
|
|
155
|
+
format: "tsv",
|
|
156
|
+
});
|
|
157
|
+
expect(result).toBe("output.txt");
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2Nzdi9wbHVnaW4uc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3ZDLE9BQU8sS0FBSyxXQUFXLE1BQU0sa0JBQWtCLENBQUE7QUFFL0MsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3JCLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0NBQ3RCLENBQUMsQ0FBQyxDQUFBO0FBRUgsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7SUFDekIsSUFBSSxNQUFpQixDQUFBO0lBQ3JCLElBQUksZ0JBQTBDLENBQUE7SUFDOUMsSUFBSSxnQkFBMEMsQ0FBQTtJQUU5QyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUE7UUFDeEIsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDdEQsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDdEQsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDekIsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQy9DLE1B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QTtRQUVGLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMvRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDbkMsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFjLEVBQUUsQ0FBQTtZQUM5RCxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUVoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRXJELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRTtnQkFDbkQsR0FBRyxPQUFPO2dCQUNWLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc291cmNlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0ICogYXMgcGwgZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBDc3ZQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW4udHNcIlxuaW1wb3J0ICogYXMgdGFibGVNb2R1bGUgZnJvbSBcIi4vdGFibGUvaW5kZXgudHNcIlxuXG52aS5tb2NrKFwiLi90YWJsZS9pbmRleC50c1wiLCAoKSA9PiAoe1xuICBsb2FkQ3N2VGFibGU6IHZpLmZuKCksXG4gIHNhdmVDc3ZUYWJsZTogdmkuZm4oKSxcbn0pKVxuXG5kZXNjcmliZShcIkNzdlBsdWdpblwiLCAoKSA9PiB7XG4gIGxldCBwbHVnaW46IENzdlBsdWdpblxuICBsZXQgbW9ja0xvYWRDc3ZUYWJsZTogUmV0dXJuVHlwZTx0eXBlb2YgdmkuZm4+XG4gIGxldCBtb2NrU2F2ZUNzdlRhYmxlOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj5cblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBwbHVnaW4gPSBuZXcgQ3N2UGx1Z2luKClcbiAgICBtb2NrTG9hZENzdlRhYmxlID0gdmkubW9ja2VkKHRhYmxlTW9kdWxlLmxvYWRDc3ZUYWJsZSlcbiAgICBtb2NrU2F2ZUNzdlRhYmxlID0gdmkubW9ja2VkKHRhYmxlTW9kdWxlLnNhdmVDc3ZUYWJsZSlcbiAgICB2aS5jbGVhckFsbE1vY2tzKClcbiAgfSlcblxuICBkZXNjcmliZShcImxvYWRUYWJsZVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgbG9hZCB0YWJsZSBmcm9tIGNzdiBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCJ0ZXN0LmNzdlwiLFxuICAgICAgfVxuICAgICAgY29uc3QgbW9ja1RhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBtb2NrTG9hZENzdlRhYmxlLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tUYWJsZSlcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkQ3N2VGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICB7IC4uLnJlc291cmNlLCBmb3JtYXQ6IFwiY3N2XCIgfSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChtb2NrVGFibGUpXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgdGFibGUgZnJvbSB0c3YgZmlsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4gPSB7XG4gICAgICAgIHBhdGg6IFwidGVzdC50c3ZcIixcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vY2tUYWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgbW9ja0xvYWRDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrVGFibGUpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5sb2FkVGFibGUocmVzb3VyY2UpXG5cbiAgICAgIGV4cGVjdChtb2NrTG9hZENzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgeyAuLi5yZXNvdXJjZSwgZm9ybWF0OiBcInRzdlwiIH0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgIClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1RhYmxlKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBub24tY3N2IGZpbGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCJ0ZXN0Lmpzb25cIixcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkQ3N2VGFibGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhwbGljaXQgZm9ybWF0IHNwZWNpZmljYXRpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2U6IFBhcnRpYWw8UmVzb3VyY2U+ID0ge1xuICAgICAgICBwYXRoOiBcInRlc3QudHh0XCIsXG4gICAgICAgIGZvcm1hdDogXCJjc3ZcIixcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vY2tUYWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgbW9ja0xvYWRDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrVGFibGUpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5sb2FkVGFibGUocmVzb3VyY2UpXG5cbiAgICAgIGV4cGVjdChtb2NrTG9hZENzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgeyAuLi5yZXNvdXJjZSwgZm9ybWF0OiBcImNzdlwiIH0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgIClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1RhYmxlKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBwYXNzIHRocm91Z2ggbG9hZCBvcHRpb25zXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCJ0ZXN0LmNzdlwiLFxuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgZGVub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgIGNvbnN0IG1vY2tUYWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgbW9ja0xvYWRDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrVGFibGUpXG5cbiAgICAgIGF3YWl0IHBsdWdpbi5sb2FkVGFibGUocmVzb3VyY2UsIG9wdGlvbnMpXG5cbiAgICAgIGV4cGVjdChtb2NrTG9hZENzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgeyAuLi5yZXNvdXJjZSwgZm9ybWF0OiBcImNzdlwiIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBwYXRocyB3aXRoIGRpcmVjdG9yaWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCIvcGF0aC90by9kYXRhLmNzdlwiLFxuICAgICAgfVxuICAgICAgY29uc3QgbW9ja1RhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBtb2NrTG9hZENzdlRhYmxlLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tUYWJsZSlcblxuICAgICAgYXdhaXQgcGx1Z2luLmxvYWRUYWJsZShyZXNvdXJjZSlcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkQ3N2VGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICB7IC4uLnJlc291cmNlLCBmb3JtYXQ6IFwiY3N2XCIgfSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhwbGljaXQgdHN2IGZvcm1hdCBzcGVjaWZpY2F0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPiA9IHtcbiAgICAgICAgcGF0aDogXCJ0ZXN0LnR4dFwiLFxuICAgICAgICBmb3JtYXQ6IFwidHN2XCIsXG4gICAgICB9XG4gICAgICBjb25zdCBtb2NrVGFibGUgPSBwbC5EYXRhRnJhbWUoKS5sYXp5KClcbiAgICAgIG1vY2tMb2FkQ3N2VGFibGUubW9ja1Jlc29sdmVkVmFsdWUobW9ja1RhYmxlKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFRhYmxlKHJlc291cmNlKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRDc3ZUYWJsZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIHsgLi4ucmVzb3VyY2UsIGZvcm1hdDogXCJ0c3ZcIiB9LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICApXG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKG1vY2tUYWJsZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKFwic2F2ZVRhYmxlXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBzYXZlIHRhYmxlIHRvIGNzdiBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBjb25zdCBvcHRpb25zID0geyBwYXRoOiBcIm91dHB1dC5jc3ZcIiB9XG4gICAgICBtb2NrU2F2ZUNzdlRhYmxlLm1vY2tSZXNvbHZlZFZhbHVlKFwib3V0cHV0LmNzdlwiKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4uc2F2ZVRhYmxlKHRhYmxlLCBvcHRpb25zKVxuXG4gICAgICBleHBlY3QobW9ja1NhdmVDc3ZUYWJsZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgodGFibGUsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZm9ybWF0OiBcImNzdlwiLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJvdXRwdXQuY3N2XCIpXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHNhdmUgdGFibGUgdG8gdHN2IGZpbGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoKS5sYXp5KClcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHBhdGg6IFwib3V0cHV0LnRzdlwiIH1cbiAgICAgIG1vY2tTYXZlQ3N2VGFibGUubW9ja1Jlc29sdmVkVmFsdWUoXCJvdXRwdXQudHN2XCIpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5zYXZlVGFibGUodGFibGUsIG9wdGlvbnMpXG5cbiAgICAgIGV4cGVjdChtb2NrU2F2ZUNzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh0YWJsZSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBmb3JtYXQ6IFwidHN2XCIsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIm91dHB1dC50c3ZcIilcbiAgICB9KVxuXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3Igbm9uLWNzdiBmaWxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogXCJvdXRwdXQuanNvblwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLnNhdmVUYWJsZSh0YWJsZSwgb3B0aW9ucylcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlQ3N2VGFibGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhwbGljaXQgZm9ybWF0IHNwZWNpZmljYXRpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBwbC5EYXRhRnJhbWUoKS5sYXp5KClcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHBhdGg6IFwib3V0cHV0LnR4dFwiLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuICAgICAgbW9ja1NhdmVDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShcIm91dHB1dC50eHRcIilcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLnNhdmVUYWJsZSh0YWJsZSwgb3B0aW9ucylcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlQ3N2VGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRhYmxlLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGZvcm1hdDogXCJjc3ZcIixcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKFwib3V0cHV0LnR4dFwiKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgcGF0aHMgd2l0aCBkaXJlY3Rvcmllc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IHBsLkRhdGFGcmFtZSgpLmxhenkoKVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogXCIvcGF0aC90by9vdXRwdXQuY3N2XCIgfVxuICAgICAgbW9ja1NhdmVDc3ZUYWJsZS5tb2NrUmVzb2x2ZWRWYWx1ZShcIi9wYXRoL3RvL291dHB1dC5jc3ZcIilcblxuICAgICAgYXdhaXQgcGx1Z2luLnNhdmVUYWJsZSh0YWJsZSwgb3B0aW9ucylcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlQ3N2VGFibGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRhYmxlLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGZvcm1hdDogXCJjc3ZcIixcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIGZpbGVzIHdpdGhvdXQgZXh0ZW5zaW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBjb25zdCBvcHRpb25zID0geyBwYXRoOiBcIm91dHB1dFwiIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLnNhdmVUYWJsZSh0YWJsZSwgb3B0aW9ucylcblxuICAgICAgZXhwZWN0KG1vY2tTYXZlQ3N2VGFibGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhwbGljaXQgdHN2IGZvcm1hdCBzcGVjaWZpY2F0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcGwuRGF0YUZyYW1lKCkubGF6eSgpXG4gICAgICBjb25zdCBvcHRpb25zID0geyBwYXRoOiBcIm91dHB1dC50eHRcIiwgZm9ybWF0OiBcInRzdlwiIGFzIGNvbnN0IH1cbiAgICAgIG1vY2tTYXZlQ3N2VGFibGUubW9ja1Jlc29sdmVkVmFsdWUoXCJvdXRwdXQudHh0XCIpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5zYXZlVGFibGUodGFibGUsIG9wdGlvbnMpXG5cbiAgICAgIGV4cGVjdChtb2NrU2F2ZUNzdlRhYmxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh0YWJsZSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBmb3JtYXQ6IFwidHN2XCIsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIm91dHB1dC50eHRcIilcbiAgICB9KVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { loadCsvTable } from "./load.js";
|
|
2
|
+
export { saveCsvTable } from "./save.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2Nzdi90YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBsb2FkQ3N2VGFibGUgfSBmcm9tIFwiLi9sb2FkLnRzXCJcbmV4cG9ydCB7IHNhdmVDc3ZUYWJsZSB9IGZyb20gXCIuL3NhdmUudHNcIlxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { LoadTableOptions } from "../../../plugin.ts";
|
|
3
|
+
import * as pl from "nodejs-polars";
|
|
4
|
+
export declare function loadCsvTable(resource: Partial<Resource> & {
|
|
5
|
+
format?: "csv" | "tsv";
|
|
6
|
+
}, options?: LoadTableOptions): Promise<pl.LazyDataFrame<any>>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { resolveDialect, resolveSchema } from "@frictionless-ts/metadata";
|
|
2
|
+
import { prefetchFiles } from "@frictionless-ts/dataset";
|
|
3
|
+
import { inferSchemaFromTable } from "../../../schema/index.js";
|
|
4
|
+
import { joinHeaderRows } from "../../../table/index.js";
|
|
5
|
+
import { normalizeTable } from "../../../table/index.js";
|
|
6
|
+
import { skipCommentRows } from "../../../table/index.js";
|
|
7
|
+
import { stripInitialSpace } from "../../../table/index.js";
|
|
8
|
+
import * as pl from "nodejs-polars";
|
|
9
|
+
import { inferCsvDialect } from "../dialect/index.js";
|
|
10
|
+
// TODO: Condier using sample to extract header first
|
|
11
|
+
// for better commentChar + headerRows/commentRows support
|
|
12
|
+
// (consult with the Data Package Working Group)
|
|
13
|
+
export async function loadCsvTable(resource, options) {
|
|
14
|
+
const paths = await prefetchFiles(resource.path);
|
|
15
|
+
if (!paths.length) {
|
|
16
|
+
throw new Error("Resource path is not defined");
|
|
17
|
+
}
|
|
18
|
+
let dialect = await resolveDialect(resource.dialect);
|
|
19
|
+
if (!dialect) {
|
|
20
|
+
dialect = await inferCsvDialect({ ...resource, path: paths[0] }, options);
|
|
21
|
+
}
|
|
22
|
+
const scanOptions = getScanOptions(resource, dialect);
|
|
23
|
+
const tables = [];
|
|
24
|
+
for (const path of paths) {
|
|
25
|
+
const table = pl.scanCSV(path, scanOptions);
|
|
26
|
+
tables.push(table);
|
|
27
|
+
}
|
|
28
|
+
// There is no way to specify column names in nodejs-polars by default
|
|
29
|
+
// so we have to rename `column_*` to `field*` is table doesn't have header
|
|
30
|
+
let table = pl.concat(tables);
|
|
31
|
+
if (!scanOptions.hasHeader) {
|
|
32
|
+
table = table.rename(Object.fromEntries(table.columns.map(name => [name, name.replace("column_", "field")])));
|
|
33
|
+
}
|
|
34
|
+
if (dialect) {
|
|
35
|
+
table = await joinHeaderRows(table, { dialect });
|
|
36
|
+
table = skipCommentRows(table, { dialect });
|
|
37
|
+
table = stripInitialSpace(table, { dialect });
|
|
38
|
+
}
|
|
39
|
+
if (!options?.denormalized) {
|
|
40
|
+
let schema = await resolveSchema(resource.schema);
|
|
41
|
+
if (!schema)
|
|
42
|
+
schema = await inferSchemaFromTable(table, options);
|
|
43
|
+
table = await normalizeTable(table, schema);
|
|
44
|
+
}
|
|
45
|
+
return table;
|
|
46
|
+
}
|
|
47
|
+
function getScanOptions(resource, dialect) {
|
|
48
|
+
const options = {
|
|
49
|
+
inferSchemaLength: 0,
|
|
50
|
+
truncateRaggedLines: true,
|
|
51
|
+
};
|
|
52
|
+
if (resource.encoding) {
|
|
53
|
+
options.encoding = resource.encoding;
|
|
54
|
+
// Polars supports only utf-8 and utf-8-lossy encodings
|
|
55
|
+
if (options.encoding === "utf-8") {
|
|
56
|
+
options.encoding = "utf8";
|
|
57
|
+
}
|
|
58
|
+
if (options.encoding !== "utf8") {
|
|
59
|
+
throw new Error(`Encoding ${options.encoding} for CSV files is not supported`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
options.skipRows = getRowsToSkip(dialect);
|
|
63
|
+
options.hasHeader = dialect?.header !== false;
|
|
64
|
+
options.eolChar = dialect?.lineTerminator ?? "\n";
|
|
65
|
+
options.sep = dialect?.delimiter ?? ",";
|
|
66
|
+
// TODO: try convincing nodejs-polars to support escapeChar
|
|
67
|
+
// https://github.com/pola-rs/polars/issues/3074
|
|
68
|
+
//options.escapeChar = dialect?.escapeChar
|
|
69
|
+
options.quoteChar = dialect?.quoteChar ?? '"';
|
|
70
|
+
options.nullValues = dialect?.nullSequence;
|
|
71
|
+
// TODO: try convincing nodejs-polars to support doubleQuote
|
|
72
|
+
//options.doubleQuote = dialect?.doubleQuote ?? true
|
|
73
|
+
// TODO: remove ts-ignore when issues is fixed
|
|
74
|
+
// https://github.com/pola-rs/nodejs-polars/issues/334
|
|
75
|
+
// @ts-ignore
|
|
76
|
+
options.commentPrefix = dialect?.commentChar;
|
|
77
|
+
return options;
|
|
78
|
+
}
|
|
79
|
+
function getRowsToSkip(dialect) {
|
|
80
|
+
const headerRows = getHeaderRows(dialect);
|
|
81
|
+
return headerRows[0] ? headerRows[0] - 1 : 0;
|
|
82
|
+
}
|
|
83
|
+
function getHeaderRows(dialect) {
|
|
84
|
+
return dialect?.header !== false ? (dialect?.headerRows ?? [1]) : [];
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbnMvY3N2L3RhYmxlL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFM0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRXJELHFEQUFxRDtBQUNyRCwwREFBMEQ7QUFDMUQsZ0RBQWdEO0FBRWhELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxRQUF3RCxFQUN4RCxPQUEwQjtJQUUxQixNQUFNLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEdBQUcsTUFBTSxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEs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O0lBQzNELGdEQUFnRDtJQUNoRCwwQ0FBMEM7SUFFMUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLEVBQUUsU0FBUyxJQUFJLEdBQUcsQ0FBQTtJQUM3QyxPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sRUFBRSxZQUFZLENBQUE7SUFFMUMsNERBQTREO0lBQzVELG9EQUFvRDtJQUVwRCw4Q0FBOEM7SUFDOUMsc0RBQXNEO0lBQ3RELGFBQWE7SUFDYixPQUFPLENBQUMsYUFBYSxHQUFHLE9BQU8sRUFBRSxXQUFXLENBQUE7SUFFNUMsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLE9BQWlCO0lBQ3RDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6QyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzlDLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxPQUFpQjtJQUN0QyxPQUFPLE9BQU8sRUFBRSxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGlhbGVjdCwgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyByZXNvbHZlRGlhbGVjdCwgcmVzb2x2ZVNjaGVtYSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IHByZWZldGNoRmlsZXMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB0eXBlIHsgTG9hZFRhYmxlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9wbHVnaW4udHNcIlxuaW1wb3J0IHsgaW5mZXJTY2hlbWFGcm9tVGFibGUgfSBmcm9tIFwiLi4vLi4vLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB7IGpvaW5IZWFkZXJSb3dzIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IG5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCB7IHNraXBDb21tZW50Um93cyB9IGZyb20gXCIuLi8uLi8uLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgeyBzdHJpcEluaXRpYWxTcGFjZSB9IGZyb20gXCIuLi8uLi8uLi90YWJsZS9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL3RhYmxlL2luZGV4LnRzXCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGluZmVyQ3N2RGlhbGVjdCB9IGZyb20gXCIuLi9kaWFsZWN0L2luZGV4LnRzXCJcblxuLy8gVE9ETzogQ29uZGllciB1c2luZyBzYW1wbGUgdG8gZXh0cmFjdCBoZWFkZXIgZmlyc3Rcbi8vIGZvciBiZXR0ZXIgY29tbWVudENoYXIgKyBoZWFkZXJSb3dzL2NvbW1lbnRSb3dzIHN1cHBvcnRcbi8vIChjb25zdWx0IHdpdGggdGhlIERhdGEgUGFja2FnZSBXb3JraW5nIEdyb3VwKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENzdlRhYmxlKFxuICByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4gJiB7IGZvcm1hdD86IFwiY3N2XCIgfCBcInRzdlwiIH0sXG4gIG9wdGlvbnM/OiBMb2FkVGFibGVPcHRpb25zLFxuKSB7XG4gIGNvbnN0IHBhdGhzID0gYXdhaXQgcHJlZmV0Y2hGaWxlcyhyZXNvdXJjZS5wYXRoKVxuICBpZiAoIXBhdGhzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHBhdGggaXMgbm90IGRlZmluZWRcIilcbiAgfVxuXG4gIGxldCBkaWFsZWN0ID0gYXdhaXQgcmVzb2x2ZURpYWxlY3QocmVzb3VyY2UuZGlhbGVjdClcbiAgaWYgKCFkaWFsZWN0KSB7XG4gICAgZGlhbGVjdCA9IGF3YWl0IGluZmVyQ3N2RGlhbGVjdCh7IC4uLnJlc291cmNlLCBwYXRoOiBwYXRoc1swXSB9LCBvcHRpb25zKVxuICB9XG5cbiAgY29uc3Qgc2Nhbk9wdGlvbnMgPSBnZXRTY2FuT3B0aW9ucyhyZXNvdXJjZSwgZGlhbGVjdClcbiAgY29uc3QgdGFibGVzOiBUYWJsZVtdID0gW11cbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgY29uc3QgdGFibGUgPSBwbC5zY2FuQ1NWKHBhdGgsIHNjYW5PcHRpb25zKVxuICAgIHRhYmxlcy5wdXNoKHRhYmxlKVxuICB9XG5cbiAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgY29sdW1uIG5hbWVzIGluIG5vZGVqcy1wb2xhcnMgYnkgZGVmYXVsdFxuICAvLyBzbyB3ZSBoYXZlIHRvIHJlbmFtZSBgY29sdW1uXypgIHRvIGBmaWVsZCpgIGlzIHRhYmxlIGRvZXNuJ3QgaGF2ZSBoZWFkZXJcbiAgbGV0IHRhYmxlID0gcGwuY29uY2F0KHRhYmxlcylcbiAgaWYgKCFzY2FuT3B0aW9ucy5oYXNIZWFkZXIpIHtcbiAgICB0YWJsZSA9IHRhYmxlLnJlbmFtZShcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgdGFibGUuY29sdW1ucy5tYXAobmFtZSA9PiBbbmFtZSwgbmFtZS5yZXBsYWNlKFwiY29sdW1uX1wiLCBcImZpZWxkXCIpXSksXG4gICAgICApLFxuICAgIClcbiAgfVxuXG4gIGlmIChkaWFsZWN0KSB7XG4gICAgdGFibGUgPSBhd2FpdCBqb2luSGVhZGVyUm93cyh0YWJsZSwgeyBkaWFsZWN0IH0pXG4gICAgdGFibGUgPSBza2lwQ29tbWVudFJvd3ModGFibGUsIHsgZGlhbGVjdCB9KVxuICAgIHRhYmxlID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHsgZGlhbGVjdCB9KVxuICB9XG5cbiAgaWYgKCFvcHRpb25zPy5kZW5vcm1hbGl6ZWQpIHtcbiAgICBsZXQgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShyZXNvdXJjZS5zY2hlbWEpXG4gICAgaWYgKCFzY2hlbWEpIHNjaGVtYSA9IGF3YWl0IGluZmVyU2NoZW1hRnJvbVRhYmxlKHRhYmxlLCBvcHRpb25zKVxuICAgIHRhYmxlID0gYXdhaXQgbm9ybWFsaXplVGFibGUodGFibGUsIHNjaGVtYSlcbiAgfVxuXG4gIHJldHVybiB0YWJsZVxufVxuXG5mdW5jdGlvbiBnZXRTY2FuT3B0aW9ucyhyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sIGRpYWxlY3Q/OiBEaWFsZWN0KSB7XG4gIGNvbnN0IG9wdGlvbnM6IFBhcnRpYWw8cGwuU2NhbkNzdk9wdGlvbnM+ID0ge1xuICAgIGluZmVyU2NoZW1hTGVuZ3RoOiAwLFxuICAgIHRydW5jYXRlUmFnZ2VkTGluZXM6IHRydWUsXG4gIH1cblxuICBpZiAocmVzb3VyY2UuZW5jb2RpbmcpIHtcbiAgICBvcHRpb25zLmVuY29kaW5nID0gcmVzb3VyY2UuZW5jb2RpbmdcblxuICAgIC8vIFBvbGFycyBzdXBwb3J0cyBvbmx5IHV0Zi04IGFuZCB1dGYtOC1sb3NzeSBlbmNvZGluZ3NcbiAgICBpZiAob3B0aW9ucy5lbmNvZGluZyA9PT0gXCJ1dGYtOFwiKSB7XG4gICAgICBvcHRpb25zLmVuY29kaW5nID0gXCJ1dGY4XCJcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5lbmNvZGluZyAhPT0gXCJ1dGY4XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW5jb2RpbmcgJHtvcHRpb25zLmVuY29kaW5nfSBmb3IgQ1NWIGZpbGVzIGlzIG5vdCBzdXBwb3J0ZWRgKVxuICAgIH1cbiAgfVxuXG4gIG9wdGlvbnMuc2tpcFJvd3MgPSBnZXRSb3dzVG9Ta2lwKGRpYWxlY3QpXG4gIG9wdGlvbnMuaGFzSGVhZGVyID0gZGlhbGVjdD8uaGVhZGVyICE9PSBmYWxzZVxuICBvcHRpb25zLmVvbENoYXIgPSBkaWFsZWN0Py5saW5lVGVybWluYXRvciA/PyBcIlxcblwiXG4gIG9wdGlvbnMuc2VwID0gZGlhbGVjdD8uZGVsaW1pdGVyID8/IFwiLFwiXG5cbiAgLy8gVE9ETzogdHJ5IGNvbnZpbmNpbmcgbm9kZWpzLXBvbGFycyB0byBzdXBwb3J0IGVzY2FwZUNoYXJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvbGEtcnMvcG9sYXJzL2lzc3Vlcy8zMDc0XG4gIC8vb3B0aW9ucy5lc2NhcGVDaGFyID0gZGlhbGVjdD8uZXNjYXBlQ2hhclxuXG4gIG9wdGlvbnMucXVvdGVDaGFyID0gZGlhbGVjdD8ucXVvdGVDaGFyID8/ICdcIidcbiAgb3B0aW9ucy5udWxsVmFsdWVzID0gZGlhbGVjdD8ubnVsbFNlcXVlbmNlXG5cbiAgLy8gVE9ETzogdHJ5IGNvbnZpbmNpbmcgbm9kZWpzLXBvbGFycyB0byBzdXBwb3J0IGRvdWJsZVF1b3RlXG4gIC8vb3B0aW9ucy5kb3VibGVRdW90ZSA9IGRpYWxlY3Q/LmRvdWJsZVF1b3RlID8/IHRydWVcblxuICAvLyBUT0RPOiByZW1vdmUgdHMtaWdub3JlIHdoZW4gaXNzdWVzIGlzIGZpeGVkXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzMzNFxuICAvLyBAdHMtaWdub3JlXG4gIG9wdGlvbnMuY29tbWVudFByZWZpeCA9IGRpYWxlY3Q/LmNvbW1lbnRDaGFyXG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gZ2V0Um93c1RvU2tpcChkaWFsZWN0PzogRGlhbGVjdCkge1xuICBjb25zdCBoZWFkZXJSb3dzID0gZ2V0SGVhZGVyUm93cyhkaWFsZWN0KVxuICByZXR1cm4gaGVhZGVyUm93c1swXSA/IGhlYWRlclJvd3NbMF0gLSAxIDogMFxufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJSb3dzKGRpYWxlY3Q/OiBEaWFsZWN0KSB7XG4gIHJldHVybiBkaWFsZWN0Py5oZWFkZXIgIT09IGZhbHNlID8gKGRpYWxlY3Q/LmhlYWRlclJvd3MgPz8gWzFdKSA6IFtdXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|