@frictionless-ts/metadata 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 (312) hide show
  1. package/README.md +3 -0
  2. package/build/assets/dialect-1.0.json +58 -0
  3. package/build/assets/dialect-2.0.json +98 -0
  4. package/build/assets/package-1.0.json +1517 -0
  5. package/build/assets/package-2.0.json +2168 -0
  6. package/build/assets/resource-1.0.json +1353 -0
  7. package/build/assets/resource-2.0.json +1987 -0
  8. package/build/assets/schema-1.0.json +1126 -0
  9. package/build/assets/schema-2.0.json +1715 -0
  10. package/build/descriptor/Descriptor.d.ts +2 -0
  11. package/build/descriptor/Descriptor.js +4 -0
  12. package/build/descriptor/index.d.ts +6 -0
  13. package/build/descriptor/index.js +6 -0
  14. package/build/descriptor/load.d.ts +8 -0
  15. package/build/descriptor/load.js +36 -0
  16. package/build/descriptor/load.spec.d.ts +1 -0
  17. package/build/descriptor/load.spec.js +44 -0
  18. package/build/descriptor/process/parse.d.ts +2 -0
  19. package/build/descriptor/process/parse.js +8 -0
  20. package/build/descriptor/process/stringify.d.ts +2 -0
  21. package/build/descriptor/process/stringify.js +4 -0
  22. package/build/descriptor/save.d.ts +9 -0
  23. package/build/descriptor/save.js +19 -0
  24. package/build/descriptor/save.spec.d.ts +1 -0
  25. package/build/descriptor/save.spec.js +99 -0
  26. package/build/dialect/Dialect.d.ts +89 -0
  27. package/build/dialect/Dialect.js +2 -0
  28. package/build/dialect/assert.d.ts +6 -0
  29. package/build/dialect/assert.js +12 -0
  30. package/build/dialect/assert.spec.d.ts +1 -0
  31. package/build/dialect/assert.spec.js +22 -0
  32. package/build/dialect/convert/fromDescriptor.d.ts +2 -0
  33. package/build/dialect/convert/fromDescriptor.js +20 -0
  34. package/build/dialect/convert/toDescriptor.d.ts +3 -0
  35. package/build/dialect/convert/toDescriptor.js +5 -0
  36. package/build/dialect/index.d.ts +8 -0
  37. package/build/dialect/index.js +8 -0
  38. package/build/dialect/load.d.ts +5 -0
  39. package/build/dialect/load.js +12 -0
  40. package/build/dialect/load.spec.d.ts +1 -0
  41. package/build/dialect/load.spec.js +18 -0
  42. package/build/dialect/resolve.d.ts +2 -0
  43. package/build/dialect/resolve.js +11 -0
  44. package/build/dialect/save.d.ts +9 -0
  45. package/build/dialect/save.js +16 -0
  46. package/build/dialect/save.spec.d.ts +1 -0
  47. package/build/dialect/save.spec.js +52 -0
  48. package/build/dialect/validate.d.ts +10 -0
  49. package/build/dialect/validate.js +25 -0
  50. package/build/dialect/validate.spec.d.ts +1 -0
  51. package/build/dialect/validate.spec.js +28 -0
  52. package/build/error/Bound.d.ts +4 -0
  53. package/build/error/Bound.js +2 -0
  54. package/build/error/Error.d.ts +3 -0
  55. package/build/error/Error.js +2 -0
  56. package/build/error/Unbound.d.ts +6 -0
  57. package/build/error/Unbound.js +2 -0
  58. package/build/error/index.d.ts +16 -0
  59. package/build/error/index.js +2 -0
  60. package/build/error/types/Base.d.ts +3 -0
  61. package/build/error/types/Base.js +2 -0
  62. package/build/error/types/Bytes.d.ts +6 -0
  63. package/build/error/types/Bytes.js +2 -0
  64. package/build/error/types/Cell.d.ts +56 -0
  65. package/build/error/types/Cell.js +2 -0
  66. package/build/error/types/Data.d.ts +5 -0
  67. package/build/error/types/Data.js +2 -0
  68. package/build/error/types/Document.d.ts +7 -0
  69. package/build/error/types/Document.js +2 -0
  70. package/build/error/types/Encoding.d.ts +6 -0
  71. package/build/error/types/Encoding.js +2 -0
  72. package/build/error/types/Field.d.ts +15 -0
  73. package/build/error/types/Field.js +2 -0
  74. package/build/error/types/Fields.d.ts +11 -0
  75. package/build/error/types/Fields.js +2 -0
  76. package/build/error/types/File.d.ts +4 -0
  77. package/build/error/types/File.js +2 -0
  78. package/build/error/types/ForeignKey.d.ts +7 -0
  79. package/build/error/types/ForeignKey.js +2 -0
  80. package/build/error/types/Hash.d.ts +6 -0
  81. package/build/error/types/Hash.js +2 -0
  82. package/build/error/types/Metadata.d.ts +9 -0
  83. package/build/error/types/Metadata.js +2 -0
  84. package/build/error/types/Row.d.ts +9 -0
  85. package/build/error/types/Row.js +2 -0
  86. package/build/error/types/Table.d.ts +6 -0
  87. package/build/error/types/Table.js +2 -0
  88. package/build/field/Field.d.ts +5 -0
  89. package/build/field/Field.js +2 -0
  90. package/build/field/Type.d.ts +2 -0
  91. package/build/field/Type.js +2 -0
  92. package/build/field/convert/fromDescriptor.d.ts +2 -0
  93. package/build/field/convert/fromDescriptor.js +61 -0
  94. package/build/field/convert/fromDescriptor.spec.d.ts +1 -0
  95. package/build/field/convert/fromDescriptor.spec.js +241 -0
  96. package/build/field/convert/toDescriptor.d.ts +3 -0
  97. package/build/field/convert/toDescriptor.js +5 -0
  98. package/build/field/convert/toDescriptor.spec.d.ts +1 -0
  99. package/build/field/convert/toDescriptor.spec.js +291 -0
  100. package/build/field/index.d.ts +5 -0
  101. package/build/field/index.js +3 -0
  102. package/build/field/types/Any.d.ts +20 -0
  103. package/build/field/types/Any.js +2 -0
  104. package/build/field/types/Array.d.ts +32 -0
  105. package/build/field/types/Array.js +2 -0
  106. package/build/field/types/Base.d.ts +60 -0
  107. package/build/field/types/Base.js +2 -0
  108. package/build/field/types/Boolean.d.ts +28 -0
  109. package/build/field/types/Boolean.js +2 -0
  110. package/build/field/types/Date.d.ts +43 -0
  111. package/build/field/types/Date.js +2 -0
  112. package/build/field/types/Datetime.d.ts +43 -0
  113. package/build/field/types/Datetime.js +2 -0
  114. package/build/field/types/Duration.d.ts +28 -0
  115. package/build/field/types/Duration.js +2 -0
  116. package/build/field/types/Geojson.d.ts +30 -0
  117. package/build/field/types/Geojson.js +2 -0
  118. package/build/field/types/Geopoint.d.ts +27 -0
  119. package/build/field/types/Geopoint.js +2 -0
  120. package/build/field/types/Integer.d.ts +57 -0
  121. package/build/field/types/Integer.js +2 -0
  122. package/build/field/types/List.d.ts +36 -0
  123. package/build/field/types/List.js +2 -0
  124. package/build/field/types/Number.d.ts +48 -0
  125. package/build/field/types/Number.js +2 -0
  126. package/build/field/types/Object.d.ts +32 -0
  127. package/build/field/types/Object.js +2 -0
  128. package/build/field/types/String.d.ts +51 -0
  129. package/build/field/types/String.js +2 -0
  130. package/build/field/types/Time.d.ts +43 -0
  131. package/build/field/types/Time.js +2 -0
  132. package/build/field/types/Year.d.ts +36 -0
  133. package/build/field/types/Year.js +2 -0
  134. package/build/field/types/Yearmonth.d.ts +36 -0
  135. package/build/field/types/Yearmonth.js +2 -0
  136. package/build/field/types/index.d.ts +16 -0
  137. package/build/field/types/index.js +17 -0
  138. package/build/index.d.ts +112 -0
  139. package/build/index.js +32 -0
  140. package/build/json/Schema.d.ts +2 -0
  141. package/build/json/Schema.js +2 -0
  142. package/build/json/Value.d.ts +1 -0
  143. package/build/json/Value.js +2 -0
  144. package/build/json/ajv.d.ts +2 -0
  145. package/build/json/ajv.js +10 -0
  146. package/build/json/assert.d.ts +2 -0
  147. package/build/json/assert.js +10 -0
  148. package/build/json/cache.d.ts +2 -0
  149. package/build/json/cache.js +5 -0
  150. package/build/json/index.d.ts +5 -0
  151. package/build/json/index.js +4 -0
  152. package/build/json/inspect/schema.d.ts +4 -0
  153. package/build/json/inspect/schema.js +10 -0
  154. package/build/json/inspect/schema.spec.d.ts +1 -0
  155. package/build/json/inspect/schema.spec.js +132 -0
  156. package/build/json/inspect/value.d.ts +11 -0
  157. package/build/json/inspect/value.js +21 -0
  158. package/build/json/inspect/value.spec.d.ts +1 -0
  159. package/build/json/inspect/value.spec.js +121 -0
  160. package/build/json/load.d.ts +3 -0
  161. package/build/json/load.js +13 -0
  162. package/build/json/resolve.d.ts +2 -0
  163. package/build/json/resolve.js +11 -0
  164. package/build/metadata/Metadata.d.ts +3 -0
  165. package/build/metadata/Metadata.js +2 -0
  166. package/build/metadata/index.d.ts +1 -0
  167. package/build/metadata/index.js +2 -0
  168. package/build/package/Contributor.d.ts +21 -0
  169. package/build/package/Contributor.js +2 -0
  170. package/build/package/Package.d.ts +64 -0
  171. package/build/package/Package.js +2 -0
  172. package/build/package/assert.d.ts +8 -0
  173. package/build/package/assert.js +12 -0
  174. package/build/package/assert.spec.d.ts +1 -0
  175. package/build/package/assert.spec.js +26 -0
  176. package/build/package/convert/fromDescriptor.d.ts +4 -0
  177. package/build/package/convert/fromDescriptor.js +36 -0
  178. package/build/package/convert/toDescriptor.d.ts +5 -0
  179. package/build/package/convert/toDescriptor.js +7 -0
  180. package/build/package/index.d.ts +8 -0
  181. package/build/package/index.js +7 -0
  182. package/build/package/load.d.ts +5 -0
  183. package/build/package/load.js +14 -0
  184. package/build/package/load.spec.d.ts +1 -0
  185. package/build/package/load.spec.js +28 -0
  186. package/build/package/save.d.ts +9 -0
  187. package/build/package/save.js +18 -0
  188. package/build/package/save.spec.d.ts +1 -0
  189. package/build/package/save.spec.js +311 -0
  190. package/build/package/validate.d.ts +12 -0
  191. package/build/package/validate.js +27 -0
  192. package/build/package/validate.spec.d.ts +1 -0
  193. package/build/package/validate.spec.js +41 -0
  194. package/build/path/basepath.d.ts +2 -0
  195. package/build/path/basepath.js +25 -0
  196. package/build/path/basepath.spec.d.ts +1 -0
  197. package/build/path/basepath.spec.js +55 -0
  198. package/build/path/denormalize.d.ts +3 -0
  199. package/build/path/denormalize.js +29 -0
  200. package/build/path/denormalize.spec.d.ts +1 -0
  201. package/build/path/denormalize.spec.js +45 -0
  202. package/build/path/index.d.ts +5 -0
  203. package/build/path/index.js +6 -0
  204. package/build/path/normalize.d.ts +6 -0
  205. package/build/path/normalize.js +54 -0
  206. package/build/path/normalize.spec.d.ts +1 -0
  207. package/build/path/normalize.spec.js +71 -0
  208. package/build/path/path.d.ts +5 -0
  209. package/build/path/path.js +48 -0
  210. package/build/path/path.spec.d.ts +1 -0
  211. package/build/path/path.spec.js +111 -0
  212. package/build/platform/index.d.ts +1 -0
  213. package/build/platform/index.js +2 -0
  214. package/build/platform/node.d.ts +130 -0
  215. package/build/platform/node.js +10 -0
  216. package/build/platform/node.spec.d.ts +1 -0
  217. package/build/platform/node.spec.js +16 -0
  218. package/build/profile/@minify.d.ts +1 -0
  219. package/build/profile/@minify.js +58 -0
  220. package/build/profile/Profile.d.ts +9 -0
  221. package/build/profile/Profile.js +2 -0
  222. package/build/profile/assert.d.ts +6 -0
  223. package/build/profile/assert.js +36 -0
  224. package/build/profile/assert.spec.d.ts +1 -0
  225. package/build/profile/assert.spec.js +115 -0
  226. package/build/profile/index.d.ts +2 -0
  227. package/build/profile/index.js +2 -0
  228. package/build/profile/load.d.ts +4 -0
  229. package/build/profile/load.js +12 -0
  230. package/build/profile/registry.d.ts +2 -0
  231. package/build/profile/registry.js +83 -0
  232. package/build/profile/resolve.d.ts +2 -0
  233. package/build/profile/resolve.js +8 -0
  234. package/build/profile/validate.d.ts +9 -0
  235. package/build/profile/validate.js +12 -0
  236. package/build/report/Report.d.ts +5 -0
  237. package/build/report/Report.js +2 -0
  238. package/build/report/create.d.ts +7 -0
  239. package/build/report/create.js +6 -0
  240. package/build/report/index.d.ts +2 -0
  241. package/build/report/index.js +2 -0
  242. package/build/resource/License.d.ts +18 -0
  243. package/build/resource/License.js +2 -0
  244. package/build/resource/Resource.d.ts +93 -0
  245. package/build/resource/Resource.js +2 -0
  246. package/build/resource/Source.d.ts +17 -0
  247. package/build/resource/Source.js +2 -0
  248. package/build/resource/assert.d.ts +8 -0
  249. package/build/resource/assert.js +12 -0
  250. package/build/resource/assert.spec.d.ts +1 -0
  251. package/build/resource/assert.spec.js +23 -0
  252. package/build/resource/convert/fromDescriptor.d.ts +4 -0
  253. package/build/resource/convert/fromDescriptor.js +69 -0
  254. package/build/resource/convert/toDescriptor.d.ts +5 -0
  255. package/build/resource/convert/toDescriptor.js +36 -0
  256. package/build/resource/helpers.d.ts +2 -0
  257. package/build/resource/helpers.js +6 -0
  258. package/build/resource/index.d.ts +11 -0
  259. package/build/resource/index.js +9 -0
  260. package/build/resource/infer.d.ts +3 -0
  261. package/build/resource/infer.js +35 -0
  262. package/build/resource/infer.spec.d.ts +1 -0
  263. package/build/resource/infer.spec.js +103 -0
  264. package/build/resource/load.d.ts +5 -0
  265. package/build/resource/load.js +14 -0
  266. package/build/resource/load.spec.d.ts +1 -0
  267. package/build/resource/load.spec.js +22 -0
  268. package/build/resource/save.d.ts +9 -0
  269. package/build/resource/save.js +18 -0
  270. package/build/resource/save.spec.d.ts +1 -0
  271. package/build/resource/save.spec.js +170 -0
  272. package/build/resource/validate.d.ts +13 -0
  273. package/build/resource/validate.js +57 -0
  274. package/build/resource/validate.spec.d.ts +1 -0
  275. package/build/resource/validate.spec.js +30 -0
  276. package/build/schema/ForeignKey.d.ts +23 -0
  277. package/build/schema/ForeignKey.js +2 -0
  278. package/build/schema/Schema.d.ts +56 -0
  279. package/build/schema/Schema.js +2 -0
  280. package/build/schema/assert.d.ts +6 -0
  281. package/build/schema/assert.js +12 -0
  282. package/build/schema/assert.spec.d.ts +1 -0
  283. package/build/schema/assert.spec.js +34 -0
  284. package/build/schema/convert/fromDescriptor.d.ts +2 -0
  285. package/build/schema/convert/fromDescriptor.js +70 -0
  286. package/build/schema/convert/fromJsonSchema.d.ts +3 -0
  287. package/build/schema/convert/fromJsonSchema.js +105 -0
  288. package/build/schema/convert/fromJsonSchema.spec.d.ts +1 -0
  289. package/build/schema/convert/fromJsonSchema.spec.js +156 -0
  290. package/build/schema/convert/toDescriptor.d.ts +3 -0
  291. package/build/schema/convert/toDescriptor.js +5 -0
  292. package/build/schema/convert/toJsonSchema.d.ts +3 -0
  293. package/build/schema/convert/toJsonSchema.js +173 -0
  294. package/build/schema/convert/toJsonSchema.spec.d.ts +1 -0
  295. package/build/schema/convert/toJsonSchema.spec.js +403 -0
  296. package/build/schema/index.d.ts +11 -0
  297. package/build/schema/index.js +10 -0
  298. package/build/schema/load.d.ts +5 -0
  299. package/build/schema/load.js +12 -0
  300. package/build/schema/load.spec.d.ts +1 -0
  301. package/build/schema/load.spec.js +55 -0
  302. package/build/schema/resolve.d.ts +2 -0
  303. package/build/schema/resolve.js +11 -0
  304. package/build/schema/save.d.ts +9 -0
  305. package/build/schema/save.js +16 -0
  306. package/build/schema/save.spec.d.ts +1 -0
  307. package/build/schema/save.spec.js +58 -0
  308. package/build/schema/validate.d.ts +10 -0
  309. package/build/schema/validate.js +25 -0
  310. package/build/schema/validate.spec.d.ts +1 -0
  311. package/build/schema/validate.spec.js +41 -0
  312. package/package.json +37 -0
@@ -0,0 +1,2 @@
1
+ export type Descriptor = Record<string, unknown>;
2
+ export declare function isDescriptor(value: unknown): value is Descriptor;
@@ -0,0 +1,4 @@
1
+ export function isDescriptor(value) {
2
+ return !!value && typeof value === "object" && !Array.isArray(value);
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2Rlc2NyaXB0b3IvRGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWM7SUFDekMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIERlc2NyaXB0b3IgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZXNjcmlwdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGVzY3JpcHRvciB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbn1cbiJdfQ==
@@ -0,0 +1,6 @@
1
+ export { parseDescriptor } from "./process/parse.ts";
2
+ export { stringifyDescriptor } from "./process/stringify.ts";
3
+ export { loadDescriptor } from "./load.ts";
4
+ export { saveDescriptor } from "./save.ts";
5
+ export type { Descriptor } from "./Descriptor.ts";
6
+ export { isDescriptor } from "./Descriptor.ts";
@@ -0,0 +1,6 @@
1
+ export { parseDescriptor } from "./process/parse.js";
2
+ export { stringifyDescriptor } from "./process/stringify.js";
3
+ export { loadDescriptor } from "./load.js";
4
+ export { saveDescriptor } from "./save.js";
5
+ export { isDescriptor } from "./Descriptor.js";
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kZXNjcmlwdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgcGFyc2VEZXNjcmlwdG9yIH0gZnJvbSBcIi4vcHJvY2Vzcy9wYXJzZS50c1wiXG5leHBvcnQgeyBzdHJpbmdpZnlEZXNjcmlwdG9yIH0gZnJvbSBcIi4vcHJvY2Vzcy9zdHJpbmdpZnkudHNcIlxuZXhwb3J0IHsgbG9hZERlc2NyaXB0b3IgfSBmcm9tIFwiLi9sb2FkLnRzXCJcbmV4cG9ydCB7IHNhdmVEZXNjcmlwdG9yIH0gZnJvbSBcIi4vc2F2ZS50c1wiXG5leHBvcnQgdHlwZSB7IERlc2NyaXB0b3IgfSBmcm9tIFwiLi9EZXNjcmlwdG9yLnRzXCJcbmV4cG9ydCB7IGlzRGVzY3JpcHRvciB9IGZyb20gXCIuL0Rlc2NyaXB0b3IudHNcIlxuIl19
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Load a descriptor (JSON Object) from a file or URL
3
+ * Uses dynamic imports to work in both Node.js and browser environments
4
+ * Supports HTTP, HTTPS, FTP, and FTPS protocols
5
+ */
6
+ export declare function loadDescriptor(path: string, options?: {
7
+ onlyRemote?: boolean;
8
+ }): Promise<Record<string, any>>;
@@ -0,0 +1,36 @@
1
+ import { node } from "../platform/index.js";
2
+ import { getProtocol, isRemotePath } from "../path/index.js";
3
+ import { parseDescriptor } from "./process/parse.js";
4
+ /**
5
+ * Load a descriptor (JSON Object) from a file or URL
6
+ * Uses dynamic imports to work in both Node.js and browser environments
7
+ * Supports HTTP, HTTPS, FTP, and FTPS protocols
8
+ */
9
+ export async function loadDescriptor(path, options) {
10
+ const isRemote = isRemotePath(path);
11
+ if (!isRemote && options?.onlyRemote) {
12
+ throw new Error("Cannot load descriptor for security reasons");
13
+ }
14
+ return !isRemote
15
+ ? await loadLocalDescriptor(path)
16
+ : await loadRemoteDescriptor(path);
17
+ }
18
+ async function loadLocalDescriptor(path) {
19
+ if (!node) {
20
+ throw new Error("File system is not supported in this environment");
21
+ }
22
+ const text = await node.fs.readFile(path, "utf-8");
23
+ const descriptor = parseDescriptor(text);
24
+ return descriptor;
25
+ }
26
+ async function loadRemoteDescriptor(path) {
27
+ const url = new URL(path);
28
+ const protocol = getProtocol(path);
29
+ if (!["http", "https", "ftp", "ftps"].includes(protocol)) {
30
+ throw new Error(`Unsupported remote protocol: ${protocol}`);
31
+ }
32
+ const response = await fetch(url.toString());
33
+ const descriptor = (await response.json());
34
+ return descriptor;
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2Rlc2NyaXB0b3IvbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFcEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUNsQyxJQUFZLEVBQ1osT0FFQztJQUVELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNuQyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7SUFDaEUsQ0FBQztJQUVELE9BQU8sQ0FBQyxRQUFRO1FBQ2QsQ0FBQyxDQUFDLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3RDLENBQUM7QUFFRCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsSUFBWTtJQUM3QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2xELE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV4QyxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQsS0FBSyxVQUFVLG9CQUFvQixDQUFDLElBQVk7SUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFekIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2xDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDN0QsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzVDLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQXdCLENBQUE7SUFFakUsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vZGUgfSBmcm9tIFwiLi4vcGxhdGZvcm0vaW5kZXgudHNcIlxuaW1wb3J0IHsgZ2V0UHJvdG9jb2wsIGlzUmVtb3RlUGF0aCB9IGZyb20gXCIuLi9wYXRoL2luZGV4LnRzXCJcbmltcG9ydCB7IHBhcnNlRGVzY3JpcHRvciB9IGZyb20gXCIuL3Byb2Nlc3MvcGFyc2UudHNcIlxuXG4vKipcbiAqIExvYWQgYSBkZXNjcmlwdG9yIChKU09OIE9iamVjdCkgZnJvbSBhIGZpbGUgb3IgVVJMXG4gKiBVc2VzIGR5bmFtaWMgaW1wb3J0cyB0byB3b3JrIGluIGJvdGggTm9kZS5qcyBhbmQgYnJvd3NlciBlbnZpcm9ubWVudHNcbiAqIFN1cHBvcnRzIEhUVFAsIEhUVFBTLCBGVFAsIGFuZCBGVFBTIHByb3RvY29sc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERlc2NyaXB0b3IoXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBvbmx5UmVtb3RlPzogYm9vbGVhblxuICB9LFxuKSB7XG4gIGNvbnN0IGlzUmVtb3RlID0gaXNSZW1vdGVQYXRoKHBhdGgpXG4gIGlmICghaXNSZW1vdGUgJiYgb3B0aW9ucz8ub25seVJlbW90ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBsb2FkIGRlc2NyaXB0b3IgZm9yIHNlY3VyaXR5IHJlYXNvbnNcIilcbiAgfVxuXG4gIHJldHVybiAhaXNSZW1vdGVcbiAgICA/IGF3YWl0IGxvYWRMb2NhbERlc2NyaXB0b3IocGF0aClcbiAgICA6IGF3YWl0IGxvYWRSZW1vdGVEZXNjcmlwdG9yKHBhdGgpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRMb2NhbERlc2NyaXB0b3IocGF0aDogc3RyaW5nKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGUgc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiKVxuICB9XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IG5vZGUuZnMucmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBkZXNjcmlwdG9yID0gcGFyc2VEZXNjcmlwdG9yKHRleHQpXG5cbiAgcmV0dXJuIGRlc2NyaXB0b3Jcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFJlbW90ZURlc2NyaXB0b3IocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcblxuICBjb25zdCBwcm90b2NvbCA9IGdldFByb3RvY29sKHBhdGgpXG4gIGlmICghW1wiaHR0cFwiLCBcImh0dHBzXCIsIFwiZnRwXCIsIFwiZnRwc1wiXS5pbmNsdWRlcyhwcm90b2NvbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJlbW90ZSBwcm90b2NvbDogJHtwcm90b2NvbH1gKVxuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwudG9TdHJpbmcoKSlcbiAgY29uc3QgZGVzY3JpcHRvciA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cblxuICByZXR1cm4gZGVzY3JpcHRvclxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ import path from "node:path";
2
+ import { afterEach, describe, expect, it, vi } from "vitest";
3
+ import { loadDescriptor } from "./load.js";
4
+ describe("loadDescriptor", () => {
5
+ const getFixturePath = (name) => path.relative(process.cwd(), path.join(import.meta.dirname, "fixtures", name ?? ""));
6
+ const expectedDescriptor = {
7
+ fields: [
8
+ {
9
+ name: "id",
10
+ type: "integer",
11
+ },
12
+ {
13
+ name: "name",
14
+ type: "string",
15
+ },
16
+ ],
17
+ };
18
+ const originalFetch = globalThis.fetch;
19
+ afterEach(() => {
20
+ globalThis.fetch = originalFetch;
21
+ vi.resetAllMocks();
22
+ });
23
+ it("loads a local descriptor from a file path", async () => {
24
+ const descriptor = await loadDescriptor(getFixturePath("schema.json"));
25
+ expect(descriptor).toEqual(expectedDescriptor);
26
+ });
27
+ it("loads a remote descriptor from a URL", async () => {
28
+ const testUrl = "https://example.com/schema.json";
29
+ globalThis.fetch = vi.fn().mockResolvedValue({
30
+ json: () => Promise.resolve(expectedDescriptor),
31
+ });
32
+ const descriptor = await loadDescriptor(testUrl);
33
+ expect(descriptor).toEqual(expectedDescriptor);
34
+ expect(fetch).toHaveBeenCalledWith(testUrl);
35
+ });
36
+ it("throws error for unsupported URL protocol", async () => {
37
+ const testUrl = "bad:///path/to/schema.json";
38
+ await expect(loadDescriptor(testUrl)).rejects.toThrow("Unsupported remote protocol: bad");
39
+ });
40
+ it("throws error when onlyRemote is true but path is local", async () => {
41
+ await expect(loadDescriptor(getFixturePath("schema.json"), { onlyRemote: true })).rejects.toThrow("Cannot load descriptor for security reasons");
42
+ });
43
+ });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGVzY3JpcHRvci9sb2FkLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFMUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixNQUFNLGNBQWMsR0FBRyxDQUFDLElBQWEsRUFBRSxFQUFFLENBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQ1gsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FDdkQsQ0FBQTtJQUVILE1BQU0sa0JBQWtCLEdBQUc7UUFDekIsTUFBTSxFQUFFO1lBQ047Z0JBQ0UsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLFNBQVM7YUFDaEI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsUUFBUTthQUNmO1NBQ0Y7S0FDRixDQUFBO0lBRUQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQTtJQUN0QyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsVUFBVSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUE7UUFDaEMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pELE1BQU0sVUFBVSxHQUFHLE1BQU0sY0FBYyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO1FBRXRFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUNoRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRCxNQUFNLE9BQU8sR0FBRyxpQ0FBaUMsQ0FBQTtRQUVqRCxVQUFVLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztZQUMzQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztTQUNoRCxDQUFDLENBQUE7UUFFRixNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVoRCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzdDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pELE1BQU0sT0FBTyxHQUFHLDRCQUE0QixDQUFBO1FBRTVDLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ25ELGtDQUFrQyxDQUNuQyxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEUsTUFBTSxNQUFNLENBQ1YsY0FBYyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUNwRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtJQUNsRSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBhZnRlckVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgbG9hZERlc2NyaXB0b3IgfSBmcm9tIFwiLi9sb2FkLnRzXCJcblxuZGVzY3JpYmUoXCJsb2FkRGVzY3JpcHRvclwiLCAoKSA9PiB7XG4gIGNvbnN0IGdldEZpeHR1cmVQYXRoID0gKG5hbWU/OiBzdHJpbmcpID0+XG4gICAgcGF0aC5yZWxhdGl2ZShcbiAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCJmaXh0dXJlc1wiLCBuYW1lID8/IFwiXCIpLFxuICAgIClcblxuICBjb25zdCBleHBlY3RlZERlc2NyaXB0b3IgPSB7XG4gICAgZmllbGRzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgXSxcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsRmV0Y2ggPSBnbG9iYWxUaGlzLmZldGNoXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgZ2xvYmFsVGhpcy5mZXRjaCA9IG9yaWdpbmFsRmV0Y2hcbiAgICB2aS5yZXNldEFsbE1vY2tzKClcbiAgfSlcblxuICBpdChcImxvYWRzIGEgbG9jYWwgZGVzY3JpcHRvciBmcm9tIGEgZmlsZSBwYXRoXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gYXdhaXQgbG9hZERlc2NyaXB0b3IoZ2V0Rml4dHVyZVBhdGgoXCJzY2hlbWEuanNvblwiKSlcblxuICAgIGV4cGVjdChkZXNjcmlwdG9yKS50b0VxdWFsKGV4cGVjdGVkRGVzY3JpcHRvcilcbiAgfSlcblxuICBpdChcImxvYWRzIGEgcmVtb3RlIGRlc2NyaXB0b3IgZnJvbSBhIFVSTFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVzdFVybCA9IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9zY2hlbWEuanNvblwiXG5cbiAgICBnbG9iYWxUaGlzLmZldGNoID0gdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBqc29uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZXhwZWN0ZWREZXNjcmlwdG9yKSxcbiAgICB9KVxuXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGF3YWl0IGxvYWREZXNjcmlwdG9yKHRlc3RVcmwpXG5cbiAgICBleHBlY3QoZGVzY3JpcHRvcikudG9FcXVhbChleHBlY3RlZERlc2NyaXB0b3IpXG4gICAgZXhwZWN0KGZldGNoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh0ZXN0VXJsKVxuICB9KVxuXG4gIGl0KFwidGhyb3dzIGVycm9yIGZvciB1bnN1cHBvcnRlZCBVUkwgcHJvdG9jb2xcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3RVcmwgPSBcImJhZDovLy9wYXRoL3RvL3NjaGVtYS5qc29uXCJcblxuICAgIGF3YWl0IGV4cGVjdChsb2FkRGVzY3JpcHRvcih0ZXN0VXJsKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgXCJVbnN1cHBvcnRlZCByZW1vdGUgcHJvdG9jb2w6IGJhZFwiLFxuICAgIClcbiAgfSlcblxuICBpdChcInRocm93cyBlcnJvciB3aGVuIG9ubHlSZW1vdGUgaXMgdHJ1ZSBidXQgcGF0aCBpcyBsb2NhbFwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgbG9hZERlc2NyaXB0b3IoZ2V0Rml4dHVyZVBhdGgoXCJzY2hlbWEuanNvblwiKSwgeyBvbmx5UmVtb3RlOiB0cnVlIH0pLFxuICAgICkucmVqZWN0cy50b1Rocm93KFwiQ2Fubm90IGxvYWQgZGVzY3JpcHRvciBmb3Igc2VjdXJpdHkgcmVhc29uc1wiKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import type { Descriptor } from "../Descriptor.ts";
2
+ export declare function parseDescriptor(text: string): Descriptor;
@@ -0,0 +1,8 @@
1
+ export function parseDescriptor(text) {
2
+ const value = JSON.parse(text);
3
+ if (typeof value !== "object" || Array.isArray(value)) {
4
+ throw new Error(`Invalid descriptor: ${text}`);
5
+ }
6
+ return value;
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXNjcmlwdG9yL3Byb2Nlc3MvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFZO0lBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFOUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLElBQUksRUFBRSxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELE9BQU8sS0FBbUIsQ0FBQTtBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEZXNjcmlwdG9yIH0gZnJvbSBcIi4uL0Rlc2NyaXB0b3IudHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEZXNjcmlwdG9yKHRleHQ6IHN0cmluZykge1xuICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dClcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlc2NyaXB0b3I6ICR7dGV4dH1gKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlIGFzIERlc2NyaXB0b3Jcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import type { Descriptor } from "../Descriptor.ts";
2
+ export declare function stringifyDescriptor(descriptor: Descriptor): string;
@@ -0,0 +1,4 @@
1
+ export function stringifyDescriptor(descriptor) {
2
+ return JSON.stringify(descriptor, null, 2);
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5naWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGVzY3JpcHRvci9wcm9jZXNzL3N0cmluZ2lmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBc0I7SUFDeEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGVzY3JpcHRvciB9IGZyb20gXCIuLi9EZXNjcmlwdG9yLnRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeURlc2NyaXB0b3IoZGVzY3JpcHRvcjogRGVzY3JpcHRvcikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGVzY3JpcHRvciwgbnVsbCwgMilcbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import type { Descriptor } from "./Descriptor.ts";
2
+ /**
3
+ * Save a descriptor (JSON Object) to a file path
4
+ * Works in Node.js environments
5
+ */
6
+ export declare function saveDescriptor(descriptor: Descriptor, options: {
7
+ path: string;
8
+ overwrite?: boolean;
9
+ }): Promise<void>;
@@ -0,0 +1,19 @@
1
+ import { node } from "../platform/index.js";
2
+ import { stringifyDescriptor } from "./process/stringify.js";
3
+ /**
4
+ * Save a descriptor (JSON Object) to a file path
5
+ * Works in Node.js environments
6
+ */
7
+ export async function saveDescriptor(descriptor, options) {
8
+ if (!node) {
9
+ throw new Error("File system is not supported in this environment");
10
+ }
11
+ const text = stringifyDescriptor(descriptor);
12
+ await node.fs.mkdir(node.path.dirname(options.path), { recursive: true });
13
+ await node.fs.writeFile(options.path, text, {
14
+ encoding: "utf8",
15
+ // The "wx" flag ensures that the file won't overwrite an existing file
16
+ flag: options.overwrite ? "w" : "wx",
17
+ });
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2Rlc2NyaXB0b3Ivc2F2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFFNUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLFVBQXNCLEVBQ3RCLE9BR0M7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRTVDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDekUsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtRQUMxQyxRQUFRLEVBQUUsTUFBTTtRQUNoQix1RUFBdUU7UUFDdkUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSTtLQUNyQyxDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9kZSB9IGZyb20gXCIuLi9wbGF0Zm9ybS9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IgfSBmcm9tIFwiLi9EZXNjcmlwdG9yLnRzXCJcbmltcG9ydCB7IHN0cmluZ2lmeURlc2NyaXB0b3IgfSBmcm9tIFwiLi9wcm9jZXNzL3N0cmluZ2lmeS50c1wiXG5cbi8qKlxuICogU2F2ZSBhIGRlc2NyaXB0b3IgKEpTT04gT2JqZWN0KSB0byBhIGZpbGUgcGF0aFxuICogV29ya3MgaW4gTm9kZS5qcyBlbnZpcm9ubWVudHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVEZXNjcmlwdG9yKFxuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yLFxuICBvcHRpb25zOiB7XG4gICAgcGF0aDogc3RyaW5nXG4gICAgb3ZlcndyaXRlPzogYm9vbGVhblxuICB9LFxuKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGUgc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiKVxuICB9XG5cbiAgY29uc3QgdGV4dCA9IHN0cmluZ2lmeURlc2NyaXB0b3IoZGVzY3JpcHRvcilcblxuICBhd2FpdCBub2RlLmZzLm1rZGlyKG5vZGUucGF0aC5kaXJuYW1lKG9wdGlvbnMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIGF3YWl0IG5vZGUuZnMud3JpdGVGaWxlKG9wdGlvbnMucGF0aCwgdGV4dCwge1xuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAvLyBUaGUgXCJ3eFwiIGZsYWcgZW5zdXJlcyB0aGF0IHRoZSBmaWxlIHdvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlXG4gICAgZmxhZzogb3B0aW9ucy5vdmVyd3JpdGUgPyBcIndcIiA6IFwid3hcIixcbiAgfSlcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,99 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { temporaryDirectory } from "tempy";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import { saveDescriptor } from "./save.js";
6
+ describe("saveDescriptor", () => {
7
+ const testDescriptor = {
8
+ name: "test-descriptor",
9
+ version: "1.0.0",
10
+ description: "Test descriptor for save function",
11
+ resources: [
12
+ {
13
+ name: "resource1",
14
+ path: "data/resource1.csv",
15
+ },
16
+ ],
17
+ };
18
+ let testDir;
19
+ let testPath;
20
+ beforeEach(() => {
21
+ testDir = temporaryDirectory();
22
+ testPath = path.join(testDir, "descriptor.json");
23
+ });
24
+ afterEach(async () => {
25
+ try {
26
+ await fs.rm(testDir, { recursive: true, force: true });
27
+ }
28
+ catch (error) {
29
+ if (error instanceof Error && !error.message.includes("ENOENT")) {
30
+ console.error(`Failed to clean up test directory: ${testDir}`, error);
31
+ }
32
+ }
33
+ });
34
+ it("should save a descriptor to the specified path", async () => {
35
+ await saveDescriptor(testDescriptor, { path: testPath });
36
+ const fileExists = await fs
37
+ .stat(testPath)
38
+ .then(() => true)
39
+ .catch(() => false);
40
+ expect(fileExists).toBe(true);
41
+ const content = await fs.readFile(testPath, "utf-8");
42
+ const parsedContent = JSON.parse(content);
43
+ expect(parsedContent).toEqual(testDescriptor);
44
+ });
45
+ it("should save a descriptor to a nested directory path", async () => {
46
+ const nestedPath = path.join(testDir, "nested", "dir", "descriptor.json");
47
+ await saveDescriptor(testDescriptor, { path: nestedPath });
48
+ const fileExists = await fs
49
+ .stat(nestedPath)
50
+ .then(() => true)
51
+ .catch(() => false);
52
+ expect(fileExists).toBe(true);
53
+ const content = await fs.readFile(nestedPath, "utf-8");
54
+ const parsedContent = JSON.parse(content);
55
+ expect(parsedContent).toEqual(testDescriptor);
56
+ });
57
+ it("should use pretty formatting with 2-space indentation", async () => {
58
+ await saveDescriptor(testDescriptor, { path: testPath });
59
+ const content = await fs.readFile(testPath, "utf-8");
60
+ const expectedFormat = JSON.stringify(testDescriptor, null, 2);
61
+ expect(content).toEqual(expectedFormat);
62
+ const lines = content.split("\n");
63
+ expect(lines.length).toBeGreaterThan(1);
64
+ if (lines.length > 1 && lines[1]) {
65
+ expect(lines[1].startsWith(" ")).toBe(true);
66
+ }
67
+ });
68
+ it("should throw an error when file exists and overwrite is false", async () => {
69
+ await saveDescriptor(testDescriptor, { path: testPath });
70
+ await expect(saveDescriptor(testDescriptor, { path: testPath, overwrite: false })).rejects.toThrow();
71
+ });
72
+ it("should throw an error when file exists and overwrite is not specified", async () => {
73
+ await saveDescriptor(testDescriptor, { path: testPath });
74
+ await expect(saveDescriptor(testDescriptor, { path: testPath })).rejects.toThrow();
75
+ });
76
+ it("should overwrite existing file when overwrite is true", async () => {
77
+ const initialDescriptor = {
78
+ name: "initial",
79
+ version: "1.0.0",
80
+ };
81
+ const updatedDescriptor = {
82
+ name: "updated",
83
+ version: "2.0.0",
84
+ description: "Updated descriptor",
85
+ };
86
+ await saveDescriptor(initialDescriptor, { path: testPath });
87
+ const initialContent = await fs.readFile(testPath, "utf-8");
88
+ const initialParsed = JSON.parse(initialContent);
89
+ expect(initialParsed).toEqual(initialDescriptor);
90
+ await saveDescriptor(updatedDescriptor, {
91
+ path: testPath,
92
+ overwrite: true,
93
+ });
94
+ const updatedContent = await fs.readFile(testPath, "utf-8");
95
+ const updatedParsed = JSON.parse(updatedContent);
96
+ expect(updatedParsed).toEqual(updatedDescriptor);
97
+ });
98
+ });
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGVzY3JpcHRvci9zYXZlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUUxQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLE1BQU0sY0FBYyxHQUFHO1FBQ3JCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsT0FBTyxFQUFFLE9BQU87UUFDaEIsV0FBVyxFQUFFLG1DQUFtQztRQUNoRCxTQUFTLEVBQUU7WUFDVDtnQkFDRSxJQUFJLEVBQUUsV0FBVztnQkFDakIsSUFBSSxFQUFFLG9CQUFvQjthQUMzQjtTQUNGO0tBQ0YsQ0FBQTtJQUVELElBQUksT0FBZSxDQUFBO0lBQ25CLElBQUksUUFBZ0IsQ0FBQTtJQUVwQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsT0FBTyxHQUFHLGtCQUFrQixFQUFFLENBQUE7UUFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUE7SUFDbEQsQ0FBQyxDQUFDLENBQUE7SUFFRixTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDeEQs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RUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUUzRCxNQUFNLGNBQWMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDaEQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBRWhELE1BQU0sY0FBYyxDQUFDLGlCQUFpQixFQUFFO1lBQ3RDLElBQUksRUFBRSxRQUFRO1lBQ2QsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFBO1FBRUYsTUFBTSxjQUFjLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ2hELE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUNsRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHRlbXBvcmFyeURpcmVjdG9yeSB9IGZyb20gXCJ0ZW1weVwiXG5pbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBzYXZlRGVzY3JpcHRvciB9IGZyb20gXCIuL3NhdmUudHNcIlxuXG5kZXNjcmliZShcInNhdmVEZXNjcmlwdG9yXCIsICgpID0+IHtcbiAgY29uc3QgdGVzdERlc2NyaXB0b3IgPSB7XG4gICAgbmFtZTogXCJ0ZXN0LWRlc2NyaXB0b3JcIixcbiAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGVzdCBkZXNjcmlwdG9yIGZvciBzYXZlIGZ1bmN0aW9uXCIsXG4gICAgcmVzb3VyY2VzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb3VyY2UxXCIsXG4gICAgICAgIHBhdGg6IFwiZGF0YS9yZXNvdXJjZTEuY3N2XCIsXG4gICAgICB9LFxuICAgIF0sXG4gIH1cblxuICBsZXQgdGVzdERpcjogc3RyaW5nXG4gIGxldCB0ZXN0UGF0aDogc3RyaW5nXG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdGVzdERpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgdGVzdFBhdGggPSBwYXRoLmpvaW4odGVzdERpciwgXCJkZXNjcmlwdG9yLmpzb25cIilcbiAgfSlcblxuICBhZnRlckVhY2goYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5ybSh0ZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIWVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJFTk9FTlRcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNsZWFuIHVwIHRlc3QgZGlyZWN0b3J5OiAke3Rlc3REaXJ9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgYSBkZXNjcmlwdG9yIHRvIHRoZSBzcGVjaWZpZWQgcGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2F2ZURlc2NyaXB0b3IodGVzdERlc2NyaXB0b3IsIHsgcGF0aDogdGVzdFBhdGggfSlcblxuICAgIGNvbnN0IGZpbGVFeGlzdHMgPSBhd2FpdCBmc1xuICAgICAgLnN0YXQodGVzdFBhdGgpXG4gICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICAgIGV4cGVjdChmaWxlRXhpc3RzKS50b0JlKHRydWUpXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGVzdFBhdGgsIFwidXRmLThcIilcbiAgICBjb25zdCBwYXJzZWRDb250ZW50ID0gSlNPTi5wYXJzZShjb250ZW50KVxuICAgIGV4cGVjdChwYXJzZWRDb250ZW50KS50b0VxdWFsKHRlc3REZXNjcmlwdG9yKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgYSBkZXNjcmlwdG9yIHRvIGEgbmVzdGVkIGRpcmVjdG9yeSBwYXRoXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aC5qb2luKHRlc3REaXIsIFwibmVzdGVkXCIsIFwiZGlyXCIsIFwiZGVzY3JpcHRvci5qc29uXCIpXG5cbiAgICBhd2FpdCBzYXZlRGVzY3JpcHRvcih0ZXN0RGVzY3JpcHRvciwgeyBwYXRoOiBuZXN0ZWRQYXRoIH0pXG5cbiAgICBjb25zdCBmaWxlRXhpc3RzID0gYXdhaXQgZnNcbiAgICAgIC5zdGF0KG5lc3RlZFBhdGgpXG4gICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICAgIGV4cGVjdChmaWxlRXhpc3RzKS50b0JlKHRydWUpXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobmVzdGVkUGF0aCwgXCJ1dGYtOFwiKVxuICAgIGNvbnN0IHBhcnNlZENvbnRlbnQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gICAgZXhwZWN0KHBhcnNlZENvbnRlbnQpLnRvRXF1YWwodGVzdERlc2NyaXB0b3IpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdXNlIHByZXR0eSBmb3JtYXR0aW5nIHdpdGggMi1zcGFjZSBpbmRlbnRhdGlvblwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2F2ZURlc2NyaXB0b3IodGVzdERlc2NyaXB0b3IsIHsgcGF0aDogdGVzdFBhdGggfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0ZXN0UGF0aCwgXCJ1dGYtOFwiKVxuICAgIGNvbnN0IGV4cGVjdGVkRm9ybWF0ID0gSlNPTi5zdHJpbmdpZnkodGVzdERlc2NyaXB0b3IsIG51bGwsIDIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoZXhwZWN0ZWRGb3JtYXQpXG5cbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilcbiAgICBleHBlY3QobGluZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSlcblxuICAgIGlmIChsaW5lcy5sZW5ndGggPiAxICYmIGxpbmVzWzFdKSB7XG4gICAgICBleHBlY3QobGluZXNbMV0uc3RhcnRzV2l0aChcIiAgXCIpKS50b0JlKHRydWUpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHRocm93IGFuIGVycm9yIHdoZW4gZmlsZSBleGlzdHMgYW5kIG92ZXJ3cml0ZSBpcyBmYWxzZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2F2ZURlc2NyaXB0b3IodGVzdERlc2NyaXB0b3IsIHsgcGF0aDogdGVzdFBhdGggfSlcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIHNhdmVEZXNjcmlwdG9yKHRlc3REZXNjcmlwdG9yLCB7IHBhdGg6IHRlc3RQYXRoLCBvdmVyd3JpdGU6IGZhbHNlIH0pLFxuICAgICkucmVqZWN0cy50b1Rocm93KClcbiAgfSlcblxuICBpdChcInNob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIGZpbGUgZXhpc3RzIGFuZCBvdmVyd3JpdGUgaXMgbm90IHNwZWNpZmllZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2F2ZURlc2NyaXB0b3IodGVzdERlc2NyaXB0b3IsIHsgcGF0aDogdGVzdFBhdGggfSlcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIHNhdmVEZXNjcmlwdG9yKHRlc3REZXNjcmlwdG9yLCB7IHBhdGg6IHRlc3RQYXRoIH0pLFxuICAgICkucmVqZWN0cy50b1Rocm93KClcbiAgfSlcblxuICBpdChcInNob3VsZCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSB3aGVuIG92ZXJ3cml0ZSBpcyB0cnVlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbml0aWFsRGVzY3JpcHRvciA9IHtcbiAgICAgIG5hbWU6IFwiaW5pdGlhbFwiLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWREZXNjcmlwdG9yID0ge1xuICAgICAgbmFtZTogXCJ1cGRhdGVkXCIsXG4gICAgICB2ZXJzaW9uOiBcIjIuMC4wXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVcGRhdGVkIGRlc2NyaXB0b3JcIixcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlRGVzY3JpcHRvcihpbml0aWFsRGVzY3JpcHRvciwgeyBwYXRoOiB0ZXN0UGF0aCB9KVxuXG4gICAgY29uc3QgaW5pdGlhbENvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0ZXN0UGF0aCwgXCJ1dGYtOFwiKVxuICAgIGNvbnN0IGluaXRpYWxQYXJzZWQgPSBKU09OLnBhcnNlKGluaXRpYWxDb250ZW50KVxuICAgIGV4cGVjdChpbml0aWFsUGFyc2VkKS50b0VxdWFsKGluaXRpYWxEZXNjcmlwdG9yKVxuXG4gICAgYXdhaXQgc2F2ZURlc2NyaXB0b3IodXBkYXRlZERlc2NyaXB0b3IsIHtcbiAgICAgIHBhdGg6IHRlc3RQYXRoLFxuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0pXG5cbiAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHRlc3RQYXRoLCBcInV0Zi04XCIpXG4gICAgY29uc3QgdXBkYXRlZFBhcnNlZCA9IEpTT04ucGFyc2UodXBkYXRlZENvbnRlbnQpXG4gICAgZXhwZWN0KHVwZGF0ZWRQYXJzZWQpLnRvRXF1YWwodXBkYXRlZERlc2NyaXB0b3IpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,89 @@
1
+ import type { Metadata } from "../metadata/index.ts";
2
+ /**
3
+ * Descriptor that describes the structure of tabular data, such as delimiters,
4
+ * headers, and other features. Following the Data Package standard:
5
+ * https://datapackage.org/standard/table-dialect/
6
+ */
7
+ export interface Dialect extends Metadata {
8
+ /**
9
+ * JSON schema profile URL for validation
10
+ */
11
+ $schema?: string;
12
+ /**
13
+ * The name of this dialect
14
+ */
15
+ name?: string;
16
+ /**
17
+ * Whether the file includes a header row with field names
18
+ */
19
+ header?: boolean;
20
+ /**
21
+ * Row numbers (zero-based) that are considered header rows
22
+ */
23
+ headerRows?: number[];
24
+ /**
25
+ * The character used to join multi-line headers
26
+ */
27
+ headerJoin?: string;
28
+ /**
29
+ * Specific rows to be excluded from the data (zero-based)
30
+ */
31
+ commentRows?: number[];
32
+ /**
33
+ * Character sequence denoting the start of a comment line
34
+ */
35
+ commentChar?: string;
36
+ /**
37
+ * The character used to separate fields in the data
38
+ */
39
+ delimiter?: string;
40
+ /**
41
+ * Character sequence used to terminate rows
42
+ */
43
+ lineTerminator?: string;
44
+ /**
45
+ * Character used to quote fields
46
+ */
47
+ quoteChar?: string;
48
+ /**
49
+ * Controls whether a sequence of two quote characters represents a single quote
50
+ */
51
+ doubleQuote?: boolean;
52
+ /**
53
+ * Character used to escape the delimiter or quote characters
54
+ */
55
+ escapeChar?: string;
56
+ /**
57
+ * Character sequence representing null or missing values in the data
58
+ */
59
+ nullSequence?: string;
60
+ /**
61
+ * Whether to ignore whitespace immediately following the delimiter
62
+ */
63
+ skipInitialSpace?: boolean;
64
+ /**
65
+ * For JSON data, the property name containing the data array
66
+ */
67
+ property?: string;
68
+ /**
69
+ * The type of data item in the source: 'array' for rows represented as arrays,
70
+ * or 'object' for rows represented as objects
71
+ */
72
+ itemType?: "array" | "object";
73
+ /**
74
+ * For object-based data items, specifies which object properties to extract as values
75
+ */
76
+ itemKeys?: string[];
77
+ /**
78
+ * For spreadsheet data, the sheet number to read (zero-based)
79
+ */
80
+ sheetNumber?: number;
81
+ /**
82
+ * For spreadsheet data, the sheet name to read
83
+ */
84
+ sheetName?: string;
85
+ /**
86
+ * For database sources, the table name to read
87
+ */
88
+ table?: string;
89
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlhbGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2RpYWxlY3QvRGlhbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9pbmRleC50c1wiXG5cbi8qKlxuICogRGVzY3JpcHRvciB0aGF0IGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRhYnVsYXIgZGF0YSwgc3VjaCBhcyBkZWxpbWl0ZXJzLFxuICogaGVhZGVycywgYW5kIG90aGVyIGZlYXR1cmVzLiBGb2xsb3dpbmcgdGhlIERhdGEgUGFja2FnZSBzdGFuZGFyZDpcbiAqIGh0dHBzOi8vZGF0YXBhY2thZ2Uub3JnL3N0YW5kYXJkL3RhYmxlLWRpYWxlY3QvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlhbGVjdCBleHRlbmRzIE1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEpTT04gc2NoZW1hIHByb2ZpbGUgVVJMIGZvciB2YWxpZGF0aW9uXG4gICAqL1xuICAkc2NoZW1hPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgZGlhbGVjdFxuICAgKi9cbiAgbmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmaWxlIGluY2x1ZGVzIGEgaGVhZGVyIHJvdyB3aXRoIGZpZWxkIG5hbWVzXG4gICAqL1xuICBoZWFkZXI/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFJvdyBudW1iZXJzICh6ZXJvLWJhc2VkKSB0aGF0IGFyZSBjb25zaWRlcmVkIGhlYWRlciByb3dzXG4gICAqL1xuICBoZWFkZXJSb3dzPzogbnVtYmVyW11cblxuICAvKipcbiAgICogVGhlIGNoYXJhY3RlciB1c2VkIHRvIGpvaW4gbXVsdGktbGluZSBoZWFkZXJzXG4gICAqL1xuICBoZWFkZXJKb2luPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIHJvd3MgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgZGF0YSAoemVyby1iYXNlZClcbiAgICovXG4gIGNvbW1lbnRSb3dzPzogbnVtYmVyW11cblxuICAvKipcbiAgICogQ2hhcmFjdGVyIHNlcXVlbmNlIGRlbm90aW5nIHRoZSBzdGFydCBvZiBhIGNvbW1lbnQgbGluZVxuICAgKi9cbiAgY29tbWVudENoYXI/OiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGZpZWxkcyBpbiB0aGUgZGF0YVxuICAgKi9cbiAgZGVsaW1pdGVyPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIENoYXJhY3RlciBzZXF1ZW5jZSB1c2VkIHRvIHRlcm1pbmF0ZSByb3dzXG4gICAqL1xuICBsaW5lVGVybWluYXRvcj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBDaGFyYWN0ZXIgdXNlZCB0byBxdW90ZSBmaWVsZHNcbiAgICovXG4gIHF1b3RlQ2hhcj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIGEgc2VxdWVuY2Ugb2YgdHdvIHF1b3RlIGNoYXJhY3RlcnMgcmVwcmVzZW50cyBhIHNpbmdsZSBxdW90ZVxuICAgKi9cbiAgZG91YmxlUXVvdGU/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIENoYXJhY3RlciB1c2VkIHRvIGVzY2FwZSB0aGUgZGVsaW1pdGVyIG9yIHF1b3RlIGNoYXJhY3RlcnNcbiAgICovXG4gIGVzY2FwZUNoYXI/OiBzdHJpbmdcblxuICAvKipcbiAgICogQ2hhcmFjdGVyIHNlcXVlbmNlIHJlcHJlc2VudGluZyBudWxsIG9yIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBkYXRhXG4gICAqL1xuICBudWxsU2VxdWVuY2U/OiBzdHJpbmdcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgd2hpdGVzcGFjZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGRlbGltaXRlclxuICAgKi9cbiAgc2tpcEluaXRpYWxTcGFjZT86IGJvb2xlYW5cblxuICAvKipcbiAgICogRm9yIEpTT04gZGF0YSwgdGhlIHByb3BlcnR5IG5hbWUgY29udGFpbmluZyB0aGUgZGF0YSBhcnJheVxuICAgKi9cbiAgcHJvcGVydHk/OiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgZGF0YSBpdGVtIGluIHRoZSBzb3VyY2U6ICdhcnJheScgZm9yIHJvd3MgcmVwcmVzZW50ZWQgYXMgYXJyYXlzLFxuICAgKiBvciAnb2JqZWN0JyBmb3Igcm93cyByZXByZXNlbnRlZCBhcyBvYmplY3RzXG4gICAqL1xuICBpdGVtVHlwZT86IFwiYXJyYXlcIiB8IFwib2JqZWN0XCJcblxuICAvKipcbiAgICogRm9yIG9iamVjdC1iYXNlZCBkYXRhIGl0ZW1zLCBzcGVjaWZpZXMgd2hpY2ggb2JqZWN0IHByb3BlcnRpZXMgdG8gZXh0cmFjdCBhcyB2YWx1ZXNcbiAgICovXG4gIGl0ZW1LZXlzPzogc3RyaW5nW11cblxuICAvKipcbiAgICogRm9yIHNwcmVhZHNoZWV0IGRhdGEsIHRoZSBzaGVldCBudW1iZXIgdG8gcmVhZCAoemVyby1iYXNlZClcbiAgICovXG4gIHNoZWV0TnVtYmVyPzogbnVtYmVyXG5cbiAgLyoqXG4gICAqIEZvciBzcHJlYWRzaGVldCBkYXRhLCB0aGUgc2hlZXQgbmFtZSB0byByZWFkXG4gICAqL1xuICBzaGVldE5hbWU/OiBzdHJpbmdcblxuICAvKipcbiAgICogRm9yIGRhdGFiYXNlIHNvdXJjZXMsIHRoZSB0YWJsZSBuYW1lIHRvIHJlYWRcbiAgICovXG4gIHRhYmxlPzogc3RyaW5nXG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ import type { Descriptor } from "../descriptor/index.ts";
2
+ import type { Dialect } from "./Dialect.ts";
3
+ /**
4
+ * Assert a Dialect descriptor (JSON Object) against its profile
5
+ */
6
+ export declare function assertDialect(source: Descriptor | Dialect): Promise<Dialect>;
@@ -0,0 +1,12 @@
1
+ import { validateDialect } from "./validate.js";
2
+ /**
3
+ * Assert a Dialect descriptor (JSON Object) against its profile
4
+ */
5
+ export async function assertDialect(source) {
6
+ const report = await validateDialect(source);
7
+ if (!report.dialect) {
8
+ throw new Error(`Dialect "${JSON.stringify(source).slice(0, 100)}" is not valid`);
9
+ }
10
+ return report.dialect;
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGlhbGVjdC9hc3NlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUUvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLE1BQTRCO0lBQzlELE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTVDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FDYixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQ2pFLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IgfSBmcm9tIFwiLi4vZGVzY3JpcHRvci9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IERpYWxlY3QgfSBmcm9tIFwiLi9EaWFsZWN0LnRzXCJcbmltcG9ydCB7IHZhbGlkYXRlRGlhbGVjdCB9IGZyb20gXCIuL3ZhbGlkYXRlLnRzXCJcblxuLyoqXG4gKiBBc3NlcnQgYSBEaWFsZWN0IGRlc2NyaXB0b3IgKEpTT04gT2JqZWN0KSBhZ2FpbnN0IGl0cyBwcm9maWxlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnREaWFsZWN0KHNvdXJjZTogRGVzY3JpcHRvciB8IERpYWxlY3QpIHtcbiAgY29uc3QgcmVwb3J0ID0gYXdhaXQgdmFsaWRhdGVEaWFsZWN0KHNvdXJjZSlcblxuICBpZiAoIXJlcG9ydC5kaWFsZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERpYWxlY3QgXCIke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgMTAwKX1cIiBpcyBub3QgdmFsaWRgLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiByZXBvcnQuZGlhbGVjdFxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { describe, expect, expectTypeOf, it } from "vitest";
2
+ import { assertDialect } from "./assert.js";
3
+ describe("assertDialect", () => {
4
+ it("returns typed dialect when valid", async () => {
5
+ const descriptor = {
6
+ delimiter: ";",
7
+ header: true,
8
+ skipInitialSpace: true,
9
+ };
10
+ const dialect = await assertDialect(descriptor);
11
+ expectTypeOf(dialect).toEqualTypeOf();
12
+ expect(dialect).toEqual(descriptor);
13
+ });
14
+ it("throws Error when dialect is invalid", async () => {
15
+ const invalidDialect = {
16
+ delimiter: 1,
17
+ header: "yes",
18
+ };
19
+ await expect(assertDialect(invalidDialect)).rejects.toThrow(Error);
20
+ });
21
+ });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kaWFsZWN0L2Fzc2VydC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUUzQyxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtJQUM3QixFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEQsTUFBTSxVQUFVLEdBQUc7WUFDakIsU0FBUyxFQUFFLEdBQUc7WUFDZCxNQUFNLEVBQUUsSUFBSTtZQUNaLGdCQUFnQixFQUFFLElBQUk7U0FDdkIsQ0FBQTtRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRS9DLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQVcsQ0FBQTtRQUM5QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BELE1BQU0sY0FBYyxHQUFHO1lBQ3JCLFNBQVMsRUFBRSxDQUFDO1lBQ1osTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFBO1FBRUQsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNwRSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgZXhwZWN0VHlwZU9mLCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHR5cGUgeyBEaWFsZWN0IH0gZnJvbSBcIi4vRGlhbGVjdC50c1wiXG5pbXBvcnQgeyBhc3NlcnREaWFsZWN0IH0gZnJvbSBcIi4vYXNzZXJ0LnRzXCJcblxuZGVzY3JpYmUoXCJhc3NlcnREaWFsZWN0XCIsICgpID0+IHtcbiAgaXQoXCJyZXR1cm5zIHR5cGVkIGRpYWxlY3Qgd2hlbiB2YWxpZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAgIGRlbGltaXRlcjogXCI7XCIsXG4gICAgICBoZWFkZXI6IHRydWUsXG4gICAgICBza2lwSW5pdGlhbFNwYWNlOiB0cnVlLFxuICAgIH1cblxuICAgIGNvbnN0IGRpYWxlY3QgPSBhd2FpdCBhc3NlcnREaWFsZWN0KGRlc2NyaXB0b3IpXG5cbiAgICBleHBlY3RUeXBlT2YoZGlhbGVjdCkudG9FcXVhbFR5cGVPZjxEaWFsZWN0PigpXG4gICAgZXhwZWN0KGRpYWxlY3QpLnRvRXF1YWwoZGVzY3JpcHRvcilcbiAgfSlcblxuICBpdChcInRocm93cyBFcnJvciB3aGVuIGRpYWxlY3QgaXMgaW52YWxpZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW52YWxpZERpYWxlY3QgPSB7XG4gICAgICBkZWxpbWl0ZXI6IDEsXG4gICAgICBoZWFkZXI6IFwieWVzXCIsXG4gICAgfVxuXG4gICAgYXdhaXQgZXhwZWN0KGFzc2VydERpYWxlY3QoaW52YWxpZERpYWxlY3QpKS5yZWplY3RzLnRvVGhyb3coRXJyb3IpXG4gIH0pXG59KVxuIl19
@@ -0,0 +1,2 @@
1
+ import type { Descriptor } from "../../descriptor/index.ts";
2
+ export declare function convertDialectFromDescriptor(descriptor: Descriptor): Descriptor;
@@ -0,0 +1,20 @@
1
+ export function convertDialectFromDescriptor(descriptor) {
2
+ descriptor = globalThis.structuredClone(descriptor);
3
+ convertProfile(descriptor);
4
+ convertTable(descriptor);
5
+ return descriptor;
6
+ }
7
+ function convertProfile(descriptor) {
8
+ descriptor.$schema = descriptor.$schema ?? descriptor.profile;
9
+ }
10
+ function convertTable(descriptor) {
11
+ const table = descriptor.table;
12
+ if (!table) {
13
+ return;
14
+ }
15
+ if (typeof table !== "string") {
16
+ descriptor.table = undefined;
17
+ console.warn(`Ignoring v2.0 incompatible dialect table: ${table}`);
18
+ }
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbURlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kaWFsZWN0L2NvbnZlcnQvZnJvbURlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLDRCQUE0QixDQUFDLFVBQXNCO0lBQ2pFLFVBQVUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRW5ELGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMxQixZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFeEIsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLFVBQXNCO0lBQzVDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFBO0FBQy9ELENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxVQUFzQjtJQUMxQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFBO0lBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixVQUFVLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQTtRQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3BFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEZXNjcmlwdG9yIH0gZnJvbSBcIi4uLy4uL2Rlc2NyaXB0b3IvaW5kZXgudHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERpYWxlY3RGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBEZXNjcmlwdG9yKSB7XG4gIGRlc2NyaXB0b3IgPSBnbG9iYWxUaGlzLnN0cnVjdHVyZWRDbG9uZShkZXNjcmlwdG9yKVxuXG4gIGNvbnZlcnRQcm9maWxlKGRlc2NyaXB0b3IpXG4gIGNvbnZlcnRUYWJsZShkZXNjcmlwdG9yKVxuXG4gIHJldHVybiBkZXNjcmlwdG9yXG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQcm9maWxlKGRlc2NyaXB0b3I6IERlc2NyaXB0b3IpIHtcbiAgZGVzY3JpcHRvci4kc2NoZW1hID0gZGVzY3JpcHRvci4kc2NoZW1hID8/IGRlc2NyaXB0b3IucHJvZmlsZVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0VGFibGUoZGVzY3JpcHRvcjogRGVzY3JpcHRvcikge1xuICBjb25zdCB0YWJsZSA9IGRlc2NyaXB0b3IudGFibGVcbiAgaWYgKCF0YWJsZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0YWJsZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIGRlc2NyaXB0b3IudGFibGUgPSB1bmRlZmluZWRcbiAgICBjb25zb2xlLndhcm4oYElnbm9yaW5nIHYyLjAgaW5jb21wYXRpYmxlIGRpYWxlY3QgdGFibGU6ICR7dGFibGV9YClcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ import type { Descriptor } from "../../descriptor/index.ts";
2
+ import type { Dialect } from "../Dialect.ts";
3
+ export declare function convertDialectToDescriptor(dialect: Dialect): Descriptor;
@@ -0,0 +1,5 @@
1
+ export function convertDialectToDescriptor(dialect) {
2
+ dialect = globalThis.structuredClone(dialect);
3
+ return dialect;
4
+ }
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9EZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGlhbGVjdC9jb252ZXJ0L3RvRGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLFVBQVUsMEJBQTBCLENBQUMsT0FBZ0I7SUFDekQsT0FBTyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFN0MsT0FBTyxPQUFxQixDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IgfSBmcm9tIFwiLi4vLi4vZGVzY3JpcHRvci9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IERpYWxlY3QgfSBmcm9tIFwiLi4vRGlhbGVjdC50c1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGlhbGVjdFRvRGVzY3JpcHRvcihkaWFsZWN0OiBEaWFsZWN0KSB7XG4gIGRpYWxlY3QgPSBnbG9iYWxUaGlzLnN0cnVjdHVyZWRDbG9uZShkaWFsZWN0KVxuXG4gIHJldHVybiBkaWFsZWN0IGFzIERlc2NyaXB0b3Jcbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ export { assertDialect } from "./assert.ts";
2
+ export { validateDialect } from "./validate.ts";
3
+ export type { Dialect } from "./Dialect.ts";
4
+ export { loadDialect } from "./load.ts";
5
+ export { saveDialect } from "./save.ts";
6
+ export { convertDialectFromDescriptor } from "./convert/fromDescriptor.ts";
7
+ export { convertDialectToDescriptor } from "./convert/toDescriptor.ts";
8
+ export { resolveDialect } from "./resolve.ts";
@@ -0,0 +1,8 @@
1
+ export { assertDialect } from "./assert.js";
2
+ export { validateDialect } from "./validate.js";
3
+ export { loadDialect } from "./load.js";
4
+ export { saveDialect } from "./save.js";
5
+ export { convertDialectFromDescriptor } from "./convert/fromDescriptor.js";
6
+ export { convertDialectToDescriptor } from "./convert/toDescriptor.js";
7
+ export { resolveDialect } from "./resolve.js";
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9kaWFsZWN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUUvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDdkMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDMUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGFzc2VydERpYWxlY3QgfSBmcm9tIFwiLi9hc3NlcnQudHNcIlxuZXhwb3J0IHsgdmFsaWRhdGVEaWFsZWN0IH0gZnJvbSBcIi4vdmFsaWRhdGUudHNcIlxuZXhwb3J0IHR5cGUgeyBEaWFsZWN0IH0gZnJvbSBcIi4vRGlhbGVjdC50c1wiXG5leHBvcnQgeyBsb2FkRGlhbGVjdCB9IGZyb20gXCIuL2xvYWQudHNcIlxuZXhwb3J0IHsgc2F2ZURpYWxlY3QgfSBmcm9tIFwiLi9zYXZlLnRzXCJcbmV4cG9ydCB7IGNvbnZlcnREaWFsZWN0RnJvbURlc2NyaXB0b3IgfSBmcm9tIFwiLi9jb252ZXJ0L2Zyb21EZXNjcmlwdG9yLnRzXCJcbmV4cG9ydCB7IGNvbnZlcnREaWFsZWN0VG9EZXNjcmlwdG9yIH0gZnJvbSBcIi4vY29udmVydC90b0Rlc2NyaXB0b3IudHNcIlxuZXhwb3J0IHsgcmVzb2x2ZURpYWxlY3QgfSBmcm9tIFwiLi9yZXNvbHZlLnRzXCJcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Load a Dialect descriptor (JSON Object) from a file or URL
3
+ * Ensures the descriptor is valid against its profile
4
+ */
5
+ export declare function loadDialect(path: string): Promise<import("./Dialect.ts").Dialect>;
@@ -0,0 +1,12 @@
1
+ import { loadDescriptor } from "../descriptor/index.js";
2
+ import { assertDialect } from "./assert.js";
3
+ /**
4
+ * Load a Dialect descriptor (JSON Object) from a file or URL
5
+ * Ensures the descriptor is valid against its profile
6
+ */
7
+ export async function loadDialect(path) {
8
+ const descriptor = await loadDescriptor(path);
9
+ const dialect = await assertDialect(descriptor);
10
+ return dialect;
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2RpYWxlY3QvbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUUzQzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxJQUFZO0lBQzVDLE1BQU0sVUFBVSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzdDLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQy9DLE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2FkRGVzY3JpcHRvciB9IGZyb20gXCIuLi9kZXNjcmlwdG9yL2luZGV4LnRzXCJcbmltcG9ydCB7IGFzc2VydERpYWxlY3QgfSBmcm9tIFwiLi9hc3NlcnQudHNcIlxuXG4vKipcbiAqIExvYWQgYSBEaWFsZWN0IGRlc2NyaXB0b3IgKEpTT04gT2JqZWN0KSBmcm9tIGEgZmlsZSBvciBVUkxcbiAqIEVuc3VyZXMgdGhlIGRlc2NyaXB0b3IgaXMgdmFsaWQgYWdhaW5zdCBpdHMgcHJvZmlsZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERpYWxlY3QocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBhd2FpdCBsb2FkRGVzY3JpcHRvcihwYXRoKVxuICBjb25zdCBkaWFsZWN0ID0gYXdhaXQgYXNzZXJ0RGlhbGVjdChkZXNjcmlwdG9yKVxuICByZXR1cm4gZGlhbGVjdFxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import { join } from "node:path";
2
+ import { describe, expect, expectTypeOf, it } from "vitest";
3
+ import { loadDialect } from "./load.js";
4
+ describe("loadDialect", async () => {
5
+ const getFixturePath = (name) => join(import.meta.dirname, "fixtures", name);
6
+ const descriptor = {
7
+ delimiter: ";",
8
+ };
9
+ it("loads a dialect from a local file path", async () => {
10
+ const dialect = await loadDialect(getFixturePath("dialect.json"));
11
+ expectTypeOf(dialect).toEqualTypeOf();
12
+ expect(dialect).toEqual(descriptor);
13
+ });
14
+ it("throws an error when dialect is invalid", async () => {
15
+ await expect(loadDialect(getFixturePath("dialect-invalid.json"))).rejects.toThrow();
16
+ });
17
+ });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGlhbGVjdC9sb2FkLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBRTNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFdkMsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtJQUNqQyxNQUFNLGNBQWMsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDN0MsTUFBTSxVQUFVLEdBQUc7UUFDakIsU0FBUyxFQUFFLEdBQUc7S0FDZixDQUFBO0lBRUQsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3RELE1BQU0sT0FBTyxHQUFHLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO1FBQ2pFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQVcsQ0FBQTtRQUM5QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZELE1BQU0sTUFBTSxDQUNWLFdBQVcsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUNwRCxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNyQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgZXhwZWN0VHlwZU9mLCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHR5cGUgeyBEaWFsZWN0IH0gZnJvbSBcIi4vRGlhbGVjdC50c1wiXG5pbXBvcnQgeyBsb2FkRGlhbGVjdCB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG5kZXNjcmliZShcImxvYWREaWFsZWN0XCIsIGFzeW5jICgpID0+IHtcbiAgY29uc3QgZ2V0Rml4dHVyZVBhdGggPSAobmFtZTogc3RyaW5nKSA9PlxuICAgIGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCJmaXh0dXJlc1wiLCBuYW1lKVxuICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgIGRlbGltaXRlcjogXCI7XCIsXG4gIH1cblxuICBpdChcImxvYWRzIGEgZGlhbGVjdCBmcm9tIGEgbG9jYWwgZmlsZSBwYXRoXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaWFsZWN0ID0gYXdhaXQgbG9hZERpYWxlY3QoZ2V0Rml4dHVyZVBhdGgoXCJkaWFsZWN0Lmpzb25cIikpXG4gICAgZXhwZWN0VHlwZU9mKGRpYWxlY3QpLnRvRXF1YWxUeXBlT2Y8RGlhbGVjdD4oKVxuICAgIGV4cGVjdChkaWFsZWN0KS50b0VxdWFsKGRlc2NyaXB0b3IpXG4gIH0pXG5cbiAgaXQoXCJ0aHJvd3MgYW4gZXJyb3Igd2hlbiBkaWFsZWN0IGlzIGludmFsaWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIGxvYWREaWFsZWN0KGdldEZpeHR1cmVQYXRoKFwiZGlhbGVjdC1pbnZhbGlkLmpzb25cIikpLFxuICAgICkucmVqZWN0cy50b1Rocm93KClcbiAgfSlcbn0pXG4iXX0=
@@ -0,0 +1,2 @@
1
+ import type { Dialect } from "./Dialect.ts";
2
+ export declare function resolveDialect(dialect?: Dialect | string): Promise<Dialect | undefined>;
@@ -0,0 +1,11 @@
1
+ import { loadDialect } from "../dialect/index.js";
2
+ export async function resolveDialect(dialect) {
3
+ if (!dialect) {
4
+ return undefined;
5
+ }
6
+ if (typeof dialect !== "string") {
7
+ return dialect;
8
+ }
9
+ return await loadDialect(dialect);
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2RpYWxlY3QvcmVzb2x2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFHakQsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsT0FBMEI7SUFDN0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVELE9BQU8sTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvYWREaWFsZWN0IH0gZnJvbSBcIi4uL2RpYWxlY3QvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBEaWFsZWN0IH0gZnJvbSBcIi4vRGlhbGVjdC50c1wiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlRGlhbGVjdChkaWFsZWN0PzogRGlhbGVjdCB8IHN0cmluZykge1xuICBpZiAoIWRpYWxlY3QpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBpZiAodHlwZW9mIGRpYWxlY3QgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZGlhbGVjdFxuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGxvYWREaWFsZWN0KGRpYWxlY3QpXG59XG4iXX0=
@@ -0,0 +1,9 @@
1
+ import type { Dialect } from "./Dialect.ts";
2
+ /**
3
+ * Save a Dialect to a file path
4
+ * Works in Node.js environments
5
+ */
6
+ export declare function saveDialect(dialect: Dialect, options: {
7
+ path: string;
8
+ overwrite?: boolean;
9
+ }): Promise<void>;