frictionless-ts 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/dialect/index.d.ts +1 -0
- package/build/dialect/index.js +2 -0
- package/build/dialect/infer.d.ts +3 -0
- package/build/dialect/infer.js +13 -0
- package/build/dialect/infer.spec.d.ts +1 -0
- package/build/dialect/infer.spec.js +89 -0
- package/build/index.d.ts +19 -0
- package/build/index.js +19 -0
- package/build/package/index.d.ts +4 -0
- package/build/package/index.js +5 -0
- package/build/package/infer.d.ts +40 -0
- package/build/package/infer.js +13 -0
- package/build/package/infer.spec.d.ts +1 -0
- package/build/package/infer.spec.js +121 -0
- package/build/package/integrity.d.ts +8 -0
- package/build/package/integrity.js +69 -0
- package/build/package/integrity.spec.d.ts +1 -0
- package/build/package/integrity.spec.js +575 -0
- package/build/package/load.d.ts +1 -0
- package/build/package/load.js +10 -0
- package/build/package/load.spec.d.ts +1 -0
- package/build/package/load.spec.js +117 -0
- package/build/package/save.d.ts +5 -0
- package/build/package/save.js +13 -0
- package/build/package/save.spec.d.ts +1 -0
- package/build/package/save.spec.js +138 -0
- package/build/package/validate.d.ts +20 -0
- package/build/package/validate.js +62 -0
- package/build/package/validate.spec.d.ts +1 -0
- package/build/package/validate.spec.js +172 -0
- package/build/plugin.d.ts +2 -0
- package/build/plugin.js +2 -0
- package/build/resource/index.d.ts +2 -0
- package/build/resource/index.js +3 -0
- package/build/resource/infer.d.ts +22 -0
- package/build/resource/infer.js +49 -0
- package/build/resource/infer.spec.d.ts +1 -0
- package/build/resource/infer.spec.js +164 -0
- package/build/resource/validate.d.ts +12 -0
- package/build/resource/validate.js +35 -0
- package/build/resource/validate.spec.d.ts +1 -0
- package/build/resource/validate.spec.js +147 -0
- package/build/schema/index.d.ts +1 -0
- package/build/schema/index.js +2 -0
- package/build/schema/infer.d.ts +3 -0
- package/build/schema/infer.js +18 -0
- package/build/schema/infer.spec.d.ts +1 -0
- package/build/schema/infer.spec.js +136 -0
- package/build/system.d.ts +6 -0
- package/build/system.js +41 -0
- package/build/table/index.d.ts +3 -0
- package/build/table/index.js +4 -0
- package/build/table/infer.d.ts +6 -0
- package/build/table/infer.js +20 -0
- package/build/table/infer.spec.d.ts +1 -0
- package/build/table/infer.spec.js +177 -0
- package/build/table/load.d.ts +3 -0
- package/build/table/load.js +11 -0
- package/build/table/load.spec.d.ts +1 -0
- package/build/table/load.spec.js +121 -0
- package/build/table/save.d.ts +2 -0
- package/build/table/save.js +11 -0
- package/build/table/save.spec.d.ts +1 -0
- package/build/table/save.spec.js +189 -0
- package/build/table/validate.d.ts +9 -0
- package/build/table/validate.js +26 -0
- package/package.json +38 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { inferResource } from "./infer.js";
|
|
2
|
+
export { validateResource, validateResourceData } from "./validate.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9yZXNvdXJjZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGluZmVyUmVzb3VyY2UgfSBmcm9tIFwiLi9pbmZlci50c1wiXG5leHBvcnQgeyB2YWxpZGF0ZVJlc291cmNlLCB2YWxpZGF0ZVJlc291cmNlRGF0YSB9IGZyb20gXCIuL3ZhbGlkYXRlLnRzXCJcbiJdfQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { InferDialectOptions } from "@frictionless-ts/table";
|
|
3
|
+
import type { InferSchemaOptions } from "@frictionless-ts/table";
|
|
4
|
+
export declare function inferResource(resource: Partial<Resource>, options?: InferDialectOptions & InferSchemaOptions): Promise<{
|
|
5
|
+
name: string;
|
|
6
|
+
$schema?: string | undefined;
|
|
7
|
+
path?: string | string[] | undefined;
|
|
8
|
+
data?: unknown | unknown[][] | Record<string, unknown>[];
|
|
9
|
+
type?: "table" | undefined;
|
|
10
|
+
format?: string | undefined;
|
|
11
|
+
mediatype?: string | undefined;
|
|
12
|
+
encoding?: string | undefined;
|
|
13
|
+
title?: string | undefined;
|
|
14
|
+
description?: string | undefined;
|
|
15
|
+
bytes?: number | undefined;
|
|
16
|
+
hash?: string | undefined;
|
|
17
|
+
sources?: import("@frictionless-ts/metadata").Source[] | undefined;
|
|
18
|
+
licenses?: import("@frictionless-ts/metadata").License[] | undefined;
|
|
19
|
+
dialect?: (string | import("@frictionless-ts/metadata").Dialect) | undefined;
|
|
20
|
+
schema?: (string | import("@frictionless-ts/metadata").Schema) | undefined;
|
|
21
|
+
jsonSchema?: (string | import("@frictionless-ts/metadata").Descriptor) | undefined;
|
|
22
|
+
}>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { prefetchFile } from "@frictionless-ts/dataset";
|
|
2
|
+
import { inferBytes, inferEncoding, inferHash } from "@frictionless-ts/dataset";
|
|
3
|
+
import { inferFormat, inferName } from "@frictionless-ts/metadata";
|
|
4
|
+
import { inferDialect } from "../dialect/index.js";
|
|
5
|
+
import { inferSchema } from "../schema/index.js";
|
|
6
|
+
export async function inferResource(resource, options) {
|
|
7
|
+
const result = {
|
|
8
|
+
...resource,
|
|
9
|
+
name: resource.name ?? inferName(resource),
|
|
10
|
+
};
|
|
11
|
+
if (!result.format) {
|
|
12
|
+
result.format = inferFormat(resource);
|
|
13
|
+
}
|
|
14
|
+
if (typeof resource.path === "string") {
|
|
15
|
+
const localPath = await prefetchFile(resource.path);
|
|
16
|
+
const localResource = { ...resource, path: localPath };
|
|
17
|
+
if (!result.encoding) {
|
|
18
|
+
const encoding = await inferEncoding(localResource);
|
|
19
|
+
if (encoding) {
|
|
20
|
+
result.encoding = encoding;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (!result.bytes) {
|
|
24
|
+
result.bytes = await inferBytes(localResource);
|
|
25
|
+
}
|
|
26
|
+
if (!result.hash) {
|
|
27
|
+
result.hash = await inferHash(localResource);
|
|
28
|
+
}
|
|
29
|
+
if (!result.dialect) {
|
|
30
|
+
try {
|
|
31
|
+
result.dialect = await inferDialect(localResource, options);
|
|
32
|
+
}
|
|
33
|
+
catch { }
|
|
34
|
+
}
|
|
35
|
+
if (!result.schema) {
|
|
36
|
+
try {
|
|
37
|
+
result.schema = await inferSchema(localResource, options);
|
|
38
|
+
}
|
|
39
|
+
catch { }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (!result.type) {
|
|
43
|
+
if (result.schema) {
|
|
44
|
+
result.type = "table";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9yZXNvdXJjZS9pbmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRWhELE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUNqQyxRQUEyQixFQUMzQixPQUFrRDtJQUVsRCxNQUFNLE1BQU0sR0FBRztRQUNiLEdBQUcsUUFBUTtRQUNYLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUM7S0FDM0MsQ0FBQTtJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVELElBQUksT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuRCxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQTtRQUV0RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQ25ELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7WUFDNUIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDaEQsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUM5QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDN0QsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDM0QsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUE7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcmVmZXRjaEZpbGUgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IGluZmVyQnl0ZXMsIGluZmVyRW5jb2RpbmcsIGluZmVySGFzaCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGluZmVyRm9ybWF0LCBpbmZlck5hbWUgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IEluZmVyRGlhbGVjdE9wdGlvbnMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgdHlwZSB7IEluZmVyU2NoZW1hT3B0aW9ucyB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL3RhYmxlXCJcbmltcG9ydCB7IGluZmVyRGlhbGVjdCB9IGZyb20gXCIuLi9kaWFsZWN0L2luZGV4LnRzXCJcbmltcG9ydCB7IGluZmVyU2NoZW1hIH0gZnJvbSBcIi4uL3NjaGVtYS9pbmRleC50c1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmZlclJlc291cmNlKFxuICByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sXG4gIG9wdGlvbnM/OiBJbmZlckRpYWxlY3RPcHRpb25zICYgSW5mZXJTY2hlbWFPcHRpb25zLFxuKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBuYW1lOiByZXNvdXJjZS5uYW1lID8/IGluZmVyTmFtZShyZXNvdXJjZSksXG4gIH1cblxuICBpZiAoIXJlc3VsdC5mb3JtYXQpIHtcbiAgICByZXN1bHQuZm9ybWF0ID0gaW5mZXJGb3JtYXQocmVzb3VyY2UpXG4gIH1cblxuICBpZiAodHlwZW9mIHJlc291cmNlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBsb2NhbFBhdGggPSBhd2FpdCBwcmVmZXRjaEZpbGUocmVzb3VyY2UucGF0aClcbiAgICBjb25zdCBsb2NhbFJlc291cmNlID0geyAuLi5yZXNvdXJjZSwgcGF0aDogbG9jYWxQYXRoIH1cblxuICAgIGlmICghcmVzdWx0LmVuY29kaW5nKSB7XG4gICAgICBjb25zdCBlbmNvZGluZyA9IGF3YWl0IGluZmVyRW5jb2RpbmcobG9jYWxSZXNvdXJjZSlcbiAgICAgIGlmIChlbmNvZGluZykge1xuICAgICAgICByZXN1bHQuZW5jb2RpbmcgPSBlbmNvZGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcmVzdWx0LmJ5dGVzKSB7XG4gICAgICByZXN1bHQuYnl0ZXMgPSBhd2FpdCBpbmZlckJ5dGVzKGxvY2FsUmVzb3VyY2UpXG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQuaGFzaCkge1xuICAgICAgcmVzdWx0Lmhhc2ggPSBhd2FpdCBpbmZlckhhc2gobG9jYWxSZXNvdXJjZSlcbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5kaWFsZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQuZGlhbGVjdCA9IGF3YWl0IGluZmVyRGlhbGVjdChsb2NhbFJlc291cmNlLCBvcHRpb25zKVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cblxuICAgIGlmICghcmVzdWx0LnNjaGVtYSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0LnNjaGVtYSA9IGF3YWl0IGluZmVyU2NoZW1hKGxvY2FsUmVzb3VyY2UsIG9wdGlvbnMpXG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXN1bHQudHlwZSkge1xuICAgIGlmIChyZXN1bHQuc2NoZW1hKSB7XG4gICAgICByZXN1bHQudHlwZSA9IFwidGFibGVcIlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { writeTempFile } from "@frictionless-ts/dataset";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { inferResource } from "./infer.js";
|
|
4
|
+
describe("inferResource", () => {
|
|
5
|
+
it("should infer name from path", async () => {
|
|
6
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
7
|
+
const resource = { path: csvPath, format: "csv" };
|
|
8
|
+
const result = await inferResource(resource);
|
|
9
|
+
expect(result.name).toBeDefined();
|
|
10
|
+
expect(typeof result.name).toBe("string");
|
|
11
|
+
});
|
|
12
|
+
it("should infer bytes (file size)", async () => {
|
|
13
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
14
|
+
const resource = { path: csvPath, format: "csv" };
|
|
15
|
+
const result = await inferResource(resource);
|
|
16
|
+
expect(result.bytes).toBeGreaterThan(0);
|
|
17
|
+
});
|
|
18
|
+
it("should infer hash", async () => {
|
|
19
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
20
|
+
const resource = { path: csvPath, format: "csv" };
|
|
21
|
+
const result = await inferResource(resource);
|
|
22
|
+
expect(result.hash).toBeDefined();
|
|
23
|
+
expect(typeof result.hash).toBe("string");
|
|
24
|
+
expect(result.hash?.length).toBeGreaterThan(0);
|
|
25
|
+
});
|
|
26
|
+
it("should infer dialect for CSV files", async () => {
|
|
27
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
28
|
+
const resource = { path: csvPath, format: "csv" };
|
|
29
|
+
const result = await inferResource(resource);
|
|
30
|
+
expect(result.dialect).toBeDefined();
|
|
31
|
+
});
|
|
32
|
+
it("should infer schema for tabular data", async () => {
|
|
33
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
34
|
+
const resource = { path: csvPath, format: "csv" };
|
|
35
|
+
const result = await inferResource(resource);
|
|
36
|
+
expect(result.schema).toBeDefined();
|
|
37
|
+
expect(typeof result.schema === "object" &&
|
|
38
|
+
"fields" in result.schema &&
|
|
39
|
+
result.schema.fields).toBeDefined();
|
|
40
|
+
expect(typeof result.schema === "object" &&
|
|
41
|
+
"fields" in result.schema &&
|
|
42
|
+
result.schema.fields?.length).toBeGreaterThan(0);
|
|
43
|
+
});
|
|
44
|
+
it("should set type to table when schema is inferred", async () => {
|
|
45
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
46
|
+
const resource = { path: csvPath, format: "csv" };
|
|
47
|
+
const result = await inferResource(resource);
|
|
48
|
+
expect(result.type).toBe("table");
|
|
49
|
+
});
|
|
50
|
+
it("should preserve existing properties", async () => {
|
|
51
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
52
|
+
const resource = {
|
|
53
|
+
path: csvPath,
|
|
54
|
+
format: "csv",
|
|
55
|
+
name: "custom-name",
|
|
56
|
+
title: "Custom Title",
|
|
57
|
+
description: "Custom description",
|
|
58
|
+
};
|
|
59
|
+
const result = await inferResource(resource);
|
|
60
|
+
expect(result.name).toBe("custom-name");
|
|
61
|
+
expect(result.title).toBe("Custom Title");
|
|
62
|
+
expect(result.description).toBe("Custom description");
|
|
63
|
+
});
|
|
64
|
+
it("should not override existing format", async () => {
|
|
65
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
66
|
+
const resource = {
|
|
67
|
+
path: csvPath,
|
|
68
|
+
format: "json",
|
|
69
|
+
};
|
|
70
|
+
const result = await inferResource(resource);
|
|
71
|
+
expect(result.format).toBe("json");
|
|
72
|
+
});
|
|
73
|
+
it("should handle inline data without path", async () => {
|
|
74
|
+
const resource = {
|
|
75
|
+
name: "test-resource",
|
|
76
|
+
data: [
|
|
77
|
+
{ id: 1, name: "alice" },
|
|
78
|
+
{ id: 2, name: "bob" },
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
const result = await inferResource(resource);
|
|
82
|
+
expect(result.name).toBe("test-resource");
|
|
83
|
+
expect(result.data).toEqual(resource.data);
|
|
84
|
+
expect(result.bytes).toBeUndefined();
|
|
85
|
+
expect(result.hash).toBeUndefined();
|
|
86
|
+
});
|
|
87
|
+
it("should infer dialect with custom options", async () => {
|
|
88
|
+
const csvPath = await writeTempFile("id|name\n1|alice\n2|bob");
|
|
89
|
+
const resource = { path: csvPath, format: "csv" };
|
|
90
|
+
const result = await inferResource(resource, { delimiter: "|" });
|
|
91
|
+
expect(result.dialect).toBeDefined();
|
|
92
|
+
});
|
|
93
|
+
it("should infer schema with custom delimiter", async () => {
|
|
94
|
+
const csvPath = await writeTempFile("id|name\n1|alice\n2|bob");
|
|
95
|
+
const resource = { path: csvPath, format: "csv" };
|
|
96
|
+
const result = await inferResource(resource, { delimiter: "|" });
|
|
97
|
+
expect(result.schema).toBeDefined();
|
|
98
|
+
expect(typeof result.schema === "object" &&
|
|
99
|
+
"fields" in result.schema &&
|
|
100
|
+
result.schema.fields).toBeDefined();
|
|
101
|
+
expect(typeof result.schema === "object" &&
|
|
102
|
+
"fields" in result.schema &&
|
|
103
|
+
result.schema.fields?.length).toBe(2);
|
|
104
|
+
});
|
|
105
|
+
it("should not override existing encoding", async () => {
|
|
106
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
107
|
+
const resource = {
|
|
108
|
+
path: csvPath,
|
|
109
|
+
format: "csv",
|
|
110
|
+
encoding: "iso-8859-1",
|
|
111
|
+
};
|
|
112
|
+
const result = await inferResource(resource);
|
|
113
|
+
expect(result.encoding).toBe("iso-8859-1");
|
|
114
|
+
});
|
|
115
|
+
it("should not override existing bytes", async () => {
|
|
116
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
117
|
+
const resource = {
|
|
118
|
+
path: csvPath,
|
|
119
|
+
format: "csv",
|
|
120
|
+
bytes: 12345,
|
|
121
|
+
};
|
|
122
|
+
const result = await inferResource(resource);
|
|
123
|
+
expect(result.bytes).toBe(12345);
|
|
124
|
+
});
|
|
125
|
+
it("should not override existing hash", async () => {
|
|
126
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
127
|
+
const resource = {
|
|
128
|
+
path: csvPath,
|
|
129
|
+
format: "csv",
|
|
130
|
+
hash: "custom-hash",
|
|
131
|
+
};
|
|
132
|
+
const result = await inferResource(resource);
|
|
133
|
+
expect(result.hash).toBe("custom-hash");
|
|
134
|
+
});
|
|
135
|
+
it("should not override existing dialect", async () => {
|
|
136
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
137
|
+
const resource = {
|
|
138
|
+
path: csvPath,
|
|
139
|
+
format: "csv",
|
|
140
|
+
dialect: { delimiter: ";" },
|
|
141
|
+
};
|
|
142
|
+
const result = await inferResource(resource);
|
|
143
|
+
expect(typeof result.dialect === "object" &&
|
|
144
|
+
"delimiter" in result.dialect &&
|
|
145
|
+
result.dialect.delimiter).toBe(";");
|
|
146
|
+
});
|
|
147
|
+
it("should not override existing schema", async () => {
|
|
148
|
+
const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
|
|
149
|
+
const customSchema = {
|
|
150
|
+
fields: [
|
|
151
|
+
{ name: "custom1", type: "string" },
|
|
152
|
+
{ name: "custom2", type: "string" },
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
const resource = {
|
|
156
|
+
path: csvPath,
|
|
157
|
+
format: "csv",
|
|
158
|
+
schema: customSchema,
|
|
159
|
+
};
|
|
160
|
+
const result = await inferResource(resource);
|
|
161
|
+
expect(result.schema).toEqual(customSchema);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Jlc291cmNlL2luZmVyLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRTFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzQyxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1FBQzlELE1BQU0sUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBYyxFQUFFLENBQUE7UUFFMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNqQyxNQUFNLENBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDOUQsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFjLEVBQUUsQ0FBQTtRQUUxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUU1QyxNQUFNLENBQUMsTUFB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SUFBSSxFQUFFO1FBQ25ELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDOUQsTUFBTSxZQUFZLEdBQUc7WUFDbkIsTUFBTSxFQUFFO2dCQUNOLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBaUIsRUFBRTtnQkFDNUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFpQixFQUFFO2FBQzdDO1NBQ0YsQ0FBQTtRQUNELE1BQU0sUUFBUSxHQUFHO1lBQ2YsSUFBSSxFQUFFLE9BQU87WUFDYixNQUFNLEVBQUUsS0FBYztZQUN0QixNQUFNLEVBQUUsWUFBWTtTQUNyQixDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDN0MsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdyaXRlVGVtcEZpbGUgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBpbmZlclJlc291cmNlIH0gZnJvbSBcIi4vaW5mZXIudHNcIlxuXG5kZXNjcmliZShcImluZmVyUmVzb3VyY2VcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBpbmZlciBuYW1lIGZyb20gcGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclJlc291cmNlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHR5cGVvZiByZXN1bHQubmFtZSkudG9CZShcInN0cmluZ1wiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGJ5dGVzIChmaWxlIHNpemUpXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyUmVzb3VyY2UocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVzdWx0LmJ5dGVzKS50b0JlR3JlYXRlclRoYW4oMClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBoYXNoXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyUmVzb3VyY2UocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVzdWx0Lmhhc2gpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QodHlwZW9mIHJlc3VsdC5oYXNoKS50b0JlKFwic3RyaW5nXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5oYXNoPy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGRpYWxlY3QgZm9yIENTViBmaWxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclJlc291cmNlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5kaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5mZXIgc2NoZW1hIGZvciB0YWJ1bGFyIGRhdGFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQuc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KFxuICAgICAgdHlwZW9mIHJlc3VsdC5zY2hlbWEgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgXCJmaWVsZHNcIiBpbiByZXN1bHQuc2NoZW1hICYmXG4gICAgICAgIHJlc3VsdC5zY2hlbWEuZmllbGRzLFxuICAgICkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChcbiAgICAgIHR5cGVvZiByZXN1bHQuc2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIFwiZmllbGRzXCIgaW4gcmVzdWx0LnNjaGVtYSAmJlxuICAgICAgICByZXN1bHQuc2NoZW1hLmZpZWxkcz8ubGVuZ3RoLFxuICAgICkudG9CZUdyZWF0ZXJUaGFuKDApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2V0IHR5cGUgdG8gdGFibGUgd2hlbiBzY2hlbWEgaXMgaW5mZXJyZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZShcInRhYmxlXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcHJlc2VydmUgZXhpc3RpbmcgcHJvcGVydGllc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBwYXRoOiBjc3ZQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgICAgbmFtZTogXCJjdXN0b20tbmFtZVwiLFxuICAgICAgdGl0bGU6IFwiQ3VzdG9tIFRpdGxlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDdXN0b20gZGVzY3JpcHRpb25cIixcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclJlc291cmNlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKFwiY3VzdG9tLW5hbWVcIilcbiAgICBleHBlY3QocmVzdWx0LnRpdGxlKS50b0JlKFwiQ3VzdG9tIFRpdGxlXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5kZXNjcmlwdGlvbikudG9CZShcIkN1c3RvbSBkZXNjcmlwdGlvblwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIG5vdCBvdmVycmlkZSBleGlzdGluZyBmb3JtYXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgcGF0aDogY3N2UGF0aCxcbiAgICAgIGZvcm1hdDogXCJqc29uXCIgYXMgY29uc3QsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQuZm9ybWF0KS50b0JlKFwianNvblwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBpbmxpbmUgZGF0YSB3aXRob3V0IHBhdGhcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICBkYXRhOiBbXG4gICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcImJvYlwiIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyUmVzb3VyY2UocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJ0ZXN0LXJlc291cmNlXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5kYXRhKS50b0VxdWFsKHJlc291cmNlLmRhdGEpXG4gICAgZXhwZWN0KHJlc3VsdC5ieXRlcykudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC5oYXNoKS50b0JlVW5kZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBkaWFsZWN0IHdpdGggY3VzdG9tIG9wdGlvbnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWR8bmFtZVxcbjF8YWxpY2VcXG4yfGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJSZXNvdXJjZShyZXNvdXJjZSwgeyBkZWxpbWl0ZXI6IFwifFwiIH0pXG5cbiAgICBleHBlY3QocmVzdWx0LmRpYWxlY3QpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBzY2hlbWEgd2l0aCBjdXN0b20gZGVsaW1pdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkfG5hbWVcXG4xfGFsaWNlXFxuMnxib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyUmVzb3VyY2UocmVzb3VyY2UsIHsgZGVsaW1pdGVyOiBcInxcIiB9KVxuXG4gICAgZXhwZWN0KHJlc3VsdC5zY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QoXG4gICAgICB0eXBlb2YgcmVzdWx0LnNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcImZpZWxkc1wiIGluIHJlc3VsdC5zY2hlbWEgJiZcbiAgICAgICAgcmVzdWx0LnNjaGVtYS5maWVsZHMsXG4gICAgKS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KFxuICAgICAgdHlwZW9mIHJlc3VsdC5zY2hlbWEgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgXCJmaWVsZHNcIiBpbiByZXN1bHQuc2NoZW1hICYmXG4gICAgICAgIHJlc3VsdC5zY2hlbWEuZmllbGRzPy5sZW5ndGgsXG4gICAgKS50b0JlKDIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IG92ZXJyaWRlIGV4aXN0aW5nIGVuY29kaW5nXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHtcbiAgICAgIHBhdGg6IGNzdlBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgICBlbmNvZGluZzogXCJpc28tODg1OS0xXCIsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQuZW5jb2RpbmcpLnRvQmUoXCJpc28tODg1OS0xXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IG92ZXJyaWRlIGV4aXN0aW5nIGJ5dGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHtcbiAgICAgIHBhdGg6IGNzdlBhdGgsXG4gICAgICBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QsXG4gICAgICBieXRlczogMTIzNDUsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQuYnl0ZXMpLnRvQmUoMTIzNDUpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IG92ZXJyaWRlIGV4aXN0aW5nIGhhc2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgcGF0aDogY3N2UGF0aCxcbiAgICAgIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCxcbiAgICAgIGhhc2g6IFwiY3VzdG9tLWhhc2hcIixcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclJlc291cmNlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5oYXNoKS50b0JlKFwiY3VzdG9tLWhhc2hcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBub3Qgb3ZlcnJpZGUgZXhpc3RpbmcgZGlhbGVjdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBwYXRoOiBjc3ZQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgICAgZGlhbGVjdDogeyBkZWxpbWl0ZXI6IFwiO1wiIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChcbiAgICAgIHR5cGVvZiByZXN1bHQuZGlhbGVjdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcImRlbGltaXRlclwiIGluIHJlc3VsdC5kaWFsZWN0ICYmXG4gICAgICAgIHJlc3VsdC5kaWFsZWN0LmRlbGltaXRlcixcbiAgICApLnRvQmUoXCI7XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbm90IG92ZXJyaWRlIGV4aXN0aW5nIHNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lXFxuMSxhbGljZVxcbjIsYm9iXCIpXG4gICAgY29uc3QgY3VzdG9tU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHsgbmFtZTogXCJjdXN0b20xXCIsIHR5cGU6IFwic3RyaW5nXCIgYXMgY29uc3QgfSxcbiAgICAgICAgeyBuYW1lOiBcImN1c3RvbTJcIiwgdHlwZTogXCJzdHJpbmdcIiBhcyBjb25zdCB9LFxuICAgICAgXSxcbiAgICB9XG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBwYXRoOiBjc3ZQYXRoLFxuICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgICAgc2NoZW1hOiBjdXN0b21TY2hlbWEsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXN1bHQuc2NoZW1hKS50b0VxdWFsKGN1c3RvbVNjaGVtYSlcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Descriptor, Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { InferSchemaOptions } from "@frictionless-ts/table";
|
|
3
|
+
export declare function validateResource(source: string | Descriptor | Partial<Resource>, options?: InferSchemaOptions & {
|
|
4
|
+
basepath?: string;
|
|
5
|
+
}): Promise<{
|
|
6
|
+
errors: import("@frictionless-ts/metadata").UnboundError[];
|
|
7
|
+
valid: boolean;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function validateResourceData(resource: Partial<Resource>, options?: InferSchemaOptions): Promise<{
|
|
10
|
+
errors: import("@frictionless-ts/metadata").UnboundError[];
|
|
11
|
+
valid: boolean;
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { validateFile } from "@frictionless-ts/dataset";
|
|
2
|
+
import { validateDocument } from "@frictionless-ts/document";
|
|
3
|
+
import { createReport } from "@frictionless-ts/metadata";
|
|
4
|
+
import { loadDescriptor, validateResourceMetadata, } from "@frictionless-ts/metadata";
|
|
5
|
+
import { resolveBasepath } from "@frictionless-ts/metadata";
|
|
6
|
+
import { validateTable } from "../table/index.js";
|
|
7
|
+
export async function validateResource(source, options) {
|
|
8
|
+
let descriptor = source;
|
|
9
|
+
let basepath = options?.basepath;
|
|
10
|
+
if (typeof descriptor === "string") {
|
|
11
|
+
basepath = await resolveBasepath(descriptor);
|
|
12
|
+
descriptor = await loadDescriptor(descriptor);
|
|
13
|
+
}
|
|
14
|
+
const report = await validateResourceMetadata(descriptor, { basepath });
|
|
15
|
+
if (!report.resource) {
|
|
16
|
+
return report;
|
|
17
|
+
}
|
|
18
|
+
return await validateResourceData(report.resource, options);
|
|
19
|
+
}
|
|
20
|
+
export async function validateResourceData(resource, options) {
|
|
21
|
+
const fileReport = await validateFile(resource);
|
|
22
|
+
if (!fileReport.valid) {
|
|
23
|
+
return fileReport;
|
|
24
|
+
}
|
|
25
|
+
const tableReport = await validateTable(resource, options);
|
|
26
|
+
if (!tableReport.valid) {
|
|
27
|
+
return tableReport;
|
|
28
|
+
}
|
|
29
|
+
const documentReport = await validateDocument(resource);
|
|
30
|
+
if (!documentReport.valid) {
|
|
31
|
+
return documentReport;
|
|
32
|
+
}
|
|
33
|
+
return createReport();
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9yZXNvdXJjZS92YWxpZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3hELE9BQU8sRUFDTCxjQUFjLEVBQ2Qsd0JBQXdCLEdBQ3pCLE1BQU0sMkJBQTJCLENBQUE7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBRTNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUVqRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxNQUErQyxFQUMvQyxPQUFvRDtJQUVwRCxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUE7SUFDdkIsSUFBSSxRQUFRLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQTtJQUVoQyxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM1QyxVQUFVLEdBQUcsTUFBTSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sd0JBQXdCLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUV2RSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVELE9BQU8sTUFBTSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQzdELENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxRQUEyQixFQUMzQixPQUE0QjtJQUU1QixNQUFNLFVBQVUsR0FBRyxNQUFNLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDMUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QixPQUFPLFdBQVcsQ0FBQTtJQUNwQixDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN2RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxPQUFPLFlBQVksRUFBRSxDQUFBO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2YWxpZGF0ZUZpbGUgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IHZhbGlkYXRlRG9jdW1lbnQgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kb2N1bWVudFwiXG5pbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IsIFJlc291cmNlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgY3JlYXRlUmVwb3J0IH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHtcbiAgbG9hZERlc2NyaXB0b3IsXG4gIHZhbGlkYXRlUmVzb3VyY2VNZXRhZGF0YSxcbn0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgcmVzb2x2ZUJhc2VwYXRoIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBJbmZlclNjaGVtYU9wdGlvbnMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgeyB2YWxpZGF0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlL2luZGV4LnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlUmVzb3VyY2UoXG4gIHNvdXJjZTogc3RyaW5nIHwgRGVzY3JpcHRvciB8IFBhcnRpYWw8UmVzb3VyY2U+LFxuICBvcHRpb25zPzogSW5mZXJTY2hlbWFPcHRpb25zICYgeyBiYXNlcGF0aD86IHN0cmluZyB9LFxuKSB7XG4gIGxldCBkZXNjcmlwdG9yID0gc291cmNlXG4gIGxldCBiYXNlcGF0aCA9IG9wdGlvbnM/LmJhc2VwYXRoXG5cbiAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgYmFzZXBhdGggPSBhd2FpdCByZXNvbHZlQmFzZXBhdGgoZGVzY3JpcHRvcilcbiAgICBkZXNjcmlwdG9yID0gYXdhaXQgbG9hZERlc2NyaXB0b3IoZGVzY3JpcHRvcilcbiAgfVxuXG4gIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlUmVzb3VyY2VNZXRhZGF0YShkZXNjcmlwdG9yLCB7IGJhc2VwYXRoIH0pXG5cbiAgaWYgKCFyZXBvcnQucmVzb3VyY2UpIHtcbiAgICByZXR1cm4gcmVwb3J0XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdmFsaWRhdGVSZXNvdXJjZURhdGEocmVwb3J0LnJlc291cmNlLCBvcHRpb25zKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVSZXNvdXJjZURhdGEoXG4gIHJlc291cmNlOiBQYXJ0aWFsPFJlc291cmNlPixcbiAgb3B0aW9ucz86IEluZmVyU2NoZW1hT3B0aW9ucyxcbikge1xuICBjb25zdCBmaWxlUmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVGaWxlKHJlc291cmNlKVxuICBpZiAoIWZpbGVSZXBvcnQudmFsaWQpIHtcbiAgICByZXR1cm4gZmlsZVJlcG9ydFxuICB9XG5cbiAgY29uc3QgdGFibGVSZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZVRhYmxlKHJlc291cmNlLCBvcHRpb25zKVxuICBpZiAoIXRhYmxlUmVwb3J0LnZhbGlkKSB7XG4gICAgcmV0dXJuIHRhYmxlUmVwb3J0XG4gIH1cblxuICBjb25zdCBkb2N1bWVudFJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRG9jdW1lbnQocmVzb3VyY2UpXG4gIGlmICghZG9jdW1lbnRSZXBvcnQudmFsaWQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRSZXBvcnRcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSZXBvcnQoKVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { validateResource } from "./validate.js";
|
|
3
|
+
describe("validateResource", () => {
|
|
4
|
+
it("should catch validation errors for invalid tabular data", async () => {
|
|
5
|
+
const resource = {
|
|
6
|
+
name: "test",
|
|
7
|
+
type: "table",
|
|
8
|
+
data: [
|
|
9
|
+
{ id: 1, name: "Alice", active: true },
|
|
10
|
+
{ id: 2, name: "Bob", active: 123 },
|
|
11
|
+
],
|
|
12
|
+
schema: {
|
|
13
|
+
fields: [
|
|
14
|
+
{ name: "id", type: "integer" },
|
|
15
|
+
{ name: "name", type: "string" },
|
|
16
|
+
{ name: "active", type: "boolean" },
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const report = await validateResource(resource);
|
|
21
|
+
expect(report.valid).toBe(false);
|
|
22
|
+
expect(report.errors.length).toEqual(1);
|
|
23
|
+
});
|
|
24
|
+
it("should validate correct tabular data", async () => {
|
|
25
|
+
const resource = {
|
|
26
|
+
name: "test",
|
|
27
|
+
type: "table",
|
|
28
|
+
data: [
|
|
29
|
+
{ name: "Alice", active: true },
|
|
30
|
+
{ name: "Bob", active: false },
|
|
31
|
+
],
|
|
32
|
+
schema: {
|
|
33
|
+
fields: [
|
|
34
|
+
{ name: "name", type: "string" },
|
|
35
|
+
{ name: "active", type: "boolean" },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const report = await validateResource(resource);
|
|
40
|
+
expect(report.valid).toBe(true);
|
|
41
|
+
expect(report.errors).toEqual([]);
|
|
42
|
+
});
|
|
43
|
+
it("should catch multiple validation errors", async () => {
|
|
44
|
+
const resource = {
|
|
45
|
+
name: "test",
|
|
46
|
+
type: "table",
|
|
47
|
+
data: [
|
|
48
|
+
{ id: 1, name: "Alice", age: 25 },
|
|
49
|
+
{ id: "not-a-number", name: "Bob", age: "not-a-number" },
|
|
50
|
+
{ id: 3, name: "Charlie", age: -5 },
|
|
51
|
+
],
|
|
52
|
+
schema: {
|
|
53
|
+
fields: [
|
|
54
|
+
{ name: "id", type: "integer" },
|
|
55
|
+
{ name: "name", type: "string" },
|
|
56
|
+
{
|
|
57
|
+
name: "age",
|
|
58
|
+
type: "integer",
|
|
59
|
+
constraints: { minimum: 0 },
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
const report = await validateResource(resource);
|
|
65
|
+
expect(report.valid).toBe(false);
|
|
66
|
+
expect(report.errors.length).toEqual(3);
|
|
67
|
+
});
|
|
68
|
+
it("should catch missing table error when schema is defined but table cannot be loaded", async () => {
|
|
69
|
+
const resource = {
|
|
70
|
+
name: "test",
|
|
71
|
+
path: "table.bad",
|
|
72
|
+
schema: {
|
|
73
|
+
fields: [
|
|
74
|
+
{ name: "id", type: "integer" },
|
|
75
|
+
{ name: "name", type: "string" },
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
const report = await validateResource(resource);
|
|
80
|
+
expect(report.valid).toBe(false);
|
|
81
|
+
expect(report.errors).toEqual([
|
|
82
|
+
{
|
|
83
|
+
type: "data",
|
|
84
|
+
message: "missing test table",
|
|
85
|
+
},
|
|
86
|
+
]);
|
|
87
|
+
});
|
|
88
|
+
it("should validate document with jsonSchema", async () => {
|
|
89
|
+
const resource = {
|
|
90
|
+
name: "test-document",
|
|
91
|
+
data: {
|
|
92
|
+
name: "test-package",
|
|
93
|
+
version: "1.0.0",
|
|
94
|
+
author: {
|
|
95
|
+
name: "John Doe",
|
|
96
|
+
email: "john@example.com",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
jsonSchema: {
|
|
100
|
+
type: "object",
|
|
101
|
+
required: ["name", "version", "author"],
|
|
102
|
+
properties: {
|
|
103
|
+
name: { type: "string" },
|
|
104
|
+
version: { type: "string" },
|
|
105
|
+
author: {
|
|
106
|
+
type: "object",
|
|
107
|
+
required: ["name", "email"],
|
|
108
|
+
properties: {
|
|
109
|
+
name: { type: "string" },
|
|
110
|
+
email: { type: "string" },
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
const report = await validateResource(resource);
|
|
117
|
+
expect(report.valid).toBe(true);
|
|
118
|
+
expect(report.errors).toEqual([]);
|
|
119
|
+
});
|
|
120
|
+
it("should catch validation errors for document with invalid jsonSchema data", async () => {
|
|
121
|
+
const resource = {
|
|
122
|
+
name: "test-document",
|
|
123
|
+
data: {
|
|
124
|
+
name: "test-package",
|
|
125
|
+
version: 123,
|
|
126
|
+
},
|
|
127
|
+
jsonSchema: {
|
|
128
|
+
type: "object",
|
|
129
|
+
required: ["name", "version"],
|
|
130
|
+
properties: {
|
|
131
|
+
name: { type: "string" },
|
|
132
|
+
version: { type: "string" },
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
const report = await validateResource(resource);
|
|
137
|
+
expect(report.valid).toBe(false);
|
|
138
|
+
expect(report.errors).toEqual([
|
|
139
|
+
{
|
|
140
|
+
type: "document/json",
|
|
141
|
+
pointer: "/version",
|
|
142
|
+
message: "must be string",
|
|
143
|
+
},
|
|
144
|
+
]);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Jlc291cmNlL3ZhbGlkYXRlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVoRCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RSxNQUFNLFFBQVEsR0FBRztZQUNmLElBQUksRUFBRSxNQUFNO1lBQ1osSUFBSSxFQUFFLE9BQWdCO1lBQ3RCLElBQUksRUFBRTtnQkFDSixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUN0QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO2FBQ3BDO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLE1BQU0sRUFBRTtvQkFDTixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQWtCLEVBQUU7b0JBQ3hDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBaUIsRUFBRTtvQkFDekMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFrQixFQUFFO2lCQUM3QzthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMs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LElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwRUFBMEUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RixNQUFNLFFBQVEsR0FBRztZQUNmLElBQUksRUFBRSxlQUFlO1lBQ3JCLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsY0FBYztnQkFDcEIsT0FBTyxFQUFFLEdBQUc7YUFDYjtZQUNELFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO2dCQUM3QixVQUFVLEVBQUU7b0JBQ1YsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtvQkFDeEIsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtpQkFDNUI7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRS9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzVCO2dCQUNFLElBQUksRUFBRSxlQUFlO2dCQUNyQixPQUFPLEVBQUUsVUFBVTtnQkFDbkIsT0FBTyxFQUFFLGdCQUFnQjthQUMxQjtTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgdmFsaWRhdGVSZXNvdXJjZSB9IGZyb20gXCIuL3ZhbGlkYXRlLnRzXCJcblxuZGVzY3JpYmUoXCJ2YWxpZGF0ZVJlc291cmNlXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgY2F0Y2ggdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGludmFsaWQgdGFidWxhciBkYXRhXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdFwiLFxuICAgICAgdHlwZTogXCJ0YWJsZVwiIGFzIGNvbnN0LFxuICAgICAgZGF0YTogW1xuICAgICAgICB7IGlkOiAxLCBuYW1lOiBcIkFsaWNlXCIsIGFjdGl2ZTogdHJ1ZSB9LFxuICAgICAgICB7IGlkOiAyLCBuYW1lOiBcIkJvYlwiLCBhY3RpdmU6IDEyMyB9LFxuICAgICAgXSxcbiAgICAgIHNjaGVtYToge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIgYXMgY29uc3QgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0IH0sXG4gICAgICAgICAgeyBuYW1lOiBcImFjdGl2ZVwiLCB0eXBlOiBcImJvb2xlYW5cIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZVJlc291cmNlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZShmYWxzZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycy5sZW5ndGgpLnRvRXF1YWwoMSlcbiAgfSlcblxuICBpdChcInNob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHRhYnVsYXIgZGF0YVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3RcIixcbiAgICAgIHR5cGU6IFwidGFibGVcIiBhcyBjb25zdCxcbiAgICAgIGRhdGE6IFtcbiAgICAgICAgeyBuYW1lOiBcIkFsaWNlXCIsIGFjdGl2ZTogdHJ1ZSB9LFxuICAgICAgICB7IG5hbWU6IFwiQm9iXCIsIGFjdGl2ZTogZmFsc2UgfSxcbiAgICAgIF0sXG4gICAgICBzY2hlbWE6IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiBhcyBjb25zdCB9LFxuICAgICAgICAgIHsgbmFtZTogXCJhY3RpdmVcIiwgdHlwZTogXCJib29sZWFuXCIgYXMgY29uc3QgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXBvcnQudmFsaWQpLnRvQmUodHJ1ZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycykudG9FcXVhbChbXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBjYXRjaCBtdWx0aXBsZSB2YWxpZGF0aW9uIGVycm9yc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3RcIixcbiAgICAgIHR5cGU6IFwidGFibGVcIiBhcyBjb25zdCxcbiAgICAgIGRhdGE6IFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJBbGljZVwiLCBhZ2U6IDI1IH0sXG4gICAgICAgIHsgaWQ6IFwibm90LWEtbnVtYmVyXCIsIG5hbWU6IFwiQm9iXCIsIGFnZTogXCJub3QtYS1udW1iZXJcIiB9LFxuICAgICAgICB7IGlkOiAzLCBuYW1lOiBcIkNoYXJsaWVcIiwgYWdlOiAtNSB9LFxuICAgICAgXSxcbiAgICAgIHNjaGVtYToge1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIgYXMgY29uc3QgfSxcbiAgICAgICAgICB7IG5hbWU6IFwibmFtZVwiLCB0eXBlOiBcInN0cmluZ1wiIGFzIGNvbnN0IH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJhZ2VcIixcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgY29uc3RyYWludHM6IHsgbWluaW11bTogMCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlUmVzb3VyY2UocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzLmxlbmd0aCkudG9FcXVhbCgzKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGNhdGNoIG1pc3NpbmcgdGFibGUgZXJyb3Igd2hlbiBzY2hlbWEgaXMgZGVmaW5lZCBidXQgdGFibGUgY2Fubm90IGJlIGxvYWRlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3RcIixcbiAgICAgIHBhdGg6IFwidGFibGUuYmFkXCIsXG4gICAgICBzY2hlbWE6IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiIGFzIGNvbnN0IH0sXG4gICAgICAgICAgeyBuYW1lOiBcIm5hbWVcIiwgdHlwZTogXCJzdHJpbmdcIiBhcyBjb25zdCB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZVJlc291cmNlKHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZShmYWxzZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZGF0YVwiLFxuICAgICAgICBtZXNzYWdlOiBcIm1pc3NpbmcgdGVzdCB0YWJsZVwiLFxuICAgICAgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHZhbGlkYXRlIGRvY3VtZW50IHdpdGgganNvblNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtZG9jdW1lbnRcIixcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgICAgICBhdXRob3I6IHtcbiAgICAgICAgICBuYW1lOiBcIkpvaG4gRG9lXCIsXG4gICAgICAgICAgZW1haWw6IFwiam9obkBleGFtcGxlLmNvbVwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ2ZXJzaW9uXCIsIFwiYXV0aG9yXCJdLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgdmVyc2lvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgYXV0aG9yOiB7XG4gICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJlbWFpbFwiXSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIGVtYWlsOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVSZXNvdXJjZShyZXNvdXJjZSlcblxuICAgIGV4cGVjdChyZXBvcnQudmFsaWQpLnRvQmUodHJ1ZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycykudG9FcXVhbChbXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBjYXRjaCB2YWxpZGF0aW9uIGVycm9ycyBmb3IgZG9jdW1lbnQgd2l0aCBpbnZhbGlkIGpzb25TY2hlbWEgZGF0YVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtZG9jdW1lbnRcIixcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgICAgdmVyc2lvbjogMTIzLFxuICAgICAgfSxcbiAgICAgIGpzb25TY2hlbWE6IHtcbiAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ2ZXJzaW9uXCJdLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgdmVyc2lvbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlUmVzb3VyY2UocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJkb2N1bWVudC9qc29uXCIsXG4gICAgICAgIHBvaW50ZXI6IFwiL3ZlcnNpb25cIixcbiAgICAgICAgbWVzc2FnZTogXCJtdXN0IGJlIHN0cmluZ1wiLFxuICAgICAgfSxcbiAgICBdKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { inferSchema } from "./infer.ts";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { inferSchema } from "./infer.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zY2hlbWEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGluZmVyU2NoZW1hIH0gZnJvbSBcIi4vaW5mZXIudHNcIlxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Resource } from "@frictionless-ts/metadata";
|
|
2
|
+
import type { InferSchemaOptions } from "@frictionless-ts/table";
|
|
3
|
+
export declare function inferSchema(resource: Partial<Resource>, options?: InferSchemaOptions): Promise<import("@frictionless-ts/metadata").Schema | undefined>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { inferSchemaFromTable } from "@frictionless-ts/table";
|
|
2
|
+
import { system } from "../system.js";
|
|
3
|
+
import { loadTable } from "../table/index.js";
|
|
4
|
+
export async function inferSchema(resource, options) {
|
|
5
|
+
for (const plugin of system.plugins) {
|
|
6
|
+
const schema = await plugin.inferSchema?.(resource, options);
|
|
7
|
+
if (schema) {
|
|
8
|
+
return schema;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const table = await loadTable(resource, { denormalized: true });
|
|
12
|
+
if (!table) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const schema = await inferSchemaFromTable(table, options);
|
|
16
|
+
return schema;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zY2hlbWEvaW5mZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFN0MsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLFFBQTJCLEVBQzNCLE9BQTRCO0lBRTVCLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUM1RCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN6RCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc291cmNlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUgeyBJbmZlclNjaGVtYU9wdGlvbnMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgeyBpbmZlclNjaGVtYUZyb21UYWJsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL3RhYmxlXCJcbmltcG9ydCB7IHN5c3RlbSB9IGZyb20gXCIuLi9zeXN0ZW0udHNcIlxuaW1wb3J0IHsgbG9hZFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlL2luZGV4LnRzXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluZmVyU2NoZW1hKFxuICByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sXG4gIG9wdGlvbnM/OiBJbmZlclNjaGVtYU9wdGlvbnMsXG4pIHtcbiAgZm9yIChjb25zdCBwbHVnaW4gb2Ygc3lzdGVtLnBsdWdpbnMpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCBwbHVnaW4uaW5mZXJTY2hlbWE/LihyZXNvdXJjZSwgb3B0aW9ucylcbiAgICBpZiAoc2NoZW1hKSB7XG4gICAgICByZXR1cm4gc2NoZW1hXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGFibGUgPSBhd2FpdCBsb2FkVGFibGUocmVzb3VyY2UsIHsgZGVub3JtYWxpemVkOiB0cnVlIH0pXG4gIGlmICghdGFibGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBzY2hlbWEgPSBhd2FpdCBpbmZlclNjaGVtYUZyb21UYWJsZSh0YWJsZSwgb3B0aW9ucylcbiAgcmV0dXJuIHNjaGVtYVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|