@fairspec/agent 0.9.0

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 (90) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/build/actions/tableSchema/asHtml.d.ts +4 -0
  4. package/build/actions/tableSchema/asHtml.js +82 -0
  5. package/build/actions/tableSchema/asHtml.spec.d.ts +1 -0
  6. package/build/actions/tableSchema/asHtml.spec.js +356 -0
  7. package/build/actions/tableSchema/asMarkdown.d.ts +4 -0
  8. package/build/actions/tableSchema/asMarkdown.js +65 -0
  9. package/build/actions/tableSchema/asMarkdown.spec.d.ts +1 -0
  10. package/build/actions/tableSchema/asMarkdown.spec.js +133 -0
  11. package/build/document/Document.d.ts +2 -0
  12. package/build/document/Document.js +2 -0
  13. package/build/document/index.d.ts +3 -0
  14. package/build/document/index.js +3 -0
  15. package/build/document/types/Base.d.ts +3 -0
  16. package/build/document/types/Base.js +2 -0
  17. package/build/document/types/Json.d.ts +5 -0
  18. package/build/document/types/Json.js +2 -0
  19. package/build/document/validate.d.ts +5 -0
  20. package/build/document/validate.js +23 -0
  21. package/build/document/validate.spec.d.ts +1 -0
  22. package/build/document/validate.spec.js +71 -0
  23. package/build/index.d.ts +1 -0
  24. package/build/index.js +2 -0
  25. package/build/package.json +39 -0
  26. package/build/plugin.d.ts +6 -0
  27. package/build/plugin.js +15 -0
  28. package/build/schema/convert/toHtml.d.ts +4 -0
  29. package/build/schema/convert/toHtml.js +107 -0
  30. package/build/schema/convert/toHtml.spec.d.ts +1 -0
  31. package/build/schema/convert/toHtml.spec.js +432 -0
  32. package/build/schema/convert/toMarkdown.d.ts +4 -0
  33. package/build/schema/convert/toMarkdown.js +75 -0
  34. package/build/schema/convert/toMarkdown.spec.d.ts +1 -0
  35. package/build/schema/convert/toMarkdown.spec.js +137 -0
  36. package/build/schema/index.d.ts +2 -0
  37. package/build/schema/index.js +3 -0
  38. package/build/server.d.ts +2 -0
  39. package/build/server.js +29 -0
  40. package/build/tableSchema/convert/toHtml.d.ts +4 -0
  41. package/build/tableSchema/convert/toHtml.js +80 -0
  42. package/build/tableSchema/convert/toHtml.spec.d.ts +1 -0
  43. package/build/tableSchema/convert/toHtml.spec.js +375 -0
  44. package/build/tableSchema/convert/toMarkdown.d.ts +4 -0
  45. package/build/tableSchema/convert/toMarkdown.js +57 -0
  46. package/build/tableSchema/convert/toMarkdown.spec.d.ts +1 -0
  47. package/build/tableSchema/convert/toMarkdown.spec.js +141 -0
  48. package/build/tableSchema/index.d.ts +2 -0
  49. package/build/tableSchema/index.js +3 -0
  50. package/build/tools/data/validate.d.ts +971 -0
  51. package/build/tools/data/validate.js +15 -0
  52. package/build/tools/data/validate.spec.d.ts +1 -0
  53. package/build/tools/data/validate.spec.js +228 -0
  54. package/build/tools/dataSchema/infer.d.ts +797 -0
  55. package/build/tools/dataSchema/infer.js +15 -0
  56. package/build/tools/dataSchema/infer.spec.d.ts +1 -0
  57. package/build/tools/dataSchema/infer.spec.js +215 -0
  58. package/build/tools/dataSchema/validate.d.ts +177 -0
  59. package/build/tools/dataSchema/validate.js +17 -0
  60. package/build/tools/dataSchema/validate.spec.d.ts +1 -0
  61. package/build/tools/dataSchema/validate.spec.js +148 -0
  62. package/build/tools/dataset/infer.d.ts +1985 -0
  63. package/build/tools/dataset/infer.js +15 -0
  64. package/build/tools/dataset/infer.spec.d.ts +1 -0
  65. package/build/tools/dataset/infer.spec.js +181 -0
  66. package/build/tools/dataset/validate.d.ts +1168 -0
  67. package/build/tools/dataset/validate.js +17 -0
  68. package/build/tools/dataset/validate.spec.d.ts +1 -0
  69. package/build/tools/dataset/validate.spec.js +212 -0
  70. package/build/tools/dialect/infer.d.ts +889 -0
  71. package/build/tools/dialect/infer.js +16 -0
  72. package/build/tools/dialect/infer.spec.d.ts +1 -0
  73. package/build/tools/dialect/infer.spec.js +138 -0
  74. package/build/tools/table/query.d.ts +798 -0
  75. package/build/tools/table/query.js +24 -0
  76. package/build/tools/table/query.spec.d.ts +1 -0
  77. package/build/tools/table/query.spec.js +138 -0
  78. package/build/tools/table/validate.d.ts +999 -0
  79. package/build/tools/table/validate.js +16 -0
  80. package/build/tools/table/validate.spec.d.ts +1 -0
  81. package/build/tools/table/validate.spec.js +106 -0
  82. package/build/tools/tableSchema/infer.d.ts +1316 -0
  83. package/build/tools/tableSchema/infer.js +16 -0
  84. package/build/tools/tableSchema/infer.spec.d.ts +1 -0
  85. package/build/tools/tableSchema/infer.spec.js +152 -0
  86. package/build/tools/tableSchema/validate.d.ts +177 -0
  87. package/build/tools/tableSchema/validate.js +17 -0
  88. package/build/tools/tableSchema/validate.spec.d.ts +1 -0
  89. package/build/tools/tableSchema/validate.spec.js +121 -0
  90. package/package.json +39 -0
@@ -0,0 +1,133 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { renderTableSchemaAsMarkdown } from "./asMarkdown.js";
3
+ describe("renderTableSchemaAsMarkdown", () => {
4
+ it("converts a simple schema to markdown table", () => {
5
+ const schema = {
6
+ properties: {
7
+ id: {
8
+ type: "integer",
9
+ title: "Identifier",
10
+ description: "Unique identifier",
11
+ },
12
+ name: {
13
+ type: "string",
14
+ title: "Name",
15
+ description: "Person name",
16
+ },
17
+ },
18
+ };
19
+ const result = renderTableSchemaAsMarkdown(schema);
20
+ expect(result).toContain("| Name | Type | Title | Description | Constraints |");
21
+ expect(result).toContain("| id | integer | Identifier | Unique identifier |");
22
+ expect(result).toContain("| name | string | Name | Person name |");
23
+ });
24
+ it("handles column constraints", () => {
25
+ const schema = {
26
+ properties: {
27
+ age: {
28
+ type: "integer",
29
+ minimum: 0,
30
+ maximum: 120,
31
+ },
32
+ email: {
33
+ type: "string",
34
+ pattern: "^[a-z]+@[a-z]+\\.[a-z]+$",
35
+ },
36
+ },
37
+ required: ["age", "email"],
38
+ };
39
+ const result = renderTableSchemaAsMarkdown(schema);
40
+ expect(result).toContain("required");
41
+ expect(result).toContain("min: 0");
42
+ expect(result).toContain("max: 120");
43
+ expect(result).toContain("pattern:");
44
+ });
45
+ it("handles empty properties object", () => {
46
+ const schema = {
47
+ properties: {},
48
+ };
49
+ const result = renderTableSchemaAsMarkdown(schema);
50
+ expect(result).toContain("| Name | Type | Title | Description | Constraints |");
51
+ });
52
+ it("handles pipe characters in column values", () => {
53
+ const schema = {
54
+ properties: {
55
+ field: {
56
+ type: "string",
57
+ description: "Description with pipe character",
58
+ },
59
+ },
60
+ };
61
+ const result = renderTableSchemaAsMarkdown(schema);
62
+ expect(result).toContain("Description with pipe character");
63
+ });
64
+ it("handles columns with enum constraints", () => {
65
+ const schema = {
66
+ properties: {
67
+ status: {
68
+ type: "string",
69
+ enum: ["active", "inactive", "pending"],
70
+ },
71
+ },
72
+ };
73
+ const result = renderTableSchemaAsMarkdown(schema);
74
+ expect(result).toContain("enum: active, inactive, pending");
75
+ });
76
+ it("uses frontmatter when frontmatter option is true", () => {
77
+ const schema = {
78
+ title: "Table Schema",
79
+ properties: {
80
+ field1: {
81
+ type: "string",
82
+ },
83
+ },
84
+ };
85
+ const result = renderTableSchemaAsMarkdown(schema, { frontmatter: true });
86
+ expect(result).toContain("---");
87
+ expect(result).toContain("title: Table Schema");
88
+ });
89
+ it("does not use frontmatter when option is false or not provided", () => {
90
+ const schema = {
91
+ properties: {
92
+ field1: {
93
+ type: "string",
94
+ },
95
+ },
96
+ };
97
+ const result = renderTableSchemaAsMarkdown(schema, { frontmatter: false });
98
+ expect(result).not.toContain("title: Table Schema");
99
+ expect(result.startsWith("\n## Columns")).toBe(true);
100
+ });
101
+ it("handles multiple constraint types", () => {
102
+ const schema = {
103
+ properties: {
104
+ username: {
105
+ type: "string",
106
+ minLength: 3,
107
+ maxLength: 20,
108
+ pattern: "^[a-zA-Z0-9_]+$",
109
+ },
110
+ },
111
+ required: ["username"],
112
+ };
113
+ const result = renderTableSchemaAsMarkdown(schema);
114
+ expect(result).toContain("required");
115
+ expect(result).toContain("minLength: 3");
116
+ expect(result).toContain("maxLength: 20");
117
+ expect(result).toContain("pattern:");
118
+ });
119
+ it("handles columns with newlines in descriptions", () => {
120
+ const schema = {
121
+ properties: {
122
+ field: {
123
+ type: "string",
124
+ description: "Description with\nnewline",
125
+ },
126
+ },
127
+ };
128
+ const result = renderTableSchemaAsMarkdown(schema);
129
+ expect(result).toContain("Description with newline");
130
+ expect(result).not.toContain("Description with\nnewline");
131
+ });
132
+ });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNNYXJrZG93bi5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWN0aW9ucy90YWJsZVNjaGVtYS9hc01hcmtkb3duLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRTdELFFBQVEsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7SUFDM0MsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLE1BQU0sR0FBZ0I7WUFDMUIsVUFBVSxFQUFFO2dCQUNWLEVBQUUsRUFBRTtvQkFDRixJQUFJLEVBQUUsU0FBUztvQkFDZixLQUFLLEVBQUUsWUFBWTtvQkFDbkIsV0FBVyxFQUFFLG1CQUFtQjtpQkFDakM7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxNQUFNO29CQUNiLFdBQVcsRUFBRSxhQUFhO2lCQUMzQjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWxELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQ3RCLHFEQUFxRCxDQUN0RCxDQUFBO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FDdEIsbURBQW1ELENBQ3BELENBQUE7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7SUFDcEUsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFnQjtZQUMxQixVQUFVLEVBQUU7Z0JBQ1YsR0FBRyxFQUFFO29CQUNILElBQUksRUFB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LENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVsRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtJQUMzRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUYWJsZVNjaGVtYSB9IGZyb20gXCJAZmFpcnNwZWMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IHJlbmRlclRhYmxlU2NoZW1hQXNNYXJrZG93biB9IGZyb20gXCIuL2FzTWFya2Rvd24udHNcIlxuXG5kZXNjcmliZShcInJlbmRlclRhYmxlU2NoZW1hQXNNYXJrZG93blwiLCAoKSA9PiB7XG4gIGl0KFwiY29udmVydHMgYSBzaW1wbGUgc2NoZW1hIHRvIG1hcmtkb3duIHRhYmxlXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpZDoge1xuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgIHRpdGxlOiBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJVbmlxdWUgaWRlbnRpZmllclwiLFxuICAgICAgICB9LFxuICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICB0aXRsZTogXCJOYW1lXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiUGVyc29uIG5hbWVcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc01hcmtkb3duKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcbiAgICAgIFwifCBOYW1lIHwgVHlwZSB8IFRpdGxlIHwgRGVzY3JpcHRpb24gfCBDb25zdHJhaW50cyB8XCIsXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcbiAgICAgIFwifCBpZCB8IGludGVnZXIgfCBJZGVudGlmaWVyIHwgVW5pcXVlIGlkZW50aWZpZXIgfFwiLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJ8IG5hbWUgfCBzdHJpbmcgfCBOYW1lIHwgUGVyc29uIG5hbWUgfFwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBjb2x1bW4gY29uc3RyYWludHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGFnZToge1xuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgIG1pbmltdW06IDAsXG4gICAgICAgICAgbWF4aW11bTogMTIwLFxuICAgICAgICB9LFxuICAgICAgICBlbWFpbDoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgcGF0dGVybjogXCJeW2Etel0rQFthLXpdK1xcXFwuW2Etel0rJFwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiBbXCJhZ2VcIiwgXCJlbWFpbFwiXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzTWFya2Rvd24oc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwicmVxdWlyZWRcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtaW46IDBcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJtYXg6IDEyMFwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcInBhdHRlcm46XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGVtcHR5IHByb3BlcnRpZXMgb2JqZWN0XCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgcHJvcGVydGllczoge30sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc01hcmtkb3duKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcbiAgICAgIFwifCBOYW1lIHwgVHlwZSB8IFRpdGxlIHwgRGVzY3JpcHRpb24gfCBDb25zdHJhaW50cyB8XCIsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBwaXBlIGNoYXJhY3RlcnMgaW4gY29sdW1uIHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgZmllbGQ6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkRlc2NyaXB0aW9uIHdpdGggcGlwZSBjaGFyYWN0ZXJcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc01hcmtkb3duKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIkRlc2NyaXB0aW9uIHdpdGggcGlwZSBjaGFyYWN0ZXJcIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgY29sdW1ucyB3aXRoIGVudW0gY29uc3RyYWludHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHN0YXR1czoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZW51bTogW1wiYWN0aXZlXCIsIFwiaW5hY3RpdmVcIiwgXCJwZW5kaW5nXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByZW5kZXJUYWJsZVNjaGVtYUFzTWFya2Rvd24oc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiZW51bTogYWN0aXZlLCBpbmFjdGl2ZSwgcGVuZGluZ1wiKVxuICB9KVxuXG4gIGl0KFwidXNlcyBmcm9udG1hdHRlciB3aGVuIGZyb250bWF0dGVyIG9wdGlvbiBpcyB0cnVlXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgdGl0bGU6IFwiVGFibGUgU2NoZW1hXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGZpZWxkMToge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJlbmRlclRhYmxlU2NoZW1hQXNNYXJrZG93bihzY2hlbWEsIHsgZnJvbnRtYXR0ZXI6IHRydWUgfSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIi0tLVwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcInRpdGxlOiBUYWJsZSBTY2hlbWFcIilcbiAgfSlcblxuICBpdChcImRvZXMgbm90IHVzZSBmcm9udG1hdHRlciB3aGVuIG9wdGlvbiBpcyBmYWxzZSBvciBub3QgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGZpZWxkMToge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJlbmRlclRhYmxlU2NoZW1hQXNNYXJrZG93bihzY2hlbWEsIHsgZnJvbnRtYXR0ZXI6IGZhbHNlIH0pXG5cbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwidGl0bGU6IFRhYmxlIFNjaGVtYVwiKVxuICAgIGV4cGVjdChyZXN1bHQuc3RhcnRzV2l0aChcIlxcbiMjIENvbHVtbnNcIikpLnRvQmUodHJ1ZSlcbiAgfSlcblxuICBpdChcImhhbmRsZXMgbXVsdGlwbGUgY29uc3RyYWludCB0eXBlc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIG1pbkxlbmd0aDogMyxcbiAgICAgICAgICBtYXhMZW5ndGg6IDIwLFxuICAgICAgICAgIHBhdHRlcm46IFwiXlthLXpBLVowLTlfXSskXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IFtcInVzZXJuYW1lXCJdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJlbmRlclRhYmxlU2NoZW1hQXNNYXJrZG93bihzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJyZXF1aXJlZFwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIm1pbkxlbmd0aDogM1wiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIm1heExlbmd0aDogMjBcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJwYXR0ZXJuOlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBjb2x1bW5zIHdpdGggbmV3bGluZXMgaW4gZGVzY3JpcHRpb25zXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBmaWVsZDoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiRGVzY3JpcHRpb24gd2l0aFxcbm5ld2xpbmVcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyVGFibGVTY2hlbWFBc01hcmtkb3duKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIkRlc2NyaXB0aW9uIHdpdGggbmV3bGluZVwiKVxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0NvbnRhaW4oXCJEZXNjcmlwdGlvbiB3aXRoXFxubmV3bGluZVwiKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import type { JsonDocument } from "./types/Json.ts";
2
+ export type Document = JsonDocument;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kb2N1bWVudC9Eb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBKc29uRG9jdW1lbnQgfSBmcm9tIFwiLi90eXBlcy9Kc29uLnRzXCJcblxuZXhwb3J0IHR5cGUgRG9jdW1lbnQgPSBKc29uRG9jdW1lbnRcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export type { Document } from "./Document.ts";
2
+ export * from "./types/Json.ts";
3
+ export { validateDocument } from "./validate.ts";
@@ -0,0 +1,3 @@
1
+ export * from "./types/Json.js";
2
+ export { validateDocument } from "./validate.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kb2N1bWVudC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxjQUFjLGlCQUFpQixDQUFBO0FBQy9CLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgRG9jdW1lbnQgfSBmcm9tIFwiLi9Eb2N1bWVudC50c1wiXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9Kc29uLnRzXCJcbmV4cG9ydCB7IHZhbGlkYXRlRG9jdW1lbnQgfSBmcm9tIFwiLi92YWxpZGF0ZS50c1wiXG4iXX0=
@@ -0,0 +1,3 @@
1
+ export interface BaseDocument {
2
+ type: string;
3
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RvY3VtZW50L3R5cGVzL0Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQmFzZURvY3VtZW50IHtcbiAgdHlwZTogc3RyaW5nXG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import type { BaseDocument } from "./Base.ts";
2
+ export interface JsonDocument extends BaseDocument {
3
+ type: "json";
4
+ data: Record<string, any>;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSnNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RvY3VtZW50L3R5cGVzL0pzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQmFzZURvY3VtZW50IH0gZnJvbSBcIi4vQmFzZS50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkRvY3VtZW50IGV4dGVuZHMgQmFzZURvY3VtZW50IHtcbiAgdHlwZTogXCJqc29uXCJcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PlxufVxuIl19
@@ -0,0 +1,5 @@
1
+ import type { Resource } from "@fairspec/metadata";
2
+ export declare function validateDocument(resource: Partial<Resource>): Promise<{
3
+ errors: import("@fairspec/metadata").FrictionlessError[];
4
+ valid: boolean;
5
+ }>;
@@ -0,0 +1,23 @@
1
+ import { createReport, inspectJsonValue, resolveJsonSchema, } from "@fairspec/metadata";
2
+ export async function validateDocument(resource) {
3
+ if (resource.jsonSchema) {
4
+ const jsonSchema = await resolveJsonSchema(resource.jsonSchema);
5
+ if (!resource.data) {
6
+ return createReport([
7
+ {
8
+ type: "data",
9
+ message: `missing ${resource.name} data`,
10
+ },
11
+ ]);
12
+ }
13
+ if (jsonSchema) {
14
+ const errors = await inspectJsonValue(resource.data, { jsonSchema });
15
+ return createReport(errors.map(error => ({
16
+ type: "document/json",
17
+ ...error,
18
+ })));
19
+ }
20
+ }
21
+ return createReport();
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kb2N1bWVudC92YWxpZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsR0FDbEIsTUFBTSxvQkFBb0IsQ0FBQTtBQUUzQixNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUFDLFFBQTJCO0lBQ2hFLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sVUFBVSxHQUFHLE1BQU0saUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRS9ELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsT0FBTyxZQUFZLENBQVk7Z0JBQzdCO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLE9BQU8sRUFBRSxXQUFXLFFBQVEsQ0FBQyxJQUFJLE9BQU87aUJBQ3pDO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixNQUFNLE1BQU0sR0FBRyxNQUFNLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1lBRXBFLE9BQU8sWUFBWSxDQUNqQixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLEdBQUcsS0FBSzthQUNULENBQUMsQ0FBQyxDQUNKLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sWUFBWSxFQUFFLENBQUE7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGF0YUVycm9yLCBKc29uRG9jdW1lbnRFcnJvciwgUmVzb3VyY2UgfSBmcm9tIFwiQGZhaXJzcGVjL21ldGFkYXRhXCJcbmltcG9ydCB7XG4gIGNyZWF0ZVJlcG9ydCxcbiAgaW5zcGVjdEpzb25WYWx1ZSxcbiAgcmVzb2x2ZUpzb25TY2hlbWEsXG59IGZyb20gXCJAZmFpcnNwZWMvbWV0YWRhdGFcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVEb2N1bWVudChyZXNvdXJjZTogUGFydGlhbDxSZXNvdXJjZT4pIHtcbiAgaWYgKHJlc291cmNlLmpzb25TY2hlbWEpIHtcbiAgICBjb25zdCBqc29uU2NoZW1hID0gYXdhaXQgcmVzb2x2ZUpzb25TY2hlbWEocmVzb3VyY2UuanNvblNjaGVtYSlcblxuICAgIGlmICghcmVzb3VyY2UuZGF0YSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlcG9ydDxEYXRhRXJyb3I+KFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiZGF0YVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBtaXNzaW5nICR7cmVzb3VyY2UubmFtZX0gZGF0YWAsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgIH1cblxuICAgIGlmIChqc29uU2NoZW1hKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBpbnNwZWN0SnNvblZhbHVlKHJlc291cmNlLmRhdGEsIHsganNvblNjaGVtYSB9KVxuXG4gICAgICByZXR1cm4gY3JlYXRlUmVwb3J0PEpzb25Eb2N1bWVudEVycm9yPihcbiAgICAgICAgZXJyb3JzLm1hcChlcnJvciA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwiZG9jdW1lbnQvanNvblwiLFxuICAgICAgICAgIC4uLmVycm9yLFxuICAgICAgICB9KSksXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJlcG9ydCgpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { validateDocument } from "./validate.js";
3
+ describe("validateDocument", () => {
4
+ it("should return valid report when data matches jsonSchema", async () => {
5
+ const resource = {
6
+ name: "test-document",
7
+ data: {
8
+ name: "test-package",
9
+ version: "1.0.0",
10
+ },
11
+ jsonSchema: {
12
+ type: "object",
13
+ required: ["name", "version"],
14
+ properties: {
15
+ name: { type: "string" },
16
+ version: { type: "string" },
17
+ },
18
+ },
19
+ };
20
+ const report = await validateDocument(resource);
21
+ expect(report.valid).toBe(true);
22
+ expect(report.errors).toEqual([]);
23
+ });
24
+ it("should return error when data is missing with jsonSchema", async () => {
25
+ const resource = {
26
+ name: "test-document",
27
+ jsonSchema: {
28
+ type: "object",
29
+ required: ["name"],
30
+ properties: {
31
+ name: { type: "string" },
32
+ },
33
+ },
34
+ };
35
+ const report = await validateDocument(resource);
36
+ expect(report.valid).toBe(false);
37
+ expect(report.errors).toEqual([
38
+ {
39
+ type: "data",
40
+ message: "missing test-document data",
41
+ },
42
+ ]);
43
+ });
44
+ it("should return validation errors when data does not match jsonSchema", async () => {
45
+ const resource = {
46
+ name: "test-document",
47
+ data: {
48
+ name: "test-package",
49
+ version: 123,
50
+ },
51
+ jsonSchema: {
52
+ type: "object",
53
+ required: ["name", "version"],
54
+ properties: {
55
+ name: { type: "string" },
56
+ version: { type: "string" },
57
+ },
58
+ },
59
+ };
60
+ const report = await validateDocument(resource);
61
+ expect(report.valid).toBe(false);
62
+ expect(report.errors).toEqual([
63
+ {
64
+ type: "document/json",
65
+ pointer: "/version",
66
+ message: "must be string",
67
+ },
68
+ ]);
69
+ });
70
+ });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2RvY3VtZW50L3ZhbGlkYXRlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVoRCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RSxNQUFNLFFBQVEsR0FBRztZQUNmLElBQUksRUFBRSxlQUFlO1lBQ3JCLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsY0FBYztnQkFDcEIsT0FBTyxFQUFFLE9BQU87YUFDakI7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztnQkFDN0IsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7b0JBQ3hCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7aUJBQzVCO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUvQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RSxNQUFNLFFBQVEsR0FBRztZQUNmLElBQUksRUFBRSxlQUFlO1lBQ3JCLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2lCQUN6QjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDNUI7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFLDRCQUE0QjthQUN0QztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25GLE1BQU0sUUFBUSxHQUFHO1lBQ2YsSUFBSSxFQUFFLGVBQWU7WUFDckIsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxjQUFjO2dCQUNwQixPQUFPLEVBQUUsR0FBRzthQUNiO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7Z0JBQzdCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO29CQUN4QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2lCQUM1QjthQUNGO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDNUI7Z0JBQ0UsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixPQUFPLEVBQUUsZ0JBQWdCO2FBQzFCO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyB2YWxpZGF0ZURvY3VtZW50IH0gZnJvbSBcIi4vdmFsaWRhdGUudHNcIlxuXG5kZXNjcmliZShcInZhbGlkYXRlRG9jdW1lbnRcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCByZXR1cm4gdmFsaWQgcmVwb3J0IHdoZW4gZGF0YSBtYXRjaGVzIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LWRvY3VtZW50XCIsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICAgIH0sXG4gICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmVyc2lvblwiXSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHZlcnNpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZURvY3VtZW50KHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzKS50b0VxdWFsKFtdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiBlcnJvciB3aGVuIGRhdGEgaXMgbWlzc2luZyB3aXRoIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LWRvY3VtZW50XCIsXG4gICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCJdLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgbmFtZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydCA9IGF3YWl0IHZhbGlkYXRlRG9jdW1lbnQocmVzb3VyY2UpXG5cbiAgICBleHBlY3QocmVwb3J0LnZhbGlkKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChyZXBvcnQuZXJyb3JzKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJkYXRhXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwibWlzc2luZyB0ZXN0LWRvY3VtZW50IGRhdGFcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCByZXR1cm4gdmFsaWRhdGlvbiBlcnJvcnMgd2hlbiBkYXRhIGRvZXMgbm90IG1hdGNoIGpzb25TY2hlbWFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LWRvY3VtZW50XCIsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1wYWNrYWdlXCIsXG4gICAgICAgIHZlcnNpb246IDEyMyxcbiAgICAgIH0sXG4gICAgICBqc29uU2NoZW1hOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmVyc2lvblwiXSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHZlcnNpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZURvY3VtZW50KHJlc291cmNlKVxuXG4gICAgZXhwZWN0KHJlcG9ydC52YWxpZCkudG9CZShmYWxzZSlcbiAgICBleHBlY3QocmVwb3J0LmVycm9ycykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZG9jdW1lbnQvanNvblwiLFxuICAgICAgICBwb2ludGVyOiBcIi92ZXJzaW9uXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwibXVzdCBiZSBzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgXSlcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1 @@
1
+ export { server } from "./server.ts";
package/build/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { server } from "./server.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgc2VydmVyIH0gZnJvbSBcIi4vc2VydmVyLnRzXCJcbiJdfQ==
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@fairspec/agent",
3
+ "type": "module",
4
+ "version": "0.0.0-dev",
5
+ "exports": "./build/index.js",
6
+ "sideEffects": false,
7
+ "files": [
8
+ "build"
9
+ ],
10
+ "license": "MIT",
11
+ "author": "Evgeny Karev",
12
+ "repository": "https://github.com/fairspec/fairspec-typescript",
13
+ "description": "Fairspec TypeScript is a fast data management framework built on top of the Fairspec standard and Polars DataFrames",
14
+ "keywords": [
15
+ "fairspec",
16
+ "data",
17
+ "polars",
18
+ "dataframe",
19
+ "jsonschema",
20
+ "tableschema",
21
+ "typescript",
22
+ "validation",
23
+ "quality",
24
+ "fair",
25
+ "mcp",
26
+ "llm",
27
+ "ai"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsc",
31
+ "type": "tsc --noEmit"
32
+ },
33
+ "dependencies": {
34
+ "@fairspec/library": "workspace:*",
35
+ "@mastra/core": "^1.2.0",
36
+ "@mastra/mcp": "^1.0.0",
37
+ "zod": "^4.2.1"
38
+ }
39
+ }
@@ -0,0 +1,6 @@
1
+ import type { MetadataPlugin, TableSchema } from "@fairspec/metadata";
2
+ export declare class ExtensionPlugin implements MetadataPlugin {
3
+ renderTableSchemaAs(tableSchema: TableSchema, options: {
4
+ format: string;
5
+ }): string | undefined;
6
+ }
@@ -0,0 +1,15 @@
1
+ import { renderTableSchemaAsHtml } from "./actions/tableSchema/asHtml.js";
2
+ import { renderTableSchemaAsMarkdown } from "./actions/tableSchema/asMarkdown.js";
3
+ export class ExtensionPlugin {
4
+ renderTableSchemaAs(tableSchema, options) {
5
+ switch (options.format) {
6
+ case "markdown":
7
+ return renderTableSchemaAsMarkdown(tableSchema);
8
+ case "html":
9
+ return renderTableSchemaAsHtml(tableSchema);
10
+ default:
11
+ return undefined;
12
+ }
13
+ }
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlDQUFrQyxDQUFBO0FBQzFFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFBO0FBRWpGLE1BQU0sT0FBTyxlQUFlO0lBQzFCLG1CQUFtQixDQUFDLFdBQXdCLEVBQUUsT0FBMkI7UUFDdkUsUUFBUSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDakQsS0FBSyxNQUFNO2dCQUNULE9BQU8sdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDN0M7Z0JBQ0UsT0FBTyxTQUFTLENBQUE7UUFDcEIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTWV0YWRhdGFQbHVnaW4sIFRhYmxlU2NoZW1hIH0gZnJvbSBcIkBmYWlyc3BlYy9tZXRhZGF0YVwiXG5pbXBvcnQgeyByZW5kZXJUYWJsZVNjaGVtYUFzSHRtbCB9IGZyb20gXCIuL2FjdGlvbnMvdGFibGVTY2hlbWEvYXNIdG1sLnRzeFwiXG5pbXBvcnQgeyByZW5kZXJUYWJsZVNjaGVtYUFzTWFya2Rvd24gfSBmcm9tIFwiLi9hY3Rpb25zL3RhYmxlU2NoZW1hL2FzTWFya2Rvd24udHNcIlxuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uUGx1Z2luIGltcGxlbWVudHMgTWV0YWRhdGFQbHVnaW4ge1xuICByZW5kZXJUYWJsZVNjaGVtYUFzKHRhYmxlU2NoZW1hOiBUYWJsZVNjaGVtYSwgb3B0aW9uczogeyBmb3JtYXQ6IHN0cmluZyB9KSB7XG4gICAgc3dpdGNoIChvcHRpb25zLmZvcm1hdCkge1xuICAgICAgY2FzZSBcIm1hcmtkb3duXCI6XG4gICAgICAgIHJldHVybiByZW5kZXJUYWJsZVNjaGVtYUFzTWFya2Rvd24odGFibGVTY2hlbWEpXG4gICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICByZXR1cm4gcmVuZGVyVGFibGVTY2hlbWFBc0h0bWwodGFibGVTY2hlbWEpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import type { Schema } from "@fairspec/metadata";
2
+ export declare function convertSchemaToHtml(schema: Schema, options?: {
3
+ frontmatter?: boolean;
4
+ }): string;
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { prettify } from "htmlfy";
3
+ import { renderToStaticMarkup } from "react-dom/server";
4
+ export function convertSchemaToHtml(schema, options) {
5
+ let html = prettify(renderToStaticMarkup(_jsx(SchemaTable, { schema: schema, withTitle: !options?.frontmatter })));
6
+ if (options?.frontmatter) {
7
+ if (schema.title) {
8
+ html = `---\ntitle: ${schema.title}\n---\n\n${html}`;
9
+ }
10
+ }
11
+ return html;
12
+ }
13
+ function SchemaTable(props) {
14
+ const { schema, withTitle } = props;
15
+ const title = withTitle ? schema.title : undefined;
16
+ return (_jsxs(_Fragment, { children: [_jsx(SchemaHeader, { title: title, description: schema.description }), schema.primaryKey && _jsx(PrimaryKey, { fields: schema.primaryKey }), schema.foreignKeys && schema.foreignKeys.length > 0 && (_jsx(ForeignKeys, { foreignKeys: schema.foreignKeys })), _jsx(FieldsTable, { fields: schema.fields })] }));
17
+ }
18
+ function SchemaHeader(props) {
19
+ const { title, description } = props;
20
+ return (_jsxs(_Fragment, { children: [title && _jsx("h1", { id: sanitizeId(title), children: title }), description && _jsx("p", { children: description })] }));
21
+ }
22
+ function FieldsTable(props) {
23
+ const { fields } = props;
24
+ return (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Fields" }), _jsxs("table", { children: [_jsxs("colgroup", { children: [_jsx("col", { width: "20%" }), _jsx("col", { width: "65%" }), _jsx("col", { width: "15%" })] }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Name" }), _jsx("th", { children: "Definition" }), _jsx("th", { children: "Type" })] }) }), _jsx("tbody", { children: fields.map((field, index) => (_jsx(FieldRow, { field: field }, index))) })] })] }));
25
+ }
26
+ function FieldRow(props) {
27
+ const { field } = props;
28
+ const fieldName = field.name || "";
29
+ const fieldType = field.type || "any";
30
+ const fieldDescription = field.description || "";
31
+ let isRequired = false;
32
+ if ("constraints" in field && field.constraints) {
33
+ const c = field.constraints;
34
+ if (c.required) {
35
+ isRequired = true;
36
+ }
37
+ }
38
+ const constraints = extractConstraints(field);
39
+ return (_jsxs("tr", { children: [_jsx("td", { id: sanitizeId(fieldName), children: _jsx("code", { children: _jsxs("strong", { children: [fieldName, !isRequired && "?"] }) }) }), _jsxs("td", { children: [fieldDescription && _jsx("p", { children: fieldDescription }), constraints.length > 0 && (_jsx(ConstraintsList, { constraints: constraints })), (field.type === "string" || field.type === "integer") &&
40
+ "categories" in field &&
41
+ field.categories !== undefined && (_jsx(CategoriesList, { categories: field.categories })), field.examples !== undefined && (_jsx(ExamplesList, { examples: field.examples }))] }), _jsx("td", { children: _jsx("code", { children: fieldType }) })] }));
42
+ }
43
+ function ConstraintsList(props) {
44
+ const { constraints } = props;
45
+ return (_jsxs(_Fragment, { children: [_jsx("strong", { children: "Constraints" }), _jsx("ul", { children: constraints.map((constraint, index) => (_jsxs("li", { children: [constraint.name, ": ", _jsx("code", { children: constraint.value })] }, index))) })] }));
46
+ }
47
+ function ExamplesList(props) {
48
+ const { examples } = props;
49
+ return (_jsxs(_Fragment, { children: [_jsx("strong", { children: "Examples" }), _jsx("ul", { children: examples.map((example, index) => (_jsx("li", { children: _jsx("code", { children: String(example) }) }, index))) })] }));
50
+ }
51
+ function CategoriesList(props) {
52
+ const { categories } = props;
53
+ return (_jsxs(_Fragment, { children: [_jsx("strong", { children: "Categories" }), _jsx("ul", { children: categories.map((category, index) => {
54
+ const value = typeof category === "object" ? category.value : category;
55
+ const label = typeof category === "object" ? category.label : undefined;
56
+ return (_jsxs("li", { children: [_jsx("code", { children: String(value) }), label && ` - ${label}`] }, index));
57
+ }) })] }));
58
+ }
59
+ function extractConstraints(field) {
60
+ const constraints = [];
61
+ if ("constraints" in field && field.constraints) {
62
+ const c = field.constraints;
63
+ if (c.required) {
64
+ constraints.push({ name: "required", value: "true" });
65
+ }
66
+ if (c.unique) {
67
+ constraints.push({ name: "unique", value: "true" });
68
+ }
69
+ if (c.minimum !== undefined) {
70
+ constraints.push({ name: "minimum", value: String(c.minimum) });
71
+ }
72
+ if (c.maximum !== undefined) {
73
+ constraints.push({ name: "maximum", value: String(c.maximum) });
74
+ }
75
+ if (c.minLength !== undefined) {
76
+ constraints.push({ name: "minLength", value: String(c.minLength) });
77
+ }
78
+ if (c.maxLength !== undefined) {
79
+ constraints.push({ name: "maxLength", value: String(c.maxLength) });
80
+ }
81
+ if (c.pattern) {
82
+ constraints.push({ name: "pattern", value: c.pattern });
83
+ }
84
+ if (c.enum) {
85
+ const enumValues = c.enum.map((v) => String(v)).join(", ");
86
+ constraints.push({ name: "enum", value: enumValues });
87
+ }
88
+ }
89
+ return constraints;
90
+ }
91
+ function PrimaryKey(props) {
92
+ const { fields } = props;
93
+ return (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Primary Key" }), _jsx("p", { children: _jsx("code", { children: fields.join(", ") }) })] }));
94
+ }
95
+ function ForeignKeys(props) {
96
+ const { foreignKeys } = props;
97
+ if (!foreignKeys)
98
+ return null;
99
+ return (_jsxs(_Fragment, { children: [_jsx("h2", { children: "Foreign Keys" }), _jsxs("table", { children: [_jsxs("colgroup", { children: [_jsx("col", { width: "40%" }), _jsx("col", { width: "30%" }), _jsx("col", { width: "30%" })] }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Fields" }), _jsx("th", { children: "Reference Resource" }), _jsx("th", { children: "Reference Fields" })] }) }), _jsx("tbody", { children: foreignKeys.map((fk, index) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx("code", { children: fk.fields.join(", ") }) }), _jsx("td", { children: _jsx("code", { children: fk.reference.resource || "-" }) }), _jsx("td", { children: _jsx("code", { children: fk.reference.fields.join(", ") }) })] }, index))) })] })] }));
100
+ }
101
+ function sanitizeId(text) {
102
+ return text
103
+ .toLowerCase()
104
+ .replace(/[^a-z0-9]+/g, "-")
105
+ .replace(/^-|-$/g, "");
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9IdG1sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc2NoZW1hL2NvbnZlcnQvdG9IdG1sLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV2RCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLE1BQWMsRUFDZCxPQUFtQztJQUVuQyxJQUFJLElBQUksR0FBRyxRQUFRLENBQ2pCLG9CQUFvQixDQUNsQixLQUFDLFdBQVcsSUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLEdBQUksQ0FDbEUsQ0FDRixDQUFBO0lBRUQsSUFBSSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDekIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxHQUFHLGVBQWUsTUFBTSxDQUFDLEtBQUssWUFBWSxJQUFJLEVBQUUsQ0FBQTtRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQThDO0lBQ2pFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBQ25DLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBRWxELE9BQU8sQ0FDTCw4QkFDRSxLQUFDLFlBQVksSUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxHQUFJLEVBQzlELE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBQyxVQUFVLElBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUksRUFDOUQsTUFBTSxDQUFDLFdBQVcsSUFB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ZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmllbGQsIFNjaGVtYSB9IGZyb20gXCJAZmFpcnNwZWMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgcHJldHRpZnkgfSBmcm9tIFwiaHRtbGZ5XCJcbmltcG9ydCB7IHJlbmRlclRvU3RhdGljTWFya3VwIH0gZnJvbSBcInJlYWN0LWRvbS9zZXJ2ZXJcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFNjaGVtYVRvSHRtbChcbiAgc2NoZW1hOiBTY2hlbWEsXG4gIG9wdGlvbnM/OiB7IGZyb250bWF0dGVyPzogYm9vbGVhbiB9LFxuKTogc3RyaW5nIHtcbiAgbGV0IGh0bWwgPSBwcmV0dGlmeShcbiAgICByZW5kZXJUb1N0YXRpY01hcmt1cChcbiAgICAgIDxTY2hlbWFUYWJsZSBzY2hlbWE9e3NjaGVtYX0gd2l0aFRpdGxlPXshb3B0aW9ucz8uZnJvbnRtYXR0ZXJ9IC8+LFxuICAgICksXG4gIClcblxuICBpZiAob3B0aW9ucz8uZnJvbnRtYXR0ZXIpIHtcbiAgICBpZiAoc2NoZW1hLnRpdGxlKSB7XG4gICAgICBodG1sID0gYC0tLVxcbnRpdGxlOiAke3NjaGVtYS50aXRsZX1cXG4tLS1cXG5cXG4ke2h0bWx9YFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBodG1sXG59XG5cbmZ1bmN0aW9uIFNjaGVtYVRhYmxlKHByb3BzOiB7IHNjaGVtYTogU2NoZW1hOyB3aXRoVGl0bGU/OiBib29sZWFuIH0pIHtcbiAgY29uc3QgeyBzY2hlbWEsIHdpdGhUaXRsZSB9ID0gcHJvcHNcbiAgY29uc3QgdGl0bGUgPSB3aXRoVGl0bGUgPyBzY2hlbWEudGl0bGUgOiB1bmRlZmluZWRcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8U2NoZW1hSGVhZGVyIHRpdGxlPXt0aXRsZX0gZGVzY3JpcHRpb249e3NjaGVtYS5kZXNjcmlwdGlvbn0gLz5cbiAgICAgIHtzY2hlbWEucHJpbWFyeUtleSAmJiA8UHJpbWFyeUtleSBmaWVsZHM9e3NjaGVtYS5wcmltYXJ5S2V5fSAvPn1cbiAgICAgIHtzY2hlbWEuZm9yZWlnbktleXMgJiYgc2NoZW1hLmZvcmVpZ25LZXlzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICA8Rm9yZWlnbktleXMgZm9yZWlnbktleXM9e3NjaGVtYS5mb3JlaWduS2V5c30gLz5cbiAgICAgICl9XG4gICAgICA8RmllbGRzVGFibGUgZmllbGRzPXtzY2hlbWEuZmllbGRzfSAvPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNjaGVtYUhlYWRlcihwcm9wczogeyB0aXRsZT86IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfSkge1xuICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiB9ID0gcHJvcHNcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7dGl0bGUgJiYgPGgxIGlkPXtzYW5pdGl6ZUlkKHRpdGxlKX0+e3RpdGxlfTwvaDE+fVxuICAgICAge2Rlc2NyaXB0aW9uICYmIDxwPntkZXNjcmlwdGlvbn08L3A+fVxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZpZWxkc1RhYmxlKHByb3BzOiB7IGZpZWxkczogRmllbGRbXSB9KSB7XG4gIGNvbnN0IHsgZmllbGRzIH0gPSBwcm9wc1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8aDI+RmllbGRzPC9oMj5cbiAgICAgIDx0YWJsZT5cbiAgICAgICAgPGNvbGdyb3VwPlxuICAgICAgICAgIDxjb2wgd2lkdGg9XCIyMCVcIiAvPlxuICAgICAgICAgIDxjb2wgd2lkdGg9XCI2NSVcIiAvPlxuICAgICAgICAgIDxjb2wgd2lkdGg9XCIxNSVcIiAvPlxuICAgICAgICA8L2NvbGdyb3VwPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxuICAgICAgICAgICAgPHRoPkRlZmluaXRpb248L3RoPlxuICAgICAgICAgICAgPHRoPlR5cGU8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICB7ZmllbGRzLm1hcCgoZmllbGQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8RmllbGRSb3cga2V5PXtpbmRleH0gZmllbGQ9e2ZpZWxkfSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8Lz5cbiAgKVxufVxuXG5mdW5jdGlvbiBGaWVsZFJvdyhwcm9wczogeyBmaWVsZDogRmllbGQgfSkge1xuICBjb25zdCB7IGZpZWxkIH0gPSBwcm9wc1xuICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZC5uYW1lIHx8IFwiXCJcbiAgY29uc3QgZmllbGRUeXBlID0gZmllbGQudHlwZSB8fCBcImFueVwiXG4gIGNvbnN0IGZpZWxkRGVzY3JpcHRpb24gPSBmaWVsZC5kZXNjcmlwdGlvbiB8fCBcIlwiXG5cbiAgbGV0IGlzUmVxdWlyZWQgPSBmYWxzZVxuICBpZiAoXCJjb25zdHJhaW50c1wiIGluIGZpZWxkICYmIGZpZWxkLmNvbnN0cmFpbnRzKSB7XG4gICAgY29uc3QgYyA9IGZpZWxkLmNvbnN0cmFpbnRzIGFzIGFueVxuICAgIGlmIChjLnJlcXVpcmVkKSB7XG4gICAgICBpc1JlcXVpcmVkID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbnN0cmFpbnRzID0gZXh0cmFjdENvbnN0cmFpbnRzKGZpZWxkKVxuXG4gIHJldHVybiAoXG4gICAgPHRyPlxuICAgICAgPHRkIGlkPXtzYW5pdGl6ZUlkKGZpZWxkTmFtZSl9PlxuICAgICAgICA8Y29kZT5cbiAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAge2ZpZWxkTmFtZX1cbiAgICAgICAgICAgIHshaXNSZXF1aXJlZCAmJiBcIj9cIn1cbiAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgPC9jb2RlPlxuICAgICAgPC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAge2ZpZWxkRGVzY3JpcHRpb24gJiYgPHA+e2ZpZWxkRGVzY3JpcHRpb259PC9wPn1cbiAgICAgICAge2NvbnN0cmFpbnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxDb25zdHJhaW50c0xpc3QgY29uc3RyYWludHM9e2NvbnN0cmFpbnRzfSAvPlxuICAgICAgICApfVxuICAgICAgICB7KGZpZWxkLnR5cGUgPT09IFwic3RyaW5nXCIgfHwgZmllbGQudHlwZSA9PT0gXCJpbnRlZ2VyXCIpICYmXG4gICAgICAgICAgXCJjYXRlZ29yaWVzXCIgaW4gZmllbGQgJiZcbiAgICAgICAgICBmaWVsZC5jYXRlZ29yaWVzICE9PSB1bmRlZmluZWQgJiYgKFxuICAgICAgICAgICAgPENhdGVnb3JpZXNMaXN0IGNhdGVnb3JpZXM9e2ZpZWxkLmNhdGVnb3JpZXN9IC8+XG4gICAgICAgICAgKX1cbiAgICAgICAge2ZpZWxkLmV4YW1wbGVzICE9PSB1bmRlZmluZWQgJiYgKFxuICAgICAgICAgIDxFeGFtcGxlc0xpc3QgZXhhbXBsZXM9e2ZpZWxkLmV4YW1wbGVzfSAvPlxuICAgICAgICApfVxuICAgICAgPC90ZD5cbiAgICAgIDx0ZD5cbiAgICAgICAgPGNvZGU+e2ZpZWxkVHlwZX08L2NvZGU+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIClcbn1cblxuZnVuY3Rpb24gQ29uc3RyYWludHNMaXN0KHByb3BzOiB7IGNvbnN0cmFpbnRzOiBDb25zdHJhaW50W10gfSkge1xuICBjb25zdCB7IGNvbnN0cmFpbnRzIH0gPSBwcm9wc1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3Ryb25nPkNvbnN0cmFpbnRzPC9zdHJvbmc+XG4gICAgICA8dWw+XG4gICAgICAgIHtjb25zdHJhaW50cy5tYXAoKGNvbnN0cmFpbnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgPGxpIGtleT17aW5kZXh9PlxuICAgICAgICAgICAge2NvbnN0cmFpbnQubmFtZX06IDxjb2RlPntjb25zdHJhaW50LnZhbHVlfTwvY29kZT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApKX1cbiAgICAgIDwvdWw+XG4gICAgPC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRXhhbXBsZXNMaXN0KHByb3BzOiB7IGV4YW1wbGVzOiBhbnlbXSB9KSB7XG4gIGNvbnN0IHsgZXhhbXBsZXMgfSA9IHByb3BzXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxzdHJvbmc+RXhhbXBsZXM8L3N0cm9uZz5cbiAgICAgIDx1bD5cbiAgICAgICAge2V4YW1wbGVzLm1hcCgoZXhhbXBsZSwgaW5kZXgpID0+IChcbiAgICAgICAgICA8bGkga2V5PXtpbmRleH0+XG4gICAgICAgICAgICA8Y29kZT57U3RyaW5nKGV4YW1wbGUpfTwvY29kZT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApKX1cbiAgICAgIDwvdWw+XG4gICAgPC8+XG4gIClcbn1cblxuZnVuY3Rpb24gQ2F0ZWdvcmllc0xpc3QocHJvcHM6IHtcbiAgY2F0ZWdvcmllczpcbiAgICB8IHN0cmluZ1tdXG4gICAgfCBudW1iZXJbXVxuICAgIHwgQXJyYXk8eyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyOyBsYWJlbDogc3RyaW5nIH0+XG59KSB7XG4gIGNvbnN0IHsgY2F0ZWdvcmllcyB9ID0gcHJvcHNcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+XG4gICAgICA8dWw+XG4gICAgICAgIHtjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCIgPyBjYXRlZ29yeS52YWx1ZSA6IGNhdGVnb3J5XG4gICAgICAgICAgY29uc3QgbGFiZWwgPVxuICAgICAgICAgICAgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiID8gY2F0ZWdvcnkubGFiZWwgOiB1bmRlZmluZWRcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGxpIGtleT17aW5kZXh9PlxuICAgICAgICAgICAgICA8Y29kZT57U3RyaW5nKHZhbHVlKX08L2NvZGU+XG4gICAgICAgICAgICAgIHtsYWJlbCAmJiBgIC0gJHtsYWJlbH1gfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICApXG4gICAgICAgIH0pfVxuICAgICAgPC91bD5cbiAgICA8Lz5cbiAgKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0Q29uc3RyYWludHMoZmllbGQ6IEZpZWxkKTogQ29uc3RyYWludFtdIHtcbiAgY29uc3QgY29uc3RyYWludHM6IENvbnN0cmFpbnRbXSA9IFtdXG5cbiAgaWYgKFwiY29uc3RyYWludHNcIiBpbiBmaWVsZCAmJiBmaWVsZC5jb25zdHJhaW50cykge1xuICAgIGNvbnN0IGMgPSBmaWVsZC5jb25zdHJhaW50cyBhcyBhbnlcblxuICAgIGlmIChjLnJlcXVpcmVkKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJyZXF1aXJlZFwiLCB2YWx1ZTogXCJ0cnVlXCIgfSlcbiAgICB9XG4gICAgaWYgKGMudW5pcXVlKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJ1bmlxdWVcIiwgdmFsdWU6IFwidHJ1ZVwiIH0pXG4gICAgfVxuICAgIGlmIChjLm1pbmltdW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3RyYWludHMucHVzaCh7IG5hbWU6IFwibWluaW11bVwiLCB2YWx1ZTogU3RyaW5nKGMubWluaW11bSkgfSlcbiAgICB9XG4gICAgaWYgKGMubWF4aW11bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJtYXhpbXVtXCIsIHZhbHVlOiBTdHJpbmcoYy5tYXhpbXVtKSB9KVxuICAgIH1cbiAgICBpZiAoYy5taW5MZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3RyYWludHMucHVzaCh7IG5hbWU6IFwibWluTGVuZ3RoXCIsIHZhbHVlOiBTdHJpbmcoYy5taW5MZW5ndGgpIH0pXG4gICAgfVxuICAgIGlmIChjLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJtYXhMZW5ndGhcIiwgdmFsdWU6IFN0cmluZyhjLm1heExlbmd0aCkgfSlcbiAgICB9XG4gICAgaWYgKGMucGF0dGVybikge1xuICAgICAgY29uc3RyYWludHMucHVzaCh7IG5hbWU6IFwicGF0dGVyblwiLCB2YWx1ZTogYy5wYXR0ZXJuIH0pXG4gICAgfVxuICAgIGlmIChjLmVudW0pIHtcbiAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBjLmVudW0ubWFwKCh2OiBhbnkpID0+IFN0cmluZyh2KSkuam9pbihcIiwgXCIpXG4gICAgICBjb25zdHJhaW50cy5wdXNoKHsgbmFtZTogXCJlbnVtXCIsIHZhbHVlOiBlbnVtVmFsdWVzIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbnN0cmFpbnRzXG59XG5cbmZ1bmN0aW9uIFByaW1hcnlLZXkocHJvcHM6IHsgZmllbGRzOiBzdHJpbmdbXSB9KSB7XG4gIGNvbnN0IHsgZmllbGRzIH0gPSBwcm9wc1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8aDI+UHJpbWFyeSBLZXk8L2gyPlxuICAgICAgPHA+XG4gICAgICAgIDxjb2RlPntmaWVsZHMuam9pbihcIiwgXCIpfTwvY29kZT5cbiAgICAgIDwvcD5cbiAgICA8Lz5cbiAgKVxufVxuXG5mdW5jdGlvbiBGb3JlaWduS2V5cyhwcm9wczogeyBmb3JlaWduS2V5czogU2NoZW1hW1wiZm9yZWlnbktleXNcIl0gfSkge1xuICBjb25zdCB7IGZvcmVpZ25LZXlzIH0gPSBwcm9wc1xuICBpZiAoIWZvcmVpZ25LZXlzKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxoMj5Gb3JlaWduIEtleXM8L2gyPlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8Y29sZ3JvdXA+XG4gICAgICAgICAgPGNvbCB3aWR0aD1cIjQwJVwiIC8+XG4gICAgICAgICAgPGNvbCB3aWR0aD1cIjMwJVwiIC8+XG4gICAgICAgICAgPGNvbCB3aWR0aD1cIjMwJVwiIC8+XG4gICAgICAgIDwvY29sZ3JvdXA+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGg+RmllbGRzPC90aD5cbiAgICAgICAgICAgIDx0aD5SZWZlcmVuY2UgUmVzb3VyY2U8L3RoPlxuICAgICAgICAgICAgPHRoPlJlZmVyZW5jZSBGaWVsZHM8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICB7Zm9yZWlnbktleXMubWFwKChmaywgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDx0ciBrZXk9e2luZGV4fT5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxjb2RlPntmay5maWVsZHMuam9pbihcIiwgXCIpfTwvY29kZT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxjb2RlPntmay5yZWZlcmVuY2UucmVzb3VyY2UgfHwgXCItXCJ9PC9jb2RlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGNvZGU+e2ZrLnJlZmVyZW5jZS5maWVsZHMuam9pbihcIiwgXCIpfTwvY29kZT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIHNhbml0aXplSWQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiLVwiKVxuICAgIC5yZXBsYWNlKC9eLXwtJC9nLCBcIlwiKVxufVxuXG5pbnRlcmZhY2UgQ29uc3RyYWludCB7XG4gIG5hbWU6IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};