@frictionless-ts/dataset 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 (242) hide show
  1. package/README.md +3 -0
  2. package/build/file/copy.d.ts +4 -0
  3. package/build/file/copy.js +7 -0
  4. package/build/file/copy.spec.d.ts +1 -0
  5. package/build/file/copy.spec.js +104 -0
  6. package/build/file/describe.d.ts +7 -0
  7. package/build/file/describe.js +9 -0
  8. package/build/file/fetch.d.ts +2 -0
  9. package/build/file/fetch.js +21 -0
  10. package/build/file/index.d.ts +9 -0
  11. package/build/file/index.js +10 -0
  12. package/build/file/infer.d.ts +10 -0
  13. package/build/file/infer.js +48 -0
  14. package/build/file/infer.spec.d.ts +1 -0
  15. package/build/file/infer.spec.js +141 -0
  16. package/build/file/load.d.ts +3 -0
  17. package/build/file/load.js +7 -0
  18. package/build/file/path.d.ts +2 -0
  19. package/build/file/path.js +17 -0
  20. package/build/file/save.d.ts +3 -0
  21. package/build/file/save.js +7 -0
  22. package/build/file/temp.d.ts +11 -0
  23. package/build/file/temp.js +23 -0
  24. package/build/file/validate.d.ts +6 -0
  25. package/build/file/validate.js +47 -0
  26. package/build/file/validate.spec.d.ts +1 -0
  27. package/build/file/validate.spec.js +180 -0
  28. package/build/folder/create.d.ts +1 -0
  29. package/build/folder/create.js +5 -0
  30. package/build/folder/index.d.ts +2 -0
  31. package/build/folder/index.js +3 -0
  32. package/build/folder/temp.d.ts +3 -0
  33. package/build/folder/temp.js +16 -0
  34. package/build/index.d.ts +36 -0
  35. package/build/index.js +35 -0
  36. package/build/package/index.d.ts +2 -0
  37. package/build/package/index.js +3 -0
  38. package/build/package/merge.d.ts +23 -0
  39. package/build/package/merge.js +12 -0
  40. package/build/package/path.d.ts +3 -0
  41. package/build/package/path.js +43 -0
  42. package/build/package/path.spec.d.ts +1 -0
  43. package/build/package/path.spec.js +56 -0
  44. package/build/plugin.d.ts +11 -0
  45. package/build/plugin.js +2 -0
  46. package/build/plugins/ckan/ckan/index.d.ts +1 -0
  47. package/build/plugins/ckan/ckan/index.js +2 -0
  48. package/build/plugins/ckan/ckan/request.d.ts +11 -0
  49. package/build/plugins/ckan/ckan/request.js +35 -0
  50. package/build/plugins/ckan/index.d.ts +4 -0
  51. package/build/plugins/ckan/index.js +5 -0
  52. package/build/plugins/ckan/package/Organization.d.ts +21 -0
  53. package/build/plugins/ckan/package/Organization.js +2 -0
  54. package/build/plugins/ckan/package/Package.d.ts +76 -0
  55. package/build/plugins/ckan/package/Package.js +2 -0
  56. package/build/plugins/ckan/package/Tag.d.ts +17 -0
  57. package/build/plugins/ckan/package/Tag.js +2 -0
  58. package/build/plugins/ckan/package/convert/fromCkan.d.ts +3 -0
  59. package/build/plugins/ckan/package/convert/fromCkan.js +63 -0
  60. package/build/plugins/ckan/package/convert/fromCkan.spec.d.ts +1 -0
  61. package/build/plugins/ckan/package/convert/fromCkan.spec.js +80 -0
  62. package/build/plugins/ckan/package/convert/toCkan.d.ts +22 -0
  63. package/build/plugins/ckan/package/convert/toCkan.js +51 -0
  64. package/build/plugins/ckan/package/convert/toCkan.spec.d.ts +1 -0
  65. package/build/plugins/ckan/package/convert/toCkan.spec.js +153 -0
  66. package/build/plugins/ckan/package/fixtures/ckan-package.json +308 -0
  67. package/build/plugins/ckan/package/index.d.ts +7 -0
  68. package/build/plugins/ckan/package/index.js +5 -0
  69. package/build/plugins/ckan/package/load.d.ts +21 -0
  70. package/build/plugins/ckan/package/load.js +74 -0
  71. package/build/plugins/ckan/package/load.spec.d.ts +1 -0
  72. package/build/plugins/ckan/package/load.spec.js +11 -0
  73. package/build/plugins/ckan/package/save.d.ts +10 -0
  74. package/build/plugins/ckan/package/save.js +83 -0
  75. package/build/plugins/ckan/package/save.spec.d.ts +1 -0
  76. package/build/plugins/ckan/package/save.spec.js +319 -0
  77. package/build/plugins/ckan/plugin.d.ts +19 -0
  78. package/build/plugins/ckan/plugin.js +18 -0
  79. package/build/plugins/ckan/plugin.spec.d.ts +1 -0
  80. package/build/plugins/ckan/plugin.spec.js +83 -0
  81. package/build/plugins/ckan/resource/Resource.d.ts +56 -0
  82. package/build/plugins/ckan/resource/Resource.js +2 -0
  83. package/build/plugins/ckan/resource/convert/fromCkan.d.ts +3 -0
  84. package/build/plugins/ckan/resource/convert/fromCkan.js +39 -0
  85. package/build/plugins/ckan/resource/convert/toCkan.d.ts +3 -0
  86. package/build/plugins/ckan/resource/convert/toCkan.js +20 -0
  87. package/build/plugins/ckan/resource/index.d.ts +3 -0
  88. package/build/plugins/ckan/resource/index.js +3 -0
  89. package/build/plugins/ckan/schema/Field.d.ts +34 -0
  90. package/build/plugins/ckan/schema/Field.js +2 -0
  91. package/build/plugins/ckan/schema/Schema.d.ts +10 -0
  92. package/build/plugins/ckan/schema/Schema.js +2 -0
  93. package/build/plugins/ckan/schema/convert/fixtures/ckan-schema.json +115 -0
  94. package/build/plugins/ckan/schema/convert/fromCkan.d.ts +3 -0
  95. package/build/plugins/ckan/schema/convert/fromCkan.js +47 -0
  96. package/build/plugins/ckan/schema/convert/fromCkan.spec.d.ts +1 -0
  97. package/build/plugins/ckan/schema/convert/fromCkan.spec.js +157 -0
  98. package/build/plugins/ckan/schema/convert/toCkan.d.ts +3 -0
  99. package/build/plugins/ckan/schema/convert/toCkan.js +50 -0
  100. package/build/plugins/ckan/schema/convert/toCkan.spec.d.ts +1 -0
  101. package/build/plugins/ckan/schema/convert/toCkan.spec.js +278 -0
  102. package/build/plugins/ckan/schema/index.d.ts +4 -0
  103. package/build/plugins/ckan/schema/index.js +3 -0
  104. package/build/plugins/datahub/index.d.ts +2 -0
  105. package/build/plugins/datahub/index.js +3 -0
  106. package/build/plugins/datahub/package/index.d.ts +1 -0
  107. package/build/plugins/datahub/package/index.js +2 -0
  108. package/build/plugins/datahub/package/load.d.ts +1 -0
  109. package/build/plugins/datahub/package/load.js +9 -0
  110. package/build/plugins/datahub/package/load.spec.d.ts +1 -0
  111. package/build/plugins/datahub/package/load.spec.js +11 -0
  112. package/build/plugins/datahub/plugin.d.ts +4 -0
  113. package/build/plugins/datahub/plugin.js +18 -0
  114. package/build/plugins/datahub/plugin.spec.d.ts +1 -0
  115. package/build/plugins/datahub/plugin.spec.js +78 -0
  116. package/build/plugins/descriptor/index.d.ts +1 -0
  117. package/build/plugins/descriptor/index.js +2 -0
  118. package/build/plugins/descriptor/plugin.d.ts +11 -0
  119. package/build/plugins/descriptor/plugin.js +29 -0
  120. package/build/plugins/descriptor/plugin.spec.d.ts +1 -0
  121. package/build/plugins/descriptor/plugin.spec.js +169 -0
  122. package/build/plugins/folder/index.d.ts +2 -0
  123. package/build/plugins/folder/index.js +3 -0
  124. package/build/plugins/folder/package/index.d.ts +2 -0
  125. package/build/plugins/folder/package/index.js +3 -0
  126. package/build/plugins/folder/package/load.d.ts +1 -0
  127. package/build/plugins/folder/package/load.js +6 -0
  128. package/build/plugins/folder/package/load.spec.d.ts +1 -0
  129. package/build/plugins/folder/package/load.spec.js +175 -0
  130. package/build/plugins/folder/package/save.d.ts +7 -0
  131. package/build/plugins/folder/package/save.js +35 -0
  132. package/build/plugins/folder/package/save.spec.d.ts +1 -0
  133. package/build/plugins/folder/package/save.spec.js +328 -0
  134. package/build/plugins/folder/plugin.d.ts +4 -0
  135. package/build/plugins/folder/plugin.js +19 -0
  136. package/build/plugins/folder/plugin.spec.d.ts +1 -0
  137. package/build/plugins/folder/plugin.spec.js +53 -0
  138. package/build/plugins/github/github/index.d.ts +1 -0
  139. package/build/plugins/github/github/index.js +2 -0
  140. package/build/plugins/github/github/path.d.ts +1 -0
  141. package/build/plugins/github/github/path.js +4 -0
  142. package/build/plugins/github/github/request.d.ts +15 -0
  143. package/build/plugins/github/github/request.js +43 -0
  144. package/build/plugins/github/index.d.ts +3 -0
  145. package/build/plugins/github/index.js +4 -0
  146. package/build/plugins/github/package/License.d.ts +21 -0
  147. package/build/plugins/github/package/License.js +2 -0
  148. package/build/plugins/github/package/Owner.d.ts +25 -0
  149. package/build/plugins/github/package/Owner.js +2 -0
  150. package/build/plugins/github/package/Package.d.ts +87 -0
  151. package/build/plugins/github/package/Package.js +2 -0
  152. package/build/plugins/github/package/convert/fromGithub.d.ts +3 -0
  153. package/build/plugins/github/package/convert/fromGithub.js +50 -0
  154. package/build/plugins/github/package/index.d.ts +6 -0
  155. package/build/plugins/github/package/index.js +4 -0
  156. package/build/plugins/github/package/load.d.ts +23 -0
  157. package/build/plugins/github/package/load.js +48 -0
  158. package/build/plugins/github/package/load.spec.d.ts +1 -0
  159. package/build/plugins/github/package/load.spec.js +15 -0
  160. package/build/plugins/github/package/save.d.ts +14 -0
  161. package/build/plugins/github/package/save.js +69 -0
  162. package/build/plugins/github/package/save.spec.d.ts +1 -0
  163. package/build/plugins/github/package/save.spec.js +566 -0
  164. package/build/plugins/github/plugin.d.ts +19 -0
  165. package/build/plugins/github/plugin.js +18 -0
  166. package/build/plugins/github/plugin.spec.d.ts +1 -0
  167. package/build/plugins/github/plugin.spec.js +73 -0
  168. package/build/plugins/github/resource/Resource.d.ts +29 -0
  169. package/build/plugins/github/resource/Resource.js +2 -0
  170. package/build/plugins/github/resource/convert/fromGithub.d.ts +5 -0
  171. package/build/plugins/github/resource/convert/fromGithub.js +24 -0
  172. package/build/plugins/github/resource/convert/toGithub.d.ts +3 -0
  173. package/build/plugins/github/resource/convert/toGithub.js +10 -0
  174. package/build/plugins/github/resource/index.d.ts +3 -0
  175. package/build/plugins/github/resource/index.js +3 -0
  176. package/build/plugins/zenodo/index.d.ts +3 -0
  177. package/build/plugins/zenodo/index.js +4 -0
  178. package/build/plugins/zenodo/package/Creator.d.ts +20 -0
  179. package/build/plugins/zenodo/package/Creator.js +2 -0
  180. package/build/plugins/zenodo/package/Package.d.ts +94 -0
  181. package/build/plugins/zenodo/package/Package.js +2 -0
  182. package/build/plugins/zenodo/package/convert/fromZenodo.d.ts +3 -0
  183. package/build/plugins/zenodo/package/convert/fromZenodo.js +43 -0
  184. package/build/plugins/zenodo/package/convert/toZenodo.d.ts +3 -0
  185. package/build/plugins/zenodo/package/convert/toZenodo.js +79 -0
  186. package/build/plugins/zenodo/package/index.d.ts +6 -0
  187. package/build/plugins/zenodo/package/index.js +5 -0
  188. package/build/plugins/zenodo/package/load.d.ts +23 -0
  189. package/build/plugins/zenodo/package/load.js +45 -0
  190. package/build/plugins/zenodo/package/load.spec.d.ts +1 -0
  191. package/build/plugins/zenodo/package/load.spec.js +15 -0
  192. package/build/plugins/zenodo/package/save.d.ts +13 -0
  193. package/build/plugins/zenodo/package/save.js +74 -0
  194. package/build/plugins/zenodo/package/save.spec.d.ts +1 -0
  195. package/build/plugins/zenodo/package/save.spec.js +524 -0
  196. package/build/plugins/zenodo/plugin.d.ts +19 -0
  197. package/build/plugins/zenodo/plugin.js +18 -0
  198. package/build/plugins/zenodo/plugin.spec.d.ts +1 -0
  199. package/build/plugins/zenodo/plugin.spec.js +78 -0
  200. package/build/plugins/zenodo/resource/Resource.d.ts +27 -0
  201. package/build/plugins/zenodo/resource/Resource.js +2 -0
  202. package/build/plugins/zenodo/resource/convert/fromZenodo.d.ts +10 -0
  203. package/build/plugins/zenodo/resource/convert/fromZenodo.js +18 -0
  204. package/build/plugins/zenodo/resource/convert/toZenodo.d.ts +3 -0
  205. package/build/plugins/zenodo/resource/convert/toZenodo.js +13 -0
  206. package/build/plugins/zenodo/resource/index.d.ts +3 -0
  207. package/build/plugins/zenodo/resource/index.js +3 -0
  208. package/build/plugins/zenodo/zenodo/index.d.ts +1 -0
  209. package/build/plugins/zenodo/zenodo/index.js +2 -0
  210. package/build/plugins/zenodo/zenodo/request.d.ts +12 -0
  211. package/build/plugins/zenodo/zenodo/request.js +36 -0
  212. package/build/plugins/zip/index.d.ts +2 -0
  213. package/build/plugins/zip/index.js +3 -0
  214. package/build/plugins/zip/package/index.d.ts +2 -0
  215. package/build/plugins/zip/package/index.js +3 -0
  216. package/build/plugins/zip/package/load.d.ts +1 -0
  217. package/build/plugins/zip/package/load.js +30 -0
  218. package/build/plugins/zip/package/load.spec.d.ts +1 -0
  219. package/build/plugins/zip/package/load.spec.js +173 -0
  220. package/build/plugins/zip/package/save.d.ts +5 -0
  221. package/build/plugins/zip/package/save.js +50 -0
  222. package/build/plugins/zip/package/save.spec.d.ts +1 -0
  223. package/build/plugins/zip/package/save.spec.js +287 -0
  224. package/build/plugins/zip/plugin.d.ts +11 -0
  225. package/build/plugins/zip/plugin.js +24 -0
  226. package/build/plugins/zip/plugin.spec.d.ts +1 -0
  227. package/build/plugins/zip/plugin.spec.js +158 -0
  228. package/build/resource/index.d.ts +1 -0
  229. package/build/resource/index.js +2 -0
  230. package/build/resource/save.d.ts +13 -0
  231. package/build/resource/save.js +53 -0
  232. package/build/resource/save.spec.d.ts +1 -0
  233. package/build/resource/save.spec.js +107 -0
  234. package/build/stream/concat.d.ts +3 -0
  235. package/build/stream/concat.js +5 -0
  236. package/build/stream/index.d.ts +3 -0
  237. package/build/stream/index.js +4 -0
  238. package/build/stream/load.d.ts +5 -0
  239. package/build/stream/load.js +46 -0
  240. package/build/stream/save.d.ts +5 -0
  241. package/build/stream/save.js +13 -0
  242. package/package.json +48 -0
@@ -0,0 +1,278 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import ckanSchemaFixture from "./fixtures/ckan-schema.json" with {
3
+ type: "json"
4
+ };
5
+ import { convertSchemaFromCkan } from "./fromCkan.js";
6
+ import { convertSchemaToCkan } from "./toCkan.js";
7
+ describe("convertSchemaToCkan", () => {
8
+ it("converts a Frictionless schema to a CKAN schema", () => {
9
+ const schema = {
10
+ fields: [
11
+ {
12
+ name: "id",
13
+ type: "integer",
14
+ title: "ID",
15
+ description: "Unique identifier",
16
+ },
17
+ {
18
+ name: "name",
19
+ type: "string",
20
+ title: "Name",
21
+ description: "Person's full name",
22
+ },
23
+ {
24
+ name: "age",
25
+ type: "integer",
26
+ },
27
+ {
28
+ name: "score",
29
+ type: "number",
30
+ title: "Score",
31
+ description: "Test score",
32
+ },
33
+ {
34
+ name: "is_active",
35
+ type: "boolean",
36
+ },
37
+ {
38
+ name: "birth_date",
39
+ type: "date",
40
+ title: "Birth Date",
41
+ description: "Date of birth",
42
+ },
43
+ {
44
+ name: "start_time",
45
+ type: "time",
46
+ },
47
+ {
48
+ name: "created_at",
49
+ type: "datetime",
50
+ title: "Created At",
51
+ description: "Timestamp when record was created",
52
+ },
53
+ {
54
+ name: "metadata",
55
+ type: "object",
56
+ },
57
+ {
58
+ name: "tags",
59
+ type: "array",
60
+ title: "Tags",
61
+ description: "List of tags",
62
+ },
63
+ {
64
+ name: "location",
65
+ type: "geopoint",
66
+ },
67
+ {
68
+ name: "boundary",
69
+ type: "geojson",
70
+ },
71
+ ],
72
+ };
73
+ const result = convertSchemaToCkan(schema);
74
+ expect(result.fields).toHaveLength(schema.fields.length);
75
+ const idField = result.fields.find(f => f.id === "id");
76
+ expect(idField).toBeDefined();
77
+ if (idField) {
78
+ expect(idField.type).toEqual("int");
79
+ expect(idField.info).toBeDefined();
80
+ expect(idField.info?.label).toEqual("ID");
81
+ expect(idField.info?.notes).toEqual("Unique identifier");
82
+ expect(idField.info?.type_override).toEqual("int");
83
+ }
84
+ const nameField = result.fields.find(f => f.id === "name");
85
+ expect(nameField).toBeDefined();
86
+ if (nameField) {
87
+ expect(nameField.type).toEqual("text");
88
+ expect(nameField.info).toBeDefined();
89
+ expect(nameField.info?.label).toEqual("Name");
90
+ expect(nameField.info?.notes).toEqual("Person's full name");
91
+ expect(nameField.info?.type_override).toEqual("text");
92
+ }
93
+ const ageField = result.fields.find(f => f.id === "age");
94
+ expect(ageField).toBeDefined();
95
+ if (ageField) {
96
+ expect(ageField.type).toEqual("int");
97
+ expect(ageField.info).toBeUndefined();
98
+ }
99
+ const scoreField = result.fields.find(f => f.id === "score");
100
+ expect(scoreField).toBeDefined();
101
+ if (scoreField) {
102
+ expect(scoreField.type).toEqual("numeric");
103
+ expect(scoreField.info).toBeDefined();
104
+ expect(scoreField.info?.label).toEqual("Score");
105
+ expect(scoreField.info?.notes).toEqual("Test score");
106
+ expect(scoreField.info?.type_override).toEqual("numeric");
107
+ }
108
+ const isActiveField = result.fields.find(f => f.id === "is_active");
109
+ expect(isActiveField).toBeDefined();
110
+ if (isActiveField) {
111
+ expect(isActiveField.type).toEqual("bool");
112
+ expect(isActiveField.info).toBeUndefined();
113
+ }
114
+ const birthDateField = result.fields.find(f => f.id === "birth_date");
115
+ expect(birthDateField).toBeDefined();
116
+ if (birthDateField) {
117
+ expect(birthDateField.type).toEqual("date");
118
+ expect(birthDateField.info).toBeDefined();
119
+ expect(birthDateField.info?.label).toEqual("Birth Date");
120
+ expect(birthDateField.info?.notes).toEqual("Date of birth");
121
+ expect(birthDateField.info?.type_override).toEqual("date");
122
+ }
123
+ const startTimeField = result.fields.find(f => f.id === "start_time");
124
+ expect(startTimeField).toBeDefined();
125
+ if (startTimeField) {
126
+ expect(startTimeField.type).toEqual("time");
127
+ expect(startTimeField.info).toBeUndefined();
128
+ }
129
+ const createdAtField = result.fields.find(f => f.id === "created_at");
130
+ expect(createdAtField).toBeDefined();
131
+ if (createdAtField) {
132
+ expect(createdAtField.type).toEqual("timestamp");
133
+ expect(createdAtField.info).toBeDefined();
134
+ expect(createdAtField.info?.label).toEqual("Created At");
135
+ expect(createdAtField.info?.notes).toEqual("Timestamp when record was created");
136
+ expect(createdAtField.info?.type_override).toEqual("timestamp");
137
+ }
138
+ const metadataField = result.fields.find(f => f.id === "metadata");
139
+ expect(metadataField).toBeDefined();
140
+ if (metadataField) {
141
+ expect(metadataField.type).toEqual("json");
142
+ expect(metadataField.info).toBeUndefined();
143
+ }
144
+ const tagsField = result.fields.find(f => f.id === "tags");
145
+ expect(tagsField).toBeDefined();
146
+ if (tagsField) {
147
+ expect(tagsField.type).toEqual("array");
148
+ expect(tagsField.info).toBeDefined();
149
+ expect(tagsField.info?.label).toEqual("Tags");
150
+ expect(tagsField.info?.notes).toEqual("List of tags");
151
+ expect(tagsField.info?.type_override).toEqual("array");
152
+ }
153
+ const locationField = result.fields.find(f => f.id === "location");
154
+ expect(locationField).toBeDefined();
155
+ if (locationField) {
156
+ expect(locationField.type).toEqual("geopoint");
157
+ }
158
+ const boundaryField = result.fields.find(f => f.id === "boundary");
159
+ expect(boundaryField).toBeDefined();
160
+ if (boundaryField) {
161
+ expect(boundaryField.type).toEqual("geojson");
162
+ }
163
+ });
164
+ it("handles fields with only title", () => {
165
+ const schema = {
166
+ fields: [
167
+ {
168
+ name: "field1",
169
+ type: "string",
170
+ title: "Field 1",
171
+ },
172
+ ],
173
+ };
174
+ const result = convertSchemaToCkan(schema);
175
+ expect(result.fields).toHaveLength(1);
176
+ const field = result.fields[0];
177
+ expect(field).toBeDefined();
178
+ if (field) {
179
+ expect(field.id).toEqual("field1");
180
+ expect(field.type).toEqual("text");
181
+ expect(field.info).toBeDefined();
182
+ expect(field.info?.label).toEqual("Field 1");
183
+ expect(field.info?.notes).toBeUndefined();
184
+ expect(field.info?.type_override).toEqual("text");
185
+ }
186
+ });
187
+ it("handles fields with only description", () => {
188
+ const schema = {
189
+ fields: [
190
+ {
191
+ name: "field1",
192
+ type: "string",
193
+ description: "Field 1 description",
194
+ },
195
+ ],
196
+ };
197
+ const result = convertSchemaToCkan(schema);
198
+ expect(result.fields).toHaveLength(1);
199
+ const field = result.fields[0];
200
+ expect(field).toBeDefined();
201
+ if (field) {
202
+ expect(field.id).toEqual("field1");
203
+ expect(field.type).toEqual("text");
204
+ expect(field.info).toBeDefined();
205
+ expect(field.info?.label).toBeUndefined();
206
+ expect(field.info?.notes).toEqual("Field 1 description");
207
+ expect(field.info?.type_override).toEqual("text");
208
+ }
209
+ });
210
+ it("handles fields without title or description", () => {
211
+ const schema = {
212
+ fields: [
213
+ {
214
+ name: "simple_field",
215
+ type: "string",
216
+ },
217
+ ],
218
+ };
219
+ const result = convertSchemaToCkan(schema);
220
+ expect(result.fields).toHaveLength(1);
221
+ const field = result.fields[0];
222
+ expect(field).toBeDefined();
223
+ if (field) {
224
+ expect(field.id).toEqual("simple_field");
225
+ expect(field.type).toEqual("text");
226
+ expect(field.info).toBeUndefined();
227
+ }
228
+ });
229
+ it("handles empty fields array", () => {
230
+ const schema = {
231
+ fields: [],
232
+ };
233
+ const result = convertSchemaToCkan(schema);
234
+ expect(result.fields).toEqual([]);
235
+ });
236
+ it("converts unknown field types to 'text'", () => {
237
+ const schema = {
238
+ fields: [
239
+ {
240
+ name: "unknown_field",
241
+ type: "unknown",
242
+ },
243
+ ],
244
+ };
245
+ const result = convertSchemaToCkan(schema);
246
+ expect(result.fields).toHaveLength(1);
247
+ const field = result.fields[0];
248
+ expect(field).toBeDefined();
249
+ if (field) {
250
+ expect(field.type).toEqual("text");
251
+ }
252
+ });
253
+ it("performs a round-trip conversion (CKAN → Frictionless → CKAN)", () => {
254
+ const originalCkanSchema = ckanSchemaFixture;
255
+ const frictionlessSchema = convertSchemaFromCkan(originalCkanSchema);
256
+ const resultCkanSchema = convertSchemaToCkan(frictionlessSchema);
257
+ expect(resultCkanSchema.fields).toHaveLength(originalCkanSchema.fields.length);
258
+ originalCkanSchema.fields.forEach(originalField => {
259
+ const resultField = resultCkanSchema.fields.find(f => f.id === originalField.id);
260
+ expect(resultField).toBeDefined();
261
+ if (resultField && originalField) {
262
+ expect(resultField.id).toEqual(originalField.id);
263
+ if (originalField.info) {
264
+ expect(resultField.info).toBeDefined();
265
+ if (resultField.info) {
266
+ if (originalField.info.label) {
267
+ expect(resultField.info.label).toEqual(originalField.info.label);
268
+ }
269
+ if (originalField.info.notes) {
270
+ expect(resultField.info.notes).toEqual(originalField.info.notes);
271
+ }
272
+ }
273
+ }
274
+ }
275
+ });
276
+ });
277
+ });
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9Da2FuLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vc2NoZW1hL2NvbnZlcnQvdG9Da2FuLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBRTdDLE9BQU8saUJBQWlCLE1BQU0sNkJBQTZCLENBQUM7SUFDMUQsSUFBSSxFQUFFLE1BQU07Q0FDYixDQUFBO0FBQ0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUVqRCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO0lBQ25DLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsTUFBTSxNQUFNLEdBQVc7WUFDckIsTUFBTSxFQUFFO2dCQUNOO29CQUNFLElBQUksRUFBRSxJQUFJO29CQUNWLElBQUksRUFBRSxTQUFTO29CQUNmLEtBQUssRUFBRSxJQUFJO29CQUNYLFdBQVcsRUFBRSxtQkFBbUI7aUJBQ2pDO2dCQUNEO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxNQUFNO29CQUNiLFdBQVcsRUFBRSxvQkFBb0I7aUJBQ2xDO2dCQUNEO29CQUNFLElBQUksRUFBRSxLQUFLO29CQUNYLElBQUksRUFBRSxTQUFTO2lCQUNoQjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBTztvQkFDYixJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsT0FBTztvQkFDZCxXQUFXLEVBQUUsWUFBWTtpQkFDMUI7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLElBQUksRUFBRSxTQUFTO2lCQUNoQjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUs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Q0FBQyxJQUFJLENBQzlDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxhQUFhLENBQUMsRUFBRSxDQUMvQixDQUFBO1lBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1lBRWpDLElBQUksV0FBVyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBRWhELElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN2QixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO29CQUN0QyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDckIsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUM3QixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTt3QkFDbEUsQ0FBQzt3QkFDRCxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQzdCLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUNsRSxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNjaGVtYSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgdHlwZSB7IENrYW5TY2hlbWEgfSBmcm9tIFwiLi4vU2NoZW1hLnRzXCJcbmltcG9ydCBja2FuU2NoZW1hRml4dHVyZSBmcm9tIFwiLi9maXh0dXJlcy9ja2FuLXNjaGVtYS5qc29uXCIgd2l0aCB7XG4gIHR5cGU6IFwianNvblwiLFxufVxuaW1wb3J0IHsgY29udmVydFNjaGVtYUZyb21Da2FuIH0gZnJvbSBcIi4vZnJvbUNrYW4udHNcIlxuaW1wb3J0IHsgY29udmVydFNjaGVtYVRvQ2thbiB9IGZyb20gXCIuL3RvQ2thbi50c1wiXG5cbmRlc2NyaWJlKFwiY29udmVydFNjaGVtYVRvQ2thblwiLCAoKSA9PiB7XG4gIGl0KFwiY29udmVydHMgYSBGcmljdGlvbmxlc3Mgc2NoZW1hIHRvIGEgQ0tBTiBzY2hlbWFcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgdGl0bGU6IFwiSURcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJVbmlxdWUgaWRlbnRpZmllclwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICB0aXRsZTogXCJOYW1lXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiUGVyc29uJ3MgZnVsbCBuYW1lXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImFnZVwiLFxuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzY29yZVwiLFxuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgdGl0bGU6IFwiU2NvcmVcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUZXN0IHNjb3JlXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImlzX2FjdGl2ZVwiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJiaXJ0aF9kYXRlXCIsXG4gICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgdGl0bGU6IFwiQmlydGggRGF0ZVwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkRhdGUgb2YgYmlydGhcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwic3RhcnRfdGltZVwiLFxuICAgICAgICAgIHR5cGU6IFwidGltZVwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgdHlwZTogXCJkYXRldGltZVwiLFxuICAgICAgICAgIHRpdGxlOiBcIkNyZWF0ZWQgQXRcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaW1lc3RhbXAgd2hlbiByZWNvcmQgd2FzIGNyZWF0ZWRcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibWV0YWRhdGFcIixcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0YWdzXCIsXG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIHRpdGxlOiBcIlRhZ3NcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMaXN0IG9mIHRhZ3NcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibG9jYXRpb25cIixcbiAgICAgICAgICB0eXBlOiBcImdlb3BvaW50XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImJvdW5kYXJ5XCIsXG4gICAgICAgICAgdHlwZTogXCJnZW9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0NrYW4oc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5maWVsZHMpLnRvSGF2ZUxlbmd0aChzY2hlbWEuZmllbGRzLmxlbmd0aClcblxuICAgIGNvbnN0IGlkRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLmlkID09PSBcImlkXCIpXG4gICAgZXhwZWN0KGlkRmllbGQpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAoaWRGaWVsZCkge1xuICAgICAgZXhwZWN0KGlkRmllbGQudHlwZSkudG9FcXVhbChcImludFwiKVxuICAgICAgZXhwZWN0KGlkRmllbGQuaW5mbykudG9CZURlZmluZWQoKVxuICAgICAgZXhwZWN0KGlkRmllbGQuaW5mbz8ubGFiZWwpLnRvRXF1YWwoXCJJRFwiKVxuICAgICAgZXhwZWN0KGlkRmllbGQuaW5mbz8ubm90ZXMpLnRvRXF1YWwoXCJVbmlxdWUgaWRlbnRpZmllclwiKVxuICAgICAgZXhwZWN0KGlkRmllbGQuaW5mbz8udHlwZV9vdmVycmlkZSkudG9FcXVhbChcImludFwiKVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWVGaWVsZCA9IHJlc3VsdC5maWVsZHMuZmluZChmID0+IGYuaWQgPT09IFwibmFtZVwiKVxuICAgIGV4cGVjdChuYW1lRmllbGQpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAobmFtZUZpZWxkKSB7XG4gICAgICBleHBlY3QobmFtZUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJ0ZXh0XCIpXG4gICAgICBleHBlY3QobmFtZUZpZWxkLmluZm8pLnRvQmVEZWZpbmVkKClcbiAgICAgIGV4cGVjdChuYW1lRmllbGQuaW5mbz8ubGFiZWwpLnRvRXF1YWwoXCJOYW1lXCIpXG4gICAgICBleHBlY3QobmFtZUZpZWxkLmluZm8/Lm5vdGVzKS50b0VxdWFsKFwiUGVyc29uJ3MgZnVsbCBuYW1lXCIpXG4gICAgICBleHBlY3QobmFtZUZpZWxkLmluZm8/LnR5cGVfb3ZlcnJpZGUpLnRvRXF1YWwoXCJ0ZXh0XCIpXG4gICAgfVxuXG4gICAgY29uc3QgYWdlRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLmlkID09PSBcImFnZVwiKVxuICAgIGV4cGVjdChhZ2VGaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChhZ2VGaWVsZCkge1xuICAgICAgZXhwZWN0KGFnZUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJpbnRcIilcbiAgICAgIGV4cGVjdChhZ2VGaWVsZC5pbmZvKS50b0JlVW5kZWZpbmVkKClcbiAgICB9XG5cbiAgICBjb25zdCBzY29yZUZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5pZCA9PT0gXCJzY29yZVwiKVxuICAgIGV4cGVjdChzY29yZUZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKHNjb3JlRmllbGQpIHtcbiAgICAgIGV4cGVjdChzY29yZUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJudW1lcmljXCIpXG4gICAgICBleHBlY3Qoc2NvcmVGaWVsZC5pbmZvKS50b0JlRGVmaW5lZCgpXG4gICAgICBleHBlY3Qoc2NvcmVGaWVsZC5pbmZvPy5sYWJlbCkudG9FcXVhbChcIlNjb3JlXCIpXG4gICAgICBleHBlY3Qoc2NvcmVGaWVsZC5pbmZvPy5ub3RlcykudG9FcXVhbChcIlRlc3Qgc2NvcmVcIilcbiAgICAgIGV4cGVjdChzY29yZUZpZWxkLmluZm8/LnR5cGVfb3ZlcnJpZGUpLnRvRXF1YWwoXCJudW1lcmljXCIpXG4gICAgfVxuXG4gICAgY29uc3QgaXNBY3RpdmVGaWVsZCA9IHJlc3VsdC5maWVsZHMuZmluZChmID0+IGYuaWQgPT09IFwiaXNfYWN0aXZlXCIpXG4gICAgZXhwZWN0KGlzQWN0aXZlRmllbGQpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAoaXNBY3RpdmVGaWVsZCkge1xuICAgICAgZXhwZWN0KGlzQWN0aXZlRmllbGQudHlwZSkudG9FcXVhbChcImJvb2xcIilcbiAgICAgIGV4cGVjdChpc0FjdGl2ZUZpZWxkLmluZm8pLnRvQmVVbmRlZmluZWQoKVxuICAgIH1cblxuICAgIGNvbnN0IGJpcnRoRGF0ZUZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5pZCA9PT0gXCJiaXJ0aF9kYXRlXCIpXG4gICAgZXhwZWN0KGJpcnRoRGF0ZUZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKGJpcnRoRGF0ZUZpZWxkKSB7XG4gICAgICBleHBlY3QoYmlydGhEYXRlRmllbGQudHlwZSkudG9FcXVhbChcImRhdGVcIilcbiAgICAgIGV4cGVjdChiaXJ0aERhdGVGaWVsZC5pbmZvKS50b0JlRGVmaW5lZCgpXG4gICAgICBleHBlY3QoYmlydGhEYXRlRmllbGQuaW5mbz8ubGFiZWwpLnRvRXF1YWwoXCJCaXJ0aCBEYXRlXCIpXG4gICAgICBleHBlY3QoYmlydGhEYXRlRmllbGQuaW5mbz8ubm90ZXMpLnRvRXF1YWwoXCJEYXRlIG9mIGJpcnRoXCIpXG4gICAgICBleHBlY3QoYmlydGhEYXRlRmllbGQuaW5mbz8udHlwZV9vdmVycmlkZSkudG9FcXVhbChcImRhdGVcIilcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWVGaWVsZCA9IHJlc3VsdC5maWVsZHMuZmluZChmID0+IGYuaWQgPT09IFwic3RhcnRfdGltZVwiKVxuICAgIGV4cGVjdChzdGFydFRpbWVGaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChzdGFydFRpbWVGaWVsZCkge1xuICAgICAgZXhwZWN0KHN0YXJ0VGltZUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJ0aW1lXCIpXG4gICAgICBleHBlY3Qoc3RhcnRUaW1lRmllbGQuaW5mbykudG9CZVVuZGVmaW5lZCgpXG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZEF0RmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLmlkID09PSBcImNyZWF0ZWRfYXRcIilcbiAgICBleHBlY3QoY3JlYXRlZEF0RmllbGQpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAoY3JlYXRlZEF0RmllbGQpIHtcbiAgICAgIGV4cGVjdChjcmVhdGVkQXRGaWVsZC50eXBlKS50b0VxdWFsKFwidGltZXN0YW1wXCIpXG4gICAgICBleHBlY3QoY3JlYXRlZEF0RmllbGQuaW5mbykudG9CZURlZmluZWQoKVxuICAgICAgZXhwZWN0KGNyZWF0ZWRBdEZpZWxkLmluZm8/LmxhYmVsKS50b0VxdWFsKFwiQ3JlYXRlZCBBdFwiKVxuICAgICAgZXhwZWN0KGNyZWF0ZWRBdEZpZWxkLmluZm8/Lm5vdGVzKS50b0VxdWFsKFxuICAgICAgICBcIlRpbWVzdGFtcCB3aGVuIHJlY29yZCB3YXMgY3JlYXRlZFwiLFxuICAgICAgKVxuICAgICAgZXhwZWN0KGNyZWF0ZWRBdEZpZWxkLmluZm8/LnR5cGVfb3ZlcnJpZGUpLnRvRXF1YWwoXCJ0aW1lc3RhbXBcIilcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YUZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5pZCA9PT0gXCJtZXRhZGF0YVwiKVxuICAgIGV4cGVjdChtZXRhZGF0YUZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKG1ldGFkYXRhRmllbGQpIHtcbiAgICAgIGV4cGVjdChtZXRhZGF0YUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJqc29uXCIpXG4gICAgICBleHBlY3QobWV0YWRhdGFGaWVsZC5pbmZvKS50b0JlVW5kZWZpbmVkKClcbiAgICB9XG5cbiAgICBjb25zdCB0YWdzRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLmlkID09PSBcInRhZ3NcIilcbiAgICBleHBlY3QodGFnc0ZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKHRhZ3NGaWVsZCkge1xuICAgICAgZXhwZWN0KHRhZ3NGaWVsZC50eXBlKS50b0VxdWFsKFwiYXJyYXlcIilcbiAgICAgIGV4cGVjdCh0YWdzRmllbGQuaW5mbykudG9CZURlZmluZWQoKVxuICAgICAgZXhwZWN0KHRhZ3NGaWVsZC5pbmZvPy5sYWJlbCkudG9FcXVhbChcIlRhZ3NcIilcbiAgICAgIGV4cGVjdCh0YWdzRmllbGQuaW5mbz8ubm90ZXMpLnRvRXF1YWwoXCJMaXN0IG9mIHRhZ3NcIilcbiAgICAgIGV4cGVjdCh0YWdzRmllbGQuaW5mbz8udHlwZV9vdmVycmlkZSkudG9FcXVhbChcImFycmF5XCIpXG4gICAgfVxuXG4gICAgY29uc3QgbG9jYXRpb25GaWVsZCA9IHJlc3VsdC5maWVsZHMuZmluZChmID0+IGYuaWQgPT09IFwibG9jYXRpb25cIilcbiAgICBleHBlY3QobG9jYXRpb25GaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChsb2NhdGlvbkZpZWxkKSB7XG4gICAgICBleHBlY3QobG9jYXRpb25GaWVsZC50eXBlKS50b0VxdWFsKFwiZ2VvcG9pbnRcIilcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyeUZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5pZCA9PT0gXCJib3VuZGFyeVwiKVxuICAgIGV4cGVjdChib3VuZGFyeUZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKGJvdW5kYXJ5RmllbGQpIHtcbiAgICAgIGV4cGVjdChib3VuZGFyeUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJnZW9qc29uXCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBmaWVsZHMgd2l0aCBvbmx5IHRpdGxlXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJmaWVsZDFcIixcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIHRpdGxlOiBcIkZpZWxkIDFcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvQ2thbihzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0LmZpZWxkcykudG9IYXZlTGVuZ3RoKDEpXG4gICAgY29uc3QgZmllbGQgPSByZXN1bHQuZmllbGRzWzBdXG4gICAgZXhwZWN0KGZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKGZpZWxkKSB7XG4gICAgICBleHBlY3QoZmllbGQuaWQpLnRvRXF1YWwoXCJmaWVsZDFcIilcbiAgICAgIGV4cGVjdChmaWVsZC50eXBlKS50b0VxdWFsKFwidGV4dFwiKVxuICAgICAgZXhwZWN0KGZpZWxkLmluZm8pLnRvQmVEZWZpbmVkKClcbiAgICAgIGV4cGVjdChmaWVsZC5pbmZvPy5sYWJlbCkudG9FcXVhbChcIkZpZWxkIDFcIilcbiAgICAgIGV4cGVjdChmaWVsZC5pbmZvPy5ub3RlcykudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QoZmllbGQuaW5mbz8udHlwZV9vdmVycmlkZSkudG9FcXVhbChcInRleHRcIilcbiAgICB9XG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGZpZWxkcyB3aXRoIG9ubHkgZGVzY3JpcHRpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImZpZWxkMVwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiRmllbGQgMSBkZXNjcmlwdGlvblwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0U2NoZW1hVG9Da2FuKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQuZmllbGRzKS50b0hhdmVMZW5ndGgoMSlcbiAgICBjb25zdCBmaWVsZCA9IHJlc3VsdC5maWVsZHNbMF1cbiAgICBleHBlY3QoZmllbGQpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAoZmllbGQpIHtcbiAgICAgIGV4cGVjdChmaWVsZC5pZCkudG9FcXVhbChcImZpZWxkMVwiKVxuICAgICAgZXhwZWN0KGZpZWxkLnR5cGUpLnRvRXF1YWwoXCJ0ZXh0XCIpXG4gICAgICBleHBlY3QoZmllbGQuaW5mbykudG9CZURlZmluZWQoKVxuICAgICAgZXhwZWN0KGZpZWxkLmluZm8/LmxhYmVsKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChmaWVsZC5pbmZvPy5ub3RlcykudG9FcXVhbChcIkZpZWxkIDEgZGVzY3JpcHRpb25cIilcbiAgICAgIGV4cGVjdChmaWVsZC5pbmZvPy50eXBlX292ZXJyaWRlKS50b0VxdWFsKFwidGV4dFwiKVxuICAgIH1cbiAgfSlcblxuICBpdChcImhhbmRsZXMgZmllbGRzIHdpdGhvdXQgdGl0bGUgb3IgZGVzY3JpcHRpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInNpbXBsZV9maWVsZFwiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0NrYW4oc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5maWVsZHMpLnRvSGF2ZUxlbmd0aCgxKVxuICAgIGNvbnN0IGZpZWxkID0gcmVzdWx0LmZpZWxkc1swXVxuICAgIGV4cGVjdChmaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChmaWVsZCkge1xuICAgICAgZXhwZWN0KGZpZWxkLmlkKS50b0VxdWFsKFwic2ltcGxlX2ZpZWxkXCIpXG4gICAgICBleHBlY3QoZmllbGQudHlwZSkudG9FcXVhbChcInRleHRcIilcbiAgICAgIGV4cGVjdChmaWVsZC5pbmZvKS50b0JlVW5kZWZpbmVkKClcbiAgICB9XG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGVtcHR5IGZpZWxkcyBhcnJheVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFUb0NrYW4oc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5maWVsZHMpLnRvRXF1YWwoW10pXG4gIH0pXG5cbiAgaXQoXCJjb252ZXJ0cyB1bmtub3duIGZpZWxkIHR5cGVzIHRvICd0ZXh0J1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBTY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidW5rbm93bl9maWVsZFwiLFxuICAgICAgICAgIHR5cGU6IFwidW5rbm93blwiIGFzIGFueSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYVRvQ2thbihzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0LmZpZWxkcykudG9IYXZlTGVuZ3RoKDEpXG4gICAgY29uc3QgZmllbGQgPSByZXN1bHQuZmllbGRzWzBdXG4gICAgZXhwZWN0KGZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKGZpZWxkKSB7XG4gICAgICBleHBlY3QoZmllbGQudHlwZSkudG9FcXVhbChcInRleHRcIilcbiAgICB9XG4gIH0pXG5cbiAgaXQoXCJwZXJmb3JtcyBhIHJvdW5kLXRyaXAgY29udmVyc2lvbiAoQ0tBTiDihpIgRnJpY3Rpb25sZXNzIOKGkiBDS0FOKVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxDa2FuU2NoZW1hID0gY2thblNjaGVtYUZpeHR1cmUgYXMgQ2thblNjaGVtYVxuXG4gICAgY29uc3QgZnJpY3Rpb25sZXNzU2NoZW1hID0gY29udmVydFNjaGVtYUZyb21Da2FuKG9yaWdpbmFsQ2thblNjaGVtYSlcblxuICAgIGNvbnN0IHJlc3VsdENrYW5TY2hlbWEgPSBjb252ZXJ0U2NoZW1hVG9Da2FuKGZyaWN0aW9ubGVzc1NjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHRDa2FuU2NoZW1hLmZpZWxkcykudG9IYXZlTGVuZ3RoKFxuICAgICAgb3JpZ2luYWxDa2FuU2NoZW1hLmZpZWxkcy5sZW5ndGgsXG4gICAgKVxuXG4gICAgb3JpZ2luYWxDa2FuU2NoZW1hLmZpZWxkcy5mb3JFYWNoKG9yaWdpbmFsRmllbGQgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0RmllbGQgPSByZXN1bHRDa2FuU2NoZW1hLmZpZWxkcy5maW5kKFxuICAgICAgICBmID0+IGYuaWQgPT09IG9yaWdpbmFsRmllbGQuaWQsXG4gICAgICApXG4gICAgICBleHBlY3QocmVzdWx0RmllbGQpLnRvQmVEZWZpbmVkKClcblxuICAgICAgaWYgKHJlc3VsdEZpZWxkICYmIG9yaWdpbmFsRmllbGQpIHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdEZpZWxkLmlkKS50b0VxdWFsKG9yaWdpbmFsRmllbGQuaWQpXG5cbiAgICAgICAgaWYgKG9yaWdpbmFsRmllbGQuaW5mbykge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHRGaWVsZC5pbmZvKS50b0JlRGVmaW5lZCgpXG4gICAgICAgICAgaWYgKHJlc3VsdEZpZWxkLmluZm8pIHtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbEZpZWxkLmluZm8ubGFiZWwpIHtcbiAgICAgICAgICAgICAgZXhwZWN0KHJlc3VsdEZpZWxkLmluZm8ubGFiZWwpLnRvRXF1YWwob3JpZ2luYWxGaWVsZC5pbmZvLmxhYmVsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsRmllbGQuaW5mby5ub3Rlcykge1xuICAgICAgICAgICAgICBleHBlY3QocmVzdWx0RmllbGQuaW5mby5ub3RlcykudG9FcXVhbChvcmlnaW5hbEZpZWxkLmluZm8ubm90ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,4 @@
1
+ export type { CkanSchema } from "./Schema.ts";
2
+ export type { CkanField } from "./Field.ts";
3
+ export { convertSchemaFromCkan } from "./convert/fromCkan.ts";
4
+ export { convertSchemaToCkan } from "./convert/toCkan.ts";
@@ -0,0 +1,3 @@
1
+ export { convertSchemaFromCkan } from "./convert/fromCkan.js";
2
+ export { convertSchemaToCkan } from "./convert/toCkan.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vc2NoZW1hL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgeyBDa2FuU2NoZW1hIH0gZnJvbSBcIi4vU2NoZW1hLnRzXCJcbmV4cG9ydCB0eXBlIHsgQ2thbkZpZWxkIH0gZnJvbSBcIi4vRmllbGQudHNcIlxuZXhwb3J0IHsgY29udmVydFNjaGVtYUZyb21Da2FuIH0gZnJvbSBcIi4vY29udmVydC9mcm9tQ2thbi50c1wiXG5leHBvcnQgeyBjb252ZXJ0U2NoZW1hVG9Da2FuIH0gZnJvbSBcIi4vY29udmVydC90b0NrYW4udHNcIlxuIl19
@@ -0,0 +1,2 @@
1
+ export * from "./package/index.ts";
2
+ export * from "./plugin.ts";
@@ -0,0 +1,3 @@
1
+ export * from "./package/index.js";
2
+ export * from "./plugin.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2RhdGFodWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQTtBQUNsQyxjQUFjLGFBQWEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3BhY2thZ2UvaW5kZXgudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luLnRzXCJcbiJdfQ==
@@ -0,0 +1 @@
1
+ export { loadPackageFromDatahub } from "./load.ts";
@@ -0,0 +1,2 @@
1
+ export { loadPackageFromDatahub } from "./load.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2RhdGFodWIvcGFja2FnZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBsb2FkUGFja2FnZUZyb21EYXRhaHViIH0gZnJvbSBcIi4vbG9hZC50c1wiXG4iXX0=
@@ -0,0 +1 @@
1
+ export declare function loadPackageFromDatahub(datasetUrl: string): Promise<import("@frictionless-ts/metadata").Package>;
@@ -0,0 +1,9 @@
1
+ import { loadPackageDescriptor } from "@frictionless-ts/metadata";
2
+ export async function loadPackageFromDatahub(datasetUrl) {
3
+ const url = new URL(datasetUrl);
4
+ url.pathname = `${url.pathname}/datapackage.json`;
5
+ url.search = "";
6
+ url.hash = "";
7
+ return loadPackageDescriptor(url.toString());
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbnMvZGF0YWh1Yi9wYWNrYWdlL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFakUsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxVQUFrQjtJQUM3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUUvQixHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsbUJBQW1CLENBQUE7SUFDakQsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7SUFDZixHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUViLE9BQU8scUJBQXFCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvYWRQYWNrYWdlRGVzY3JpcHRvciB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQYWNrYWdlRnJvbURhdGFodWIoZGF0YXNldFVybDogc3RyaW5nKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoZGF0YXNldFVybClcblxuICB1cmwucGF0aG5hbWUgPSBgJHt1cmwucGF0aG5hbWV9L2RhdGFwYWNrYWdlLmpzb25gXG4gIHVybC5zZWFyY2ggPSBcIlwiXG4gIHVybC5oYXNoID0gXCJcIlxuXG4gIHJldHVybiBsb2FkUGFja2FnZURlc2NyaXB0b3IodXJsLnRvU3RyaW5nKCkpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { useRecording } from "vitest-polly";
3
+ import { loadPackageFromDatahub } from "./load.js";
4
+ useRecording();
5
+ describe.skip("loadPackageFromDatahub", () => {
6
+ it("should load a package", async () => {
7
+ const dataPackage = await loadPackageFromDatahub("https://datahub.io/core/eu-emissions-trading-system#readme");
8
+ expect(dataPackage).toMatchSnapshot();
9
+ });
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9kYXRhaHViL3BhY2thZ2UvbG9hZC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVsRCxZQUFZLEVBQUUsQ0FBQTtBQUVkLFFBQVEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyQyxNQUFNLFdBQVcsR0FBRyxNQUFNLHNCQUFzQixDQUM5Qyw0REFBNEQsQ0FDN0QsQ0FBQTtRQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtJQUN2QyxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB7IHVzZVJlY29yZGluZyB9IGZyb20gXCJ2aXRlc3QtcG9sbHlcIlxuaW1wb3J0IHsgbG9hZFBhY2thZ2VGcm9tRGF0YWh1YiB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG51c2VSZWNvcmRpbmcoKVxuXG5kZXNjcmliZS5za2lwKFwibG9hZFBhY2thZ2VGcm9tRGF0YWh1YlwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIGxvYWQgYSBwYWNrYWdlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IGF3YWl0IGxvYWRQYWNrYWdlRnJvbURhdGFodWIoXG4gICAgICBcImh0dHBzOi8vZGF0YWh1Yi5pby9jb3JlL2V1LWVtaXNzaW9ucy10cmFkaW5nLXN5c3RlbSNyZWFkbWVcIixcbiAgICApXG5cbiAgICBleHBlY3QoZGF0YVBhY2thZ2UpLnRvTWF0Y2hTbmFwc2hvdCgpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,4 @@
1
+ import type { DatasetPlugin } from "../../plugin.ts";
2
+ export declare class DatahubPlugin implements DatasetPlugin {
3
+ loadPackage(source: string): Promise<import("@frictionless-ts/metadata").Package | undefined>;
4
+ }
@@ -0,0 +1,18 @@
1
+ import { isRemotePath } from "@frictionless-ts/metadata";
2
+ import { loadPackageFromDatahub } from "./package/index.js";
3
+ export class DatahubPlugin {
4
+ async loadPackage(source) {
5
+ const isDatahub = getIsDatahub(source);
6
+ if (!isDatahub)
7
+ return undefined;
8
+ const dataPackage = await loadPackageFromDatahub(source);
9
+ return dataPackage;
10
+ }
11
+ }
12
+ function getIsDatahub(path) {
13
+ const isRemote = isRemotePath(path);
14
+ if (!isRemote)
15
+ return false;
16
+ return new URL(path).hostname === "datahub.io";
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy9kYXRhaHViL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFM0QsTUFBTSxPQUFPLGFBQWE7SUFDeEIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFjO1FBQzlCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN0QyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFBO1FBRWhDLE1BQU0sV0FBVyxHQUFHLE1BQU0sc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEQsT0FBTyxXQUFXLENBQUE7SUFDcEIsQ0FBQztDQUNGO0FBRUQsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbkMsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUUzQixPQUFPLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUE7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUmVtb3RlUGF0aCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgRGF0YXNldFBsdWdpbiB9IGZyb20gXCIuLi8uLi9wbHVnaW4udHNcIlxuaW1wb3J0IHsgbG9hZFBhY2thZ2VGcm9tRGF0YWh1YiB9IGZyb20gXCIuL3BhY2thZ2UvaW5kZXgudHNcIlxuXG5leHBvcnQgY2xhc3MgRGF0YWh1YlBsdWdpbiBpbXBsZW1lbnRzIERhdGFzZXRQbHVnaW4ge1xuICBhc3luYyBsb2FkUGFja2FnZShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IGlzRGF0YWh1YiA9IGdldElzRGF0YWh1Yihzb3VyY2UpXG4gICAgaWYgKCFpc0RhdGFodWIpIHJldHVybiB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRhdGFQYWNrYWdlID0gYXdhaXQgbG9hZFBhY2thZ2VGcm9tRGF0YWh1Yihzb3VyY2UpXG4gICAgcmV0dXJuIGRhdGFQYWNrYWdlXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNEYXRhaHViKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBpc1JlbW90ZSA9IGlzUmVtb3RlUGF0aChwYXRoKVxuICBpZiAoIWlzUmVtb3RlKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gbmV3IFVSTChwYXRoKS5ob3N0bmFtZSA9PT0gXCJkYXRhaHViLmlvXCJcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,78 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import * as packageModule from "./package/index.js";
3
+ import { DatahubPlugin } from "./plugin.js";
4
+ vi.mock("./package/index.ts", () => ({
5
+ loadPackageFromDatahub: vi.fn(),
6
+ }));
7
+ describe("DatahubPlugin", () => {
8
+ let plugin;
9
+ let mockLoadPackageFromDatahub;
10
+ beforeEach(() => {
11
+ plugin = new DatahubPlugin();
12
+ mockLoadPackageFromDatahub = vi.mocked(packageModule.loadPackageFromDatahub);
13
+ vi.clearAllMocks();
14
+ });
15
+ describe("loadPackage", () => {
16
+ it("should load package from datahub.io url", async () => {
17
+ const mockPackage = {
18
+ name: "test-package",
19
+ resources: [{ name: "test", data: [] }],
20
+ };
21
+ mockLoadPackageFromDatahub.mockResolvedValue(mockPackage);
22
+ const result = await plugin.loadPackage("https://datahub.io/core/country-codes");
23
+ expect(mockLoadPackageFromDatahub).toHaveBeenCalledWith("https://datahub.io/core/country-codes");
24
+ expect(result).toEqual(mockPackage);
25
+ });
26
+ it("should return undefined for non-datahub urls", async () => {
27
+ const result = await plugin.loadPackage("https://example.com/data");
28
+ expect(mockLoadPackageFromDatahub).not.toHaveBeenCalled();
29
+ expect(result).toBeUndefined();
30
+ });
31
+ it("should return undefined for local paths", async () => {
32
+ const result = await plugin.loadPackage("./data");
33
+ expect(mockLoadPackageFromDatahub).not.toHaveBeenCalled();
34
+ expect(result).toBeUndefined();
35
+ });
36
+ it("should return undefined for github urls", async () => {
37
+ const result = await plugin.loadPackage("https://github.com/owner/repo");
38
+ expect(mockLoadPackageFromDatahub).not.toHaveBeenCalled();
39
+ expect(result).toBeUndefined();
40
+ });
41
+ it("should handle datahub urls with multiple path segments", async () => {
42
+ const mockPackage = {
43
+ name: "test-package",
44
+ resources: [{ name: "test", data: [] }],
45
+ };
46
+ mockLoadPackageFromDatahub.mockResolvedValue(mockPackage);
47
+ const result = await plugin.loadPackage("https://datahub.io/core/gdp/datapackage.json");
48
+ expect(mockLoadPackageFromDatahub).toHaveBeenCalledWith("https://datahub.io/core/gdp/datapackage.json");
49
+ expect(result).toEqual(mockPackage);
50
+ });
51
+ it("should handle datahub urls with query parameters", async () => {
52
+ const mockPackage = {
53
+ name: "test-package",
54
+ resources: [{ name: "test", data: [] }],
55
+ };
56
+ mockLoadPackageFromDatahub.mockResolvedValue(mockPackage);
57
+ const result = await plugin.loadPackage("https://datahub.io/core/country-codes?format=json");
58
+ expect(mockLoadPackageFromDatahub).toHaveBeenCalledWith("https://datahub.io/core/country-codes?format=json");
59
+ expect(result).toEqual(mockPackage);
60
+ });
61
+ it("should return undefined for http non-datahub urls", async () => {
62
+ const result = await plugin.loadPackage("http://example.com/data");
63
+ expect(mockLoadPackageFromDatahub).not.toHaveBeenCalled();
64
+ expect(result).toBeUndefined();
65
+ });
66
+ it("should return undefined for zenodo urls", async () => {
67
+ const result = await plugin.loadPackage("https://zenodo.org/record/123");
68
+ expect(mockLoadPackageFromDatahub).not.toHaveBeenCalled();
69
+ expect(result).toBeUndefined();
70
+ });
71
+ it("should return undefined for subdomain datahub urls", async () => {
72
+ const result = await plugin.loadPackage("https://test.datahub.io/data");
73
+ expect(mockLoadPackageFromDatahub).not.toHaveBeenCalled();
74
+ expect(result).toBeUndefined();
75
+ });
76
+ });
77
+ });
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2RhdGFodWIvcGx1Z2luLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDN0QsT0FBTyxLQUFLLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRTNDLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNuQyxzQkFBc0IsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0NBQ2hDLENBQUMsQ0FBQyxDQUFBO0FBRUgsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDN0IsSUFBSSxNQUFxQixDQUFBO0lBQ3pCLElBQUksMEJBQW9ELENBQUE7SUFFeEQsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFBO1FBQzVCLDBCQUEwQixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUE7UUFDNUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7UUFDM0IsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3ZELE1BQU0sV0FBVyxHQUFZO2dCQUMzQixJQUFJLEVBQUUsY0FBYztnQkFDcEIsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUN4QyxDQUFBO1lBQ0QsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUNyQyx1Q0FBdUMsQ0FDeEMsQ0FBQTtZQUVELE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLG9CQUFvQixDQUNyRCx1Q0FBdUMsQ0FDeEMsQ0FBQTtZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDckMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsOENBQThDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLDBCQUEwQixDQUFDLENBQUE7WUFFbkUsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3ZELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUVqRCxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtZQUN6RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDaEMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMseUNBQXlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLENBQUE7WUFFeEUsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RFLE1BQU0sV0FBVyxHQUFZO2dCQUMzQixJQUFJLEVBQUUsY0FBYztnQkFDcEIsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUN4QyxDQUFBO1lBQ0QsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUNyQyw4Q0FBOEMsQ0FDL0MsQ0FBQTtZQUVELE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLG9CQUFvQixDQUNyRCw4Q0FBOEMsQ0FDL0MsQ0FBQTtZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDckMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEUsTUFBTSxXQUFXLEdBQVk7Z0JBQzNCLElBQUksRUFBRSxjQUFjO2dCQUNwQixTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO2FBQ3hDLENBQUE7WUFDRCwwQkFBMEIsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUV6RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQ3JDLG1EQUFtRCxDQUNwRCxDQUFBO1lBRUQsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsb0JBQW9CLENBQ3JELG1EQUFtRCxDQUNwRCxDQUFBO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNyQyxDQUFDLENBQUMsQ0FBQTtRQUVGLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsQ0FBQTtZQUVsRSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtZQUN6RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDaEMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMseUNBQXlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLENBQUE7WUFFeEUsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1lBRXZFLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQ3pELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNoQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhY2thZ2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCAqIGFzIHBhY2thZ2VNb2R1bGUgZnJvbSBcIi4vcGFja2FnZS9pbmRleC50c1wiXG5pbXBvcnQgeyBEYXRhaHViUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2luLnRzXCJcblxudmkubW9jayhcIi4vcGFja2FnZS9pbmRleC50c1wiLCAoKSA9PiAoe1xuICBsb2FkUGFja2FnZUZyb21EYXRhaHViOiB2aS5mbigpLFxufSkpXG5cbmRlc2NyaWJlKFwiRGF0YWh1YlBsdWdpblwiLCAoKSA9PiB7XG4gIGxldCBwbHVnaW46IERhdGFodWJQbHVnaW5cbiAgbGV0IG1vY2tMb2FkUGFja2FnZUZyb21EYXRhaHViOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj5cblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBwbHVnaW4gPSBuZXcgRGF0YWh1YlBsdWdpbigpXG4gICAgbW9ja0xvYWRQYWNrYWdlRnJvbURhdGFodWIgPSB2aS5tb2NrZWQocGFja2FnZU1vZHVsZS5sb2FkUGFja2FnZUZyb21EYXRhaHViKVxuICAgIHZpLmNsZWFyQWxsTW9ja3MoKVxuICB9KVxuXG4gIGRlc2NyaWJlKFwibG9hZFBhY2thZ2VcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGxvYWQgcGFja2FnZSBmcm9tIGRhdGFodWIuaW8gdXJsXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgICByZXNvdXJjZXM6IFt7IG5hbWU6IFwidGVzdFwiLCBkYXRhOiBbXSB9XSxcbiAgICAgIH1cbiAgICAgIG1vY2tMb2FkUGFja2FnZUZyb21EYXRhaHViLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tQYWNrYWdlKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2UoXG4gICAgICAgIFwiaHR0cHM6Ly9kYXRhaHViLmlvL2NvcmUvY291bnRyeS1jb2Rlc1wiLFxuICAgICAgKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbURhdGFodWIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBcImh0dHBzOi8vZGF0YWh1Yi5pby9jb3JlL2NvdW50cnktY29kZXNcIixcbiAgICAgIClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1BhY2thZ2UpXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIG5vbi1kYXRhaHViIHVybHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmxvYWRQYWNrYWdlKFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9kYXRhXCIpXG5cbiAgICAgIGV4cGVjdChtb2NrTG9hZFBhY2thZ2VGcm9tRGF0YWh1Yikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIGxvY2FsIHBhdGhzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5sb2FkUGFja2FnZShcIi4vZGF0YVwiKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbURhdGFodWIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBnaXRodWIgdXJsc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2UoXCJodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwb1wiKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbURhdGFodWIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZGF0YWh1YiB1cmxzIHdpdGggbXVsdGlwbGUgcGF0aCBzZWdtZW50c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrUGFja2FnZTogUGFja2FnZSA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgICAgcmVzb3VyY2VzOiBbeyBuYW1lOiBcInRlc3RcIiwgZGF0YTogW10gfV0sXG4gICAgICB9XG4gICAgICBtb2NrTG9hZFBhY2thZ2VGcm9tRGF0YWh1Yi5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUGFja2FnZSlcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmxvYWRQYWNrYWdlKFxuICAgICAgICBcImh0dHBzOi8vZGF0YWh1Yi5pby9jb3JlL2dkcC9kYXRhcGFja2FnZS5qc29uXCIsXG4gICAgICApXG5cbiAgICAgIGV4cGVjdChtb2NrTG9hZFBhY2thZ2VGcm9tRGF0YWh1YikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIFwiaHR0cHM6Ly9kYXRhaHViLmlvL2NvcmUvZ2RwL2RhdGFwYWNrYWdlLmpzb25cIixcbiAgICAgIClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1BhY2thZ2UpXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBkYXRhaHViIHVybHMgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgICByZXNvdXJjZXM6IFt7IG5hbWU6IFwidGVzdFwiLCBkYXRhOiBbXSB9XSxcbiAgICAgIH1cbiAgICAgIG1vY2tMb2FkUGFja2FnZUZyb21EYXRhaHViLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tQYWNrYWdlKVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2UoXG4gICAgICAgIFwiaHR0cHM6Ly9kYXRhaHViLmlvL2NvcmUvY291bnRyeS1jb2Rlcz9mb3JtYXQ9anNvblwiLFxuICAgICAgKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbURhdGFodWIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBcImh0dHBzOi8vZGF0YWh1Yi5pby9jb3JlL2NvdW50cnktY29kZXM/Zm9ybWF0PWpzb25cIixcbiAgICAgIClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1BhY2thZ2UpXG4gICAgfSlcblxuICAgIGl0KFwic2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIGh0dHAgbm9uLWRhdGFodWIgdXJsc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2UoXCJodHRwOi8vZXhhbXBsZS5jb20vZGF0YVwiKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbURhdGFodWIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciB6ZW5vZG8gdXJsc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4ubG9hZFBhY2thZ2UoXCJodHRwczovL3plbm9kby5vcmcvcmVjb3JkLzEyM1wiKVxuXG4gICAgICBleHBlY3QobW9ja0xvYWRQYWNrYWdlRnJvbURhdGFodWIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG5cbiAgICBpdChcInNob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBzdWJkb21haW4gZGF0YWh1YiB1cmxzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsdWdpbi5sb2FkUGFja2FnZShcImh0dHBzOi8vdGVzdC5kYXRhaHViLmlvL2RhdGFcIilcblxuICAgICAgZXhwZWN0KG1vY2tMb2FkUGFja2FnZUZyb21EYXRhaHViKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1 @@
1
+ export * from "./plugin.ts";
@@ -0,0 +1,2 @@
1
+ export * from "./plugin.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW5zL2Rlc2NyaXB0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9wbHVnaW4udHNcIlxuIl19
@@ -0,0 +1,11 @@
1
+ import type { Package } from "@frictionless-ts/metadata";
2
+ import type { DatasetPlugin } from "../../plugin.ts";
3
+ export declare class DescriptorPlugin implements DatasetPlugin {
4
+ loadPackage(source: string): Promise<Package | undefined>;
5
+ savePackage(dataPackage: Package, options: {
6
+ target: string;
7
+ withRemote?: boolean;
8
+ }): Promise<{
9
+ path: string;
10
+ } | undefined>;
11
+ }
@@ -0,0 +1,29 @@
1
+ import { inferFormat } from "@frictionless-ts/metadata";
2
+ import { isRemotePath } from "@frictionless-ts/metadata";
3
+ import { loadPackageDescriptor } from "@frictionless-ts/metadata";
4
+ import { savePackageDescriptor } from "@frictionless-ts/metadata";
5
+ export class DescriptorPlugin {
6
+ async loadPackage(source) {
7
+ const isLocalJson = await getIsLocalJson(source);
8
+ if (!isLocalJson)
9
+ return undefined;
10
+ const dataPackage = await loadPackageDescriptor(source);
11
+ return dataPackage;
12
+ }
13
+ async savePackage(dataPackage, options) {
14
+ const isLocalJson = await getIsLocalJson(options.target);
15
+ if (!isLocalJson)
16
+ return undefined;
17
+ if (!options.target.endsWith("datapackage.json")) {
18
+ return undefined;
19
+ }
20
+ await savePackageDescriptor(dataPackage, { path: options.target });
21
+ return { path: options.target };
22
+ }
23
+ }
24
+ async function getIsLocalJson(path) {
25
+ const isRemote = isRemotePath(path);
26
+ const format = inferFormat({ path });
27
+ return !isRemote && format === "json";
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2lucy9kZXNjcmlwdG9yL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBR2pFLE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFjO1FBQzlCLE1BQU0sV0FBVyxHQUFHLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2hELElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFFbEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN2RCxPQUFPLFdBQVcsQ0FBQTtJQUNwQixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FDZixXQUFvQixFQUNwQixPQUFpRDtRQUVqRCxNQUFNLFdBQVcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUVsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ2pELE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7UUFFRCxNQUFNLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUVsRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNqQyxDQUFDO0NBQ0Y7QUFFRCxLQUFLLFVBQVUsY0FBYyxDQUFDLElBQVk7SUFDeEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ25DLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDcEMsT0FBTyxDQUFDLFFBQVEsSUFBSSxNQUFNLEtBQUssTUFBTSxDQUFBO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmZlckZvcm1hdCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgUGFja2FnZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGlzUmVtb3RlUGF0aCB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGxvYWRQYWNrYWdlRGVzY3JpcHRvciB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IHNhdmVQYWNrYWdlRGVzY3JpcHRvciB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgRGF0YXNldFBsdWdpbiB9IGZyb20gXCIuLi8uLi9wbHVnaW4udHNcIlxuXG5leHBvcnQgY2xhc3MgRGVzY3JpcHRvclBsdWdpbiBpbXBsZW1lbnRzIERhdGFzZXRQbHVnaW4ge1xuICBhc3luYyBsb2FkUGFja2FnZShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IGlzTG9jYWxKc29uID0gYXdhaXQgZ2V0SXNMb2NhbEpzb24oc291cmNlKVxuICAgIGlmICghaXNMb2NhbEpzb24pIHJldHVybiB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRhdGFQYWNrYWdlID0gYXdhaXQgbG9hZFBhY2thZ2VEZXNjcmlwdG9yKHNvdXJjZSlcbiAgICByZXR1cm4gZGF0YVBhY2thZ2VcbiAgfVxuXG4gIGFzeW5jIHNhdmVQYWNrYWdlKFxuICAgIGRhdGFQYWNrYWdlOiBQYWNrYWdlLFxuICAgIG9wdGlvbnM6IHsgdGFyZ2V0OiBzdHJpbmc7IHdpdGhSZW1vdGU/OiBib29sZWFuIH0sXG4gICkge1xuICAgIGNvbnN0IGlzTG9jYWxKc29uID0gYXdhaXQgZ2V0SXNMb2NhbEpzb24ob3B0aW9ucy50YXJnZXQpXG4gICAgaWYgKCFpc0xvY2FsSnNvbikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgaWYgKCFvcHRpb25zLnRhcmdldC5lbmRzV2l0aChcImRhdGFwYWNrYWdlLmpzb25cIikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlUGFja2FnZURlc2NyaXB0b3IoZGF0YVBhY2thZ2UsIHsgcGF0aDogb3B0aW9ucy50YXJnZXQgfSlcblxuICAgIHJldHVybiB7IHBhdGg6IG9wdGlvbnMudGFyZ2V0IH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJc0xvY2FsSnNvbihwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgaXNSZW1vdGUgPSBpc1JlbW90ZVBhdGgocGF0aClcbiAgY29uc3QgZm9ybWF0ID0gaW5mZXJGb3JtYXQoeyBwYXRoIH0pXG4gIHJldHVybiAhaXNSZW1vdGUgJiYgZm9ybWF0ID09PSBcImpzb25cIlxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};