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.
Files changed (69) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/build/dialect/index.d.ts +1 -0
  4. package/build/dialect/index.js +2 -0
  5. package/build/dialect/infer.d.ts +3 -0
  6. package/build/dialect/infer.js +13 -0
  7. package/build/dialect/infer.spec.d.ts +1 -0
  8. package/build/dialect/infer.spec.js +89 -0
  9. package/build/index.d.ts +19 -0
  10. package/build/index.js +19 -0
  11. package/build/package/index.d.ts +4 -0
  12. package/build/package/index.js +5 -0
  13. package/build/package/infer.d.ts +40 -0
  14. package/build/package/infer.js +13 -0
  15. package/build/package/infer.spec.d.ts +1 -0
  16. package/build/package/infer.spec.js +121 -0
  17. package/build/package/integrity.d.ts +8 -0
  18. package/build/package/integrity.js +69 -0
  19. package/build/package/integrity.spec.d.ts +1 -0
  20. package/build/package/integrity.spec.js +575 -0
  21. package/build/package/load.d.ts +1 -0
  22. package/build/package/load.js +10 -0
  23. package/build/package/load.spec.d.ts +1 -0
  24. package/build/package/load.spec.js +117 -0
  25. package/build/package/save.d.ts +5 -0
  26. package/build/package/save.js +13 -0
  27. package/build/package/save.spec.d.ts +1 -0
  28. package/build/package/save.spec.js +138 -0
  29. package/build/package/validate.d.ts +20 -0
  30. package/build/package/validate.js +62 -0
  31. package/build/package/validate.spec.d.ts +1 -0
  32. package/build/package/validate.spec.js +172 -0
  33. package/build/plugin.d.ts +2 -0
  34. package/build/plugin.js +2 -0
  35. package/build/resource/index.d.ts +2 -0
  36. package/build/resource/index.js +3 -0
  37. package/build/resource/infer.d.ts +22 -0
  38. package/build/resource/infer.js +49 -0
  39. package/build/resource/infer.spec.d.ts +1 -0
  40. package/build/resource/infer.spec.js +164 -0
  41. package/build/resource/validate.d.ts +12 -0
  42. package/build/resource/validate.js +35 -0
  43. package/build/resource/validate.spec.d.ts +1 -0
  44. package/build/resource/validate.spec.js +147 -0
  45. package/build/schema/index.d.ts +1 -0
  46. package/build/schema/index.js +2 -0
  47. package/build/schema/infer.d.ts +3 -0
  48. package/build/schema/infer.js +18 -0
  49. package/build/schema/infer.spec.d.ts +1 -0
  50. package/build/schema/infer.spec.js +136 -0
  51. package/build/system.d.ts +6 -0
  52. package/build/system.js +41 -0
  53. package/build/table/index.d.ts +3 -0
  54. package/build/table/index.js +4 -0
  55. package/build/table/infer.d.ts +6 -0
  56. package/build/table/infer.js +20 -0
  57. package/build/table/infer.spec.d.ts +1 -0
  58. package/build/table/infer.spec.js +177 -0
  59. package/build/table/load.d.ts +3 -0
  60. package/build/table/load.js +11 -0
  61. package/build/table/load.spec.d.ts +1 -0
  62. package/build/table/load.spec.js +121 -0
  63. package/build/table/save.d.ts +2 -0
  64. package/build/table/save.js +11 -0
  65. package/build/table/save.spec.d.ts +1 -0
  66. package/build/table/save.spec.js +189 -0
  67. package/build/table/validate.d.ts +9 -0
  68. package/build/table/validate.js +26 -0
  69. package/package.json +38 -0
@@ -0,0 +1,2 @@
1
+ export { inferResource } from "./infer.ts";
2
+ export { validateResource, validateResourceData } from "./validate.ts";
@@ -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 {};