@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,56 @@
1
+ import type { SetRequired } from "type-fest";
2
+ import type { CkanSchema } from "../schema/index.ts";
3
+ /**
4
+ * CKAN Resource interface
5
+ */
6
+ export interface CkanResource {
7
+ /**
8
+ * Resource identifier
9
+ */
10
+ id: string;
11
+ /**
12
+ * Resource URL
13
+ */
14
+ url: string;
15
+ /**
16
+ * Resource name
17
+ */
18
+ name: string;
19
+ /**
20
+ * Resource creation timestamp
21
+ */
22
+ created: string;
23
+ /**
24
+ * Resource description
25
+ */
26
+ description: string;
27
+ /**
28
+ * Resource format
29
+ */
30
+ format: string;
31
+ /**
32
+ * Resource hash
33
+ */
34
+ hash: string;
35
+ /**
36
+ * Resource last modification timestamp
37
+ */
38
+ last_modified: string;
39
+ /**
40
+ * Resource metadata modification timestamp
41
+ */
42
+ metadata_modified: string;
43
+ /**
44
+ * Resource MIME type
45
+ */
46
+ mimetype: string;
47
+ /**
48
+ * Resource size in bytes
49
+ */
50
+ size: number;
51
+ /**
52
+ * Resource schema
53
+ */
54
+ schema?: CkanSchema;
55
+ }
56
+ export type NewCkanResource = SetRequired<Partial<CkanResource>, "url" | "name">;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vcmVzb3VyY2UvUmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2V0UmVxdWlyZWQgfSBmcm9tIFwidHlwZS1mZXN0XCJcbmltcG9ydCB0eXBlIHsgQ2thblNjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWEvaW5kZXgudHNcIlxuXG4vKipcbiAqIENLQU4gUmVzb3VyY2UgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2thblJlc291cmNlIHtcbiAgLyoqXG4gICAqIFJlc291cmNlIGlkZW50aWZpZXJcbiAgICovXG4gIGlkOiBzdHJpbmdcblxuICAvKipcbiAgICogUmVzb3VyY2UgVVJMXG4gICAqL1xuICB1cmw6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogUmVzb3VyY2UgY3JlYXRpb24gdGltZXN0YW1wXG4gICAqL1xuICBjcmVhdGVkOiBzdHJpbmdcblxuICAvKipcbiAgICogUmVzb3VyY2UgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcblxuICAvKipcbiAgICogUmVzb3VyY2UgZm9ybWF0XG4gICAqL1xuICBmb3JtYXQ6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBoYXNoXG4gICAqL1xuICBoYXNoOiBzdHJpbmdcblxuICAvKipcbiAgICogUmVzb3VyY2UgbGFzdCBtb2RpZmljYXRpb24gdGltZXN0YW1wXG4gICAqL1xuICBsYXN0X21vZGlmaWVkOiBzdHJpbmdcblxuICAvKipcbiAgICogUmVzb3VyY2UgbWV0YWRhdGEgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcFxuICAgKi9cbiAgbWV0YWRhdGFfbW9kaWZpZWQ6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBNSU1FIHR5cGVcbiAgICovXG4gIG1pbWV0eXBlOiBzdHJpbmdcblxuICAvKipcbiAgICogUmVzb3VyY2Ugc2l6ZSBpbiBieXRlc1xuICAgKi9cbiAgc2l6ZTogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFJlc291cmNlIHNjaGVtYVxuICAgKi9cbiAgc2NoZW1hPzogQ2thblNjaGVtYVxufVxuXG5leHBvcnQgdHlwZSBOZXdDa2FuUmVzb3VyY2UgPSBTZXRSZXF1aXJlZDxQYXJ0aWFsPENrYW5SZXNvdXJjZT4sIFwidXJsXCIgfCBcIm5hbWVcIj5cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ import type { CkanResource } from "../Resource.ts";
3
+ export declare function convertResourceFromCkan(ckanResource: CkanResource): Resource;
@@ -0,0 +1,39 @@
1
+ import { getFilename } from "@frictionless-ts/metadata";
2
+ import { convertSchemaFromCkan } from "../../schema/index.js";
3
+ export function convertResourceFromCkan(ckanResource) {
4
+ const resource = {
5
+ name: convertName(ckanResource.name),
6
+ path: ckanResource.url,
7
+ "ckan:key": getFilename(ckanResource.url),
8
+ "ckan:url": ckanResource.url,
9
+ };
10
+ if (ckanResource.description) {
11
+ resource.description = ckanResource.description;
12
+ }
13
+ if (ckanResource.format) {
14
+ resource.format = ckanResource.format.toLowerCase();
15
+ }
16
+ if (ckanResource.mimetype) {
17
+ resource.mediatype = ckanResource.mimetype;
18
+ }
19
+ if (ckanResource.size) {
20
+ resource.bytes = ckanResource.size;
21
+ }
22
+ if (ckanResource.hash) {
23
+ resource.hash = ckanResource.hash;
24
+ }
25
+ if (ckanResource.schema) {
26
+ resource.type = "table";
27
+ resource.schema = convertSchemaFromCkan(ckanResource.schema);
28
+ }
29
+ return resource;
30
+ }
31
+ function convertName(name) {
32
+ return name
33
+ .replace(/[\s\.\(\)\/\\,]+/g, "_")
34
+ .toLowerCase()
35
+ .replace(/[^a-z0-9_\-]/g, "")
36
+ .replace(/^(\d)/, "_$1")
37
+ .slice(0, 100);
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbUNrYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vcmVzb3VyY2UvY29udmVydC9mcm9tQ2thbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFHN0QsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFlBQTBCO0lBQ2hFLE1BQU0sUUFBUSxHQUFhO1FBQ3pCLElBQUksRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUNwQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUc7UUFDdEIsVUFBVSxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1FBQ3pDLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRztLQUM3QixDQUFBO0lBRUQsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0IsUUFBUSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFBO0lBQ2pELENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4QixRQUFRLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDckQsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQTtJQUM1QyxDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsUUFBUSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFBO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixRQUFRLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUE7SUFDbkMsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBQ3ZCLFFBQVEsQ0FBQyxNQUFNLEdBQUcscUJBQXFCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBWTtJQUMvQixPQUFPLElBQUk7U0FDUixPQUFPLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDO1NBQ2pDLFdBQVcsRUFBRTtTQUNiLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1NBQzVCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO1NBQ3ZCLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb3VyY2UgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBnZXRGaWxlbmFtZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB7IGNvbnZlcnRTY2hlbWFGcm9tQ2thbiB9IGZyb20gXCIuLi8uLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBDa2FuUmVzb3VyY2UgfSBmcm9tIFwiLi4vUmVzb3VyY2UudHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFJlc291cmNlRnJvbUNrYW4oY2thblJlc291cmNlOiBDa2FuUmVzb3VyY2UpOiBSZXNvdXJjZSB7XG4gIGNvbnN0IHJlc291cmNlOiBSZXNvdXJjZSA9IHtcbiAgICBuYW1lOiBjb252ZXJ0TmFtZShja2FuUmVzb3VyY2UubmFtZSksXG4gICAgcGF0aDogY2thblJlc291cmNlLnVybCxcbiAgICBcImNrYW46a2V5XCI6IGdldEZpbGVuYW1lKGNrYW5SZXNvdXJjZS51cmwpLFxuICAgIFwiY2thbjp1cmxcIjogY2thblJlc291cmNlLnVybCxcbiAgfVxuXG4gIGlmIChja2FuUmVzb3VyY2UuZGVzY3JpcHRpb24pIHtcbiAgICByZXNvdXJjZS5kZXNjcmlwdGlvbiA9IGNrYW5SZXNvdXJjZS5kZXNjcmlwdGlvblxuICB9XG5cbiAgaWYgKGNrYW5SZXNvdXJjZS5mb3JtYXQpIHtcbiAgICByZXNvdXJjZS5mb3JtYXQgPSBja2FuUmVzb3VyY2UuZm9ybWF0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIGlmIChja2FuUmVzb3VyY2UubWltZXR5cGUpIHtcbiAgICByZXNvdXJjZS5tZWRpYXR5cGUgPSBja2FuUmVzb3VyY2UubWltZXR5cGVcbiAgfVxuXG4gIGlmIChja2FuUmVzb3VyY2Uuc2l6ZSkge1xuICAgIHJlc291cmNlLmJ5dGVzID0gY2thblJlc291cmNlLnNpemVcbiAgfVxuXG4gIGlmIChja2FuUmVzb3VyY2UuaGFzaCkge1xuICAgIHJlc291cmNlLmhhc2ggPSBja2FuUmVzb3VyY2UuaGFzaFxuICB9XG5cbiAgaWYgKGNrYW5SZXNvdXJjZS5zY2hlbWEpIHtcbiAgICByZXNvdXJjZS50eXBlID0gXCJ0YWJsZVwiXG4gICAgcmVzb3VyY2Uuc2NoZW1hID0gY29udmVydFNjaGVtYUZyb21Da2FuKGNrYW5SZXNvdXJjZS5zY2hlbWEpXG4gIH1cblxuICByZXR1cm4gcmVzb3VyY2Vcbn1cblxuZnVuY3Rpb24gY29udmVydE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVcbiAgICAucmVwbGFjZSgvW1xcc1xcLlxcKFxcKVxcL1xcXFwsXSsvZywgXCJfXCIpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW15hLXowLTlfXFwtXS9nLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9eKFxcZCkvLCBcIl8kMVwiKVxuICAgIC5zbGljZSgwLCAxMDApXG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import type { Resource } from "@frictionless-ts/metadata";
2
+ import type { CkanResource } from "../Resource.ts";
3
+ export declare function convertResourceToCkan(resource: Resource): Partial<CkanResource>;
@@ -0,0 +1,20 @@
1
+ export function convertResourceToCkan(resource) {
2
+ const ckanResource = {};
3
+ if (resource.description) {
4
+ ckanResource.description = resource.description;
5
+ }
6
+ if (resource.format) {
7
+ ckanResource.format = resource.format.toUpperCase();
8
+ }
9
+ if (resource.mediatype) {
10
+ ckanResource.mimetype = resource.mediatype;
11
+ }
12
+ if (resource.bytes) {
13
+ ckanResource.size = resource.bytes;
14
+ }
15
+ if (resource.hash) {
16
+ ckanResource.hash = resource.hash;
17
+ }
18
+ return ckanResource;
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9Da2FuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGx1Z2lucy9ja2FuL3Jlc291cmNlL2NvbnZlcnQvdG9Da2FuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxRQUFrQjtJQUN0RCxNQUFNLFlBQVksR0FBMEIsRUFBRSxDQUFBO0lBRTlDLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLFlBQVksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsWUFBWSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3JELENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN2QixZQUFZLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUE7SUFDNUMsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLFlBQVksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsWUFBWSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFBO0lBQ25DLENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQTtBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgQ2thblJlc291cmNlIH0gZnJvbSBcIi4uL1Jlc291cmNlLnRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRSZXNvdXJjZVRvQ2thbihyZXNvdXJjZTogUmVzb3VyY2UpIHtcbiAgY29uc3QgY2thblJlc291cmNlOiBQYXJ0aWFsPENrYW5SZXNvdXJjZT4gPSB7fVxuXG4gIGlmIChyZXNvdXJjZS5kZXNjcmlwdGlvbikge1xuICAgIGNrYW5SZXNvdXJjZS5kZXNjcmlwdGlvbiA9IHJlc291cmNlLmRlc2NyaXB0aW9uXG4gIH1cblxuICBpZiAocmVzb3VyY2UuZm9ybWF0KSB7XG4gICAgY2thblJlc291cmNlLmZvcm1hdCA9IHJlc291cmNlLmZvcm1hdC50b1VwcGVyQ2FzZSgpXG4gIH1cblxuICBpZiAocmVzb3VyY2UubWVkaWF0eXBlKSB7XG4gICAgY2thblJlc291cmNlLm1pbWV0eXBlID0gcmVzb3VyY2UubWVkaWF0eXBlXG4gIH1cblxuICBpZiAocmVzb3VyY2UuYnl0ZXMpIHtcbiAgICBja2FuUmVzb3VyY2Uuc2l6ZSA9IHJlc291cmNlLmJ5dGVzXG4gIH1cblxuICBpZiAocmVzb3VyY2UuaGFzaCkge1xuICAgIGNrYW5SZXNvdXJjZS5oYXNoID0gcmVzb3VyY2UuaGFzaFxuICB9XG5cbiAgcmV0dXJuIGNrYW5SZXNvdXJjZVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export type { CkanResource } from "./Resource.ts";
2
+ export { convertResourceFromCkan } from "./convert/fromCkan.ts";
3
+ export { convertResourceToCkan } from "./convert/toCkan.ts";
@@ -0,0 +1,3 @@
1
+ export { convertResourceFromCkan } from "./convert/fromCkan.js";
2
+ export { convertResourceToCkan } from "./convert/toCkan.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vcmVzb3VyY2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDL0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IENrYW5SZXNvdXJjZSB9IGZyb20gXCIuL1Jlc291cmNlLnRzXCJcbmV4cG9ydCB7IGNvbnZlcnRSZXNvdXJjZUZyb21Da2FuIH0gZnJvbSBcIi4vY29udmVydC9mcm9tQ2thbi50c1wiXG5leHBvcnQgeyBjb252ZXJ0UmVzb3VyY2VUb0NrYW4gfSBmcm9tIFwiLi9jb252ZXJ0L3RvQ2thbi50c1wiXG4iXX0=
@@ -0,0 +1,34 @@
1
+ /**
2
+ * CKAN Field interface
3
+ */
4
+ export interface CkanField {
5
+ /**
6
+ * Field identifier
7
+ */
8
+ id: string;
9
+ /**
10
+ * Field data type
11
+ */
12
+ type: string;
13
+ /**
14
+ * Additional field information
15
+ */
16
+ info?: CkanFieldInfo;
17
+ }
18
+ /**
19
+ * CKAN Field Info interface
20
+ */
21
+ export interface CkanFieldInfo {
22
+ /**
23
+ * Human-readable field label
24
+ */
25
+ label: string;
26
+ /**
27
+ * Additional notes about the field
28
+ */
29
+ notes: string;
30
+ /**
31
+ * Field type override
32
+ */
33
+ type_override: string;
34
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vc2NoZW1hL0ZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENLQU4gRmllbGQgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2thbkZpZWxkIHtcbiAgLyoqXG4gICAqIEZpZWxkIGlkZW50aWZpZXJcbiAgICovXG4gIGlkOiBzdHJpbmdcblxuICAvKipcbiAgICogRmllbGQgZGF0YSB0eXBlXG4gICAqL1xuICB0eXBlOiBzdHJpbmdcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBmaWVsZCBpbmZvcm1hdGlvblxuICAgKi9cbiAgaW5mbz86IENrYW5GaWVsZEluZm9cbn1cblxuLyoqXG4gKiBDS0FOIEZpZWxkIEluZm8gaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2thbkZpZWxkSW5mbyB7XG4gIC8qKlxuICAgKiBIdW1hbi1yZWFkYWJsZSBmaWVsZCBsYWJlbFxuICAgKi9cbiAgbGFiZWw6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG5vdGVzIGFib3V0IHRoZSBmaWVsZFxuICAgKi9cbiAgbm90ZXM6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBGaWVsZCB0eXBlIG92ZXJyaWRlXG4gICAqL1xuICB0eXBlX292ZXJyaWRlOiBzdHJpbmdcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import type { CkanField } from "./Field.ts";
2
+ /**
3
+ * CKAN Schema interface
4
+ */
5
+ export interface CkanSchema {
6
+ /**
7
+ * List of fields
8
+ */
9
+ fields: CkanField[];
10
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGx1Z2lucy9ja2FuL3NjaGVtYS9TY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2thbkZpZWxkIH0gZnJvbSBcIi4vRmllbGQudHNcIlxuXG4vKipcbiAqIENLQU4gU2NoZW1hIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENrYW5TY2hlbWEge1xuICAvKipcbiAgICogTGlzdCBvZiBmaWVsZHNcbiAgICovXG4gIGZpZWxkczogQ2thbkZpZWxkW11cbn1cbiJdfQ==
@@ -0,0 +1,115 @@
1
+ {
2
+ "fields": [
3
+ {
4
+ "id": "id",
5
+ "type": "int",
6
+ "info": {
7
+ "label": "ID",
8
+ "notes": "Unique identifier",
9
+ "type_override": "int"
10
+ }
11
+ },
12
+ {
13
+ "id": "name",
14
+ "type": "text",
15
+ "info": {
16
+ "label": "Name",
17
+ "notes": "Person's full name",
18
+ "type_override": "text"
19
+ }
20
+ },
21
+ {
22
+ "id": "age",
23
+ "type": "int"
24
+ },
25
+ {
26
+ "id": "score",
27
+ "type": "numeric",
28
+ "info": {
29
+ "label": "Score",
30
+ "notes": "Test score",
31
+ "type_override": "numeric"
32
+ }
33
+ },
34
+ {
35
+ "id": "is_active",
36
+ "type": "bool"
37
+ },
38
+ {
39
+ "id": "birth_date",
40
+ "type": "date",
41
+ "info": {
42
+ "label": "Birth Date",
43
+ "notes": "Date of birth",
44
+ "type_override": "date"
45
+ }
46
+ },
47
+ {
48
+ "id": "start_time",
49
+ "type": "time"
50
+ },
51
+ {
52
+ "id": "created_at",
53
+ "type": "timestamp",
54
+ "info": {
55
+ "label": "Created At",
56
+ "notes": "Timestamp when record was created",
57
+ "type_override": "timestamp"
58
+ }
59
+ },
60
+ {
61
+ "id": "metadata",
62
+ "type": "json"
63
+ },
64
+ {
65
+ "id": "tags",
66
+ "type": "array",
67
+ "info": {
68
+ "label": "Tags",
69
+ "notes": "List of tags",
70
+ "type_override": "array"
71
+ }
72
+ },
73
+ {
74
+ "id": "string_field",
75
+ "type": "string"
76
+ },
77
+ {
78
+ "id": "integer_field",
79
+ "type": "integer"
80
+ },
81
+ {
82
+ "id": "number_field",
83
+ "type": "number"
84
+ },
85
+ {
86
+ "id": "float_field",
87
+ "type": "float"
88
+ },
89
+ {
90
+ "id": "boolean_field",
91
+ "type": "boolean"
92
+ },
93
+ {
94
+ "id": "datetime_field",
95
+ "type": "datetime"
96
+ },
97
+ {
98
+ "id": "object_field",
99
+ "type": "object"
100
+ },
101
+ {
102
+ "id": "unknown_field",
103
+ "type": "unknown_type"
104
+ },
105
+ {
106
+ "id": "override_field",
107
+ "type": "text",
108
+ "info": {
109
+ "label": "Override Field",
110
+ "notes": "Field with type override",
111
+ "type_override": "int"
112
+ }
113
+ }
114
+ ]
115
+ }
@@ -0,0 +1,3 @@
1
+ import type { Schema } from "@frictionless-ts/metadata";
2
+ import type { CkanSchema } from "../Schema.ts";
3
+ export declare function convertSchemaFromCkan(ckanSchema: CkanSchema): Schema;
@@ -0,0 +1,47 @@
1
+ export function convertSchemaFromCkan(ckanSchema) {
2
+ const fields = ckanSchema.fields.map(convertField);
3
+ return { fields };
4
+ }
5
+ function convertField(ckanField) {
6
+ const { id, type, info } = ckanField;
7
+ const field = {
8
+ name: id,
9
+ };
10
+ if (info) {
11
+ if (info.label)
12
+ field.title = info.label;
13
+ if (info.notes)
14
+ field.description = info.notes;
15
+ }
16
+ const fieldType = (info?.type_override || type).toLowerCase();
17
+ switch (fieldType) {
18
+ case "text":
19
+ case "string":
20
+ return { ...field, type: "string" };
21
+ case "int":
22
+ case "integer":
23
+ return { ...field, type: "integer" };
24
+ case "numeric":
25
+ case "number":
26
+ case "float":
27
+ return { ...field, type: "number" };
28
+ case "bool":
29
+ case "boolean":
30
+ return { ...field, type: "boolean" };
31
+ case "date":
32
+ return { ...field, type: "date" };
33
+ case "time":
34
+ return { ...field, type: "time" };
35
+ case "timestamp":
36
+ case "datetime":
37
+ return { ...field, type: "datetime" };
38
+ case "json":
39
+ case "object":
40
+ return { ...field, type: "object" };
41
+ case "array":
42
+ return { ...field, type: "array" };
43
+ default:
44
+ return { ...field, type: "any" };
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbUNrYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wbHVnaW5zL2NrYW4vc2NoZW1hL2NvbnZlcnQvZnJvbUNrYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUEsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFVBQXNCO0lBQzFELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRWxELE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQTtBQUNuQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsU0FBb0I7SUFDeEMsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFBO0lBRXBDLE1BQU0sS0FBSyxHQUFtQjtRQUM1QixJQUFJLEVBQUUsRUFBRTtLQUNULENBQUE7SUFFRCxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUN4QyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBO0lBQ2hELENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRSxhQUFhLElBQUksSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDN0QsUUFBUSxTQUFTLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssUUFBUTtZQUNYLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFpQixDQUFBO1FBQ3BELEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQWtCLENBQUE7UUFDdEQsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssT0FBTztZQUNWLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFpQixDQUFBO1FBQ3BELEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxTQUFTO1lBQ1osT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQWtCLENBQUE7UUFDdEQsS0FBSyxNQUFNO1lBQ1QsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQWUsQ0FBQTtRQUNoRCxLQUFLLE1BQU07WUFDVCxPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBZSxDQUFBO1FBQ2hELEtBQUssV0FBVyxDQUFDO1FBQ2pCLEtBQUssVUFBVTtZQUNiLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFtQixDQUFBO1FBQ3hELEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxRQUFRO1lBQ1gsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQWlCLENBQUE7UUFDcEQsS0FBSyxPQUFPO1lBQ1YsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQWdCLENBQUE7UUFDbEQ7WUFDRSxPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBVyxDQUFBO0lBQzdDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBGaWVsZCwgU2NoZW1hIH0gZnJvbSBcIkBmcmljdGlvbmxlc3MtdHMvbWV0YWRhdGFcIlxuaW1wb3J0IHR5cGUge1xuICBBcnJheUZpZWxkLFxuICBCb29sZWFuRmllbGQsXG4gIERhdGVGaWVsZCxcbiAgRGF0ZXRpbWVGaWVsZCxcbiAgSW50ZWdlckZpZWxkLFxuICBOdW1iZXJGaWVsZCxcbiAgT2JqZWN0RmllbGQsXG4gIFN0cmluZ0ZpZWxkLFxuICBUaW1lRmllbGQsXG59IGZyb20gXCJAZnJpY3Rpb25sZXNzLXRzL21ldGFkYXRhXCJcbmltcG9ydCB0eXBlIHsgQ2thbkZpZWxkIH0gZnJvbSBcIi4uL0ZpZWxkLnRzXCJcbmltcG9ydCB0eXBlIHsgQ2thblNjaGVtYSB9IGZyb20gXCIuLi9TY2hlbWEudHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFNjaGVtYUZyb21Da2FuKGNrYW5TY2hlbWE6IENrYW5TY2hlbWEpOiBTY2hlbWEge1xuICBjb25zdCBmaWVsZHMgPSBja2FuU2NoZW1hLmZpZWxkcy5tYXAoY29udmVydEZpZWxkKVxuXG4gIHJldHVybiB7IGZpZWxkcyB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWVsZChja2FuRmllbGQ6IENrYW5GaWVsZCkge1xuICBjb25zdCB7IGlkLCB0eXBlLCBpbmZvIH0gPSBja2FuRmllbGRcblxuICBjb25zdCBmaWVsZDogUGFydGlhbDxGaWVsZD4gPSB7XG4gICAgbmFtZTogaWQsXG4gIH1cblxuICBpZiAoaW5mbykge1xuICAgIGlmIChpbmZvLmxhYmVsKSBmaWVsZC50aXRsZSA9IGluZm8ubGFiZWxcbiAgICBpZiAoaW5mby5ub3RlcykgZmllbGQuZGVzY3JpcHRpb24gPSBpbmZvLm5vdGVzXG4gIH1cblxuICBjb25zdCBmaWVsZFR5cGUgPSAoaW5mbz8udHlwZV9vdmVycmlkZSB8fCB0eXBlKS50b0xvd2VyQ2FzZSgpXG4gIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4geyAuLi5maWVsZCwgdHlwZTogXCJzdHJpbmdcIiB9IGFzIFN0cmluZ0ZpZWxkXG4gICAgY2FzZSBcImludFwiOlxuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4geyAuLi5maWVsZCwgdHlwZTogXCJpbnRlZ2VyXCIgfSBhcyBJbnRlZ2VyRmllbGRcbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIHJldHVybiB7IC4uLmZpZWxkLCB0eXBlOiBcIm51bWJlclwiIH0gYXMgTnVtYmVyRmllbGRcbiAgICBjYXNlIFwiYm9vbFwiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4geyAuLi5maWVsZCwgdHlwZTogXCJib29sZWFuXCIgfSBhcyBCb29sZWFuRmllbGRcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIHsgLi4uZmllbGQsIHR5cGU6IFwiZGF0ZVwiIH0gYXMgRGF0ZUZpZWxkXG4gICAgY2FzZSBcInRpbWVcIjpcbiAgICAgIHJldHVybiB7IC4uLmZpZWxkLCB0eXBlOiBcInRpbWVcIiB9IGFzIFRpbWVGaWVsZFxuICAgIGNhc2UgXCJ0aW1lc3RhbXBcIjpcbiAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgIHJldHVybiB7IC4uLmZpZWxkLCB0eXBlOiBcImRhdGV0aW1lXCIgfSBhcyBEYXRldGltZUZpZWxkXG4gICAgY2FzZSBcImpzb25cIjpcbiAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICByZXR1cm4geyAuLi5maWVsZCwgdHlwZTogXCJvYmplY3RcIiB9IGFzIE9iamVjdEZpZWxkXG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4geyAuLi5maWVsZCwgdHlwZTogXCJhcnJheVwiIH0gYXMgQXJyYXlGaWVsZFxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyAuLi5maWVsZCwgdHlwZTogXCJhbnlcIiB9IGFzIEZpZWxkXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,157 @@
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
+ describe("convertSchemaFromCkan", () => {
7
+ it("converts a CKAN schema to a Frictionless schema", () => {
8
+ const ckanSchema = ckanSchemaFixture;
9
+ const result = convertSchemaFromCkan(ckanSchema);
10
+ expect(result.fields).toHaveLength(ckanSchema.fields.length);
11
+ const idField = result.fields.find(f => f.name === "id");
12
+ expect(idField).toBeDefined();
13
+ if (idField) {
14
+ expect(idField.type).toEqual("integer");
15
+ expect(idField.title).toEqual("ID");
16
+ expect(idField.description).toEqual("Unique identifier");
17
+ }
18
+ const nameField = result.fields.find(f => f.name === "name");
19
+ expect(nameField).toBeDefined();
20
+ if (nameField) {
21
+ expect(nameField.type).toEqual("string");
22
+ expect(nameField.title).toEqual("Name");
23
+ expect(nameField.description).toEqual("Person's full name");
24
+ }
25
+ const ageField = result.fields.find(f => f.name === "age");
26
+ expect(ageField).toBeDefined();
27
+ if (ageField) {
28
+ expect(ageField.type).toEqual("integer");
29
+ expect(ageField.title).toBeUndefined();
30
+ expect(ageField.description).toBeUndefined();
31
+ }
32
+ const scoreField = result.fields.find(f => f.name === "score");
33
+ expect(scoreField).toBeDefined();
34
+ if (scoreField) {
35
+ expect(scoreField.type).toEqual("number");
36
+ expect(scoreField.title).toEqual("Score");
37
+ expect(scoreField.description).toEqual("Test score");
38
+ }
39
+ const isActiveField = result.fields.find(f => f.name === "is_active");
40
+ expect(isActiveField).toBeDefined();
41
+ if (isActiveField) {
42
+ expect(isActiveField.type).toEqual("boolean");
43
+ }
44
+ const birthDateField = result.fields.find(f => f.name === "birth_date");
45
+ expect(birthDateField).toBeDefined();
46
+ if (birthDateField) {
47
+ expect(birthDateField.type).toEqual("date");
48
+ expect(birthDateField.title).toEqual("Birth Date");
49
+ expect(birthDateField.description).toEqual("Date of birth");
50
+ }
51
+ const startTimeField = result.fields.find(f => f.name === "start_time");
52
+ expect(startTimeField).toBeDefined();
53
+ if (startTimeField) {
54
+ expect(startTimeField.type).toEqual("time");
55
+ }
56
+ const createdAtField = result.fields.find(f => f.name === "created_at");
57
+ expect(createdAtField).toBeDefined();
58
+ if (createdAtField) {
59
+ expect(createdAtField.type).toEqual("datetime");
60
+ expect(createdAtField.title).toEqual("Created At");
61
+ expect(createdAtField.description).toEqual("Timestamp when record was created");
62
+ }
63
+ const metadataField = result.fields.find(f => f.name === "metadata");
64
+ expect(metadataField).toBeDefined();
65
+ if (metadataField) {
66
+ expect(metadataField.type).toEqual("object");
67
+ }
68
+ const tagsField = result.fields.find(f => f.name === "tags");
69
+ expect(tagsField).toBeDefined();
70
+ if (tagsField) {
71
+ expect(tagsField.type).toEqual("array");
72
+ expect(tagsField.title).toEqual("Tags");
73
+ expect(tagsField.description).toEqual("List of tags");
74
+ }
75
+ });
76
+ it("converts CKAN type aliases to Frictionless types", () => {
77
+ const ckanSchema = ckanSchemaFixture;
78
+ const result = convertSchemaFromCkan(ckanSchema);
79
+ const stringField = result.fields.find(f => f.name === "string_field");
80
+ expect(stringField?.type).toEqual("string");
81
+ const integerField = result.fields.find(f => f.name === "integer_field");
82
+ expect(integerField?.type).toEqual("integer");
83
+ const numberField = result.fields.find(f => f.name === "number_field");
84
+ expect(numberField?.type).toEqual("number");
85
+ const floatField = result.fields.find(f => f.name === "float_field");
86
+ expect(floatField?.type).toEqual("number");
87
+ const booleanField = result.fields.find(f => f.name === "boolean_field");
88
+ expect(booleanField?.type).toEqual("boolean");
89
+ const datetimeField = result.fields.find(f => f.name === "datetime_field");
90
+ expect(datetimeField?.type).toEqual("datetime");
91
+ const objectField = result.fields.find(f => f.name === "object_field");
92
+ expect(objectField?.type).toEqual("object");
93
+ });
94
+ it("handles unknown field types by converting to 'any'", () => {
95
+ const ckanSchema = ckanSchemaFixture;
96
+ const result = convertSchemaFromCkan(ckanSchema);
97
+ const unknownField = result.fields.find(f => f.name === "unknown_field");
98
+ expect(unknownField).toBeDefined();
99
+ if (unknownField) {
100
+ expect(unknownField.type).toEqual("any");
101
+ }
102
+ });
103
+ it("respects type_override in field info", () => {
104
+ const ckanSchema = ckanSchemaFixture;
105
+ const result = convertSchemaFromCkan(ckanSchema);
106
+ const overrideField = result.fields.find(f => f.name === "override_field");
107
+ expect(overrideField).toBeDefined();
108
+ if (overrideField) {
109
+ expect(overrideField.type).toEqual("integer");
110
+ expect(overrideField.title).toEqual("Override Field");
111
+ expect(overrideField.description).toEqual("Field with type override");
112
+ }
113
+ });
114
+ it("handles empty fields array", () => {
115
+ const ckanSchema = {
116
+ fields: [],
117
+ };
118
+ const result = convertSchemaFromCkan(ckanSchema);
119
+ expect(result.fields).toEqual([]);
120
+ });
121
+ it("handles fields without info object", () => {
122
+ const ckanSchema = {
123
+ fields: [
124
+ {
125
+ id: "simple_field",
126
+ type: "text",
127
+ },
128
+ ],
129
+ };
130
+ const result = convertSchemaFromCkan(ckanSchema);
131
+ expect(result.fields).toHaveLength(1);
132
+ const field = result.fields[0];
133
+ expect(field).toBeDefined();
134
+ if (field) {
135
+ expect(field.name).toEqual("simple_field");
136
+ expect(field.type).toEqual("string");
137
+ expect(field.title).toBeUndefined();
138
+ expect(field.description).toBeUndefined();
139
+ }
140
+ });
141
+ it("handles case insensitivity in type conversion", () => {
142
+ const ckanSchema = {
143
+ fields: [
144
+ { id: "field1", type: "TEXT" },
145
+ { id: "field2", type: "INT" },
146
+ { id: "field3", type: "BOOL" },
147
+ { id: "field4", type: "TIMESTAMP" },
148
+ ],
149
+ };
150
+ const result = convertSchemaFromCkan(ckanSchema);
151
+ expect(result.fields[0]?.type).toEqual("string");
152
+ expect(result.fields[1]?.type).toEqual("integer");
153
+ expect(result.fields[2]?.type).toEqual("boolean");
154
+ expect(result.fields[3]?.type).toEqual("datetime");
155
+ });
156
+ });
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbUNrYW4uc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BsdWdpbnMvY2thbi9zY2hlbWEvY29udmVydC9mcm9tQ2thbi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUU3QyxPQUFPLGlCQUFpQixNQUFNLDZCQUE2QixDQUFDO0lBQzFELElBQUksRUFBRSxNQUFNO0NBQ2IsQ0FBQTtBQUNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVyRCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsTUFBTSxVQUFVLEdBQUcsaUJBQStCLENBQUE7UUFFbEQsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUU1RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzdCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNuQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdB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K0MsRUFBRSxHQUFHLEVBQUU7UUFDdkQsTUFBTSxVQUFVLEdBQWU7WUFDN0IsTUFBTSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO2dCQUM5QixFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFDN0IsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7Z0JBQzlCLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2FBQ3BDO1NBQ0YsQ0FBQTtRQUVELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRWhELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNwRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB0eXBlIHsgQ2thblNjaGVtYSB9IGZyb20gXCIuLi9TY2hlbWEudHNcIlxuaW1wb3J0IGNrYW5TY2hlbWFGaXh0dXJlIGZyb20gXCIuL2ZpeHR1cmVzL2NrYW4tc2NoZW1hLmpzb25cIiB3aXRoIHtcbiAgdHlwZTogXCJqc29uXCIsXG59XG5pbXBvcnQgeyBjb252ZXJ0U2NoZW1hRnJvbUNrYW4gfSBmcm9tIFwiLi9mcm9tQ2thbi50c1wiXG5cbmRlc2NyaWJlKFwiY29udmVydFNjaGVtYUZyb21Da2FuXCIsICgpID0+IHtcbiAgaXQoXCJjb252ZXJ0cyBhIENLQU4gc2NoZW1hIHRvIGEgRnJpY3Rpb25sZXNzIHNjaGVtYVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY2thblNjaGVtYSA9IGNrYW5TY2hlbWFGaXh0dXJlIGFzIENrYW5TY2hlbWFcblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFGcm9tQ2thbihja2FuU2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5maWVsZHMpLnRvSGF2ZUxlbmd0aChja2FuU2NoZW1hLmZpZWxkcy5sZW5ndGgpXG5cbiAgICBjb25zdCBpZEZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBcImlkXCIpXG4gICAgZXhwZWN0KGlkRmllbGQpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAoaWRGaWVsZCkge1xuICAgICAgZXhwZWN0KGlkRmllbGQudHlwZSkudG9FcXVhbChcImludGVnZXJcIilcbiAgICAgIGV4cGVjdChpZEZpZWxkLnRpdGxlKS50b0VxdWFsKFwiSURcIilcbiAgICAgIGV4cGVjdChpZEZpZWxkLmRlc2NyaXB0aW9uKS50b0VxdWFsKFwiVW5pcXVlIGlkZW50aWZpZXJcIilcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwibmFtZVwiKVxuICAgIGV4cGVjdChuYW1lRmllbGQpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAobmFtZUZpZWxkKSB7XG4gICAgICBleHBlY3QobmFtZUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJzdHJpbmdcIilcbiAgICAgIGV4cGVjdChuYW1lRmllbGQudGl0bGUpLnRvRXF1YWwoXCJOYW1lXCIpXG4gICAgICBleHBlY3QobmFtZUZpZWxkLmRlc2NyaXB0aW9uKS50b0VxdWFsKFwiUGVyc29uJ3MgZnVsbCBuYW1lXCIpXG4gICAgfVxuXG4gICAgY29uc3QgYWdlRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwiYWdlXCIpXG4gICAgZXhwZWN0KGFnZUZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKGFnZUZpZWxkKSB7XG4gICAgICBleHBlY3QoYWdlRmllbGQudHlwZSkudG9FcXVhbChcImludGVnZXJcIilcbiAgICAgIGV4cGVjdChhZ2VGaWVsZC50aXRsZSkudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QoYWdlRmllbGQuZGVzY3JpcHRpb24pLnRvQmVVbmRlZmluZWQoKVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3JlRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwic2NvcmVcIilcbiAgICBleHBlY3Qoc2NvcmVGaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChzY29yZUZpZWxkKSB7XG4gICAgICBleHBlY3Qoc2NvcmVGaWVsZC50eXBlKS50b0VxdWFsKFwibnVtYmVyXCIpXG4gICAgICBleHBlY3Qoc2NvcmVGaWVsZC50aXRsZSkudG9FcXVhbChcIlNjb3JlXCIpXG4gICAgICBleHBlY3Qoc2NvcmVGaWVsZC5kZXNjcmlwdGlvbikudG9FcXVhbChcIlRlc3Qgc2NvcmVcIilcbiAgICB9XG5cbiAgICBjb25zdCBpc0FjdGl2ZUZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBcImlzX2FjdGl2ZVwiKVxuICAgIGV4cGVjdChpc0FjdGl2ZUZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKGlzQWN0aXZlRmllbGQpIHtcbiAgICAgIGV4cGVjdChpc0FjdGl2ZUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJib29sZWFuXCIpXG4gICAgfVxuXG4gICAgY29uc3QgYmlydGhEYXRlRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwiYmlydGhfZGF0ZVwiKVxuICAgIGV4cGVjdChiaXJ0aERhdGVGaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChiaXJ0aERhdGVGaWVsZCkge1xuICAgICAgZXhwZWN0KGJpcnRoRGF0ZUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJkYXRlXCIpXG4gICAgICBleHBlY3QoYmlydGhEYXRlRmllbGQudGl0bGUpLnRvRXF1YWwoXCJCaXJ0aCBEYXRlXCIpXG4gICAgICBleHBlY3QoYmlydGhEYXRlRmllbGQuZGVzY3JpcHRpb24pLnRvRXF1YWwoXCJEYXRlIG9mIGJpcnRoXCIpXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwic3RhcnRfdGltZVwiKVxuICAgIGV4cGVjdChzdGFydFRpbWVGaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChzdGFydFRpbWVGaWVsZCkge1xuICAgICAgZXhwZWN0KHN0YXJ0VGltZUZpZWxkLnR5cGUpLnRvRXF1YWwoXCJ0aW1lXCIpXG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZEF0RmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwiY3JlYXRlZF9hdFwiKVxuICAgIGV4cGVjdChjcmVhdGVkQXRGaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChjcmVhdGVkQXRGaWVsZCkge1xuICAgICAgZXhwZWN0KGNyZWF0ZWRBdEZpZWxkLnR5cGUpLnRvRXF1YWwoXCJkYXRldGltZVwiKVxuICAgICAgZXhwZWN0KGNyZWF0ZWRBdEZpZWxkLnRpdGxlKS50b0VxdWFsKFwiQ3JlYXRlZCBBdFwiKVxuICAgICAgZXhwZWN0KGNyZWF0ZWRBdEZpZWxkLmRlc2NyaXB0aW9uKS50b0VxdWFsKFxuICAgICAgICBcIlRpbWVzdGFtcCB3aGVuIHJlY29yZCB3YXMgY3JlYXRlZFwiLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGFkYXRhRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwibWV0YWRhdGFcIilcbiAgICBleHBlY3QobWV0YWRhdGFGaWVsZCkudG9CZURlZmluZWQoKVxuICAgIGlmIChtZXRhZGF0YUZpZWxkKSB7XG4gICAgICBleHBlY3QobWV0YWRhdGFGaWVsZC50eXBlKS50b0VxdWFsKFwib2JqZWN0XCIpXG4gICAgfVxuXG4gICAgY29uc3QgdGFnc0ZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBcInRhZ3NcIilcbiAgICBleHBlY3QodGFnc0ZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKHRhZ3NGaWVsZCkge1xuICAgICAgZXhwZWN0KHRhZ3NGaWVsZC50eXBlKS50b0VxdWFsKFwiYXJyYXlcIilcbiAgICAgIGV4cGVjdCh0YWdzRmllbGQudGl0bGUpLnRvRXF1YWwoXCJUYWdzXCIpXG4gICAgICBleHBlY3QodGFnc0ZpZWxkLmRlc2NyaXB0aW9uKS50b0VxdWFsKFwiTGlzdCBvZiB0YWdzXCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwiY29udmVydHMgQ0tBTiB0eXBlIGFsaWFzZXMgdG8gRnJpY3Rpb25sZXNzIHR5cGVzXCIsICgpID0+IHtcbiAgICBjb25zdCBja2FuU2NoZW1hID0gY2thblNjaGVtYUZpeHR1cmUgYXMgQ2thblNjaGVtYVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYUZyb21Da2FuKGNrYW5TY2hlbWEpXG5cbiAgICBjb25zdCBzdHJpbmdGaWVsZCA9IHJlc3VsdC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gXCJzdHJpbmdfZmllbGRcIilcbiAgICBleHBlY3Qoc3RyaW5nRmllbGQ/LnR5cGUpLnRvRXF1YWwoXCJzdHJpbmdcIilcblxuICAgIGNvbnN0IGludGVnZXJGaWVsZCA9IHJlc3VsdC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gXCJpbnRlZ2VyX2ZpZWxkXCIpXG4gICAgZXhwZWN0KGludGVnZXJGaWVsZD8udHlwZSkudG9FcXVhbChcImludGVnZXJcIilcblxuICAgIGNvbnN0IG51bWJlckZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBcIm51bWJlcl9maWVsZFwiKVxuICAgIGV4cGVjdChudW1iZXJGaWVsZD8udHlwZSkudG9FcXVhbChcIm51bWJlclwiKVxuXG4gICAgY29uc3QgZmxvYXRGaWVsZCA9IHJlc3VsdC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gXCJmbG9hdF9maWVsZFwiKVxuICAgIGV4cGVjdChmbG9hdEZpZWxkPy50eXBlKS50b0VxdWFsKFwibnVtYmVyXCIpXG5cbiAgICBjb25zdCBib29sZWFuRmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwiYm9vbGVhbl9maWVsZFwiKVxuICAgIGV4cGVjdChib29sZWFuRmllbGQ/LnR5cGUpLnRvRXF1YWwoXCJib29sZWFuXCIpXG5cbiAgICBjb25zdCBkYXRldGltZUZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBcImRhdGV0aW1lX2ZpZWxkXCIpXG4gICAgZXhwZWN0KGRhdGV0aW1lRmllbGQ/LnR5cGUpLnRvRXF1YWwoXCJkYXRldGltZVwiKVxuXG4gICAgY29uc3Qgb2JqZWN0RmllbGQgPSByZXN1bHQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IFwib2JqZWN0X2ZpZWxkXCIpXG4gICAgZXhwZWN0KG9iamVjdEZpZWxkPy50eXBlKS50b0VxdWFsKFwib2JqZWN0XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIHVua25vd24gZmllbGQgdHlwZXMgYnkgY29udmVydGluZyB0byAnYW55J1wiLCAoKSA9PiB7XG4gICAgY29uc3QgY2thblNjaGVtYSA9IGNrYW5TY2hlbWFGaXh0dXJlIGFzIENrYW5TY2hlbWFcblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFGcm9tQ2thbihja2FuU2NoZW1hKVxuXG4gICAgY29uc3QgdW5rbm93bkZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBcInVua25vd25fZmllbGRcIilcbiAgICBleHBlY3QodW5rbm93bkZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKHVua25vd25GaWVsZCkge1xuICAgICAgZXhwZWN0KHVua25vd25GaWVsZC50eXBlKS50b0VxdWFsKFwiYW55XCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwicmVzcGVjdHMgdHlwZV9vdmVycmlkZSBpbiBmaWVsZCBpbmZvXCIsICgpID0+IHtcbiAgICBjb25zdCBja2FuU2NoZW1hID0gY2thblNjaGVtYUZpeHR1cmUgYXMgQ2thblNjaGVtYVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYUZyb21Da2FuKGNrYW5TY2hlbWEpXG5cbiAgICBjb25zdCBvdmVycmlkZUZpZWxkID0gcmVzdWx0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBcIm92ZXJyaWRlX2ZpZWxkXCIpXG4gICAgZXhwZWN0KG92ZXJyaWRlRmllbGQpLnRvQmVEZWZpbmVkKClcbiAgICBpZiAob3ZlcnJpZGVGaWVsZCkge1xuICAgICAgZXhwZWN0KG92ZXJyaWRlRmllbGQudHlwZSkudG9FcXVhbChcImludGVnZXJcIilcbiAgICAgIGV4cGVjdChvdmVycmlkZUZpZWxkLnRpdGxlKS50b0VxdWFsKFwiT3ZlcnJpZGUgRmllbGRcIilcbiAgICAgIGV4cGVjdChvdmVycmlkZUZpZWxkLmRlc2NyaXB0aW9uKS50b0VxdWFsKFwiRmllbGQgd2l0aCB0eXBlIG92ZXJyaWRlXCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBlbXB0eSBmaWVsZHMgYXJyYXlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNrYW5TY2hlbWE6IENrYW5TY2hlbWEgPSB7XG4gICAgICBmaWVsZHM6IFtdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRTY2hlbWFGcm9tQ2thbihja2FuU2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdC5maWVsZHMpLnRvRXF1YWwoW10pXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGZpZWxkcyB3aXRob3V0IGluZm8gb2JqZWN0XCIsICgpID0+IHtcbiAgICBjb25zdCBja2FuU2NoZW1hOiBDa2FuU2NoZW1hID0ge1xuICAgICAgZmllbGRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJzaW1wbGVfZmllbGRcIixcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYUZyb21Da2FuKGNrYW5TY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0LmZpZWxkcykudG9IYXZlTGVuZ3RoKDEpXG4gICAgY29uc3QgZmllbGQgPSByZXN1bHQuZmllbGRzWzBdXG4gICAgZXhwZWN0KGZpZWxkKS50b0JlRGVmaW5lZCgpXG4gICAgaWYgKGZpZWxkKSB7XG4gICAgICBleHBlY3QoZmllbGQubmFtZSkudG9FcXVhbChcInNpbXBsZV9maWVsZFwiKVxuICAgICAgZXhwZWN0KGZpZWxkLnR5cGUpLnRvRXF1YWwoXCJzdHJpbmdcIilcbiAgICAgIGV4cGVjdChmaWVsZC50aXRsZSkudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3QoZmllbGQuZGVzY3JpcHRpb24pLnRvQmVVbmRlZmluZWQoKVxuICAgIH1cbiAgfSlcblxuICBpdChcImhhbmRsZXMgY2FzZSBpbnNlbnNpdGl2aXR5IGluIHR5cGUgY29udmVyc2lvblwiLCAoKSA9PiB7XG4gICAgY29uc3QgY2thblNjaGVtYTogQ2thblNjaGVtYSA9IHtcbiAgICAgIGZpZWxkczogW1xuICAgICAgICB7IGlkOiBcImZpZWxkMVwiLCB0eXBlOiBcIlRFWFRcIiB9LFxuICAgICAgICB7IGlkOiBcImZpZWxkMlwiLCB0eXBlOiBcIklOVFwiIH0sXG4gICAgICAgIHsgaWQ6IFwiZmllbGQzXCIsIHR5cGU6IFwiQk9PTFwiIH0sXG4gICAgICAgIHsgaWQ6IFwiZmllbGQ0XCIsIHR5cGU6IFwiVElNRVNUQU1QXCIgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFNjaGVtYUZyb21Da2FuKGNrYW5TY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0LmZpZWxkc1swXT8udHlwZSkudG9FcXVhbChcInN0cmluZ1wiKVxuICAgIGV4cGVjdChyZXN1bHQuZmllbGRzWzFdPy50eXBlKS50b0VxdWFsKFwiaW50ZWdlclwiKVxuICAgIGV4cGVjdChyZXN1bHQuZmllbGRzWzJdPy50eXBlKS50b0VxdWFsKFwiYm9vbGVhblwiKVxuICAgIGV4cGVjdChyZXN1bHQuZmllbGRzWzNdPy50eXBlKS50b0VxdWFsKFwiZGF0ZXRpbWVcIilcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,3 @@
1
+ import type { Schema } from "@frictionless-ts/metadata";
2
+ import type { CkanSchema } from "../Schema.ts";
3
+ export declare function convertSchemaToCkan(schema: Schema): CkanSchema;
@@ -0,0 +1,50 @@
1
+ export function convertSchemaToCkan(schema) {
2
+ const fields = schema.fields.map(convertField);
3
+ return { fields };
4
+ }
5
+ function convertField(field) {
6
+ const { name, title, description, type } = field;
7
+ const ckanField = {
8
+ id: name,
9
+ type: convertType(type),
10
+ };
11
+ if (title || description) {
12
+ const fieldInfo = {};
13
+ if (title)
14
+ fieldInfo.label = title;
15
+ if (description)
16
+ fieldInfo.notes = description;
17
+ fieldInfo.type_override = convertType(type);
18
+ ckanField.info = fieldInfo;
19
+ }
20
+ return ckanField;
21
+ }
22
+ function convertType(type) {
23
+ switch (type) {
24
+ case "string":
25
+ return "text";
26
+ case "integer":
27
+ return "int";
28
+ case "number":
29
+ return "numeric";
30
+ case "boolean":
31
+ return "bool";
32
+ case "date":
33
+ return "date";
34
+ case "time":
35
+ return "time";
36
+ case "datetime":
37
+ return "timestamp";
38
+ case "object":
39
+ return "json";
40
+ case "array":
41
+ return "array";
42
+ case "geopoint":
43
+ return "geopoint";
44
+ case "geojson":
45
+ return "geojson";
46
+ default:
47
+ return "text";
48
+ }
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9Da2FuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGx1Z2lucy9ja2FuL3NjaGVtYS9jb252ZXJ0L3RvQ2thbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBYztJQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUU5QyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbkIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQVk7SUFDaEMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUVoRCxNQUFNLFNBQVMsR0FBYztRQUMzQixFQUFFLEVBQUUsSUFBSTtRQUNSLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDO0tBQ3hCLENBQUE7SUFFRCxJQUFJLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUN6QixNQUFNLFNBQVMsR0FBa0IsRUFBbUIsQ0FBQTtRQUVwRCxJQUFJLEtBQUs7WUFBRSxTQUFTLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQyxJQUFJLFdBQVc7WUFBRSxTQUFTLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQTtRQUU5QyxTQUFTLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUzQyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQTtJQUM1QixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQWE7SUFDaEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssUUFBUTtZQUNYLE9BQU8sTUFBTSxDQUFBO1FBQ2YsS0FBSyxTQUFTO1lBQ1osT0FBTyxLQUFLLENBQUE7UUFDZCxLQUFLLFFBQVE7WUFDWCxPQUFPLFNBQVMsQ0FBQTtRQUNsQixLQUFLLFNBQVM7WUFDWixPQUFPLE1BQU0sQ0FBQTtRQUNmLEtBQUssTUFBTTtZQUNULE9BQU8sTUFBTSxDQUFBO1FBQ2YsS0FBSyxNQUFNO1lBQ1QsT0FBTyxNQUFNLENBQUE7UUFDZixLQUFLLFVBQVU7WUFDYixPQUFPLFdBQVcsQ0FBQTtRQUNwQixLQUFLLFFBQVE7WUFDWCxPQUFPLE1BQU0sQ0FBQTtRQUNmLEtBQUssT0FBTztZQUNWLE9BQU8sT0FBTyxDQUFBO1FBQ2hCLEtBQUssVUFBVTtZQUNiLE9BQU8sVUFBVSxDQUFBO1FBQ25CLEtBQUssU0FBUztZQUNaLE9BQU8sU0FBUyxDQUFBO1FBQ2xCO1lBQ0UsT0FBTyxNQUFNLENBQUE7SUFDakIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpZWxkLCBTY2hlbWEgfSBmcm9tIFwiQGZyaWN0aW9ubGVzcy10cy9tZXRhZGF0YVwiXG5pbXBvcnQgdHlwZSB7IENrYW5GaWVsZCwgQ2thbkZpZWxkSW5mbyB9IGZyb20gXCIuLi9GaWVsZC50c1wiXG5pbXBvcnQgdHlwZSB7IENrYW5TY2hlbWEgfSBmcm9tIFwiLi4vU2NoZW1hLnRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRTY2hlbWFUb0NrYW4oc2NoZW1hOiBTY2hlbWEpOiBDa2FuU2NoZW1hIHtcbiAgY29uc3QgZmllbGRzID0gc2NoZW1hLmZpZWxkcy5tYXAoY29udmVydEZpZWxkKVxuXG4gIHJldHVybiB7IGZpZWxkcyB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWVsZChmaWVsZDogRmllbGQpOiBDa2FuRmllbGQge1xuICBjb25zdCB7IG5hbWUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgdHlwZSB9ID0gZmllbGRcblxuICBjb25zdCBja2FuRmllbGQ6IENrYW5GaWVsZCA9IHtcbiAgICBpZDogbmFtZSxcbiAgICB0eXBlOiBjb252ZXJ0VHlwZSh0eXBlKSxcbiAgfVxuXG4gIGlmICh0aXRsZSB8fCBkZXNjcmlwdGlvbikge1xuICAgIGNvbnN0IGZpZWxkSW5mbzogQ2thbkZpZWxkSW5mbyA9IHt9IGFzIENrYW5GaWVsZEluZm9cblxuICAgIGlmICh0aXRsZSkgZmllbGRJbmZvLmxhYmVsID0gdGl0bGVcbiAgICBpZiAoZGVzY3JpcHRpb24pIGZpZWxkSW5mby5ub3RlcyA9IGRlc2NyaXB0aW9uXG5cbiAgICBmaWVsZEluZm8udHlwZV9vdmVycmlkZSA9IGNvbnZlcnRUeXBlKHR5cGUpXG5cbiAgICBja2FuRmllbGQuaW5mbyA9IGZpZWxkSW5mb1xuICB9XG5cbiAgcmV0dXJuIGNrYW5GaWVsZFxufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHlwZSh0eXBlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwidGV4dFwiXG4gICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIHJldHVybiBcImludFwiXG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwibnVtZXJpY1wiXG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcImJvb2xcIlxuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJkYXRlXCJcbiAgICBjYXNlIFwidGltZVwiOlxuICAgICAgcmV0dXJuIFwidGltZVwiXG4gICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gXCJ0aW1lc3RhbXBcIlxuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIHJldHVybiBcImpzb25cIlxuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIFwiYXJyYXlcIlxuICAgIGNhc2UgXCJnZW9wb2ludFwiOlxuICAgICAgcmV0dXJuIFwiZ2VvcG9pbnRcIlxuICAgIGNhc2UgXCJnZW9qc29uXCI6XG4gICAgICByZXR1cm4gXCJnZW9qc29uXCJcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidGV4dFwiXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};