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
package/LICENSE.md ADDED
@@ -0,0 +1,9 @@
1
+ # The MIT License (MIT)
2
+
3
+ Copyright © `2025` `Evgeny Karev`
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @frictionless-ts
2
+
3
+ frictionless-ts is a fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames. It supports various formats like CSV, JSON, and Parquet and integrates with data platforms such as CKAN, Zenodo, and GitHub. For more information, please read the [project's documentation](https://frictionlessdata.github.io/frictionless-ts/).
@@ -0,0 +1 @@
1
+ export { inferDialect } from "./infer.ts";
@@ -0,0 +1,2 @@
1
+ export { inferDialect } from "./infer.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kaWFsZWN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBpbmZlckRpYWxlY3QgfSBmcm9tIFwiLi9pbmZlci50c1wiXG4iXX0=
@@ -0,0 +1,3 @@
1
+ import type { Dialect, Resource } from "@frictionless-ts/metadata";
2
+ import type { InferDialectOptions } from "@frictionless-ts/table";
3
+ export declare function inferDialect(resource: Partial<Resource>, options?: InferDialectOptions): Promise<Dialect>;
@@ -0,0 +1,13 @@
1
+ import { system } from "../system.js";
2
+ // TODO: review default values being {} vs undefined
3
+ export async function inferDialect(resource, options) {
4
+ let dialect = {};
5
+ for (const plugin of system.plugins) {
6
+ const result = await plugin.inferDialect?.(resource, options);
7
+ if (result) {
8
+ dialect = result;
9
+ }
10
+ }
11
+ return dialect;
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kaWFsZWN0L2luZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFckMsb0RBQW9EO0FBRXBELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxRQUEyQixFQUMzQixPQUE2QjtJQUU3QixJQUFJLE9BQU8sR0FBWSxFQUFFLENBQUE7SUFFekIsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzdELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxPQUFPLEdBQUcsTUFBTSxDQUFBO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGlhbGVjdCwgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IEluZmVyRGlhbGVjdE9wdGlvbnMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgeyBzeXN0ZW0gfSBmcm9tIFwiLi4vc3lzdGVtLnRzXCJcblxuLy8gVE9ETzogcmV2aWV3IGRlZmF1bHQgdmFsdWVzIGJlaW5nIHt9IHZzIHVuZGVmaW5lZFxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5mZXJEaWFsZWN0KFxuICByZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4sXG4gIG9wdGlvbnM/OiBJbmZlckRpYWxlY3RPcHRpb25zLFxuKSB7XG4gIGxldCBkaWFsZWN0OiBEaWFsZWN0ID0ge31cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBzeXN0ZW0ucGx1Z2lucykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5pbmZlckRpYWxlY3Q/LihyZXNvdXJjZSwgb3B0aW9ucylcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBkaWFsZWN0ID0gcmVzdWx0XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpYWxlY3Rcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ import { writeTempFile } from "@frictionless-ts/dataset";
2
+ import { describe, expect, it } from "vitest";
3
+ import { inferDialect } from "./infer.js";
4
+ // TODO: fix this test/implementation
5
+ describe.skip("inferDialect", () => {
6
+ it("should infer dialect from CSV file with comma delimiter", async () => {
7
+ const csvPath = await writeTempFile("id,name,age\n1,alice,25\n2,bob,30");
8
+ const resource = { path: csvPath, format: "csv" };
9
+ const dialect = await inferDialect(resource);
10
+ expect(dialect).toEqual({ delimiter: "|" });
11
+ });
12
+ it("should infer dialect from CSV file with pipe delimiter", async () => {
13
+ const csvPath = await writeTempFile("id|name|age\n1|alice|25\n2|bob|30");
14
+ const resource = { path: csvPath, format: "csv" };
15
+ const dialect = await inferDialect(resource);
16
+ expect(dialect).toEqual({ delimiter: "|" });
17
+ });
18
+ it("should infer dialect from CSV file with semicolon delimiter", async () => {
19
+ const csvPath = await writeTempFile("id;name;age\n1;alice;25\n2;bob;30");
20
+ const resource = { path: csvPath, format: "csv" };
21
+ const dialect = await inferDialect(resource);
22
+ expect(dialect).toEqual({ delimiter: ";" });
23
+ });
24
+ it("should infer dialect from CSV file with tab delimiter", async () => {
25
+ const csvPath = await writeTempFile("id\tname\tage\n1\talice\t25\n2\tbob\t30");
26
+ const resource = { path: csvPath, format: "csv" };
27
+ const dialect = await inferDialect(resource, { delimiter: "\t" });
28
+ expect(dialect).toBeDefined();
29
+ });
30
+ it("should handle CSV with quoted fields", async () => {
31
+ const csvPath = await writeTempFile('id,name,description\n1,"alice","Description with, comma"\n2,"bob","Normal text"');
32
+ const resource = { path: csvPath, format: "csv" };
33
+ const dialect = await inferDialect(resource);
34
+ expect(dialect).toBeDefined();
35
+ });
36
+ it("should handle CSV with different quote character", async () => {
37
+ const csvPath = await writeTempFile("id,name,description\n1,'alice','Description text'\n2,'bob','Normal text'");
38
+ const resource = { path: csvPath, format: "csv" };
39
+ const dialect = await inferDialect(resource);
40
+ expect(dialect).toBeDefined();
41
+ });
42
+ it("should handle resources without path", async () => {
43
+ const resource = {
44
+ name: "test-resource",
45
+ data: [
46
+ { id: 1, name: "alice" },
47
+ { id: 2, name: "bob" },
48
+ ],
49
+ };
50
+ const dialect = await inferDialect(resource);
51
+ expect(dialect).toBeDefined();
52
+ });
53
+ it("should return empty object for non-CSV resources", async () => {
54
+ const resource = {
55
+ name: "test-resource",
56
+ format: "json",
57
+ data: [{ id: 1 }],
58
+ };
59
+ const dialect = await inferDialect(resource);
60
+ expect(dialect).toBeDefined();
61
+ expect(typeof dialect).toBe("object");
62
+ });
63
+ it("should handle CSV with custom line terminator", async () => {
64
+ const csvPath = await writeTempFile("id,name\r\n1,alice\r\n2,bob\r\n");
65
+ const resource = { path: csvPath, format: "csv" };
66
+ const dialect = await inferDialect(resource);
67
+ expect(dialect).toBeDefined();
68
+ });
69
+ it("should handle CSV with header row only", async () => {
70
+ const csvPath = await writeTempFile("id,name,age");
71
+ const resource = { path: csvPath, format: "csv" };
72
+ const dialect = await inferDialect(resource);
73
+ expect(dialect).toBeDefined();
74
+ });
75
+ it("should handle empty CSV file", async () => {
76
+ const csvPath = await writeTempFile("");
77
+ const resource = { path: csvPath, format: "csv" };
78
+ const dialect = await inferDialect(resource);
79
+ expect(dialect).toBeDefined();
80
+ expect(typeof dialect).toBe("object");
81
+ });
82
+ it("should respect provided delimiter option", async () => {
83
+ const csvPath = await writeTempFile("id|name|age\n1|alice|25\n2|bob|30");
84
+ const resource = { path: csvPath, format: "csv" };
85
+ const dialect = await inferDialect(resource, { delimiter: "|" });
86
+ expect(dialect).toBeDefined();
87
+ });
88
+ });
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2RpYWxlY3QvaW5mZXIuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFekMscUNBQXFDO0FBQ3JDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUN4RSxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQWMsRUFBRSxDQUFBO1FBRTFELE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RSxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBQ3hFLE1BQU0sUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBYyxFQUFFLENBQUE7UUFFMUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNB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QUMsQ0FBQTtRQUU1QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDN0IsTUFBTSxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3hELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFDeEUsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFjLEVBQUUsQ0FBQTtRQUUxRCxNQUFNLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUVoRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDL0IsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdyaXRlVGVtcEZpbGUgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9kYXRhc2V0XCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBpbmZlckRpYWxlY3QgfSBmcm9tIFwiLi9pbmZlci50c1wiXG5cbi8vIFRPRE86IGZpeCB0aGlzIHRlc3QvaW1wbGVtZW50YXRpb25cbmRlc2NyaWJlLnNraXAoXCJpbmZlckRpYWxlY3RcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBpbmZlciBkaWFsZWN0IGZyb20gQ1NWIGZpbGUgd2l0aCBjb21tYSBkZWxpbWl0ZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZSxhZ2VcXG4xLGFsaWNlLDI1XFxuMixib2IsMzBcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IGRpYWxlY3QgPSBhd2FpdCBpbmZlckRpYWxlY3QocmVzb3VyY2UpXG5cbiAgICBleHBlY3QoZGlhbGVjdCkudG9FcXVhbCh7IGRlbGltaXRlcjogXCJ8XCIgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBkaWFsZWN0IGZyb20gQ1NWIGZpbGUgd2l0aCBwaXBlIGRlbGltaXRlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZHxuYW1lfGFnZVxcbjF8YWxpY2V8MjVcXG4yfGJvYnwzMFwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgZGlhbGVjdCA9IGF3YWl0IGluZmVyRGlhbGVjdChyZXNvdXJjZSlcblxuICAgIGV4cGVjdChkaWFsZWN0KS50b0VxdWFsKHsgZGVsaW1pdGVyOiBcInxcIiB9KVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIGRpYWxlY3QgZnJvbSBDU1YgZmlsZSB3aXRoIHNlbWljb2xvbiBkZWxpbWl0ZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQ7bmFtZTthZ2VcXG4xO2FsaWNlOzI1XFxuMjtib2I7MzBcIilcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IGRpYWxlY3QgPSBhd2FpdCBpbmZlckRpYWxlY3QocmVzb3VyY2UpXG5cbiAgICBleHBlY3QoZGlhbGVjdCkudG9FcXVhbCh7IGRlbGltaXRlcjogXCI7XCIgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBkaWFsZWN0IGZyb20gQ1NWIGZpbGUgd2l0aCB0YWIgZGVsaW1pdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWRcXHRuYW1lXFx0YWdlXFxuMVxcdGFsaWNlXFx0MjVcXG4yXFx0Ym9iXFx0MzBcIixcbiAgICApXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCBkaWFsZWN0ID0gYXdhaXQgaW5mZXJEaWFsZWN0KHJlc291cmNlLCB7IGRlbGltaXRlcjogXCJcXHRcIiB9KVxuXG4gICAgZXhwZWN0KGRpYWxlY3QpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgQ1NWIHdpdGggcXVvdGVkIGZpZWxkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXG4gICAgICAnaWQsbmFtZSxkZXNjcmlwdGlvblxcbjEsXCJhbGljZVwiLFwiRGVzY3JpcHRpb24gd2l0aCwgY29tbWFcIlxcbjIsXCJib2JcIixcIk5vcm1hbCB0ZXh0XCInLFxuICAgIClcbiAgICBjb25zdCByZXNvdXJjZSA9IHsgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1cblxuICAgIGNvbnN0IGRpYWxlY3QgPSBhd2FpdCBpbmZlckRpYWxlY3QocmVzb3VyY2UpXG5cbiAgICBleHBlY3QoZGlhbGVjdCkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBDU1Ygd2l0aCBkaWZmZXJlbnQgcXVvdGUgY2hhcmFjdGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcbiAgICAgIFwiaWQsbmFtZSxkZXNjcmlwdGlvblxcbjEsJ2FsaWNlJywnRGVzY3JpcHRpb24gdGV4dCdcXG4yLCdib2InLCdOb3JtYWwgdGV4dCdcIixcbiAgICApXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCBkaWFsZWN0ID0gYXdhaXQgaW5mZXJEaWFsZWN0KHJlc291cmNlKVxuXG4gICAgZXhwZWN0KGRpYWxlY3QpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgcmVzb3VyY2VzIHdpdGhvdXQgcGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgIGRhdGE6IFtcbiAgICAgICAgeyBpZDogMSwgbmFtZTogXCJhbGljZVwiIH0sXG4gICAgICAgIHsgaWQ6IDIsIG5hbWU6IFwiYm9iXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgZGlhbGVjdCA9IGF3YWl0IGluZmVyRGlhbGVjdChyZXNvdXJjZSlcblxuICAgIGV4cGVjdChkaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmV0dXJuIGVtcHR5IG9iamVjdCBmb3Igbm9uLUNTViByZXNvdXJjZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXJlc291cmNlXCIsXG4gICAgICBmb3JtYXQ6IFwianNvblwiIGFzIGNvbnN0LFxuICAgICAgZGF0YTogW3sgaWQ6IDEgfV0sXG4gICAgfVxuXG4gICAgY29uc3QgZGlhbGVjdCA9IGF3YWl0IGluZmVyRGlhbGVjdChyZXNvdXJjZSlcblxuICAgIGV4cGVjdChkaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHR5cGVvZiBkaWFsZWN0KS50b0JlKFwib2JqZWN0XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIENTViB3aXRoIGN1c3RvbSBsaW5lIHRlcm1pbmF0b3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcclxcbjEsYWxpY2VcXHJcXG4yLGJvYlxcclxcblwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgZGlhbGVjdCA9IGF3YWl0IGluZmVyRGlhbGVjdChyZXNvdXJjZSlcblxuICAgIGV4cGVjdChkaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIENTViB3aXRoIGhlYWRlciByb3cgb25seVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3N2UGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCxuYW1lLGFnZVwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgZGlhbGVjdCA9IGF3YWl0IGluZmVyRGlhbGVjdChyZXNvdXJjZSlcblxuICAgIGV4cGVjdChkaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGVtcHR5IENTViBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcIlwiKVxuICAgIGNvbnN0IHJlc291cmNlID0geyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfVxuXG4gICAgY29uc3QgZGlhbGVjdCA9IGF3YWl0IGluZmVyRGlhbGVjdChyZXNvdXJjZSlcblxuICAgIGV4cGVjdChkaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHR5cGVvZiBkaWFsZWN0KS50b0JlKFwib2JqZWN0XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmVzcGVjdCBwcm92aWRlZCBkZWxpbWl0ZXIgb3B0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkfG5hbWV8YWdlXFxuMXxhbGljZXwyNVxcbjJ8Ym9ifDMwXCIpXG4gICAgY29uc3QgcmVzb3VyY2UgPSB7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XG5cbiAgICBjb25zdCBkaWFsZWN0ID0gYXdhaXQgaW5mZXJEaWFsZWN0KHJlc291cmNlLCB7IGRlbGltaXRlcjogXCJ8XCIgfSlcblxuICAgIGV4cGVjdChkaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,19 @@
1
+ export * from "@frictionless-ts/dataset";
2
+ export * from "@frictionless-ts/database";
3
+ export * from "@frictionless-ts/document";
4
+ export * from "@frictionless-ts/metadata";
5
+ export * from "@frictionless-ts/table";
6
+ export type { Plugin } from "./plugin.ts";
7
+ export { System } from "./system.ts";
8
+ export { inferDialect } from "./dialect/index.ts";
9
+ export { inferPackage } from "./package/index.ts";
10
+ export { inferResource } from "./resource/index.ts";
11
+ export { inferSchema } from "./schema/index.ts";
12
+ export { loadPackage } from "./package/index.ts";
13
+ export { loadTable } from "./table/index.ts";
14
+ export { savePackage } from "./package/index.ts";
15
+ export { saveTable } from "./table/index.ts";
16
+ export { system } from "./system.ts";
17
+ export { validatePackage } from "./package/index.ts";
18
+ export { validateResource } from "./resource/index.ts";
19
+ export { validateTable } from "./table/index.ts";
package/build/index.js ADDED
@@ -0,0 +1,19 @@
1
+ export * from "@frictionless-ts/dataset";
2
+ export * from "@frictionless-ts/database";
3
+ export * from "@frictionless-ts/document";
4
+ export * from "@frictionless-ts/metadata";
5
+ export * from "@frictionless-ts/table";
6
+ export { System } from "./system.js";
7
+ export { inferDialect } from "./dialect/index.js";
8
+ export { inferPackage } from "./package/index.js";
9
+ export { inferResource } from "./resource/index.js";
10
+ export { inferSchema } from "./schema/index.js";
11
+ export { loadPackage } from "./package/index.js";
12
+ export { loadTable } from "./table/index.js";
13
+ export { savePackage } from "./package/index.js";
14
+ export { saveTable } from "./table/index.js";
15
+ export { system } from "./system.js";
16
+ export { validatePackage } from "./package/index.js";
17
+ export { validateResource } from "./resource/index.js";
18
+ export { validateTable } from "./table/index.js";
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFBO0FBQ3hDLGNBQWMsMkJBQTJCLENBQUE7QUFDekMsY0FBYywyQkFBMkIsQ0FBQTtBQUN6QyxjQUFjLDJCQUEyQixDQUFBO0FBQ3pDLGNBQWMsd0JBQXdCLENBQUE7QUFJdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuZXhwb3J0ICogZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZGF0YWJhc2VcIlxuZXhwb3J0ICogZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvZG9jdW1lbnRcIlxuZXhwb3J0ICogZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuZXhwb3J0ICogZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuXG5leHBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpbi50c1wiXG5cbmV4cG9ydCB7IFN5c3RlbSB9IGZyb20gXCIuL3N5c3RlbS50c1wiXG5cbmV4cG9ydCB7IGluZmVyRGlhbGVjdCB9IGZyb20gXCIuL2RpYWxlY3QvaW5kZXgudHNcIlxuZXhwb3J0IHsgaW5mZXJQYWNrYWdlIH0gZnJvbSBcIi4vcGFja2FnZS9pbmRleC50c1wiXG5leHBvcnQgeyBpbmZlclJlc291cmNlIH0gZnJvbSBcIi4vcmVzb3VyY2UvaW5kZXgudHNcIlxuZXhwb3J0IHsgaW5mZXJTY2hlbWEgfSBmcm9tIFwiLi9zY2hlbWEvaW5kZXgudHNcIlxuZXhwb3J0IHsgbG9hZFBhY2thZ2UgfSBmcm9tIFwiLi9wYWNrYWdlL2luZGV4LnRzXCJcbmV4cG9ydCB7IGxvYWRUYWJsZSB9IGZyb20gXCIuL3RhYmxlL2luZGV4LnRzXCJcbmV4cG9ydCB7IHNhdmVQYWNrYWdlIH0gZnJvbSBcIi4vcGFja2FnZS9pbmRleC50c1wiXG5leHBvcnQgeyBzYXZlVGFibGUgfSBmcm9tIFwiLi90YWJsZS9pbmRleC50c1wiXG5leHBvcnQgeyBzeXN0ZW0gfSBmcm9tIFwiLi9zeXN0ZW0udHNcIlxuZXhwb3J0IHsgdmFsaWRhdGVQYWNrYWdlIH0gZnJvbSBcIi4vcGFja2FnZS9pbmRleC50c1wiXG5leHBvcnQgeyB2YWxpZGF0ZVJlc291cmNlIH0gZnJvbSBcIi4vcmVzb3VyY2UvaW5kZXgudHNcIlxuZXhwb3J0IHsgdmFsaWRhdGVUYWJsZSB9IGZyb20gXCIuL3RhYmxlL2luZGV4LnRzXCJcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export { loadPackage } from "./load.ts";
2
+ export { savePackage } from "./save.ts";
3
+ export { inferPackage } from "./infer.ts";
4
+ export { validatePackage, validatePackageData } from "./validate.ts";
@@ -0,0 +1,5 @@
1
+ export { loadPackage } from "./load.js";
2
+ export { savePackage } from "./save.js";
3
+ export { inferPackage } from "./infer.js";
4
+ export { validatePackage, validatePackageData } from "./validate.js";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9wYWNrYWdlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBsb2FkUGFja2FnZSB9IGZyb20gXCIuL2xvYWQudHNcIlxuZXhwb3J0IHsgc2F2ZVBhY2thZ2UgfSBmcm9tIFwiLi9zYXZlLnRzXCJcbmV4cG9ydCB7IGluZmVyUGFja2FnZSB9IGZyb20gXCIuL2luZmVyLnRzXCJcbmV4cG9ydCB7IHZhbGlkYXRlUGFja2FnZSwgdmFsaWRhdGVQYWNrYWdlRGF0YSB9IGZyb20gXCIuL3ZhbGlkYXRlLnRzXCJcbiJdfQ==
@@ -0,0 +1,40 @@
1
+ import type { Package, Resource } from "@frictionless-ts/metadata";
2
+ import type { InferDialectOptions } from "@frictionless-ts/table";
3
+ import type { InferSchemaOptions } from "@frictionless-ts/table";
4
+ interface PartialPackage extends Omit<Package, "resources"> {
5
+ resources: Partial<Resource>[];
6
+ }
7
+ export declare function inferPackage(dataPackage: PartialPackage, options?: InferDialectOptions & InferSchemaOptions): Promise<{
8
+ resources: {
9
+ name: string;
10
+ $schema?: string | undefined;
11
+ path?: string | string[] | undefined;
12
+ data?: unknown | unknown[][] | Record<string, unknown>[];
13
+ type?: "table" | undefined;
14
+ format?: string | undefined;
15
+ mediatype?: string | undefined;
16
+ encoding?: string | undefined;
17
+ title?: string | undefined;
18
+ description?: string | undefined;
19
+ bytes?: number | undefined;
20
+ hash?: string | undefined;
21
+ sources?: import("@frictionless-ts/metadata").Source[] | undefined;
22
+ licenses?: import("@frictionless-ts/metadata").License[] | undefined;
23
+ dialect?: (string | import("@frictionless-ts/metadata").Dialect) | undefined;
24
+ schema?: (string | import("@frictionless-ts/metadata").Schema) | undefined;
25
+ jsonSchema?: (string | import("@frictionless-ts/metadata").Descriptor) | undefined;
26
+ }[];
27
+ $schema?: string | undefined;
28
+ name?: string | undefined;
29
+ title?: string | undefined;
30
+ description?: string | undefined;
31
+ sources?: import("@frictionless-ts/metadata").Source[] | undefined;
32
+ licenses?: import("@frictionless-ts/metadata").License[] | undefined;
33
+ homepage?: string | undefined;
34
+ version?: string | undefined;
35
+ contributors?: import("@frictionless-ts/metadata").Contributor[] | undefined;
36
+ keywords?: string[] | undefined;
37
+ created?: string | undefined;
38
+ image?: string | undefined;
39
+ }>;
40
+ export {};
@@ -0,0 +1,13 @@
1
+ import os from "node:os";
2
+ import pAll from "p-all";
3
+ import { inferResource } from "../resource/index.js";
4
+ export async function inferPackage(dataPackage, options) {
5
+ const concurrency = os.cpus().length;
6
+ const resources = await pAll(dataPackage.resources.map(resource => () => inferResource(resource, options)), { concurrency });
7
+ const result = {
8
+ ...dataPackage,
9
+ resources,
10
+ };
11
+ return result;
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9wYWNrYWdlL2luZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUl4QixPQUFPLElBQUksTUFBTSxPQUFPLENBQUE7QUFDeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBUXBELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxXQUEyQixFQUMzQixPQUFrRDtJQUVsRCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFBO0lBRXBDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUMxQixXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FDdkIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUNuRCxFQUNELEVBQUUsV0FBVyxFQUFFLENBQ2hCLENBQUE7SUFFRCxNQUFNLE1BQU0sR0FBRztRQUNiLEdBQUcsV0FBVztRQUNkLFNBQVM7S0FDVixDQUFBO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCJcbmltcG9ydCB0eXBlIHsgUGFja2FnZSwgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IEluZmVyRGlhbGVjdE9wdGlvbnMgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy90YWJsZVwiXG5pbXBvcnQgdHlwZSB7IEluZmVyU2NoZW1hT3B0aW9ucyB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL3RhYmxlXCJcbmltcG9ydCBwQWxsIGZyb20gXCJwLWFsbFwiXG5pbXBvcnQgeyBpbmZlclJlc291cmNlIH0gZnJvbSBcIi4uL3Jlc291cmNlL2luZGV4LnRzXCJcblxuLy8gVE9ETzogTW92ZSBQYXJ0aWFsUGFja2FnZS9SZXNvdXJjZSB0byBAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhP1xuXG5pbnRlcmZhY2UgUGFydGlhbFBhY2thZ2UgZXh0ZW5kcyBPbWl0PFBhY2thZ2UsIFwicmVzb3VyY2VzXCI+IHtcbiAgcmVzb3VyY2VzOiBQYXJ0aWFsPFJlc291cmNlPltdXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmZlclBhY2thZ2UoXG4gIGRhdGFQYWNrYWdlOiBQYXJ0aWFsUGFja2FnZSxcbiAgb3B0aW9ucz86IEluZmVyRGlhbGVjdE9wdGlvbnMgJiBJbmZlclNjaGVtYU9wdGlvbnMsXG4pIHtcbiAgY29uc3QgY29uY3VycmVuY3kgPSBvcy5jcHVzKCkubGVuZ3RoXG5cbiAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgcEFsbChcbiAgICBkYXRhUGFja2FnZS5yZXNvdXJjZXMubWFwKFxuICAgICAgcmVzb3VyY2UgPT4gKCkgPT4gaW5mZXJSZXNvdXJjZShyZXNvdXJjZSwgb3B0aW9ucyksXG4gICAgKSxcbiAgICB7IGNvbmN1cnJlbmN5IH0sXG4gIClcblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgLi4uZGF0YVBhY2thZ2UsXG4gICAgcmVzb3VyY2VzLFxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,121 @@
1
+ import { writeTempFile } from "@frictionless-ts/dataset";
2
+ import { describe, expect, it } from "vitest";
3
+ import { inferPackage } from "./infer.js";
4
+ describe("inferPackage", () => {
5
+ it("should infer package with single resource", async () => {
6
+ const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
7
+ const dataPackage = {
8
+ name: "test-package",
9
+ resources: [{ path: csvPath, format: "csv" }],
10
+ };
11
+ const result = await inferPackage(dataPackage);
12
+ expect(result.name).toBe("test-package");
13
+ expect(result.resources).toBeDefined();
14
+ expect(result.resources.length).toBe(1);
15
+ expect(result.resources?.[0]?.schema).toBeDefined();
16
+ });
17
+ it("should infer package with multiple resources", async () => {
18
+ const csv1Path = await writeTempFile("id,name\n1,alice\n2,bob");
19
+ const csv2Path = await writeTempFile("id,value\n1,100\n2,200");
20
+ const dataPackage = {
21
+ name: "test-package",
22
+ resources: [
23
+ { path: csv1Path, format: "csv" },
24
+ { path: csv2Path, format: "csv" },
25
+ ],
26
+ };
27
+ const result = await inferPackage(dataPackage);
28
+ expect(result.name).toBe("test-package");
29
+ expect(result.resources.length).toBe(2);
30
+ expect(result.resources?.[0]?.schema).toBeDefined();
31
+ expect(result.resources?.[1]?.schema).toBeDefined();
32
+ });
33
+ it("should preserve package-level properties", async () => {
34
+ const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
35
+ const dataPackage = {
36
+ name: "test-package",
37
+ title: "Test Package",
38
+ description: "A test package",
39
+ version: "1.0.0",
40
+ resources: [{ path: csvPath, format: "csv" }],
41
+ };
42
+ const result = await inferPackage(dataPackage);
43
+ expect(result.name).toBe("test-package");
44
+ expect(result.title).toBe("Test Package");
45
+ expect(result.description).toBe("A test package");
46
+ expect(result.version).toBe("1.0.0");
47
+ });
48
+ it("should pass options to resource inference", async () => {
49
+ const csvPath = await writeTempFile("id|name\n1|alice\n2|bob");
50
+ const dataPackage = {
51
+ name: "test-package",
52
+ resources: [{ path: csvPath, format: "csv" }],
53
+ };
54
+ const result = await inferPackage(dataPackage, { delimiter: "|" });
55
+ expect(result.resources?.[0]?.dialect).toBeDefined();
56
+ expect(result.resources?.[0]?.schema).toBeDefined();
57
+ });
58
+ it("should handle empty resources array", async () => {
59
+ const dataPackage = {
60
+ name: "test-package",
61
+ resources: [],
62
+ };
63
+ const result = await inferPackage(dataPackage);
64
+ expect(result.name).toBe("test-package");
65
+ expect(result.resources).toEqual([]);
66
+ });
67
+ it("should preserve existing resource properties", async () => {
68
+ const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
69
+ const dataPackage = {
70
+ name: "test-package",
71
+ resources: [
72
+ {
73
+ path: csvPath,
74
+ format: "csv",
75
+ name: "custom-name",
76
+ title: "Custom Resource",
77
+ },
78
+ ],
79
+ };
80
+ const result = await inferPackage(dataPackage);
81
+ expect(result.resources?.[0]?.name).toBe("custom-name");
82
+ expect(result.resources?.[0]?.title).toBe("Custom Resource");
83
+ });
84
+ it("should infer package with inline data resources", async () => {
85
+ const dataPackage = {
86
+ name: "test-package",
87
+ resources: [
88
+ {
89
+ name: "test-resource",
90
+ data: [
91
+ { id: 1, name: "alice" },
92
+ { id: 2, name: "bob" },
93
+ ],
94
+ },
95
+ ],
96
+ };
97
+ const result = await inferPackage(dataPackage);
98
+ expect(result.name).toBe("test-package");
99
+ expect(result.resources.length).toBe(1);
100
+ expect(result.resources?.[0]?.name).toBe("test-resource");
101
+ expect(result.resources?.[0]?.data).toBeDefined();
102
+ });
103
+ it("should handle mixed file and inline resources", async () => {
104
+ const csvPath = await writeTempFile("id,name\n1,alice\n2,bob");
105
+ const dataPackage = {
106
+ name: "test-package",
107
+ resources: [
108
+ { path: csvPath, format: "csv" },
109
+ {
110
+ name: "inline-resource",
111
+ data: [{ id: 1, value: 100 }],
112
+ },
113
+ ],
114
+ };
115
+ const result = await inferPackage(dataPackage);
116
+ expect(result.resources.length).toBe(2);
117
+ expect(result.resources?.[0]?.path).toBe(csvPath);
118
+ expect(result.resources?.[1]?.data).toBeDefined();
119
+ });
120
+ });
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mZXIuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3BhY2thZ2UvaW5mZXIuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFekMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDOUQsTUFBTSxXQUFXLEdBQUc7WUFDbEIsSUFBSSxFQUFFLGNBQWM7WUFDcEIsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFjLEVBQUUsQ0FBQztTQUN2RCxDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNyRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxL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QUssRUFBRSxHQUFHLEVBQUUsQ0FBQztpQkFDOUI7YUFDRjtTQUNGLENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUU5QyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd3JpdGVUZW1wRmlsZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL2RhdGFzZXRcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IGluZmVyUGFja2FnZSB9IGZyb20gXCIuL2luZmVyLnRzXCJcblxuZGVzY3JpYmUoXCJpbmZlclBhY2thZ2VcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBpbmZlciBwYWNrYWdlIHdpdGggc2luZ2xlIHJlc291cmNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFt7IHBhdGg6IGNzdlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9XSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclBhY2thZ2UoZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJ0ZXN0LXBhY2thZ2VcIilcbiAgICBleHBlY3QocmVzdWx0LnJlc291cmNlcykudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzLmxlbmd0aCkudG9CZSgxKVxuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzPy5bMF0/LnNjaGVtYSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGluZmVyIHBhY2thZ2Ugd2l0aCBtdWx0aXBsZSByZXNvdXJjZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdjFQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCBjc3YyUGF0aCA9IGF3YWl0IHdyaXRlVGVtcEZpbGUoXCJpZCx2YWx1ZVxcbjEsMTAwXFxuMiwyMDBcIilcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgeyBwYXRoOiBjc3YxUGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH0sXG4gICAgICAgIHsgcGF0aDogY3N2MlBhdGgsIGZvcm1hdDogXCJjc3ZcIiBhcyBjb25zdCB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclBhY2thZ2UoZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJ0ZXN0LXBhY2thZ2VcIilcbiAgICBleHBlY3QocmVzdWx0LnJlc291cmNlcy5sZW5ndGgpLnRvQmUoMilcbiAgICBleHBlY3QocmVzdWx0LnJlc291cmNlcz8uWzBdPy5zY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0LnJlc291cmNlcz8uWzFdPy5zY2hlbWEpLnRvQmVEZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBwcmVzZXJ2ZSBwYWNrYWdlLWxldmVsIHByb3BlcnRpZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWQsbmFtZVxcbjEsYWxpY2VcXG4yLGJvYlwiKVxuICAgIGNvbnN0IGRhdGFQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHRpdGxlOiBcIlRlc3QgUGFja2FnZVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQSB0ZXN0IHBhY2thZ2VcIixcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIHJlc291cmNlczogW3sgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyUGFja2FnZShkYXRhUGFja2FnZSlcblxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZShcInRlc3QtcGFja2FnZVwiKVxuICAgIGV4cGVjdChyZXN1bHQudGl0bGUpLnRvQmUoXCJUZXN0IFBhY2thZ2VcIilcbiAgICBleHBlY3QocmVzdWx0LmRlc2NyaXB0aW9uKS50b0JlKFwiQSB0ZXN0IHBhY2thZ2VcIilcbiAgICBleHBlY3QocmVzdWx0LnZlcnNpb24pLnRvQmUoXCIxLjAuMFwiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHBhc3Mgb3B0aW9ucyB0byByZXNvdXJjZSBpbmZlcmVuY2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNzdlBhdGggPSBhd2FpdCB3cml0ZVRlbXBGaWxlKFwiaWR8bmFtZVxcbjF8YWxpY2VcXG4yfGJvYlwiKVxuICAgIGNvbnN0IGRhdGFQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW3sgcGF0aDogY3N2UGF0aCwgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0IH1dLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyUGFja2FnZShkYXRhUGFja2FnZSwgeyBkZWxpbWl0ZXI6IFwifFwiIH0pXG5cbiAgICBleHBlY3QocmVzdWx0LnJlc291cmNlcz8uWzBdPy5kaWFsZWN0KS50b0JlRGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC5yZXNvdXJjZXM/LlswXT8uc2NoZW1hKS50b0JlRGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGVtcHR5IHJlc291cmNlcyBhcnJheVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgcmVzb3VyY2VzOiBbXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbmZlclBhY2thZ2UoZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoXCJ0ZXN0LXBhY2thZ2VcIilcbiAgICBleHBlY3QocmVzdWx0LnJlc291cmNlcykudG9FcXVhbChbXSlcbiAgfSlcblxuICBpdChcInNob3VsZCBwcmVzZXJ2ZSBleGlzdGluZyByZXNvdXJjZSBwcm9wZXJ0aWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6IGNzdlBhdGgsXG4gICAgICAgICAgZm9ybWF0OiBcImNzdlwiIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6IFwiY3VzdG9tLW5hbWVcIixcbiAgICAgICAgICB0aXRsZTogXCJDdXN0b20gUmVzb3VyY2VcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5mZXJQYWNrYWdlKGRhdGFQYWNrYWdlKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5yZXNvdXJjZXM/LlswXT8ubmFtZSkudG9CZShcImN1c3RvbS1uYW1lXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5yZXNvdXJjZXM/LlswXT8udGl0bGUpLnRvQmUoXCJDdXN0b20gUmVzb3VyY2VcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmZlciBwYWNrYWdlIHdpdGggaW5saW5lIGRhdGEgcmVzb3VyY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidGVzdC1yZXNvdXJjZVwiLFxuICAgICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAgIHsgaWQ6IDEsIG5hbWU6IFwiYWxpY2VcIiB9LFxuICAgICAgICAgICAgeyBpZDogMiwgbmFtZTogXCJib2JcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyUGFja2FnZShkYXRhUGFja2FnZSlcblxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZShcInRlc3QtcGFja2FnZVwiKVxuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzLmxlbmd0aCkudG9CZSgxKVxuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzPy5bMF0/Lm5hbWUpLnRvQmUoXCJ0ZXN0LXJlc291cmNlXCIpXG4gICAgZXhwZWN0KHJlc3VsdC5yZXNvdXJjZXM/LlswXT8uZGF0YSkudG9CZURlZmluZWQoKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBtaXhlZCBmaWxlIGFuZCBpbmxpbmUgcmVzb3VyY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjc3ZQYXRoID0gYXdhaXQgd3JpdGVUZW1wRmlsZShcImlkLG5hbWVcXG4xLGFsaWNlXFxuMixib2JcIilcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IHtcbiAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgeyBwYXRoOiBjc3ZQYXRoLCBmb3JtYXQ6IFwiY3N2XCIgYXMgY29uc3QgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiaW5saW5lLXJlc291cmNlXCIsXG4gICAgICAgICAgZGF0YTogW3sgaWQ6IDEsIHZhbHVlOiAxMDAgfV0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluZmVyUGFja2FnZShkYXRhUGFja2FnZSlcblxuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzLmxlbmd0aCkudG9CZSgyKVxuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzPy5bMF0/LnBhdGgpLnRvQmUoY3N2UGF0aClcbiAgICBleHBlY3QocmVzdWx0LnJlc291cmNlcz8uWzFdPy5kYXRhKS50b0JlRGVmaW5lZCgpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,8 @@
1
+ import type { Package } from "@frictionless-ts/metadata";
2
+ import type { BoundError } from "@frictionless-ts/metadata";
3
+ export declare function validatePackageIntegrity(dataPackage: Package, options?: {
4
+ maxErrors?: number;
5
+ }): Promise<{
6
+ errors: BoundError[];
7
+ valid: boolean;
8
+ }>;
@@ -0,0 +1,69 @@
1
+ import { createReport } from "@frictionless-ts/metadata";
2
+ import { resolveSchema } from "@frictionless-ts/metadata";
3
+ import { loadTable } from "../table/index.js";
4
+ // TODO: foreign key fields definition should be validated as well (metadata/here?)
5
+ // TODO: review temporary files creation from validatePackage call
6
+ export async function validatePackageIntegrity(dataPackage, options) {
7
+ const { maxErrors = 1000 } = options ?? {};
8
+ const errors = [];
9
+ const tables = {};
10
+ for (const resource of dataPackage.resources) {
11
+ const schema = await resolveSchema(resource.schema);
12
+ if (!schema)
13
+ continue;
14
+ const foreignKeys = schema.foreignKeys;
15
+ if (!foreignKeys)
16
+ continue;
17
+ const names = [
18
+ resource.name,
19
+ ...foreignKeys.map(it => it.reference.resource),
20
+ ].filter(Boolean);
21
+ for (const name of names) {
22
+ const resource = dataPackage.resources.find(r => r.name === name);
23
+ if (!resource) {
24
+ errors.push({
25
+ type: "data",
26
+ message: `missing ${name} resource`,
27
+ resource: name,
28
+ });
29
+ continue;
30
+ }
31
+ if (!tables[name]) {
32
+ const table = await loadTable(resource);
33
+ if (!table) {
34
+ errors.push({
35
+ type: "data",
36
+ message: `missing ${resource.name} table`,
37
+ resource: name,
38
+ });
39
+ continue;
40
+ }
41
+ tables[name] = table;
42
+ }
43
+ }
44
+ for (const foreignKey of foreignKeys) {
45
+ const left = tables[resource.name];
46
+ const right = tables[foreignKey.reference.resource ?? resource.name];
47
+ const foreignKeyCheckTable = left
48
+ .select(...foreignKey.fields)
49
+ .join(right, {
50
+ how: "anti",
51
+ leftOn: foreignKey.fields,
52
+ rightOn: foreignKey.reference.fields,
53
+ });
54
+ const foreignKeyCheckFrame = await foreignKeyCheckTable
55
+ .head(maxErrors)
56
+ .collect();
57
+ for (const row of foreignKeyCheckFrame.toRecords()) {
58
+ errors.push({
59
+ type: "foreignKey",
60
+ foreignKey,
61
+ cells: Object.values(row).map(String),
62
+ resource: resource.name,
63
+ });
64
+ }
65
+ }
66
+ }
67
+ return createReport(errors, { maxErrors });
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcGFja2FnZS9pbnRlZ3JpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUd6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFN0MsbUZBQW1GO0FBQ25GLGtFQUFrRTtBQUVsRSxNQUFNLENBQUMsS0FBSyxVQUFVLHdCQUF3QixDQUM1QyxXQUFvQixFQUNwQixPQUFnQztJQUVoQyxNQUFNLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7SUFFMUMsTUFBTSxNQUFNLEdBQWlCLEVBQUUsQ0FBQTtJQUMvQixNQUFNLE1BQU0sR0FBMEIsRUFBRSxDQUFBO0lBRXhDLEtBQUssTUFBTSxRQUFRLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuRCxJQUFJLENBQUMsTUFBTTtZQUFFLFNBQVE7UUFFckIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQTtRQUN0QyxJQUFJLENBQUMsV0FBVztZQUFFLFNBQVE7UUFFMUIsTUFBTSxLQUFLLEdBQUc7WUFDWixRQUFRLENBQUMsSUFBSTtZQUNiLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1NBQ2hELENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBYSxDQUFBO1FBRTdCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFBO1lBRWpFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUNWLElBQUksRUFBRSxNQUFNO29CQUNaLE9BQU8sRUFBRSxXQUFXLElBQUksV0FBVztvQkFDbkMsUUFBUSxFQUFFLElBQUk7aUJBQ2YsQ0FBQyxDQUFBO2dCQUVGLFNBQVE7WUFDVixDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNsQixNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFFdkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUM7d0JBQ1YsSUFBSSxFQUFFLE1BQU07d0JBQ1osT0FBTyxFQUFFLFdBQVcsUUFBUSxDQUFDLElBQUksUUFBUTt3QkFDekMsUUFBUSxFQUFFLElBQUk7cUJBQ2YsQ0FBQyxDQUFBO29CQUVGLFNBQVE7Z0JBQ1YsQ0FBQztnQkFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFBO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBVSxDQUFBO1lBQzNDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FDbEIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FDdEMsQ0FBQTtZQUVWLE1BQU0sb0JBQW9CLEdBQUcsSUFBSTtpQkFDOUIsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztpQkFDNUIsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDWCxHQUFHLEVBQUUsTUFBTTtnQkFDWCxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07Z0JBQ3pCLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU07YUFDckMsQ0FBQyxDQUFBO1lBRUosTUFBTSxvQkFBb0IsR0FBRyxNQUFNLG9CQUFvQjtpQkFDcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQztpQkFDZixPQUFPLEVBQUUsQ0FBQTtZQUVaLEtBQUssTUFBTSxHQUFHLElBQUksb0JBQW9CLENBQUMsU0FBUyxFQUFXLEVBQUUsQ0FBQztnQkFDNUQsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixJQUFJLEVBQUUsWUFBWTtvQkFDbEIsVUFBVTtvQkFDVixLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUNyQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7aUJBQ3hCLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGFja2FnZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGNyZWF0ZVJlcG9ydCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IHJlc29sdmVTY2hlbWEgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IEJvdW5kRXJyb3IgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvdGFibGVcIlxuaW1wb3J0IHsgbG9hZFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlL2luZGV4LnRzXCJcblxuLy8gVE9ETzogZm9yZWlnbiBrZXkgZmllbGRzIGRlZmluaXRpb24gc2hvdWxkIGJlIHZhbGlkYXRlZCBhcyB3ZWxsIChtZXRhZGF0YS9oZXJlPylcbi8vIFRPRE86IHJldmlldyB0ZW1wb3JhcnkgZmlsZXMgY3JlYXRpb24gZnJvbSB2YWxpZGF0ZVBhY2thZ2UgY2FsbFxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVQYWNrYWdlSW50ZWdyaXR5KFxuICBkYXRhUGFja2FnZTogUGFja2FnZSxcbiAgb3B0aW9ucz86IHsgbWF4RXJyb3JzPzogbnVtYmVyIH0sXG4pIHtcbiAgY29uc3QgeyBtYXhFcnJvcnMgPSAxMDAwIH0gPSBvcHRpb25zID8/IHt9XG5cbiAgY29uc3QgZXJyb3JzOiBCb3VuZEVycm9yW10gPSBbXVxuICBjb25zdCB0YWJsZXM6IFJlY29yZDxzdHJpbmcsIFRhYmxlPiA9IHt9XG5cbiAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBkYXRhUGFja2FnZS5yZXNvdXJjZXMpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCByZXNvbHZlU2NoZW1hKHJlc291cmNlLnNjaGVtYSlcbiAgICBpZiAoIXNjaGVtYSkgY29udGludWVcblxuICAgIGNvbnN0IGZvcmVpZ25LZXlzID0gc2NoZW1hLmZvcmVpZ25LZXlzXG4gICAgaWYgKCFmb3JlaWduS2V5cykgY29udGludWVcblxuICAgIGNvbnN0IG5hbWVzID0gW1xuICAgICAgcmVzb3VyY2UubmFtZSxcbiAgICAgIC4uLmZvcmVpZ25LZXlzLm1hcChpdCA9PiBpdC5yZWZlcmVuY2UucmVzb3VyY2UpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdXG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gZGF0YVBhY2thZ2UucmVzb3VyY2VzLmZpbmQociA9PiByLm5hbWUgPT09IG5hbWUpXG5cbiAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiZGF0YVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBtaXNzaW5nICR7bmFtZX0gcmVzb3VyY2VgLFxuICAgICAgICAgIHJlc291cmNlOiBuYW1lLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghdGFibGVzW25hbWVdKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgbG9hZFRhYmxlKHJlc291cmNlKVxuXG4gICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcImRhdGFcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBtaXNzaW5nICR7cmVzb3VyY2UubmFtZX0gdGFibGVgLFxuICAgICAgICAgICAgcmVzb3VyY2U6IG5hbWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0YWJsZXNbbmFtZV0gPSB0YWJsZVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZm9yZWlnbktleSBvZiBmb3JlaWduS2V5cykge1xuICAgICAgY29uc3QgbGVmdCA9IHRhYmxlc1tyZXNvdXJjZS5uYW1lXSBhcyBUYWJsZVxuICAgICAgY29uc3QgcmlnaHQgPSB0YWJsZXNbXG4gICAgICAgIGZvcmVpZ25LZXkucmVmZXJlbmNlLnJlc291cmNlID8/IHJlc291cmNlLm5hbWVcbiAgICAgIF0gYXMgVGFibGVcblxuICAgICAgY29uc3QgZm9yZWlnbktleUNoZWNrVGFibGUgPSBsZWZ0XG4gICAgICAgIC5zZWxlY3QoLi4uZm9yZWlnbktleS5maWVsZHMpXG4gICAgICAgIC5qb2luKHJpZ2h0LCB7XG4gICAgICAgICAgaG93OiBcImFudGlcIixcbiAgICAgICAgICBsZWZ0T246IGZvcmVpZ25LZXkuZmllbGRzLFxuICAgICAgICAgIHJpZ2h0T246IGZvcmVpZ25LZXkucmVmZXJlbmNlLmZpZWxkcyxcbiAgICAgICAgfSlcblxuICAgICAgY29uc3QgZm9yZWlnbktleUNoZWNrRnJhbWUgPSBhd2FpdCBmb3JlaWduS2V5Q2hlY2tUYWJsZVxuICAgICAgICAuaGVhZChtYXhFcnJvcnMpXG4gICAgICAgIC5jb2xsZWN0KClcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgZm9yZWlnbktleUNoZWNrRnJhbWUudG9SZWNvcmRzKCkgYXMgYW55W10pIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiZm9yZWlnbktleVwiLFxuICAgICAgICAgIGZvcmVpZ25LZXksXG4gICAgICAgICAgY2VsbHM6IE9iamVjdC52YWx1ZXMocm93KS5tYXAoU3RyaW5nKSxcbiAgICAgICAgICByZXNvdXJjZTogcmVzb3VyY2UubmFtZSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUmVwb3J0KGVycm9ycywgeyBtYXhFcnJvcnMgfSlcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};