@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,6 @@
|
|
|
1
|
+
import type { Schema } from "@frictionless-ts/metadata";
|
|
2
|
+
import type * as pl from "nodejs-polars";
|
|
3
|
+
import type { DenormalizeFieldOptions } from "../field/index.ts";
|
|
4
|
+
import type { Table } from "./Table.ts";
|
|
5
|
+
export declare function denormalizeTable(table: Table, schema: Schema, options?: DenormalizeFieldOptions): Promise<pl.LazyDataFrame<any>>;
|
|
6
|
+
export declare function denormalizeFields(schema: Schema, options?: DenormalizeFieldOptions): Record<string, pl.Expr>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { denormalizeField } from "../field/index.js";
|
|
2
|
+
export async function denormalizeTable(table, schema, options) {
|
|
3
|
+
return table.select(...Object.values(denormalizeFields(schema, options)));
|
|
4
|
+
}
|
|
5
|
+
export function denormalizeFields(schema, options) {
|
|
6
|
+
const exprs = {};
|
|
7
|
+
for (const field of schema.fields) {
|
|
8
|
+
const missingValues = field.missingValues ?? schema.missingValues;
|
|
9
|
+
const mergedField = { ...field, missingValues };
|
|
10
|
+
const expr = denormalizeField(mergedField, options);
|
|
11
|
+
exprs[field.name] = expr;
|
|
12
|
+
}
|
|
13
|
+
return exprs;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVub3JtYWxpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9kZW5vcm1hbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUlwRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxLQUFZLEVBQ1osTUFBYyxFQUNkLE9BQWlDO0lBRWpDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMzRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixNQUFjLEVBQ2QsT0FBaUM7SUFFakMsTUFBTSxLQUFLLEdBQTRCLEVBQUUsQ0FBQTtJQUV6QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUE7UUFDakUsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQTtRQUUvQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbkQsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgKiBhcyBwbCBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZUZpZWxkIH0gZnJvbSBcIi4uL2ZpZWxkL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgRGVub3JtYWxpemVGaWVsZE9wdGlvbnMgfSBmcm9tIFwiLi4vZmllbGQvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gXCIuL1RhYmxlLnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbm9ybWFsaXplVGFibGUoXG4gIHRhYmxlOiBUYWJsZSxcbiAgc2NoZW1hOiBTY2hlbWEsXG4gIG9wdGlvbnM/OiBEZW5vcm1hbGl6ZUZpZWxkT3B0aW9ucyxcbikge1xuICByZXR1cm4gdGFibGUuc2VsZWN0KC4uLk9iamVjdC52YWx1ZXMoZGVub3JtYWxpemVGaWVsZHMoc2NoZW1hLCBvcHRpb25zKSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZW5vcm1hbGl6ZUZpZWxkcyhcbiAgc2NoZW1hOiBTY2hlbWEsXG4gIG9wdGlvbnM/OiBEZW5vcm1hbGl6ZUZpZWxkT3B0aW9ucyxcbikge1xuICBjb25zdCBleHByczogUmVjb3JkPHN0cmluZywgcGwuRXhwcj4gPSB7fVxuXG4gIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgIGNvbnN0IG1pc3NpbmdWYWx1ZXMgPSBmaWVsZC5taXNzaW5nVmFsdWVzID8/IHNjaGVtYS5taXNzaW5nVmFsdWVzXG4gICAgY29uc3QgbWVyZ2VkRmllbGQgPSB7IC4uLmZpZWxkLCBtaXNzaW5nVmFsdWVzIH1cblxuICAgIGNvbnN0IGV4cHIgPSBkZW5vcm1hbGl6ZUZpZWxkKG1lcmdlZEZpZWxkLCBvcHRpb25zKVxuICAgIGV4cHJzW2ZpZWxkLm5hbWVdID0gZXhwclxuICB9XG5cbiAgcmV0dXJuIGV4cHJzXG59XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Dialect } from "@frictionless-ts/metadata";
|
|
2
|
+
import * as pl from "nodejs-polars";
|
|
3
|
+
import type { Table } from "../table/index.ts";
|
|
4
|
+
export declare function joinHeaderRows(table: Table, options: {
|
|
5
|
+
dialect: Dialect;
|
|
6
|
+
}): Promise<Table | pl.LazyDataFrame<{
|
|
7
|
+
[x: string]: any;
|
|
8
|
+
[x: number]: any;
|
|
9
|
+
}>>;
|
|
10
|
+
export declare function skipCommentRows(table: Table, options: {
|
|
11
|
+
dialect: Dialect;
|
|
12
|
+
}): Table | pl.LazyDataFrame<{
|
|
13
|
+
[x: string]: any;
|
|
14
|
+
[x: number]: any;
|
|
15
|
+
[x: symbol]: any;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function stripInitialSpace(table: Table, options: {
|
|
18
|
+
dialect: Dialect;
|
|
19
|
+
}): Table;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
export async function joinHeaderRows(table, options) {
|
|
3
|
+
const { dialect } = options;
|
|
4
|
+
const headerOffset = getHeaderOffset(dialect);
|
|
5
|
+
const headerRows = getHeaderRows(dialect);
|
|
6
|
+
const headerJoin = dialect?.headerJoin ?? " ";
|
|
7
|
+
if (headerRows.length < 2) {
|
|
8
|
+
return table;
|
|
9
|
+
}
|
|
10
|
+
const extraLabelsFrame = await table
|
|
11
|
+
.withRowCount()
|
|
12
|
+
.withColumn(pl.col("row_nr").add(1))
|
|
13
|
+
.filter(pl.col("row_nr").add(headerOffset).isIn(headerRows))
|
|
14
|
+
.select(...table.columns.map(name => pl.col(name).str.concat(headerJoin)))
|
|
15
|
+
.collect();
|
|
16
|
+
const labels = table.columns;
|
|
17
|
+
const extraLabels = extraLabelsFrame.row(0);
|
|
18
|
+
const mapping = Object.fromEntries(labels.map((label, index) => [
|
|
19
|
+
label,
|
|
20
|
+
[label, extraLabels[index]].join(headerJoin),
|
|
21
|
+
]));
|
|
22
|
+
return table
|
|
23
|
+
.withRowCount()
|
|
24
|
+
.withColumn(pl.col("row_nr").add(1))
|
|
25
|
+
.filter(pl.col("row_nr").add(headerOffset).isIn(headerRows).not())
|
|
26
|
+
.rename(mapping)
|
|
27
|
+
.drop("row_nr");
|
|
28
|
+
}
|
|
29
|
+
export function skipCommentRows(table, options) {
|
|
30
|
+
const { dialect } = options;
|
|
31
|
+
const commentOffset = getCommentOffset(dialect);
|
|
32
|
+
if (!dialect?.commentRows) {
|
|
33
|
+
return table;
|
|
34
|
+
}
|
|
35
|
+
return table
|
|
36
|
+
.withRowCount()
|
|
37
|
+
.withColumn(pl.col("row_nr").add(1))
|
|
38
|
+
.filter(pl.col("row_nr").add(commentOffset).isIn(dialect.commentRows).not())
|
|
39
|
+
.drop("row_nr");
|
|
40
|
+
}
|
|
41
|
+
export function stripInitialSpace(table, options) {
|
|
42
|
+
const { dialect } = options;
|
|
43
|
+
if (!dialect?.skipInitialSpace) {
|
|
44
|
+
return table;
|
|
45
|
+
}
|
|
46
|
+
return table.select(
|
|
47
|
+
// TODO: rebase on stripCharsStart when it's fixed in polars
|
|
48
|
+
// https://github.com/pola-rs/nodejs-polars/issues/336
|
|
49
|
+
table.columns.map(name => pl.col(name).str.strip().as(name)));
|
|
50
|
+
}
|
|
51
|
+
function getHeaderOffset(dialect) {
|
|
52
|
+
const headerRows = getHeaderRows(dialect);
|
|
53
|
+
return headerRows.at(0) ?? 0;
|
|
54
|
+
}
|
|
55
|
+
function getHeaderRows(dialect) {
|
|
56
|
+
return dialect?.header !== false ? (dialect?.headerRows ?? [1]) : [];
|
|
57
|
+
}
|
|
58
|
+
function getCommentOffset(dialect) {
|
|
59
|
+
const headerRows = getHeaderRows(dialect);
|
|
60
|
+
return headerRows.at(-1) ?? 0;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RhYmxlL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHbkMsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLEtBQVksRUFDWixPQUE2QjtJQUU3QixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBRTNCLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM3QyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekMsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFVBQVUsSUFBSSxHQUFHLENBQUE7SUFDN0MsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxLQUFLO1NBQ2pDLFlBQVksRUFBRTtTQUNkLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzNELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDekUsT0FBTyxFQUFFLENBQUE7SUFFWixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO0lBQzVCLE1BQU0s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SSxDQUFDLENBQUE7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGlhbGVjdCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUvaW5kZXgudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gam9pbkhlYWRlclJvd3MoXG4gIHRhYmxlOiBUYWJsZSxcbiAgb3B0aW9uczogeyBkaWFsZWN0OiBEaWFsZWN0IH0sXG4pIHtcbiAgY29uc3QgeyBkaWFsZWN0IH0gPSBvcHRpb25zXG5cbiAgY29uc3QgaGVhZGVyT2Zmc2V0ID0gZ2V0SGVhZGVyT2Zmc2V0KGRpYWxlY3QpXG4gIGNvbnN0IGhlYWRlclJvd3MgPSBnZXRIZWFkZXJSb3dzKGRpYWxlY3QpXG4gIGNvbnN0IGhlYWRlckpvaW4gPSBkaWFsZWN0Py5oZWFkZXJKb2luID8/IFwiIFwiXG4gIGlmIChoZWFkZXJSb3dzLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gdGFibGVcbiAgfVxuXG4gIGNvbnN0IGV4dHJhTGFiZWxzRnJhbWUgPSBhd2FpdCB0YWJsZVxuICAgIC53aXRoUm93Q291bnQoKVxuICAgIC53aXRoQ29sdW1uKHBsLmNvbChcInJvd19uclwiKS5hZGQoMSkpXG4gICAgLmZpbHRlcihwbC5jb2woXCJyb3dfbnJcIikuYWRkKGhlYWRlck9mZnNldCkuaXNJbihoZWFkZXJSb3dzKSlcbiAgICAuc2VsZWN0KC4uLnRhYmxlLmNvbHVtbnMubWFwKG5hbWUgPT4gcGwuY29sKG5hbWUpLnN0ci5jb25jYXQoaGVhZGVySm9pbikpKVxuICAgIC5jb2xsZWN0KClcblxuICBjb25zdCBsYWJlbHMgPSB0YWJsZS5jb2x1bW5zXG4gIGNvbnN0IGV4dHJhTGFiZWxzID0gZXh0cmFMYWJlbHNGcmFtZS5yb3coMClcblxuICBjb25zdCBtYXBwaW5nID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIGxhYmVscy5tYXAoKGxhYmVsLCBpbmRleCkgPT4gW1xuICAgICAgbGFiZWwsXG4gICAgICBbbGFiZWwsIGV4dHJhTGFiZWxzW2luZGV4XV0uam9pbihoZWFkZXJKb2luKSxcbiAgICBdKSxcbiAgKVxuXG4gIHJldHVybiB0YWJsZVxuICAgIC53aXRoUm93Q291bnQoKVxuICAgIC53aXRoQ29sdW1uKHBsLmNvbChcInJvd19uclwiKS5hZGQoMSkpXG4gICAgLmZpbHRlcihwbC5jb2woXCJyb3dfbnJcIikuYWRkKGhlYWRlck9mZnNldCkuaXNJbihoZWFkZXJSb3dzKS5ub3QoKSlcbiAgICAucmVuYW1lKG1hcHBpbmcpXG4gICAgLmRyb3AoXCJyb3dfbnJcIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNraXBDb21tZW50Um93cyh0YWJsZTogVGFibGUsIG9wdGlvbnM6IHsgZGlhbGVjdDogRGlhbGVjdCB9KSB7XG4gIGNvbnN0IHsgZGlhbGVjdCB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IGNvbW1lbnRPZmZzZXQgPSBnZXRDb21tZW50T2Zmc2V0KGRpYWxlY3QpXG4gIGlmICghZGlhbGVjdD8uY29tbWVudFJvd3MpIHtcbiAgICByZXR1cm4gdGFibGVcbiAgfVxuXG4gIHJldHVybiB0YWJsZVxuICAgIC53aXRoUm93Q291bnQoKVxuICAgIC53aXRoQ29sdW1uKHBsLmNvbChcInJvd19uclwiKS5hZGQoMSkpXG4gICAgLmZpbHRlcihwbC5jb2woXCJyb3dfbnJcIikuYWRkKGNvbW1lbnRPZmZzZXQpLmlzSW4oZGlhbGVjdC5jb21tZW50Um93cykubm90KCkpXG4gICAgLmRyb3AoXCJyb3dfbnJcIilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwSW5pdGlhbFNwYWNlKHRhYmxlOiBUYWJsZSwgb3B0aW9uczogeyBkaWFsZWN0OiBEaWFsZWN0IH0pIHtcbiAgY29uc3QgeyBkaWFsZWN0IH0gPSBvcHRpb25zXG5cbiAgaWYgKCFkaWFsZWN0Py5za2lwSW5pdGlhbFNwYWNlKSB7XG4gICAgcmV0dXJuIHRhYmxlXG4gIH1cblxuICByZXR1cm4gdGFibGUuc2VsZWN0KFxuICAgIC8vIFRPRE86IHJlYmFzZSBvbiBzdHJpcENoYXJzU3RhcnQgd2hlbiBpdCdzIGZpeGVkIGluIHBvbGFyc1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2xhLXJzL25vZGVqcy1wb2xhcnMvaXNzdWVzLzMzNlxuICAgIHRhYmxlLmNvbHVtbnMubWFwKG5hbWUgPT4gcGwuY29sKG5hbWUpLnN0ci5zdHJpcCgpLmFzKG5hbWUpKSxcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJPZmZzZXQoZGlhbGVjdD86IERpYWxlY3QpIHtcbiAgY29uc3QgaGVhZGVyUm93cyA9IGdldEhlYWRlclJvd3MoZGlhbGVjdClcbiAgcmV0dXJuIGhlYWRlclJvd3MuYXQoMCkgPz8gMFxufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJSb3dzKGRpYWxlY3Q/OiBEaWFsZWN0KSB7XG4gIHJldHVybiBkaWFsZWN0Py5oZWFkZXIgIT09IGZhbHNlID8gKGRpYWxlY3Q/LmhlYWRlclJvd3MgPz8gWzFdKSA6IFtdXG59XG5cbmZ1bmN0aW9uIGdldENvbW1lbnRPZmZzZXQoZGlhbGVjdD86IERpYWxlY3QpIHtcbiAgY29uc3QgaGVhZGVyUm93cyA9IGdldEhlYWRlclJvd3MoZGlhbGVjdClcbiAgcmV0dXJuIGhlYWRlclJvd3MuYXQoLTEpID8/IDBcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import * as pl from "nodejs-polars";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { joinHeaderRows, skipCommentRows, stripInitialSpace, } from "./helpers.js";
|
|
4
|
+
describe("joinHeaderRows", () => {
|
|
5
|
+
it("should join two header rows with default space separator", async () => {
|
|
6
|
+
const table = pl
|
|
7
|
+
.DataFrame({
|
|
8
|
+
col1: ["first", "name", "header3", "Alice", "Bob"],
|
|
9
|
+
col2: ["last", "name", "header3", "Smith", "Jones"],
|
|
10
|
+
col3: [
|
|
11
|
+
"contact",
|
|
12
|
+
"email",
|
|
13
|
+
"header3",
|
|
14
|
+
"alice@example.com",
|
|
15
|
+
"bob@example.com",
|
|
16
|
+
],
|
|
17
|
+
})
|
|
18
|
+
.lazy();
|
|
19
|
+
const result = await joinHeaderRows(table, {
|
|
20
|
+
dialect: { headerRows: [2, 3] },
|
|
21
|
+
});
|
|
22
|
+
const collected = await result.collect();
|
|
23
|
+
expect(collected.columns).toEqual([
|
|
24
|
+
"col1 first",
|
|
25
|
+
"col2 last",
|
|
26
|
+
"col3 contact",
|
|
27
|
+
]);
|
|
28
|
+
expect(collected.height).toBe(4);
|
|
29
|
+
expect(collected.row(0)).toEqual(["name", "name", "email"]);
|
|
30
|
+
expect(collected.row(1)).toEqual(["header3", "header3", "header3"]);
|
|
31
|
+
expect(collected.row(2)).toEqual(["Alice", "Smith", "alice@example.com"]);
|
|
32
|
+
expect(collected.row(3)).toEqual(["Bob", "Jones", "bob@example.com"]);
|
|
33
|
+
});
|
|
34
|
+
it("should join two header rows with custom separator", async () => {
|
|
35
|
+
const table = pl
|
|
36
|
+
.DataFrame({
|
|
37
|
+
col1: ["user", "first", "header3", "Alice", "Bob"],
|
|
38
|
+
col2: ["user", "last", "header3", "Smith", "Jones"],
|
|
39
|
+
col3: ["meta", "created", "header3", "2023-01-01", "2023-01-02"],
|
|
40
|
+
})
|
|
41
|
+
.lazy();
|
|
42
|
+
const result = await joinHeaderRows(table, {
|
|
43
|
+
dialect: { headerRows: [2, 3], headerJoin: "_" },
|
|
44
|
+
});
|
|
45
|
+
const collected = await result.collect();
|
|
46
|
+
expect(collected.columns).toEqual(["col1_user", "col2_user", "col3_meta"]);
|
|
47
|
+
expect(collected.height).toBe(4);
|
|
48
|
+
expect(collected.row(0)).toEqual(["first", "last", "created"]);
|
|
49
|
+
expect(collected.row(1)).toEqual(["header3", "header3", "header3"]);
|
|
50
|
+
expect(collected.row(2)).toEqual(["Alice", "Smith", "2023-01-01"]);
|
|
51
|
+
expect(collected.row(3)).toEqual(["Bob", "Jones", "2023-01-02"]);
|
|
52
|
+
});
|
|
53
|
+
it("should return table unchanged when only one header row", async () => {
|
|
54
|
+
const table = pl
|
|
55
|
+
.DataFrame({
|
|
56
|
+
name: ["Alice", "Bob"],
|
|
57
|
+
age: [30, 25],
|
|
58
|
+
city: ["NYC", "LA"],
|
|
59
|
+
})
|
|
60
|
+
.lazy();
|
|
61
|
+
const result = await joinHeaderRows(table, {
|
|
62
|
+
dialect: { headerRows: [1] },
|
|
63
|
+
});
|
|
64
|
+
const collected = await result.collect();
|
|
65
|
+
expect(collected.columns).toEqual(["name", "age", "city"]);
|
|
66
|
+
expect(collected.height).toBe(2);
|
|
67
|
+
});
|
|
68
|
+
it("should return table unchanged when no header rows", async () => {
|
|
69
|
+
const table = pl
|
|
70
|
+
.DataFrame({
|
|
71
|
+
field1: ["Alice", "Bob"],
|
|
72
|
+
field2: [30, 25],
|
|
73
|
+
field3: ["NYC", "LA"],
|
|
74
|
+
})
|
|
75
|
+
.lazy();
|
|
76
|
+
const result = await joinHeaderRows(table, {
|
|
77
|
+
dialect: { header: false },
|
|
78
|
+
});
|
|
79
|
+
const collected = await result.collect();
|
|
80
|
+
expect(collected.columns).toEqual(["field1", "field2", "field3"]);
|
|
81
|
+
expect(collected.height).toBe(2);
|
|
82
|
+
});
|
|
83
|
+
it("should join three header rows", async () => {
|
|
84
|
+
const table = pl
|
|
85
|
+
.DataFrame({
|
|
86
|
+
col1: ["person", "user", "first", "header4", "Alice", "Bob"],
|
|
87
|
+
col2: ["person", "user", "last", "header4", "Smith", "Jones"],
|
|
88
|
+
col3: ["location", "address", "city", "header4", "NYC", "LA"],
|
|
89
|
+
})
|
|
90
|
+
.lazy();
|
|
91
|
+
const result = await joinHeaderRows(table, {
|
|
92
|
+
dialect: { headerRows: [2, 3, 4] },
|
|
93
|
+
});
|
|
94
|
+
const collected = await result.collect();
|
|
95
|
+
expect(collected.columns).toEqual([
|
|
96
|
+
"col1 person user",
|
|
97
|
+
"col2 person user",
|
|
98
|
+
"col3 location address",
|
|
99
|
+
]);
|
|
100
|
+
expect(collected.height).toBe(4);
|
|
101
|
+
expect(collected.row(0)).toEqual(["first", "last", "city"]);
|
|
102
|
+
expect(collected.row(1)).toEqual(["header4", "header4", "header4"]);
|
|
103
|
+
expect(collected.row(2)).toEqual(["Alice", "Smith", "NYC"]);
|
|
104
|
+
expect(collected.row(3)).toEqual(["Bob", "Jones", "LA"]);
|
|
105
|
+
});
|
|
106
|
+
it("should handle empty strings in header rows", async () => {
|
|
107
|
+
const table = pl
|
|
108
|
+
.DataFrame({
|
|
109
|
+
col1: ["person", "", "header3", "Alice", "Bob"],
|
|
110
|
+
col2: ["", "name", "header3", "Smith", "Jones"],
|
|
111
|
+
col3: ["location", "city", "header3", "NYC", "LA"],
|
|
112
|
+
})
|
|
113
|
+
.lazy();
|
|
114
|
+
const result = await joinHeaderRows(table, {
|
|
115
|
+
dialect: { headerRows: [2, 3] },
|
|
116
|
+
});
|
|
117
|
+
const collected = await result.collect();
|
|
118
|
+
expect(collected.columns).toEqual(["col1 person", "col2 ", "col3 location"]);
|
|
119
|
+
expect(collected.height).toBe(4);
|
|
120
|
+
expect(collected.row(0)).toEqual(["", "name", "city"]);
|
|
121
|
+
expect(collected.row(1)).toEqual(["header3", "header3", "header3"]);
|
|
122
|
+
expect(collected.row(2)).toEqual(["Alice", "Smith", "NYC"]);
|
|
123
|
+
expect(collected.row(3)).toEqual(["Bob", "Jones", "LA"]);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe("skipCommentRows", () => {
|
|
127
|
+
it("should skip comment rows by row number", async () => {
|
|
128
|
+
const table = pl
|
|
129
|
+
.DataFrame({
|
|
130
|
+
name: ["Alice", "# Comment", "Bob", "Charlie"],
|
|
131
|
+
age: [30, 0, 25, 35],
|
|
132
|
+
city: ["NYC", "ignored", "LA", "SF"],
|
|
133
|
+
})
|
|
134
|
+
.lazy();
|
|
135
|
+
const result = skipCommentRows(table, {
|
|
136
|
+
dialect: { commentRows: [2], header: false },
|
|
137
|
+
});
|
|
138
|
+
const collected = await result.collect();
|
|
139
|
+
expect(collected.height).toBe(3);
|
|
140
|
+
expect(collected.row(0)).toEqual(["Alice", 30, "NYC"]);
|
|
141
|
+
expect(collected.row(1)).toEqual(["Bob", 25, "LA"]);
|
|
142
|
+
expect(collected.row(2)).toEqual(["Charlie", 35, "SF"]);
|
|
143
|
+
});
|
|
144
|
+
it("should skip multiple comment rows", async () => {
|
|
145
|
+
const table = pl
|
|
146
|
+
.DataFrame({
|
|
147
|
+
name: ["Alice", "# Comment 1", "Bob", "# Comment 2", "Charlie"],
|
|
148
|
+
age: [30, 0, 25, 0, 35],
|
|
149
|
+
city: ["NYC", "ignored", "LA", "ignored", "SF"],
|
|
150
|
+
})
|
|
151
|
+
.lazy();
|
|
152
|
+
const result = skipCommentRows(table, {
|
|
153
|
+
dialect: { commentRows: [2, 4], header: false },
|
|
154
|
+
});
|
|
155
|
+
const collected = await result.collect();
|
|
156
|
+
expect(collected.height).toBe(3);
|
|
157
|
+
expect(collected.row(0)).toEqual(["Alice", 30, "NYC"]);
|
|
158
|
+
expect(collected.row(1)).toEqual(["Bob", 25, "LA"]);
|
|
159
|
+
expect(collected.row(2)).toEqual(["Charlie", 35, "SF"]);
|
|
160
|
+
});
|
|
161
|
+
it("should return table unchanged when no commentRows specified", async () => {
|
|
162
|
+
const table = pl
|
|
163
|
+
.DataFrame({
|
|
164
|
+
name: ["Alice", "Bob", "Charlie"],
|
|
165
|
+
age: [30, 25, 35],
|
|
166
|
+
city: ["NYC", "LA", "SF"],
|
|
167
|
+
})
|
|
168
|
+
.lazy();
|
|
169
|
+
const result = skipCommentRows(table, {
|
|
170
|
+
dialect: {},
|
|
171
|
+
});
|
|
172
|
+
const collected = await result.collect();
|
|
173
|
+
expect(collected.height).toBe(3);
|
|
174
|
+
expect(collected.columns).toEqual(["name", "age", "city"]);
|
|
175
|
+
});
|
|
176
|
+
it("should skip rows after header when headerRows specified", async () => {
|
|
177
|
+
const table = pl
|
|
178
|
+
.DataFrame({
|
|
179
|
+
col1: ["name", "Alice", "# Comment", "Bob"],
|
|
180
|
+
col2: ["age", "30", "-1", "25"],
|
|
181
|
+
col3: ["city", "NYC", "ignored", "LA"],
|
|
182
|
+
})
|
|
183
|
+
.lazy();
|
|
184
|
+
const result = skipCommentRows(table, {
|
|
185
|
+
dialect: { headerRows: [2], commentRows: [5] },
|
|
186
|
+
});
|
|
187
|
+
const collected = await result.collect();
|
|
188
|
+
expect(collected.height).toBe(3);
|
|
189
|
+
expect(collected.row(0)).toEqual(["name", "age", "city"]);
|
|
190
|
+
expect(collected.row(1)).toEqual(["Alice", "30", "NYC"]);
|
|
191
|
+
expect(collected.row(2)).toEqual(["Bob", "25", "LA"]);
|
|
192
|
+
});
|
|
193
|
+
it("should handle commentRows at the beginning", async () => {
|
|
194
|
+
const table = pl
|
|
195
|
+
.DataFrame({
|
|
196
|
+
name: ["# Skip this", "Alice", "Bob"],
|
|
197
|
+
age: [0, 30, 25],
|
|
198
|
+
city: ["ignored", "NYC", "LA"],
|
|
199
|
+
})
|
|
200
|
+
.lazy();
|
|
201
|
+
const result = skipCommentRows(table, {
|
|
202
|
+
dialect: { commentRows: [1], header: false },
|
|
203
|
+
});
|
|
204
|
+
const collected = await result.collect();
|
|
205
|
+
expect(collected.height).toBe(2);
|
|
206
|
+
expect(collected.row(0)).toEqual(["Alice", 30, "NYC"]);
|
|
207
|
+
expect(collected.row(1)).toEqual(["Bob", 25, "LA"]);
|
|
208
|
+
});
|
|
209
|
+
it("should handle commentRows at the end", async () => {
|
|
210
|
+
const table = pl
|
|
211
|
+
.DataFrame({
|
|
212
|
+
name: ["Alice", "Bob", "# Footer comment"],
|
|
213
|
+
age: [30, 25, 0],
|
|
214
|
+
city: ["NYC", "LA", "ignored"],
|
|
215
|
+
})
|
|
216
|
+
.lazy();
|
|
217
|
+
const result = skipCommentRows(table, {
|
|
218
|
+
dialect: { commentRows: [3], header: false },
|
|
219
|
+
});
|
|
220
|
+
const collected = await result.collect();
|
|
221
|
+
expect(collected.height).toBe(2);
|
|
222
|
+
expect(collected.row(0)).toEqual(["Alice", 30, "NYC"]);
|
|
223
|
+
expect(collected.row(1)).toEqual(["Bob", 25, "LA"]);
|
|
224
|
+
});
|
|
225
|
+
it("should handle multiple header rows with commentRows", async () => {
|
|
226
|
+
const table = pl
|
|
227
|
+
.DataFrame({
|
|
228
|
+
col1: ["person", "first", "Alice", "# Comment", "Bob"],
|
|
229
|
+
col2: ["person", "last", "Smith", "ignored", "Jones"],
|
|
230
|
+
col3: ["location", "city", "NYC", "ignored", "LA"],
|
|
231
|
+
})
|
|
232
|
+
.lazy();
|
|
233
|
+
const result = skipCommentRows(table, {
|
|
234
|
+
dialect: { headerRows: [2, 3], commentRows: [7] },
|
|
235
|
+
});
|
|
236
|
+
const collected = await result.collect();
|
|
237
|
+
expect(collected.height).toBe(4);
|
|
238
|
+
expect(collected.row(0)).toEqual(["person", "person", "location"]);
|
|
239
|
+
expect(collected.row(1)).toEqual(["first", "last", "city"]);
|
|
240
|
+
expect(collected.row(2)).toEqual(["Alice", "Smith", "NYC"]);
|
|
241
|
+
expect(collected.row(3)).toEqual(["Bob", "Jones", "LA"]);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
describe("stripInitialSpace", () => {
|
|
245
|
+
it("should strip leading and trailing spaces from all columns", async () => {
|
|
246
|
+
const table = pl
|
|
247
|
+
.DataFrame({
|
|
248
|
+
name: [" Alice ", " Bob", "Charlie "],
|
|
249
|
+
age: ["30", " 25 ", "35"],
|
|
250
|
+
city: [" NYC", "LA ", " SF "],
|
|
251
|
+
})
|
|
252
|
+
.lazy();
|
|
253
|
+
const result = stripInitialSpace(table, {
|
|
254
|
+
dialect: { skipInitialSpace: true },
|
|
255
|
+
});
|
|
256
|
+
const collected = await result.collect();
|
|
257
|
+
expect(collected.row(0)).toEqual(["Alice", "30", "NYC"]);
|
|
258
|
+
expect(collected.row(1)).toEqual(["Bob", "25", "LA"]);
|
|
259
|
+
expect(collected.row(2)).toEqual(["Charlie", "35", "SF"]);
|
|
260
|
+
});
|
|
261
|
+
it("should return table unchanged when skipInitialSpace is false", async () => {
|
|
262
|
+
const table = pl
|
|
263
|
+
.DataFrame({
|
|
264
|
+
name: [" Alice ", " Bob"],
|
|
265
|
+
age: ["30", " 25 "],
|
|
266
|
+
city: [" NYC", "LA "],
|
|
267
|
+
})
|
|
268
|
+
.lazy();
|
|
269
|
+
const result = stripInitialSpace(table, {
|
|
270
|
+
dialect: { skipInitialSpace: false },
|
|
271
|
+
});
|
|
272
|
+
const collected = await result.collect();
|
|
273
|
+
expect(collected.row(0)).toEqual([" Alice ", "30", " NYC"]);
|
|
274
|
+
expect(collected.row(1)).toEqual([" Bob", " 25 ", "LA "]);
|
|
275
|
+
});
|
|
276
|
+
it("should return table unchanged when skipInitialSpace is not specified", async () => {
|
|
277
|
+
const table = pl
|
|
278
|
+
.DataFrame({
|
|
279
|
+
name: [" Alice ", " Bob"],
|
|
280
|
+
age: ["30", " 25 "],
|
|
281
|
+
city: [" NYC", "LA "],
|
|
282
|
+
})
|
|
283
|
+
.lazy();
|
|
284
|
+
const result = stripInitialSpace(table, {
|
|
285
|
+
dialect: {},
|
|
286
|
+
});
|
|
287
|
+
const collected = await result.collect();
|
|
288
|
+
expect(collected.row(0)).toEqual([" Alice ", "30", " NYC"]);
|
|
289
|
+
expect(collected.row(1)).toEqual([" Bob", " 25 ", "LA "]);
|
|
290
|
+
});
|
|
291
|
+
it("should handle strings with no spaces", async () => {
|
|
292
|
+
const table = pl
|
|
293
|
+
.DataFrame({
|
|
294
|
+
name: ["Alice", "Bob"],
|
|
295
|
+
age: ["30", "25"],
|
|
296
|
+
city: ["NYC", "LA"],
|
|
297
|
+
})
|
|
298
|
+
.lazy();
|
|
299
|
+
const result = stripInitialSpace(table, {
|
|
300
|
+
dialect: { skipInitialSpace: true },
|
|
301
|
+
});
|
|
302
|
+
const collected = await result.collect();
|
|
303
|
+
expect(collected.row(0)).toEqual(["Alice", "30", "NYC"]);
|
|
304
|
+
expect(collected.row(1)).toEqual(["Bob", "25", "LA"]);
|
|
305
|
+
});
|
|
306
|
+
it("should handle empty strings", async () => {
|
|
307
|
+
const table = pl
|
|
308
|
+
.DataFrame({
|
|
309
|
+
name: ["Alice", ""],
|
|
310
|
+
age: ["30", " "],
|
|
311
|
+
city: ["", "LA"],
|
|
312
|
+
})
|
|
313
|
+
.lazy();
|
|
314
|
+
const result = stripInitialSpace(table, {
|
|
315
|
+
dialect: { skipInitialSpace: true },
|
|
316
|
+
});
|
|
317
|
+
const collected = await result.collect();
|
|
318
|
+
expect(collected.row(0)).toEqual(["Alice", "30", ""]);
|
|
319
|
+
expect(collected.row(1)).toEqual(["", "", "LA"]);
|
|
320
|
+
});
|
|
321
|
+
it("should handle strings with multiple spaces", async () => {
|
|
322
|
+
const table = pl
|
|
323
|
+
.DataFrame({
|
|
324
|
+
name: [" Alice ", " Bob"],
|
|
325
|
+
age: ["30 ", " 25 "],
|
|
326
|
+
city: [" NYC ", " LA "],
|
|
327
|
+
})
|
|
328
|
+
.lazy();
|
|
329
|
+
const result = stripInitialSpace(table, {
|
|
330
|
+
dialect: { skipInitialSpace: true },
|
|
331
|
+
});
|
|
332
|
+
const collected = await result.collect();
|
|
333
|
+
expect(collected.row(0)).toEqual(["Alice", "30", "NYC"]);
|
|
334
|
+
expect(collected.row(1)).toEqual(["Bob", "25", "LA"]);
|
|
335
|
+
});
|
|
336
|
+
it("should handle tabs and other whitespace", async () => {
|
|
337
|
+
const table = pl
|
|
338
|
+
.DataFrame({
|
|
339
|
+
name: ["\tAlice\t", "\nBob"],
|
|
340
|
+
age: ["30\n", "\t25\t"],
|
|
341
|
+
city: ["\tNYC", "LA\n"],
|
|
342
|
+
})
|
|
343
|
+
.lazy();
|
|
344
|
+
const result = stripInitialSpace(table, {
|
|
345
|
+
dialect: { skipInitialSpace: true },
|
|
346
|
+
});
|
|
347
|
+
const collected = await result.collect();
|
|
348
|
+
expect(collected.row(0)).toEqual(["Alice", "30", "NYC"]);
|
|
349
|
+
expect(collected.row(1)).toEqual(["Bob", "25", "LA"]);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGFibGUvaGVscGVycy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGVBQWUsRUFDZixpQkFBaUIsR0FDbEIsTUFBTSxjQUFjLENBQUE7QUFFckIsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixFQUFFLENBQUMsMERBQTBELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDeEUsTUFBTSxLQUFLLEdBQUcsRUFBRTthQUNiLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7WUFDbEQsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUNuRCxJQUFJLEVBQUU7Z0JBQ0osU0FBUztnQkFDVCxPQUFPO2dCQUNQLFNBQVM7Z0JBQ1QsbUJBQW1CO2dCQUNuQixpQkFBaUI7YUFDbEI7U0FDRixDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUU7WUFDekMsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO1NBQ2hDLENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2hDLFlBQVk7WUFDWixXQUFXO1lB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QUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQzNELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQ25FLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzNELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzFELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFELE1BQU0sS0FBSyxHQUFHLEVBQUU7YUFDYixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQy9DLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7WUFDL0MsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztTQUNuRCxDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQUE7UUFFVCxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUU7WUFDekMsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO1NBQ2hDLENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0s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QUssRUFBRTtZQUN0QyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7U0FDcEMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdkQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsIGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQge1xuICBqb2luSGVhZGVyUm93cyxcbiAgc2tpcENvbW1lbnRSb3dzLFxuICBzdHJpcEluaXRpYWxTcGFjZSxcbn0gZnJvbSBcIi4vaGVscGVycy50c1wiXG5cbmRlc2NyaWJlKFwiam9pbkhlYWRlclJvd3NcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBqb2luIHR3byBoZWFkZXIgcm93cyB3aXRoIGRlZmF1bHQgc3BhY2Ugc2VwYXJhdG9yXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgY29sMTogW1wiZmlyc3RcIiwgXCJuYW1lXCIsIFwiaGVhZGVyM1wiLCBcIkFsaWNlXCIsIFwiQm9iXCJdLFxuICAgICAgICBjb2wyOiBbXCJsYXN0XCIsIFwibmFtZVwiLCBcImhlYWRlcjNcIiwgXCJTbWl0aFwiLCBcIkpvbmVzXCJdLFxuICAgICAgICBjb2wzOiBbXG4gICAgICAgICAgXCJjb250YWN0XCIsXG4gICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgIFwiaGVhZGVyM1wiLFxuICAgICAgICAgIFwiYWxpY2VAZXhhbXBsZS5jb21cIixcbiAgICAgICAgICBcImJvYkBleGFtcGxlLmNvbVwiLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzXSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5jb2x1bW5zKS50b0VxdWFsKFtcbiAgICAgIFwiY29sMSBmaXJzdFwiLFxuICAgICAgXCJjb2wyIGxhc3RcIixcbiAgICAgIFwiY29sMyBjb250YWN0XCIsXG4gICAgXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLmhlaWdodCkudG9CZSg0KVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDApKS50b0VxdWFsKFtcIm5hbWVcIiwgXCJuYW1lXCIsIFwiZW1haWxcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiaGVhZGVyM1wiLCBcImhlYWRlcjNcIiwgXCJoZWFkZXIzXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDIpKS50b0VxdWFsKFtcIkFsaWNlXCIsIFwiU21pdGhcIiwgXCJhbGljZUBleGFtcGxlLmNvbVwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygzKSkudG9FcXVhbChbXCJCb2JcIiwgXCJKb25lc1wiLCBcImJvYkBleGFtcGxlLmNvbVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBqb2luIHR3byBoZWFkZXIgcm93cyB3aXRoIGN1c3RvbSBzZXBhcmF0b3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBjb2wxOiBbXCJ1c2VyXCIsIFwiZmlyc3RcIiwgXCJoZWFkZXIzXCIsIFwiQWxpY2VcIiwgXCJCb2JcIl0sXG4gICAgICAgIGNvbDI6IFtcInVzZXJcIiwgXCJsYXN0XCIsIFwiaGVhZGVyM1wiLCBcIlNtaXRoXCIsIFwiSm9uZXNcIl0sXG4gICAgICAgIGNvbDM6IFtcIm1ldGFcIiwgXCJjcmVhdGVkXCIsIFwiaGVhZGVyM1wiLCBcIjIwMjMtMDEtMDFcIiwgXCIyMDIzLTAxLTAyXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzXSwgaGVhZGVySm9pbjogXCJfXCIgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuY29sdW1ucykudG9FcXVhbChbXCJjb2wxX3VzZXJcIiwgXCJjb2wyX3VzZXJcIiwgXCJjb2wzX21ldGFcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoNClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJmaXJzdFwiLCBcImxhc3RcIiwgXCJjcmVhdGVkXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcImhlYWRlcjNcIiwgXCJoZWFkZXIzXCIsIFwiaGVhZGVyM1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygyKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIlNtaXRoXCIsIFwiMjAyMy0wMS0wMVwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygzKSkudG9FcXVhbChbXCJCb2JcIiwgXCJKb25lc1wiLCBcIjIwMjMtMDEtMDJcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIHRhYmxlIHVuY2hhbmdlZCB3aGVuIG9ubHkgb25lIGhlYWRlciByb3dcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCJBbGljZVwiLCBcIkJvYlwiXSxcbiAgICAgICAgYWdlOiBbMzAsIDI1XSxcbiAgICAgICAgY2l0eTogW1wiTllDXCIsIFwiTEFcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgam9pbkhlYWRlclJvd3ModGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgaGVhZGVyUm93czogWzFdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLmNvbHVtbnMpLnRvRXF1YWwoW1wibmFtZVwiLCBcImFnZVwiLCBcImNpdHlcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoMilcbiAgfSlcblxuICBpdChcInNob3VsZCByZXR1cm4gdGFibGUgdW5jaGFuZ2VkIHdoZW4gbm8gaGVhZGVyIHJvd3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBmaWVsZDE6IFtcIkFsaWNlXCIsIFwiQm9iXCJdLFxuICAgICAgICBmaWVsZDI6IFszMCwgMjVdLFxuICAgICAgICBmaWVsZDM6IFtcIk5ZQ1wiLCBcIkxBXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlcjogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuY29sdW1ucykudG9FcXVhbChbXCJmaWVsZDFcIiwgXCJmaWVsZDJcIiwgXCJmaWVsZDNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoMilcbiAgfSlcblxuICBpdChcInNob3VsZCBqb2luIHRocmVlIGhlYWRlciByb3dzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgY29sMTogW1wicGVyc29uXCIsIFwidXNlclwiLCBcImZpcnN0XCIsIFwiaGVhZGVyNFwiLCBcIkFsaWNlXCIsIFwiQm9iXCJdLFxuICAgICAgICBjb2wyOiBbXCJwZXJzb25cIiwgXCJ1c2VyXCIsIFwibGFzdFwiLCBcImhlYWRlcjRcIiwgXCJTbWl0aFwiLCBcIkpvbmVzXCJdLFxuICAgICAgICBjb2wzOiBbXCJsb2NhdGlvblwiLCBcImFkZHJlc3NcIiwgXCJjaXR5XCIsIFwiaGVhZGVyNFwiLCBcIk5ZQ1wiLCBcIkxBXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzLCA0XSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5jb2x1bW5zKS50b0VxdWFsKFtcbiAgICAgIFwiY29sMSBwZXJzb24gdXNlclwiLFxuICAgICAgXCJjb2wyIHBlcnNvbiB1c2VyXCIsXG4gICAgICBcImNvbDMgbG9jYXRpb24gYWRkcmVzc1wiLFxuICAgIF0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoNClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJmaXJzdFwiLCBcImxhc3RcIiwgXCJjaXR5XCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcImhlYWRlcjRcIiwgXCJoZWFkZXI0XCIsIFwiaGVhZGVyNFwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygyKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIlNtaXRoXCIsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDMpKS50b0VxdWFsKFtcIkJvYlwiLCBcIkpvbmVzXCIsIFwiTEFcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGVtcHR5IHN0cmluZ3MgaW4gaGVhZGVyIHJvd3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBjb2wxOiBbXCJwZXJzb25cIiwgXCJcIiwgXCJoZWFkZXIzXCIsIFwiQWxpY2VcIiwgXCJCb2JcIl0sXG4gICAgICAgIGNvbDI6IFtcIlwiLCBcIm5hbWVcIiwgXCJoZWFkZXIzXCIsIFwiU21pdGhcIiwgXCJKb25lc1wiXSxcbiAgICAgICAgY29sMzogW1wibG9jYXRpb25cIiwgXCJjaXR5XCIsIFwiaGVhZGVyM1wiLCBcIk5ZQ1wiLCBcIkxBXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGpvaW5IZWFkZXJSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGhlYWRlclJvd3M6IFsyLCAzXSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5jb2x1bW5zKS50b0VxdWFsKFtcImNvbDEgcGVyc29uXCIsIFwiY29sMiBcIiwgXCJjb2wzIGxvY2F0aW9uXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuaGVpZ2h0KS50b0JlKDQpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiXCIsIFwibmFtZVwiLCBcImNpdHlcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiaGVhZGVyM1wiLCBcImhlYWRlcjNcIiwgXCJoZWFkZXIzXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDIpKS50b0VxdWFsKFtcIkFsaWNlXCIsIFwiU21pdGhcIiwgXCJOWUNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMykpLnRvRXF1YWwoW1wiQm9iXCIsIFwiSm9uZXNcIiwgXCJMQVwiXSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKFwic2tpcENvbW1lbnRSb3dzXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc2tpcCBjb21tZW50IHJvd3MgYnkgcm93IG51bWJlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiIyBDb21tZW50XCIsIFwiQm9iXCIsIFwiQ2hhcmxpZVwiXSxcbiAgICAgICAgYWdlOiBbMzAsIDAsIDI1LCAzNV0sXG4gICAgICAgIGNpdHk6IFtcIk5ZQ1wiLCBcImlnbm9yZWRcIiwgXCJMQVwiLCBcIlNGXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IHNraXBDb21tZW50Um93cyh0YWJsZSwge1xuICAgICAgZGlhbGVjdDogeyBjb21tZW50Um93czogWzJdLCBoZWFkZXI6IGZhbHNlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLmhlaWdodCkudG9CZSgzKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDApKS50b0VxdWFsKFtcIkFsaWNlXCIsIDMwLCBcIk5ZQ1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygxKSkudG9FcXVhbChbXCJCb2JcIiwgMjUsIFwiTEFcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMikpLnRvRXF1YWwoW1wiQ2hhcmxpZVwiLCAzNSwgXCJTRlwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBza2lwIG11bHRpcGxlIGNvbW1lbnQgcm93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWU6IFtcIkFsaWNlXCIsIFwiIyBDb21tZW50IDFcIiwgXCJCb2JcIiwgXCIjIENvbW1lbnQgMlwiLCBcIkNoYXJsaWVcIl0sXG4gICAgICAgIGFnZTogWzMwLCAwLCAyNSwgMCwgMzVdLFxuICAgICAgICBjaXR5OiBbXCJOWUNcIiwgXCJpZ25vcmVkXCIsIFwiTEFcIiwgXCJpZ25vcmVkXCIsIFwiU0ZcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc2tpcENvbW1lbnRSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGNvbW1lbnRSb3dzOiBbMiwgNF0sIGhlYWRlcjogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuaGVpZ2h0KS50b0JlKDMpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgMzAsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIkJvYlwiLCAyNSwgXCJMQVwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygyKSkudG9FcXVhbChbXCJDaGFybGllXCIsIDM1LCBcIlNGXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiB0YWJsZSB1bmNoYW5nZWQgd2hlbiBubyBjb21tZW50Um93cyBzcGVjaWZpZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCJBbGljZVwiLCBcIkJvYlwiLCBcIkNoYXJsaWVcIl0sXG4gICAgICAgIGFnZTogWzMwLCAyNSwgMzVdLFxuICAgICAgICBjaXR5OiBbXCJOWUNcIiwgXCJMQVwiLCBcIlNGXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IHNraXBDb21tZW50Um93cyh0YWJsZSwge1xuICAgICAgZGlhbGVjdDoge30sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLmhlaWdodCkudG9CZSgzKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuY29sdW1ucykudG9FcXVhbChbXCJuYW1lXCIsIFwiYWdlXCIsIFwiY2l0eVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBza2lwIHJvd3MgYWZ0ZXIgaGVhZGVyIHdoZW4gaGVhZGVyUm93cyBzcGVjaWZpZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBjb2wxOiBbXCJuYW1lXCIsIFwiQWxpY2VcIiwgXCIjIENvbW1lbnRcIiwgXCJCb2JcIl0sXG4gICAgICAgIGNvbDI6IFtcImFnZVwiLCBcIjMwXCIsIFwiLTFcIiwgXCIyNVwiXSxcbiAgICAgICAgY29sMzogW1wiY2l0eVwiLCBcIk5ZQ1wiLCBcImlnbm9yZWRcIiwgXCJMQVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBza2lwQ29tbWVudFJvd3ModGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgaGVhZGVyUm93czogWzJdLCBjb21tZW50Um93czogWzVdIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLmhlaWdodCkudG9CZSgzKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDApKS50b0VxdWFsKFtcIm5hbWVcIiwgXCJhZ2VcIiwgXCJjaXR5XCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIkFsaWNlXCIsIFwiMzBcIiwgXCJOWUNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMikpLnRvRXF1YWwoW1wiQm9iXCIsIFwiMjVcIiwgXCJMQVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgY29tbWVudFJvd3MgYXQgdGhlIGJlZ2lubmluZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWU6IFtcIiMgU2tpcCB0aGlzXCIsIFwiQWxpY2VcIiwgXCJCb2JcIl0sXG4gICAgICAgIGFnZTogWzAsIDMwLCAyNV0sXG4gICAgICAgIGNpdHk6IFtcImlnbm9yZWRcIiwgXCJOWUNcIiwgXCJMQVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBza2lwQ29tbWVudFJvd3ModGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgY29tbWVudFJvd3M6IFsxXSwgaGVhZGVyOiBmYWxzZSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5oZWlnaHQpLnRvQmUoMilcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJBbGljZVwiLCAzMCwgXCJOWUNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiQm9iXCIsIDI1LCBcIkxBXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjb21tZW50Um93cyBhdCB0aGUgZW5kXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJCb2JcIiwgXCIjIEZvb3RlciBjb21tZW50XCJdLFxuICAgICAgICBhZ2U6IFszMCwgMjUsIDBdLFxuICAgICAgICBjaXR5OiBbXCJOWUNcIiwgXCJMQVwiLCBcImlnbm9yZWRcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc2tpcENvbW1lbnRSb3dzKHRhYmxlLCB7XG4gICAgICBkaWFsZWN0OiB7IGNvbW1lbnRSb3dzOiBbM10sIGhlYWRlcjogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuaGVpZ2h0KS50b0JlKDIpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgMzAsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIkJvYlwiLCAyNSwgXCJMQVwiXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgbXVsdGlwbGUgaGVhZGVyIHJvd3Mgd2l0aCBjb21tZW50Um93c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIGNvbDE6IFtcInBlcnNvblwiLCBcImZpcnN0XCIsIFwiQWxpY2VcIiwgXCIjIENvbW1lbnRcIiwgXCJCb2JcIl0sXG4gICAgICAgIGNvbDI6IFtcInBlcnNvblwiLCBcImxhc3RcIiwgXCJTbWl0aFwiLCBcImlnbm9yZWRcIiwgXCJKb25lc1wiXSxcbiAgICAgICAgY29sMzogW1wibG9jYXRpb25cIiwgXCJjaXR5XCIsIFwiTllDXCIsIFwiaWdub3JlZFwiLCBcIkxBXCJdLFxuICAgICAgfSlcbiAgICAgIC5sYXp5KClcblxuICAgIGNvbnN0IHJlc3VsdCA9IHNraXBDb21tZW50Um93cyh0YWJsZSwge1xuICAgICAgZGlhbGVjdDogeyBoZWFkZXJSb3dzOiBbMiwgM10sIGNvbW1lbnRSb3dzOiBbN10gfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQuaGVpZ2h0KS50b0JlKDQpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wicGVyc29uXCIsIFwicGVyc29uXCIsIFwibG9jYXRpb25cIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiZmlyc3RcIiwgXCJsYXN0XCIsIFwiY2l0eVwiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygyKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIlNtaXRoXCIsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDMpKS50b0VxdWFsKFtcIkJvYlwiLCBcIkpvbmVzXCIsIFwiTEFcIl0pXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInN0cmlwSW5pdGlhbFNwYWNlXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgc3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGZyb20gYWxsIGNvbHVtbnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCIgQWxpY2UgXCIsIFwiIEJvYlwiLCBcIkNoYXJsaWUgXCJdLFxuICAgICAgICBhZ2U6IFtcIjMwXCIsIFwiIDI1IFwiLCBcIjM1XCJdLFxuICAgICAgICBjaXR5OiBbXCIgTllDXCIsIFwiTEEgXCIsIFwiIFNGIFwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBzdHJpcEluaXRpYWxTcGFjZSh0YWJsZSwge1xuICAgICAgZGlhbGVjdDogeyBza2lwSW5pdGlhbFNwYWNlOiB0cnVlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIjMwXCIsIFwiTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIkJvYlwiLCBcIjI1XCIsIFwiTEFcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMikpLnRvRXF1YWwoW1wiQ2hhcmxpZVwiLCBcIjM1XCIsIFwiU0ZcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIHRhYmxlIHVuY2hhbmdlZCB3aGVuIHNraXBJbml0aWFsU3BhY2UgaXMgZmFsc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlID0gcGxcbiAgICAgIC5EYXRhRnJhbWUoe1xuICAgICAgICBuYW1lOiBbXCIgQWxpY2UgXCIsIFwiIEJvYlwiXSxcbiAgICAgICAgYWdlOiBbXCIzMFwiLCBcIiAyNSBcIl0sXG4gICAgICAgIGNpdHk6IFtcIiBOWUNcIiwgXCJMQSBcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogZmFsc2UgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgY29sbGVjdGVkID0gYXdhaXQgcmVzdWx0LmNvbGxlY3QoKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDApKS50b0VxdWFsKFtcIiBBbGljZSBcIiwgXCIzMFwiLCBcIiBOWUNcIl0pXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMSkpLnRvRXF1YWwoW1wiIEJvYlwiLCBcIiAyNSBcIiwgXCJMQSBcIl0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIHRhYmxlIHVuY2hhbmdlZCB3aGVuIHNraXBJbml0aWFsU3BhY2UgaXMgbm90IHNwZWNpZmllZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGUgPSBwbFxuICAgICAgLkRhdGFGcmFtZSh7XG4gICAgICAgIG5hbWU6IFtcIiBBbGljZSBcIiwgXCIgQm9iXCJdLFxuICAgICAgICBhZ2U6IFtcIjMwXCIsIFwiIDI1IFwiXSxcbiAgICAgICAgY2l0eTogW1wiIE5ZQ1wiLCBcIkxBIFwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBzdHJpcEluaXRpYWxTcGFjZSh0YWJsZSwge1xuICAgICAgZGlhbGVjdDoge30sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCIgQWxpY2UgXCIsIFwiMzBcIiwgXCIgTllDXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIiBCb2JcIiwgXCIgMjUgXCIsIFwiTEEgXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBzdHJpbmdzIHdpdGggbm8gc3BhY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJCb2JcIl0sXG4gICAgICAgIGFnZTogW1wiMzBcIiwgXCIyNVwiXSxcbiAgICAgICAgY2l0eTogW1wiTllDXCIsIFwiTEFcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgXCIzMFwiLCBcIk5ZQ1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygxKSkudG9FcXVhbChbXCJCb2JcIiwgXCIyNVwiLCBcIkxBXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBlbXB0eSBzdHJpbmdzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiQWxpY2VcIiwgXCJcIl0sXG4gICAgICAgIGFnZTogW1wiMzBcIiwgXCIgXCJdLFxuICAgICAgICBjaXR5OiBbXCJcIiwgXCJMQVwiXSxcbiAgICAgIH0pXG4gICAgICAubGF6eSgpXG5cbiAgICBjb25zdCByZXN1bHQgPSBzdHJpcEluaXRpYWxTcGFjZSh0YWJsZSwge1xuICAgICAgZGlhbGVjdDogeyBza2lwSW5pdGlhbFNwYWNlOiB0cnVlIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RlZCA9IGF3YWl0IHJlc3VsdC5jb2xsZWN0KClcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygwKSkudG9FcXVhbChbXCJBbGljZVwiLCBcIjMwXCIsIFwiXCJdKVxuICAgIGV4cGVjdChjb2xsZWN0ZWQucm93KDEpKS50b0VxdWFsKFtcIlwiLCBcIlwiLCBcIkxBXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBzdHJpbmdzIHdpdGggbXVsdGlwbGUgc3BhY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiICBBbGljZSAgXCIsIFwiICAgQm9iXCJdLFxuICAgICAgICBhZ2U6IFtcIjMwICAgXCIsIFwiICAyNSAgXCJdLFxuICAgICAgICBjaXR5OiBbXCIgIE5ZQyAgXCIsIFwiICAgTEEgICBcIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgXCIzMFwiLCBcIk5ZQ1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygxKSkudG9FcXVhbChbXCJCb2JcIiwgXCIyNVwiLCBcIkxBXCJdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSB0YWJzIGFuZCBvdGhlciB3aGl0ZXNwYWNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZSA9IHBsXG4gICAgICAuRGF0YUZyYW1lKHtcbiAgICAgICAgbmFtZTogW1wiXFx0QWxpY2VcXHRcIiwgXCJcXG5Cb2JcIl0sXG4gICAgICAgIGFnZTogW1wiMzBcXG5cIiwgXCJcXHQyNVxcdFwiXSxcbiAgICAgICAgY2l0eTogW1wiXFx0TllDXCIsIFwiTEFcXG5cIl0sXG4gICAgICB9KVxuICAgICAgLmxhenkoKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyaXBJbml0aWFsU3BhY2UodGFibGUsIHtcbiAgICAgIGRpYWxlY3Q6IHsgc2tpcEluaXRpYWxTcGFjZTogdHJ1ZSB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0ZWQgPSBhd2FpdCByZXN1bHQuY29sbGVjdCgpXG4gICAgZXhwZWN0KGNvbGxlY3RlZC5yb3coMCkpLnRvRXF1YWwoW1wiQWxpY2VcIiwgXCIzMFwiLCBcIk5ZQ1wiXSlcbiAgICBleHBlY3QoY29sbGVjdGVkLnJvdygxKSkudG9FcXVhbChbXCJCb2JcIiwgXCIyNVwiLCBcIkxBXCJdKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { normalizeTable } from "./normalize.ts";
|
|
2
|
+
export { denormalizeTable } from "./denormalize.ts";
|
|
3
|
+
export { inspectTable } from "./inspect.ts";
|
|
4
|
+
export type { Frame } from "./Frame.ts";
|
|
5
|
+
export type { Table } from "./Table.ts";
|
|
6
|
+
export { skipCommentRows } from "./helpers.ts";
|
|
7
|
+
export { joinHeaderRows } from "./helpers.ts";
|
|
8
|
+
export { stripInitialSpace } from "./helpers.ts";
|
|
9
|
+
export { queryTable } from "./query.ts";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { normalizeTable } from "./normalize.js";
|
|
2
|
+
export { denormalizeTable } from "./denormalize.js";
|
|
3
|
+
export { inspectTable } from "./inspect.js";
|
|
4
|
+
export { skipCommentRows } from "./helpers.js";
|
|
5
|
+
export { joinHeaderRows } from "./helpers.js";
|
|
6
|
+
export { stripInitialSpace } from "./helpers.js";
|
|
7
|
+
export { queryTable } from "./query.js";
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUczQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBub3JtYWxpemVUYWJsZSB9IGZyb20gXCIuL25vcm1hbGl6ZS50c1wiXG5leHBvcnQgeyBkZW5vcm1hbGl6ZVRhYmxlIH0gZnJvbSBcIi4vZGVub3JtYWxpemUudHNcIlxuZXhwb3J0IHsgaW5zcGVjdFRhYmxlIH0gZnJvbSBcIi4vaW5zcGVjdC50c1wiXG5leHBvcnQgdHlwZSB7IEZyYW1lIH0gZnJvbSBcIi4vRnJhbWUudHNcIlxuZXhwb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gXCIuL1RhYmxlLnRzXCJcbmV4cG9ydCB7IHNraXBDb21tZW50Um93cyB9IGZyb20gXCIuL2hlbHBlcnMudHNcIlxuZXhwb3J0IHsgam9pbkhlYWRlclJvd3MgfSBmcm9tIFwiLi9oZWxwZXJzLnRzXCJcbmV4cG9ydCB7IHN0cmlwSW5pdGlhbFNwYWNlIH0gZnJvbSBcIi4vaGVscGVycy50c1wiXG5leHBvcnQgeyBxdWVyeVRhYmxlIH0gZnJvbSBcIi4vcXVlcnkudHNcIlxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Schema } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { TableError } from "@frictionless-ts/metadata";
|
|
3
|
+
import type { Table } from "./Table.ts";
|
|
4
|
+
export declare function inspectTable(table: Table, options?: {
|
|
5
|
+
schema?: Schema;
|
|
6
|
+
sampleRows?: number;
|
|
7
|
+
maxErrors?: number;
|
|
8
|
+
}): Promise<TableError[]>;
|