@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,153 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import ckanPackageFixture from "../fixtures/ckan-package.json" with {
3
+ type: "json"
4
+ };
5
+ import { convertPackageFromCkan } from "./fromCkan.js";
6
+ import { convertPackageToCkan } from "./toCkan.js";
7
+ describe("convertPackageToCkan", () => {
8
+ it("converts a Frictionless Data Package to a CKAN package", () => {
9
+ const dataPackage = {
10
+ name: "test-package",
11
+ title: "Test Package",
12
+ description: "This is a test package",
13
+ version: "1.0.0",
14
+ licenses: [
15
+ {
16
+ name: "cc-by",
17
+ title: "Creative Commons Attribution",
18
+ path: "http://www.opendefinition.org/licenses/cc-by",
19
+ },
20
+ ],
21
+ contributors: [
22
+ {
23
+ title: "Test Author",
24
+ email: "author@example.com",
25
+ role: "author",
26
+ },
27
+ {
28
+ title: "Test Maintainer",
29
+ email: "maintainer@example.com",
30
+ role: "maintainer",
31
+ },
32
+ ],
33
+ keywords: ["test", "sample", "data"],
34
+ created: "2023-01-01T00:00:00Z",
35
+ resources: [
36
+ {
37
+ name: "test-resource",
38
+ path: "https://example.com/data.csv",
39
+ format: "csv",
40
+ mediatype: "text/csv",
41
+ description: "Test resource",
42
+ bytes: 1024,
43
+ hash: "md5:1234567890abcdef",
44
+ },
45
+ ],
46
+ };
47
+ const result = convertPackageToCkan(dataPackage);
48
+ expect(result.name).toEqual(dataPackage.name);
49
+ expect(result.title).toEqual(dataPackage.title);
50
+ expect(result.notes).toEqual(dataPackage.description);
51
+ expect(result.version).toEqual(dataPackage.version);
52
+ if (dataPackage.licenses &&
53
+ dataPackage.licenses.length > 0 &&
54
+ dataPackage.licenses[0]) {
55
+ const license = dataPackage.licenses[0];
56
+ if (license.name)
57
+ expect(result.license_id).toEqual(license.name);
58
+ if (license.title)
59
+ expect(result.license_title).toEqual(license.title);
60
+ if (license.path)
61
+ expect(result.license_url).toEqual(license.path);
62
+ }
63
+ if (dataPackage.contributors && dataPackage.contributors.length >= 2) {
64
+ const author = dataPackage.contributors.find(c => c.role === "author");
65
+ const maintainer = dataPackage.contributors.find(c => c.role === "maintainer");
66
+ if (author) {
67
+ expect(result.author).toEqual(author.title);
68
+ expect(result.author_email).toEqual(author.email);
69
+ }
70
+ if (maintainer) {
71
+ expect(result.maintainer).toEqual(maintainer.title);
72
+ expect(result.maintainer_email).toEqual(maintainer.email);
73
+ }
74
+ }
75
+ if (dataPackage.keywords && dataPackage.keywords.length > 0) {
76
+ expect(result.tags).toHaveLength(dataPackage.keywords.length);
77
+ dataPackage.keywords.forEach((keyword, index) => {
78
+ const tag = result.tags?.[index];
79
+ if (tag && keyword) {
80
+ expect(tag.name).toEqual(keyword);
81
+ expect(tag.display_name).toEqual(keyword);
82
+ }
83
+ });
84
+ }
85
+ expect(result.resources).toHaveLength(dataPackage.resources.length);
86
+ expect(dataPackage.resources.length).toBeGreaterThan(0);
87
+ expect(result.resources?.length).toBeGreaterThan(0);
88
+ if (dataPackage.resources.length > 0 && result.resources.length > 0) {
89
+ const firstResource = dataPackage.resources[0];
90
+ const firstCkanResource = result.resources[0];
91
+ expect(firstCkanResource).toBeDefined();
92
+ expect(firstResource).toBeDefined();
93
+ if (firstResource && firstCkanResource) {
94
+ expect(firstCkanResource.description).toEqual(firstResource.description);
95
+ expect(firstCkanResource.format).toEqual(firstResource.format?.toUpperCase());
96
+ expect(firstCkanResource.mimetype).toEqual(firstResource.mediatype);
97
+ expect(firstCkanResource.size).toEqual(firstResource.bytes);
98
+ expect(firstCkanResource.hash).toEqual(firstResource.hash);
99
+ }
100
+ }
101
+ });
102
+ it("handles empty resources array", () => {
103
+ const dataPackage = {
104
+ name: "test-package",
105
+ resources: [],
106
+ };
107
+ const result = convertPackageToCkan(dataPackage);
108
+ expect(result.resources).toEqual([]);
109
+ });
110
+ it("handles undefined optional properties", () => {
111
+ const dataPackage = {
112
+ resources: [],
113
+ };
114
+ const result = convertPackageToCkan(dataPackage);
115
+ expect(result.name).toBeUndefined();
116
+ expect(result.title).toBeUndefined();
117
+ expect(result.notes).toBeUndefined();
118
+ expect(result.version).toBeUndefined();
119
+ expect(result.metadata_created).toBeUndefined();
120
+ expect(result.license_id).toBeUndefined();
121
+ expect(result.license_title).toBeUndefined();
122
+ expect(result.license_url).toBeUndefined();
123
+ expect(result.author).toBeUndefined();
124
+ expect(result.author_email).toBeUndefined();
125
+ expect(result.maintainer).toBeUndefined();
126
+ expect(result.maintainer_email).toBeUndefined();
127
+ expect(result.tags).toEqual([]);
128
+ expect(result.resources).toEqual([]);
129
+ });
130
+ it("performs a round-trip conversion (CKAN → DP → CKAN)", () => {
131
+ const originalCkanPackage = ckanPackageFixture;
132
+ const dataPackage = convertPackageFromCkan(originalCkanPackage);
133
+ const resultCkanPackage = convertPackageToCkan(dataPackage);
134
+ expect(resultCkanPackage.name).toEqual(originalCkanPackage.name);
135
+ expect(resultCkanPackage.title).toEqual(originalCkanPackage.title);
136
+ expect(resultCkanPackage.notes).toEqual(originalCkanPackage.notes);
137
+ expect(resultCkanPackage.version).toEqual(originalCkanPackage.version);
138
+ expect(resultCkanPackage.license_id).toEqual(originalCkanPackage.license_id);
139
+ expect(resultCkanPackage.license_title).toEqual(originalCkanPackage.license_title);
140
+ expect(resultCkanPackage.license_url).toEqual(originalCkanPackage.license_url);
141
+ expect(resultCkanPackage.author).toEqual(originalCkanPackage.author);
142
+ expect(resultCkanPackage.author_email).toEqual(originalCkanPackage.author_email);
143
+ expect(resultCkanPackage.maintainer).toEqual(originalCkanPackage.maintainer);
144
+ expect(resultCkanPackage.maintainer_email).toEqual(originalCkanPackage.maintainer_email);
145
+ expect(resultCkanPackage.resources.length).toBeGreaterThan(0);
146
+ expect(resultCkanPackage.tags.length).toEqual(originalCkanPackage.tags.length);
147
+ originalCkanPackage.tags.forEach(originalTag => {
148
+ const matchingTag = resultCkanPackage.tags.find(tag => tag.name === originalTag.name);
149
+ expect(matchingTag).toBeTruthy();
150
+ });
151
+ });
152
+ });
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9Da2FuLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vcGFja2FnZS9jb252ZXJ0L3RvQ2thbi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUU3QyxPQUFPLGtCQUFrQixNQUFNLCtCQUErQixDQUFDO0lBQzdELElBQUksRUFBRSxNQUFNO0NBQ2IsQ0FBQTtBQUNELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFbEQsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxFQUFFLENBQUMsd0RBQXdELEVBQUUsR0FBRyxFQUFFO1FBQ2hFLE1BQU0sV0FBVyxHQUFZO1lBQzNCLElBQUksRUFBRSxjQUFjO1lBQ3BCLEtBQUssRUFBRSxjQUFjO1lBQ3JCLFdBQVcsRUFBRSx3QkFBd0I7WUFDckMsT0FBTyxFQUFFLE9BQU87WUFDaEIsUUFBUSxFQUFFO2dCQUNSO29CQUNFLElBQUksRUFBRSxPQUFPO29CQUNiLEtBQUssRUFBRSw4QkFBOEI7b0JBQ3JDLElBQUksRUFBRSw4Q0FBOEM7aUJBQ3JEO2FBQ0Y7WUFDRCxZQUFZLEVBQUU7Z0JBQ1o7b0JBQ0UsS0FBSyxFQUFFLGFBQWE7b0JBQ3BCLEtBQUssRUFBRSxvQkFBb0I7b0JBQzNCLElBQUksRUFBRSxRQUFRO2lCQUNmO2dCQUNEO29CQUNFLEtBQUssRUFBRSxpQkFBaUI7b0JBQ3hCLEtBQUssRUFBRSx3QkFBd0I7b0JBQy9CLElBQUksRUFBRSxZQUFZO2lCQUNuQjthQUNGO1lBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7WUFDcEMsT0FBTyxFQUFFLHNCQUFzQjtZ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QUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzVFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FDaEQsbUJBQW1CLENBQUMsZ0JBQWdCLENBQ3JDLENBQUE7UUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU3RCxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FDM0MsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDaEMsQ0FBQTtRQUNELG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0MsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDN0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxJQUFJLENBQ3JDLENBQUE7WUFDRCxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQYWNrYWdlIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB0eXBlIHsgQ2thblBhY2thZ2UgfSBmcm9tIFwiLi4vUGFja2FnZS50c1wiXG5pbXBvcnQgY2thblBhY2thZ2VGaXh0dXJlIGZyb20gXCIuLi9maXh0dXJlcy9ja2FuLXBhY2thZ2UuanNvblwiIHdpdGgge1xuICB0eXBlOiBcImpzb25cIixcbn1cbmltcG9ydCB7IGNvbnZlcnRQYWNrYWdlRnJvbUNrYW4gfSBmcm9tIFwiLi9mcm9tQ2thbi50c1wiXG5pbXBvcnQgeyBjb252ZXJ0UGFja2FnZVRvQ2thbiB9IGZyb20gXCIuL3RvQ2thbi50c1wiXG5cbmRlc2NyaWJlKFwiY29udmVydFBhY2thZ2VUb0NrYW5cIiwgKCkgPT4ge1xuICBpdChcImNvbnZlcnRzIGEgRnJpY3Rpb25sZXNzIERhdGEgUGFja2FnZSB0byBhIENLQU4gcGFja2FnZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhY2thZ2U6IFBhY2thZ2UgPSB7XG4gICAgICBuYW1lOiBcInRlc3QtcGFja2FnZVwiLFxuICAgICAgdGl0bGU6IFwiVGVzdCBQYWNrYWdlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGlzIGlzIGEgdGVzdCBwYWNrYWdlXCIsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICBsaWNlbnNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJjYy1ieVwiLFxuICAgICAgICAgIHRpdGxlOiBcIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb25cIixcbiAgICAgICAgICBwYXRoOiBcImh0dHA6Ly93d3cub3BlbmRlZmluaXRpb24ub3JnL2xpY2Vuc2VzL2NjLWJ5XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgY29udHJpYnV0b3JzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogXCJUZXN0IEF1dGhvclwiLFxuICAgICAgICAgIGVtYWlsOiBcImF1dGhvckBleGFtcGxlLmNvbVwiLFxuICAgICAgICAgIHJvbGU6IFwiYXV0aG9yXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogXCJUZXN0IE1haW50YWluZXJcIixcbiAgICAgICAgICBlbWFpbDogXCJtYWludGFpbmVyQGV4YW1wbGUuY29tXCIsXG4gICAgICAgICAgcm9sZTogXCJtYWludGFpbmVyXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAga2V5d29yZHM6IFtcInRlc3RcIiwgXCJzYW1wbGVcIiwgXCJkYXRhXCJdLFxuICAgICAgY3JlYXRlZDogXCIyMDIzLTAxLTAxVDAwOjAwOjAwWlwiLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3QtcmVzb3VyY2VcIixcbiAgICAgICAgICBwYXRoOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vZGF0YS5jc3ZcIixcbiAgICAgICAgICBmb3JtYXQ6IFwiY3N2XCIsXG4gICAgICAgICAgbWVkaWF0eXBlOiBcInRleHQvY3N2XCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiVGVzdCByZXNvdXJjZVwiLFxuICAgICAgICAgIGJ5dGVzOiAxMDI0LFxuICAgICAgICAgIGhhc2g6IFwibWQ1OjEyMzQ1Njc4OTBhYmNkZWZcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFBhY2thZ2VUb0NrYW4oZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvRXF1YWwoZGF0YVBhY2thZ2UubmFtZSlcbiAgICBleHBlY3QocmVzdWx0LnRpdGxlKS50b0VxdWFsKGRhdGFQYWNrYWdlLnRpdGxlKVxuICAgIGV4cGVjdChyZXN1bHQubm90ZXMpLnRvRXF1YWwoZGF0YVBhY2thZ2UuZGVzY3JpcHRpb24pXG4gICAgZXhwZWN0KHJlc3VsdC52ZXJzaW9uKS50b0VxdWFsKGRhdGFQYWNrYWdlLnZlcnNpb24pXG5cbiAgICBpZiAoXG4gICAgICBkYXRhUGFja2FnZS5saWNlbnNlcyAmJlxuICAgICAgZGF0YVBhY2thZ2UubGljZW5zZXMubGVuZ3RoID4gMCAmJlxuICAgICAgZGF0YVBhY2thZ2UubGljZW5zZXNbMF1cbiAgICApIHtcbiAgICAgIGNvbnN0IGxpY2Vuc2UgPSBkYXRhUGFja2FnZS5saWNlbnNlc1swXVxuICAgICAgaWYgKGxpY2Vuc2UubmFtZSkgZXhwZWN0KHJlc3VsdC5saWNlbnNlX2lkKS50b0VxdWFsKGxpY2Vuc2UubmFtZSlcbiAgICAgIGlmIChsaWNlbnNlLnRpdGxlKSBleHBlY3QocmVzdWx0LmxpY2Vuc2VfdGl0bGUpLnRvRXF1YWwobGljZW5zZS50aXRsZSlcbiAgICAgIGlmIChsaWNlbnNlLnBhdGgpIGV4cGVjdChyZXN1bHQubGljZW5zZV91cmwpLnRvRXF1YWwobGljZW5zZS5wYXRoKVxuICAgIH1cblxuICAgIGlmIChkYXRhUGFja2FnZS5jb250cmlidXRvcnMgJiYgZGF0YVBhY2thZ2UuY29udHJpYnV0b3JzLmxlbmd0aCA+PSAyKSB7XG4gICAgICBjb25zdCBhdXRob3IgPSBkYXRhUGFja2FnZS5jb250cmlidXRvcnMuZmluZChjID0+IGMucm9sZSA9PT0gXCJhdXRob3JcIilcbiAgICAgIGNvbnN0IG1haW50YWluZXIgPSBkYXRhUGFja2FnZS5jb250cmlidXRvcnMuZmluZChcbiAgICAgICAgYyA9PiBjLnJvbGUgPT09IFwibWFpbnRhaW5lclwiLFxuICAgICAgKVxuXG4gICAgICBpZiAoYXV0aG9yKSB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuYXV0aG9yKS50b0VxdWFsKGF1dGhvci50aXRsZSlcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5hdXRob3JfZW1haWwpLnRvRXF1YWwoYXV0aG9yLmVtYWlsKVxuICAgICAgfVxuXG4gICAgICBpZiAobWFpbnRhaW5lcikge1xuICAgICAgICBleHBlY3QocmVzdWx0Lm1haW50YWluZXIpLnRvRXF1YWwobWFpbnRhaW5lci50aXRsZSlcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5tYWludGFpbmVyX2VtYWlsKS50b0VxdWFsKG1haW50YWluZXIuZW1haWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGFQYWNrYWdlLmtleXdvcmRzICYmIGRhdGFQYWNrYWdlLmtleXdvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGV4cGVjdChyZXN1bHQudGFncykudG9IYXZlTGVuZ3RoKGRhdGFQYWNrYWdlLmtleXdvcmRzLmxlbmd0aClcbiAgICAgIGRhdGFQYWNrYWdlLmtleXdvcmRzLmZvckVhY2goKGtleXdvcmQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IHJlc3VsdC50YWdzPy5baW5kZXhdXG4gICAgICAgIGlmICh0YWcgJiYga2V5d29yZCkge1xuICAgICAgICAgIGV4cGVjdCh0YWcubmFtZSkudG9FcXVhbChrZXl3b3JkKVxuICAgICAgICAgIGV4cGVjdCh0YWcuZGlzcGxheV9uYW1lKS50b0VxdWFsKGtleXdvcmQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZXhwZWN0KHJlc3VsdC5yZXNvdXJjZXMpLnRvSGF2ZUxlbmd0aChkYXRhUGFja2FnZS5yZXNvdXJjZXMubGVuZ3RoKVxuXG4gICAgZXhwZWN0KGRhdGFQYWNrYWdlLnJlc291cmNlcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzPy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuXG4gICAgaWYgKGRhdGFQYWNrYWdlLnJlc291cmNlcy5sZW5ndGggPiAwICYmIHJlc3VsdC5yZXNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RSZXNvdXJjZSA9IGRhdGFQYWNrYWdlLnJlc291cmNlc1swXVxuICAgICAgY29uc3QgZmlyc3RDa2FuUmVzb3VyY2UgPSByZXN1bHQucmVzb3VyY2VzWzBdXG5cbiAgICAgIGV4cGVjdChmaXJzdENrYW5SZXNvdXJjZSkudG9CZURlZmluZWQoKVxuICAgICAgZXhwZWN0KGZpcnN0UmVzb3VyY2UpLnRvQmVEZWZpbmVkKClcblxuICAgICAgaWYgKGZpcnN0UmVzb3VyY2UgJiYgZmlyc3RDa2FuUmVzb3VyY2UpIHtcbiAgICAgICAgZXhwZWN0KGZpcnN0Q2thblJlc291cmNlLmRlc2NyaXB0aW9uKS50b0VxdWFsKGZpcnN0UmVzb3VyY2UuZGVzY3JpcHRpb24pXG4gICAgICAgIGV4cGVjdChmaXJzdENrYW5SZXNvdXJjZS5mb3JtYXQpLnRvRXF1YWwoXG4gICAgICAgICAgZmlyc3RSZXNvdXJjZS5mb3JtYXQ/LnRvVXBwZXJDYXNlKCksXG4gICAgICAgIClcbiAgICAgICAgZXhwZWN0KGZpcnN0Q2thblJlc291cmNlLm1pbWV0eXBlKS50b0VxdWFsKGZpcnN0UmVzb3VyY2UubWVkaWF0eXBlKVxuICAgICAgICBleHBlY3QoZmlyc3RDa2FuUmVzb3VyY2Uuc2l6ZSkudG9FcXVhbChmaXJzdFJlc291cmNlLmJ5dGVzKVxuICAgICAgICBleHBlY3QoZmlyc3RDa2FuUmVzb3VyY2UuaGFzaCkudG9FcXVhbChmaXJzdFJlc291cmNlLmhhc2gpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBlbXB0eSByZXNvdXJjZXMgYXJyYXlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgbmFtZTogXCJ0ZXN0LXBhY2thZ2VcIixcbiAgICAgIHJlc291cmNlczogW10sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFBhY2thZ2VUb0NrYW4oZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVzdWx0LnJlc291cmNlcykudG9FcXVhbChbXSlcbiAgfSlcblxuICBpdChcImhhbmRsZXMgdW5kZWZpbmVkIG9wdGlvbmFsIHByb3BlcnRpZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYWNrYWdlOiBQYWNrYWdlID0ge1xuICAgICAgcmVzb3VyY2VzOiBbXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0UGFja2FnZVRvQ2thbihkYXRhUGFja2FnZSlcblxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC50aXRsZSkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC5ub3RlcykudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC52ZXJzaW9uKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0Lm1ldGFkYXRhX2NyZWF0ZWQpLnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQubGljZW5zZV9pZCkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC5saWNlbnNlX3RpdGxlKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0LmxpY2Vuc2VfdXJsKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0LmF1dGhvcikudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC5hdXRob3JfZW1haWwpLnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQubWFpbnRhaW5lcikudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC5tYWludGFpbmVyX2VtYWlsKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0LnRhZ3MpLnRvRXF1YWwoW10pXG4gICAgZXhwZWN0KHJlc3VsdC5yZXNvdXJjZXMpLnRvRXF1YWwoW10pXG4gIH0pXG5cbiAgaXQoXCJwZXJmb3JtcyBhIHJvdW5kLXRyaXAgY29udmVyc2lvbiAoQ0tBTiDihpIgRFAg4oaSIENLQU4pXCIsICgpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbENrYW5QYWNrYWdlID0gY2thblBhY2thZ2VGaXh0dXJlIGFzIENrYW5QYWNrYWdlXG5cbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IGNvbnZlcnRQYWNrYWdlRnJvbUNrYW4ob3JpZ2luYWxDa2FuUGFja2FnZSlcblxuICAgIGNvbnN0IHJlc3VsdENrYW5QYWNrYWdlID0gY29udmVydFBhY2thZ2VUb0NrYW4oZGF0YVBhY2thZ2UpXG5cbiAgICBleHBlY3QocmVzdWx0Q2thblBhY2thZ2UubmFtZSkudG9FcXVhbChvcmlnaW5hbENrYW5QYWNrYWdlLm5hbWUpXG4gICAgZXhwZWN0KHJlc3VsdENrYW5QYWNrYWdlLnRpdGxlKS50b0VxdWFsKG9yaWdpbmFsQ2thblBhY2thZ2UudGl0bGUpXG4gICAgZXhwZWN0KHJlc3VsdENrYW5QYWNrYWdlLm5vdGVzKS50b0VxdWFsKG9yaWdpbmFsQ2thblBhY2thZ2Uubm90ZXMpXG4gICAgZXhwZWN0KHJlc3VsdENrYW5QYWNrYWdlLnZlcnNpb24pLnRvRXF1YWwob3JpZ2luYWxDa2FuUGFja2FnZS52ZXJzaW9uKVxuXG4gICAgZXhwZWN0KHJlc3VsdENrYW5QYWNrYWdlLmxpY2Vuc2VfaWQpLnRvRXF1YWwob3JpZ2luYWxDa2FuUGFja2FnZS5saWNlbnNlX2lkKVxuICAgIGV4cGVjdChyZXN1bHRDa2FuUGFja2FnZS5saWNlbnNlX3RpdGxlKS50b0VxdWFsKFxuICAgICAgb3JpZ2luYWxDa2FuUGFja2FnZS5saWNlbnNlX3RpdGxlLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0Q2thblBhY2thZ2UubGljZW5zZV91cmwpLnRvRXF1YWwoXG4gICAgICBvcmlnaW5hbENrYW5QYWNrYWdlLmxpY2Vuc2VfdXJsLFxuICAgIClcblxuICAgIGV4cGVjdChyZXN1bHRDa2FuUGFja2FnZS5hdXRob3IpLnRvRXF1YWwob3JpZ2luYWxDa2FuUGFja2FnZS5hdXRob3IpXG4gICAgZXhwZWN0KHJlc3VsdENrYW5QYWNrYWdlLmF1dGhvcl9lbWFpbCkudG9FcXVhbChcbiAgICAgIG9yaWdpbmFsQ2thblBhY2thZ2UuYXV0aG9yX2VtYWlsLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0Q2thblBhY2thZ2UubWFpbnRhaW5lcikudG9FcXVhbChvcmlnaW5hbENrYW5QYWNrYWdlLm1haW50YWluZXIpXG4gICAgZXhwZWN0KHJlc3VsdENrYW5QYWNrYWdlLm1haW50YWluZXJfZW1haWwpLnRvRXF1YWwoXG4gICAgICBvcmlnaW5hbENrYW5QYWNrYWdlLm1haW50YWluZXJfZW1haWwsXG4gICAgKVxuXG4gICAgZXhwZWN0KHJlc3VsdENrYW5QYWNrYWdlLnJlc291cmNlcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKVxuXG4gICAgZXhwZWN0KHJlc3VsdENrYW5QYWNrYWdlLnRhZ3MubGVuZ3RoKS50b0VxdWFsKFxuICAgICAgb3JpZ2luYWxDa2FuUGFja2FnZS50YWdzLmxlbmd0aCxcbiAgICApXG4gICAgb3JpZ2luYWxDa2FuUGFja2FnZS50YWdzLmZvckVhY2gob3JpZ2luYWxUYWcgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdUYWcgPSByZXN1bHRDa2FuUGFja2FnZS50YWdzLmZpbmQoXG4gICAgICAgIHRhZyA9PiB0YWcubmFtZSA9PT0gb3JpZ2luYWxUYWcubmFtZSxcbiAgICAgIClcbiAgICAgIGV4cGVjdChtYXRjaGluZ1RhZykudG9CZVRydXRoeSgpXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,308 @@
1
+ {
2
+ "author": "Test Author",
3
+ "author_email": "test@email.com",
4
+ "creator_user_id": "47c7f1b1-0ef5-4d7b-b43c-811c51c9e349",
5
+ "id": "c322307a-b871-44fe-a602-32ee8437ff04",
6
+ "isopen": true,
7
+ "license_id": "cc-by",
8
+ "license_title": "Creative Commons Attribution",
9
+ "license_url": "http://www.opendefinition.org/licenses/cc-by",
10
+ "maintainer": "Test Maintainer",
11
+ "maintainer_email": "test@email.com",
12
+ "metadata_created": "2021-04-09T11:39:37.657233",
13
+ "metadata_modified": "2022-05-20T09:20:43.998956",
14
+ "name": "sample-dataset-1",
15
+ "notes": "A CKAN Dataset is a collection of data resources (such as files), together with a description and other information (what is known as metadata), at a fixed URL. \r\n\r\n",
16
+ "num_resources": 9,
17
+ "num_tags": 8,
18
+ "organization": {
19
+ "id": "1fa89238-ee96-4439-a885-22d15244d070",
20
+ "name": "sample-organization",
21
+ "title": "Sample Organization",
22
+ "type": "organization",
23
+ "description": "This is a sample organization.",
24
+ "image_url": "2022-05-20-084702.929838siurana.jpg",
25
+ "created": "2021-04-09T14:27:17.753798",
26
+ "is_organization": true,
27
+ "approval_status": "approved",
28
+ "state": "active"
29
+ },
30
+ "owner_org": "1fa89238-ee96-4439-a885-22d15244d070",
31
+ "private": false,
32
+ "state": "active",
33
+ "title": "Sample Dataset",
34
+ "type": "dataset",
35
+ "url": "",
36
+ "version": "1.0",
37
+ "groups": [
38
+ {
39
+ "description": "",
40
+ "display_name": "Test Group",
41
+ "id": "5d423f6b-137e-4d15-a156-868763fa7a64",
42
+ "image_display_url": "https://demo.ckan.org/uploads/group/2021-04-21-153504.571229064c7c.png",
43
+ "name": "test-group",
44
+ "title": "Test Group"
45
+ }
46
+ ],
47
+ "resources": [
48
+ {
49
+ "cache_last_updated": null,
50
+ "cache_url": null,
51
+ "created": "2021-04-09T14:31:09.032858",
52
+ "datastore_active": true,
53
+ "description": "This is a sample resource added via url.",
54
+ "format": "CSV",
55
+ "hash": "",
56
+ "id": "e687245d-7835-44b0-8ed3-0827de123895",
57
+ "last_modified": null,
58
+ "metadata_modified": "2021-04-09T14:31:09.021596",
59
+ "mimetype": "text/csv",
60
+ "mimetype_inner": null,
61
+ "name": "sample-linked.csv",
62
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
63
+ "position": 0,
64
+ "resource_type": null,
65
+ "size": null,
66
+ "state": "active",
67
+ "url": "https://raw.githubusercontent.com/datopian/CKAN_Demo_Datasets/main/resources/org1_sample.csv",
68
+ "url_type": null
69
+ },
70
+ {
71
+ "cache_last_updated": null,
72
+ "cache_url": null,
73
+ "created": "2021-04-09T14:31:45.092631",
74
+ "datastore_active": true,
75
+ "description": "Sample csv (uploaded).",
76
+ "format": "CSV",
77
+ "hash": "",
78
+ "id": "b53c9e72-6b59-4cda-8c0c-7d6a51dad12a",
79
+ "last_modified": "2021-04-09T16:13:57.353205",
80
+ "metadata_modified": "2021-04-09T16:13:57.367140",
81
+ "mimetype": "application/csv",
82
+ "mimetype_inner": null,
83
+ "name": "sample.csv",
84
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
85
+ "position": 1,
86
+ "resource_type": null,
87
+ "size": 6731,
88
+ "state": "active",
89
+ "url": "https://demo.ckan.org/dataset/c322307a-b871-44fe-a602-32ee8437ff04/resource/b53c9e72-6b59-4cda-8c0c-7d6a51dad12a/download/sample.csv",
90
+ "url_type": "upload"
91
+ },
92
+ {
93
+ "cache_last_updated": null,
94
+ "cache_url": null,
95
+ "created": "2021-04-09T16:21:17.140402",
96
+ "datastore_active": true,
97
+ "description": "Sample views for csv.",
98
+ "format": "CSV",
99
+ "hash": "",
100
+ "id": "9ce6650b-6ff0-4a52-9b10-09cfc29bbd7e",
101
+ "last_modified": "2021-04-09T16:21:17.106693",
102
+ "metadata_modified": "2021-04-13T12:41:06.751746",
103
+ "mimetype": null,
104
+ "mimetype_inner": null,
105
+ "name": "views.csv",
106
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
107
+ "position": 2,
108
+ "resource_type": null,
109
+ "size": 32773,
110
+ "state": "active",
111
+ "url": "https://demo.ckan.org/dataset/c322307a-b871-44fe-a602-32ee8437ff04/resource/9ce6650b-6ff0-4a52-9b10-09cfc29bbd7e/download/co2-mm-mlo_csv.csv",
112
+ "url_type": "upload"
113
+ },
114
+ {
115
+ "cache_last_updated": null,
116
+ "cache_url": null,
117
+ "created": "2021-04-09T14:49:24.711541",
118
+ "datastore_active": false,
119
+ "description": "Sample pdf file.",
120
+ "format": "PDF",
121
+ "hash": "",
122
+ "id": "8aa53505-3b7f-4b9c-9b54-cf674eadc3f1",
123
+ "last_modified": "2021-04-09T16:11:46.261373",
124
+ "metadata_modified": "2021-04-13T12:39:41.141419",
125
+ "mimetype": null,
126
+ "mimetype_inner": null,
127
+ "name": "sample.pdf",
128
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
129
+ "position": 3,
130
+ "resource_type": null,
131
+ "size": 712352,
132
+ "state": "active",
133
+ "url": "https://demo.ckan.org/dataset/c322307a-b871-44fe-a602-32ee8437ff04/resource/8aa53505-3b7f-4b9c-9b54-cf674eadc3f1/download/sample.pdf",
134
+ "url_type": "upload"
135
+ },
136
+ {
137
+ "cache_last_updated": null,
138
+ "cache_url": null,
139
+ "created": "2021-04-09T16:17:05.189302",
140
+ "datastore_active": false,
141
+ "description": "Sample txt file.",
142
+ "format": "TXT",
143
+ "hash": "",
144
+ "id": "0185907b-2812-437f-9c64-eae24771ef5f",
145
+ "last_modified": "2021-04-09T16:17:05.136426",
146
+ "metadata_modified": "2021-04-13T12:39:24.524530",
147
+ "mimetype": null,
148
+ "mimetype_inner": null,
149
+ "name": "sample.txt",
150
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
151
+ "position": 4,
152
+ "resource_type": null,
153
+ "size": 85,
154
+ "state": "active",
155
+ "url": "https://demo.ckan.org/dataset/c322307a-b871-44fe-a602-32ee8437ff04/resource/0185907b-2812-437f-9c64-eae24771ef5f/download/sample.txt",
156
+ "url_type": "upload"
157
+ },
158
+ {
159
+ "cache_last_updated": null,
160
+ "cache_url": null,
161
+ "created": "2021-04-13T12:19:02.178513",
162
+ "datastore_active": false,
163
+ "description": "Sample GeoJSON resource for the list of countries.\r\n\r\nResource taken from https://openlayers.org/ \r\nLicensed under the 2-Clause BSD (https://www.tldrlegal.com/l/freebsd)",
164
+ "format": "GeoJSON",
165
+ "hash": "",
166
+ "id": "ecd4a62d-998b-46e4-8a64-cadac2125c64",
167
+ "last_modified": "2021-04-13T12:19:01.921374",
168
+ "metadata_modified": "2021-04-13T12:29:29.067536",
169
+ "mimetype": null,
170
+ "mimetype_inner": null,
171
+ "name": "sample.geojson",
172
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
173
+ "position": 5,
174
+ "resource_type": null,
175
+ "size": 255943,
176
+ "state": "active",
177
+ "url": "https://demo.ckan.org/dataset/c322307a-b871-44fe-a602-32ee8437ff04/resource/ecd4a62d-998b-46e4-8a64-cadac2125c64/download/countries.geojson",
178
+ "url_type": "upload"
179
+ },
180
+ {
181
+ "cache_last_updated": null,
182
+ "cache_url": null,
183
+ "created": "2021-04-13T12:32:17.823512",
184
+ "datastore_active": false,
185
+ "description": "Sample kml file for Earthquakes of magnitude 5 in 2012.\r\n\r\nResource taken from https://openlayers.org/ \r\nLicensed under the 2-Clause BSD (https://www.tldrlegal.com/l/freebsd)\r\n",
186
+ "format": "KML",
187
+ "hash": "",
188
+ "id": "048333ab-9608-42dc-901b-a7dd9fca3dda",
189
+ "last_modified": "2021-04-13T12:32:17.769578",
190
+ "metadata_modified": "2021-04-13T12:40:09.731123",
191
+ "mimetype": null,
192
+ "mimetype_inner": null,
193
+ "name": "sample.kml",
194
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
195
+ "position": 6,
196
+ "resource_type": null,
197
+ "size": 474000,
198
+ "state": "active",
199
+ "url": "https://demo.ckan.org/dataset/c322307a-b871-44fe-a602-32ee8437ff04/resource/048333ab-9608-42dc-901b-a7dd9fca3dda/download/2012_earthquakes_mag5.kml",
200
+ "url_type": "upload"
201
+ },
202
+ {
203
+ "cache_last_updated": null,
204
+ "cache_url": null,
205
+ "created": "2022-04-11T18:35:24.435997",
206
+ "datastore_active": false,
207
+ "description": "",
208
+ "format": "JPEG",
209
+ "hash": "",
210
+ "id": "b6c22c1d-e789-490d-b935-989093bbb173",
211
+ "last_modified": "2022-04-11T18:35:24.381740",
212
+ "metadata_modified": "2022-05-20T09:03:31.574365",
213
+ "mimetype": "image/png",
214
+ "mimetype_inner": null,
215
+ "name": "avoid-crowds-when-buying-materials-social-media-post.jpeg",
216
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
217
+ "position": 7,
218
+ "resource_type": null,
219
+ "size": 444695,
220
+ "state": "active",
221
+ "url": "https://demo.ckan.org/dataset/c322307a-b871-44fe-a602-32ee8437ff04/resource/b6c22c1d-e789-490d-b935-989093bbb173/download/avoid-crowds-when-buying-materials-social-media-post.jpeg",
222
+ "url_type": "upload"
223
+ },
224
+ {
225
+ "cache_last_updated": null,
226
+ "cache_url": null,
227
+ "created": "2022-05-20T09:03:31.617635",
228
+ "datastore_active": false,
229
+ "description": "",
230
+ "format": "WMS",
231
+ "hash": "",
232
+ "id": "664e5e2c-bd7d-4972-a245-a747f7d61cc9",
233
+ "last_modified": null,
234
+ "metadata_modified": "2022-05-20T09:03:42.450846",
235
+ "mimetype": null,
236
+ "mimetype_inner": null,
237
+ "name": "Sample WMS",
238
+ "package_id": "c322307a-b871-44fe-a602-32ee8437ff04",
239
+ "position": 8,
240
+ "resource_type": null,
241
+ "size": null,
242
+ "state": "active",
243
+ "url": "https://geoserveis.icgc.cat/icc_mapesbase/wms/service?",
244
+ "url_type": null
245
+ }
246
+ ],
247
+ "tags": [
248
+ {
249
+ "display_name": "csv",
250
+ "id": "b5e651dd-8f42-445c-b9c4-2f09a3268427",
251
+ "name": "csv",
252
+ "state": "active",
253
+ "vocabulary_id": null
254
+ },
255
+ {
256
+ "display_name": "economy",
257
+ "id": "0c4f9ad5-a372-4bda-a59b-e560cf264b0f",
258
+ "name": "economy",
259
+ "state": "active",
260
+ "vocabulary_id": null
261
+ },
262
+ {
263
+ "display_name": "geojson",
264
+ "id": "a91d1c52-bd37-40fc-a1f2-6610ac7f39f3",
265
+ "name": "geojson",
266
+ "state": "active",
267
+ "vocabulary_id": null
268
+ },
269
+ {
270
+ "display_name": "kml",
271
+ "id": "f29e8c38-be23-430b-bae0-7898f59d0089",
272
+ "name": "kml",
273
+ "state": "active",
274
+ "vocabulary_id": null
275
+ },
276
+ {
277
+ "display_name": "pdf",
278
+ "id": "a4ba9601-bfa5-4322-8a62-38a83f2348c1",
279
+ "name": "pdf",
280
+ "state": "active",
281
+ "vocabulary_id": null
282
+ },
283
+ {
284
+ "display_name": "sample",
285
+ "id": "1e6aa0c9-0dfc-448a-8c13-b5fd8ab2fefd",
286
+ "name": "sample",
287
+ "state": "active",
288
+ "vocabulary_id": null
289
+ },
290
+ {
291
+ "display_name": "txt",
292
+ "id": "19e5f926-d769-49cf-a82c-80870baa3528",
293
+ "name": "txt",
294
+ "state": "active",
295
+ "vocabulary_id": null
296
+ },
297
+ {
298
+ "display_name": "wms",
299
+ "id": "1279dad1-9397-48e1-94b8-0999bac75aee",
300
+ "name": "wms",
301
+ "state": "active",
302
+ "vocabulary_id": null
303
+ }
304
+ ],
305
+ "extras": [],
306
+ "relationships_as_subject": [],
307
+ "relationships_as_object": []
308
+ }
@@ -0,0 +1,7 @@
1
+ export type { CkanPackage } from "./Package.ts";
2
+ export type { CkanOrganization } from "./Organization.ts";
3
+ export type { CkanTag } from "./Tag.ts";
4
+ export { loadPackageFromCkan } from "./load.ts";
5
+ export { savePackageToCkan } from "./save.ts";
6
+ export { convertPackageFromCkan } from "./convert/fromCkan.ts";
7
+ export { convertPackageToCkan } from "./convert/toCkan.ts";
@@ -0,0 +1,5 @@
1
+ export { loadPackageFromCkan } from "./load.js";
2
+ export { savePackageToCkan } from "./save.js";
3
+ export { convertPackageFromCkan } from "./convert/fromCkan.js";
4
+ export { convertPackageToCkan } from "./convert/toCkan.js";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vcGFja2FnZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgeyBDa2FuUGFja2FnZSB9IGZyb20gXCIuL1BhY2thZ2UudHNcIlxuZXhwb3J0IHR5cGUgeyBDa2FuT3JnYW5pemF0aW9uIH0gZnJvbSBcIi4vT3JnYW5pemF0aW9uLnRzXCJcbmV4cG9ydCB0eXBlIHsgQ2thblRhZyB9IGZyb20gXCIuL1RhZy50c1wiXG5leHBvcnQgeyBsb2FkUGFja2FnZUZyb21Da2FuIH0gZnJvbSBcIi4vbG9hZC50c1wiXG5leHBvcnQgeyBzYXZlUGFja2FnZVRvQ2thbiB9IGZyb20gXCIuL3NhdmUudHNcIlxuZXhwb3J0IHsgY29udmVydFBhY2thZ2VGcm9tQ2thbiB9IGZyb20gXCIuL2NvbnZlcnQvZnJvbUNrYW4udHNcIlxuZXhwb3J0IHsgY29udmVydFBhY2thZ2VUb0NrYW4gfSBmcm9tIFwiLi9jb252ZXJ0L3RvQ2thbi50c1wiXG4iXX0=
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Load a package from a CKAN instance
3
+ * @param props Object containing the URL to the CKAN package
4
+ * @returns Package object and cleanup function
5
+ */
6
+ export declare function loadPackageFromCkan(datasetUrl: string): Promise<{
7
+ [x: `${string}:${string}`]: any;
8
+ $schema?: string;
9
+ resources: import("@frictionless-ts/metadata").Resource[];
10
+ name?: string;
11
+ title?: string;
12
+ description?: string;
13
+ homepage?: string;
14
+ version?: string;
15
+ licenses?: import("@frictionless-ts/metadata").License[];
16
+ contributors?: import("@frictionless-ts/metadata").Contributor[];
17
+ sources?: import("@frictionless-ts/metadata").Source[];
18
+ keywords?: string[];
19
+ created?: string;
20
+ image?: string;
21
+ }>;
@@ -0,0 +1,74 @@
1
+ import { mergePackages } from "../../../package/index.js";
2
+ import { makeCkanApiRequest } from "../ckan/index.js";
3
+ import { convertPackageFromCkan } from "./convert/fromCkan.js";
4
+ /**
5
+ * Load a package from a CKAN instance
6
+ * @param props Object containing the URL to the CKAN package
7
+ * @returns Package object and cleanup function
8
+ */
9
+ export async function loadPackageFromCkan(datasetUrl) {
10
+ const packageId = extractPackageId(datasetUrl);
11
+ if (!packageId) {
12
+ throw new Error(`Failed to extract package ID from URL: ${datasetUrl}`);
13
+ }
14
+ const ckanPackage = await makeCkanApiRequest({
15
+ ckanUrl: datasetUrl,
16
+ action: "package_show",
17
+ payload: { id: packageId },
18
+ });
19
+ for (const resource of ckanPackage.resources) {
20
+ const resourceId = resource.id;
21
+ if (["CSV", "XLS", "XLSX"].includes(resource.format)) {
22
+ const schema = await loadCkanSchema({ datasetUrl, resourceId });
23
+ if (schema) {
24
+ resource.schema = schema;
25
+ }
26
+ }
27
+ }
28
+ const systemPackage = convertPackageFromCkan(ckanPackage);
29
+ const userPackagePath = systemPackage.resources
30
+ .filter(resource => resource["ckan:key"] === "datapackage.json")
31
+ .map(resource => resource["ckan:url"])
32
+ .at(0);
33
+ const datapackage = await mergePackages({ systemPackage, userPackagePath });
34
+ datapackage.resources = datapackage.resources.map(resource => {
35
+ // TODO: remove these keys completely
36
+ return { ...resource, "ckan:key": undefined, "ckan:url": undefined };
37
+ });
38
+ return datapackage;
39
+ }
40
+ /**
41
+ * Extract package ID from URL
42
+ *
43
+ * Examples:
44
+ * - https://hri.fi/data/en_GB/dataset/helsingin-kaupungin-verkkosivustojen-kavijaanalytiikka
45
+ * - https://www.opendata.dk/city-of-copenhagen/parkeringszoner-information
46
+ * - https://open.africa/dataset/pib-annual-senegal
47
+ * - https://data.nhm.ac.uk/dataset/join-the-dots-collection-level-descriptions
48
+ */
49
+ function extractPackageId(datasetUrl) {
50
+ const url = new URL(datasetUrl);
51
+ const pathParts = url.pathname.split("/").filter(Boolean);
52
+ return pathParts.at(-1);
53
+ }
54
+ /**
55
+ * Fetch resource schema data from CKAN datastore
56
+ */
57
+ async function loadCkanSchema(options) {
58
+ try {
59
+ // For some reason, datastore_info doesn't work
60
+ // So we use data fetching endpoint that also returns the schema
61
+ const result = await makeCkanApiRequest({
62
+ ckanUrl: options.datasetUrl,
63
+ action: "datastore_search",
64
+ payload: { resource_id: options.resourceId, limit: 0 },
65
+ });
66
+ // @ts-ignore
67
+ const fields = result.fields.filter((field) => field.id !== "_id" && field.id !== "_full_text");
68
+ return { fields };
69
+ }
70
+ catch (error) {
71
+ return undefined;
72
+ }
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbnMvY2thbi9wYWNrYWdlL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRXJELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRTlEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFVBQWtCO0lBQzFELE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzlDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDekUsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sa0JBQWtCLENBQWM7UUFDeEQsT0FBTyxFQUFFLFVBQVU7UUFDbkIsTUFBTSxFQUFFLGNBQWM7UUFDdEIsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRTtLQUMzQixDQUFDLENBQUE7SUFFRixLQUFLLE1BQU0sUUFBUSxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFBO1FBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1lBQy9ELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7WUFDMUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDekQsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLFNBQVM7U0FDNUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLGtCQUFrQixDQUFDO1NBQy9ELEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNyQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFUixNQUFNLFdBQVcsR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFBO0lBQzNFLFdBQVcsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDM0QscUNBQXFDO1FBQ3JDLE9BQU8sRUFBRSxHQUFHLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQTtJQUN0RSxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsVUFBa0I7SUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDL0IsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pELE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3pCLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxjQUFjLENBQUMsT0FHN0I7SUFDQyxJQUFJLENBQUM7UUFDSCwrQ0FBK0M7UUFDL0MsZ0VBQWdFO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQUM7WUFDdEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzNCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUN2RCxDQUFDLENBQUE7UUFFRixhQUFhO1FBQ2IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ2pDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FDaEUsQ0FBQTtRQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVyZ2VQYWNrYWdlcyB9IGZyb20gXCIuLi8uLi8uLi9wYWNrYWdlL2luZGV4LnRzXCJcbmltcG9ydCB7IG1ha2VDa2FuQXBpUmVxdWVzdCB9IGZyb20gXCIuLi9ja2FuL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgQ2thblBhY2thZ2UgfSBmcm9tIFwiLi9QYWNrYWdlLnRzXCJcbmltcG9ydCB7IGNvbnZlcnRQYWNrYWdlRnJvbUNrYW4gfSBmcm9tIFwiLi9jb252ZXJ0L2Zyb21Da2FuLnRzXCJcblxuLyoqXG4gKiBMb2FkIGEgcGFja2FnZSBmcm9tIGEgQ0tBTiBpbnN0YW5jZVxuICogQHBhcmFtIHByb3BzIE9iamVjdCBjb250YWluaW5nIHRoZSBVUkwgdG8gdGhlIENLQU4gcGFja2FnZVxuICogQHJldHVybnMgUGFja2FnZSBvYmplY3QgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQYWNrYWdlRnJvbUNrYW4oZGF0YXNldFVybDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhY2thZ2VJZCA9IGV4dHJhY3RQYWNrYWdlSWQoZGF0YXNldFVybClcbiAgaWYgKCFwYWNrYWdlSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBleHRyYWN0IHBhY2thZ2UgSUQgZnJvbSBVUkw6ICR7ZGF0YXNldFVybH1gKVxuICB9XG5cbiAgY29uc3QgY2thblBhY2thZ2UgPSBhd2FpdCBtYWtlQ2thbkFwaVJlcXVlc3Q8Q2thblBhY2thZ2U+KHtcbiAgICBja2FuVXJsOiBkYXRhc2V0VXJsLFxuICAgIGFjdGlvbjogXCJwYWNrYWdlX3Nob3dcIixcbiAgICBwYXlsb2FkOiB7IGlkOiBwYWNrYWdlSWQgfSxcbiAgfSlcblxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNrYW5QYWNrYWdlLnJlc291cmNlcykge1xuICAgIGNvbnN0IHJlc291cmNlSWQgPSByZXNvdXJjZS5pZFxuICAgIGlmIChbXCJDU1ZcIiwgXCJYTFNcIiwgXCJYTFNYXCJdLmluY2x1ZGVzKHJlc291cmNlLmZvcm1hdCkpIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGxvYWRDa2FuU2NoZW1hKHsgZGF0YXNldFVybCwgcmVzb3VyY2VJZCB9KVxuICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICByZXNvdXJjZS5zY2hlbWEgPSBzY2hlbWFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzeXN0ZW1QYWNrYWdlID0gY29udmVydFBhY2thZ2VGcm9tQ2thbihja2FuUGFja2FnZSlcbiAgY29uc3QgdXNlclBhY2thZ2VQYXRoID0gc3lzdGVtUGFja2FnZS5yZXNvdXJjZXNcbiAgICAuZmlsdGVyKHJlc291cmNlID0+IHJlc291cmNlW1wiY2thbjprZXlcIl0gPT09IFwiZGF0YXBhY2thZ2UuanNvblwiKVxuICAgIC5tYXAocmVzb3VyY2UgPT4gcmVzb3VyY2VbXCJja2FuOnVybFwiXSlcbiAgICAuYXQoMClcblxuICBjb25zdCBkYXRhcGFja2FnZSA9IGF3YWl0IG1lcmdlUGFja2FnZXMoeyBzeXN0ZW1QYWNrYWdlLCB1c2VyUGFja2FnZVBhdGggfSlcbiAgZGF0YXBhY2thZ2UucmVzb3VyY2VzID0gZGF0YXBhY2thZ2UucmVzb3VyY2VzLm1hcChyZXNvdXJjZSA9PiB7XG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIGtleXMgY29tcGxldGVseVxuICAgIHJldHVybiB7IC4uLnJlc291cmNlLCBcImNrYW46a2V5XCI6IHVuZGVmaW5lZCwgXCJja2FuOnVybFwiOiB1bmRlZmluZWQgfVxuICB9KVxuXG4gIHJldHVybiBkYXRhcGFja2FnZVxufVxuXG4vKipcbiAqIEV4dHJhY3QgcGFja2FnZSBJRCBmcm9tIFVSTFxuICpcbiAqIEV4YW1wbGVzOlxuICogLSBodHRwczovL2hyaS5maS9kYXRhL2VuX0dCL2RhdGFzZXQvaGVsc2luZ2luLWthdXB1bmdpbi12ZXJra29zaXZ1c3RvamVuLWthdmlqYWFuYWx5dGlpa2thXG4gKiAtIGh0dHBzOi8vd3d3Lm9wZW5kYXRhLmRrL2NpdHktb2YtY29wZW5oYWdlbi9wYXJrZXJpbmdzem9uZXItaW5mb3JtYXRpb25cbiAqIC0gaHR0cHM6Ly9vcGVuLmFmcmljYS9kYXRhc2V0L3BpYi1hbm51YWwtc2VuZWdhbFxuICogLSBodHRwczovL2RhdGEubmhtLmFjLnVrL2RhdGFzZXQvam9pbi10aGUtZG90cy1jb2xsZWN0aW9uLWxldmVsLWRlc2NyaXB0aW9uc1xuICovXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZUlkKGRhdGFzZXRVcmw6IHN0cmluZykge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKGRhdGFzZXRVcmwpXG4gIGNvbnN0IHBhdGhQYXJ0cyA9IHVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pXG4gIHJldHVybiBwYXRoUGFydHMuYXQoLTEpXG59XG5cbi8qKlxuICogRmV0Y2ggcmVzb3VyY2Ugc2NoZW1hIGRhdGEgZnJvbSBDS0FOIGRhdGFzdG9yZVxuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkQ2thblNjaGVtYShvcHRpb25zOiB7XG4gIGRhdGFzZXRVcmw6IHN0cmluZ1xuICByZXNvdXJjZUlkOiBzdHJpbmdcbn0pIHtcbiAgdHJ5IHtcbiAgICAvLyBGb3Igc29tZSByZWFzb24sIGRhdGFzdG9yZV9pbmZvIGRvZXNuJ3Qgd29ya1xuICAgIC8vIFNvIHdlIHVzZSBkYXRhIGZldGNoaW5nIGVuZHBvaW50IHRoYXQgYWxzbyByZXR1cm5zIHRoZSBzY2hlbWFcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtYWtlQ2thbkFwaVJlcXVlc3Qoe1xuICAgICAgY2thblVybDogb3B0aW9ucy5kYXRhc2V0VXJsLFxuICAgICAgYWN0aW9uOiBcImRhdGFzdG9yZV9zZWFyY2hcIixcbiAgICAgIHBheWxvYWQ6IHsgcmVzb3VyY2VfaWQ6IG9wdGlvbnMucmVzb3VyY2VJZCwgbGltaXQ6IDAgfSxcbiAgICB9KVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGZpZWxkcyA9IHJlc3VsdC5maWVsZHMuZmlsdGVyKFxuICAgICAgKGZpZWxkOiBhbnkpID0+IGZpZWxkLmlkICE9PSBcIl9pZFwiICYmIGZpZWxkLmlkICE9PSBcIl9mdWxsX3RleHRcIixcbiAgICApXG5cbiAgICByZXR1cm4geyBmaWVsZHMgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { useRecording } from "vitest-polly";
3
+ import { loadPackageFromCkan } from "./load.js";
4
+ useRecording();
5
+ describe("loadPackageFromCkan", () => {
6
+ it("should load a package", async () => {
7
+ const dataPackage = await loadPackageFromCkan("https://data.nhm.ac.uk/dataset/join-the-dots-collection-level-descriptions");
8
+ expect(dataPackage).toMatchSnapshot();
9
+ });
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9ja2FuL3BhY2thZ2UvbG9hZC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUUvQyxZQUFZLEVBQUUsQ0FBQTtBQUVkLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7SUFDbkMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sbUJBQW1CLENBQzNDLDRFQUE0RSxDQUM3RSxDQUFBO1FBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQ3ZDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgdXNlUmVjb3JkaW5nIH0gZnJvbSBcInZpdGVzdC1wb2xseVwiXG5pbXBvcnQgeyBsb2FkUGFja2FnZUZyb21Da2FuIH0gZnJvbSBcIi4vbG9hZC50c1wiXG5cbnVzZVJlY29yZGluZygpXG5cbmRlc2NyaWJlKFwibG9hZFBhY2thZ2VGcm9tQ2thblwiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIGxvYWQgYSBwYWNrYWdlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkYXRhUGFja2FnZSA9IGF3YWl0IGxvYWRQYWNrYWdlRnJvbUNrYW4oXG4gICAgICBcImh0dHBzOi8vZGF0YS5uaG0uYWMudWsvZGF0YXNldC9qb2luLXRoZS1kb3RzLWNvbGxlY3Rpb24tbGV2ZWwtZGVzY3JpcHRpb25zXCIsXG4gICAgKVxuXG4gICAgZXhwZWN0KGRhdGFQYWNrYWdlKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import type { Package } from "@frictionless-ts/metadata";
2
+ export declare function savePackageToCkan(dataPackage: Package, options: {
3
+ apiKey: string;
4
+ ckanUrl: string;
5
+ ownerOrg: string;
6
+ datasetName: string;
7
+ }): Promise<{
8
+ path: unknown;
9
+ datasetUrl: string;
10
+ }>;