@natlibfi/marc-record-validators-melinda 11.6.7 → 12.0.0-alpha.12

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 (563) hide show
  1. package/.github/workflows/{melinda-node-tests.yml → melinda-node-tests-and-publish.yml} +37 -12
  2. package/dist/access-rights.js +63 -91
  3. package/dist/access-rights.js.map +7 -1
  4. package/dist/access-rights.test.js +137 -0
  5. package/dist/access-rights.test.js.map +7 -0
  6. package/dist/addMissingField041.js +21 -53
  7. package/dist/addMissingField041.js.map +7 -1
  8. package/dist/addMissingField041.test.js +39 -0
  9. package/dist/addMissingField041.test.js.map +7 -0
  10. package/dist/addMissingField336.js +99 -191
  11. package/dist/addMissingField336.js.map +7 -1
  12. package/dist/addMissingField336.test.js +39 -0
  13. package/dist/addMissingField336.test.js.map +7 -0
  14. package/dist/addMissingField337.js +63 -132
  15. package/dist/addMissingField337.js.map +7 -1
  16. package/dist/addMissingField337.test.js +39 -0
  17. package/dist/addMissingField337.test.js.map +7 -0
  18. package/dist/addMissingField338.js +147 -253
  19. package/dist/addMissingField338.js.map +7 -1
  20. package/dist/addMissingField338.test.js +39 -0
  21. package/dist/addMissingField338.test.js.map +7 -0
  22. package/dist/cyrillux-usemarcon-replacement.js +119 -272
  23. package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
  24. package/dist/cyrillux-usemarcon-replacement.test.js +43 -0
  25. package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
  26. package/dist/cyrillux.js +119 -223
  27. package/dist/cyrillux.js.map +7 -1
  28. package/dist/cyrillux.test.js +39 -0
  29. package/dist/cyrillux.test.js.map +7 -0
  30. package/dist/disambiguateSeriesStatements.js +40 -81
  31. package/dist/disambiguateSeriesStatements.js.map +7 -1
  32. package/dist/disambiguateSeriesStatements.test.js +44 -0
  33. package/dist/disambiguateSeriesStatements.test.js.map +7 -0
  34. package/dist/double-commas.js +7 -14
  35. package/dist/double-commas.js.map +7 -1
  36. package/dist/double-commas.test.js +48 -0
  37. package/dist/double-commas.test.js.map +7 -0
  38. package/dist/duplicates-ind1.js +10 -31
  39. package/dist/duplicates-ind1.js.map +7 -1
  40. package/dist/duplicates-ind1.test.js +40 -0
  41. package/dist/duplicates-ind1.test.js.map +7 -0
  42. package/dist/empty-fields.js +10 -22
  43. package/dist/empty-fields.js.map +7 -1
  44. package/dist/empty-fields.test.js +129 -0
  45. package/dist/empty-fields.test.js.map +7 -0
  46. package/dist/ending-punctuation-conf.js +873 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +156 -169
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2385 -0
  51. package/dist/ending-punctuation.test.js.map +7 -0
  52. package/dist/ending-whitespace.js +10 -35
  53. package/dist/ending-whitespace.js.map +7 -1
  54. package/dist/ending-whitespace.test.js +38 -0
  55. package/dist/ending-whitespace.test.js.map +7 -0
  56. package/dist/field-008-18-34-character-groups.js +40 -125
  57. package/dist/field-008-18-34-character-groups.js.map +7 -1
  58. package/dist/field-008-18-34-character-groups.test.js +45 -0
  59. package/dist/field-008-18-34-character-groups.test.js.map +7 -0
  60. package/dist/field-505-separators.js +19 -39
  61. package/dist/field-505-separators.js.map +7 -1
  62. package/dist/field-505-separators.test.js +45 -0
  63. package/dist/field-505-separators.test.js.map +7 -0
  64. package/dist/field-521-fix.js +19 -47
  65. package/dist/field-521-fix.js.map +7 -1
  66. package/dist/field-521-fix.test.js +44 -0
  67. package/dist/field-521-fix.test.js.map +7 -0
  68. package/dist/field-exclusion.js +37 -91
  69. package/dist/field-exclusion.js.map +7 -1
  70. package/dist/field-exclusion.test.js +821 -0
  71. package/dist/field-exclusion.test.js.map +7 -0
  72. package/dist/field-structure.js +52 -104
  73. package/dist/field-structure.js.map +7 -1
  74. package/dist/field-structure.test.js +587 -0
  75. package/dist/field-structure.test.js.map +7 -0
  76. package/dist/field33XUtils.js +119 -503
  77. package/dist/field33XUtils.js.map +7 -1
  78. package/dist/fields-present.js +11 -23
  79. package/dist/fields-present.js.map +7 -1
  80. package/dist/fields-present.test.js +95 -0
  81. package/dist/fields-present.test.js.map +7 -0
  82. package/dist/fix-33X.js +393 -431
  83. package/dist/fix-33X.js.map +7 -1
  84. package/dist/fix-33X.test.js +39 -0
  85. package/dist/fix-33X.test.js.map +7 -0
  86. package/dist/fix-country-codes.js +20 -50
  87. package/dist/fix-country-codes.js.map +7 -1
  88. package/dist/fix-country-codes.test.js +44 -0
  89. package/dist/fix-country-codes.test.js.map +7 -0
  90. package/dist/fix-language-codes.js +23 -53
  91. package/dist/fix-language-codes.js.map +7 -1
  92. package/dist/fix-language-codes.test.js +38 -0
  93. package/dist/fix-language-codes.test.js.map +7 -0
  94. package/dist/fixRelatorTerms.js +82 -209
  95. package/dist/fixRelatorTerms.js.map +7 -1
  96. package/dist/fixRelatorTerms.test.js +44 -0
  97. package/dist/fixRelatorTerms.test.js.map +7 -0
  98. package/dist/fixed-fields.js +21 -30
  99. package/dist/fixed-fields.js.map +7 -1
  100. package/dist/fixed-fields.test.js +87 -0
  101. package/dist/fixed-fields.test.js.map +7 -0
  102. package/dist/identical-fields.js +8 -24
  103. package/dist/identical-fields.js.map +7 -1
  104. package/dist/identical-fields.test.js +119 -0
  105. package/dist/identical-fields.test.js.map +7 -0
  106. package/dist/index.js +182 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +66 -94
  109. package/dist/indicator-fixes.js.map +7 -1
  110. package/dist/indicator-fixes.test.js +42 -0
  111. package/dist/indicator-fixes.test.js.map +7 -0
  112. package/dist/isbn-issn.js +71 -128
  113. package/dist/isbn-issn.js.map +7 -1
  114. package/dist/isbn-issn.test.js +398 -0
  115. package/dist/isbn-issn.test.js.map +7 -0
  116. package/dist/item-language.js +32 -65
  117. package/dist/item-language.js.map +7 -1
  118. package/dist/item-language.test.js +322 -0
  119. package/dist/item-language.test.js.map +7 -0
  120. package/dist/melindaCustomMergeFields.js +5182 -11233
  121. package/dist/melindaCustomMergeFields.js.map +7 -1
  122. package/dist/merge-fields/controlSubfields.js +75 -142
  123. package/dist/merge-fields/controlSubfields.js.map +7 -1
  124. package/dist/merge-fields/counterpartField.js +187 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/dataProvenance.js +29 -0
  127. package/dist/merge-fields/dataProvenance.js.map +7 -0
  128. package/dist/merge-fields/index.js +25 -50
  129. package/dist/merge-fields/index.js.map +7 -1
  130. package/dist/merge-fields/mergableIndicator.js +18 -51
  131. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  132. package/dist/merge-fields/mergableTag.js +78 -30
  133. package/dist/merge-fields/mergableTag.js.map +7 -1
  134. package/dist/merge-fields/mergeConfig.js +66 -171
  135. package/dist/merge-fields/mergeConfig.js.map +7 -1
  136. package/dist/merge-fields/mergeConstraints.js +323 -1214
  137. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  138. package/dist/merge-fields/mergeField.js +47 -111
  139. package/dist/merge-fields/mergeField.js.map +7 -1
  140. package/dist/merge-fields/mergeIndicator.js +64 -118
  141. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  143. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  144. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  145. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  146. package/dist/merge-fields/mergeSubfield.js +47 -95
  147. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  148. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  149. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  150. package/dist/merge-fields/worldKnowledge.js +15 -40
  151. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  152. package/dist/merge-fields.test.js +46 -0
  153. package/dist/merge-fields.test.js.map +7 -0
  154. package/dist/mergeField500Lisapainokset.js +27 -56
  155. package/dist/mergeField500Lisapainokset.js.map +7 -1
  156. package/dist/mergeField500Lisapainokset.test.js +44 -0
  157. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  158. package/dist/mergeRelatorTermFields.js +33 -69
  159. package/dist/mergeRelatorTermFields.js.map +7 -1
  160. package/dist/mergeRelatorTermFields.test.js +44 -0
  161. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  162. package/dist/modernize-502.js +23 -55
  163. package/dist/modernize-502.js.map +7 -1
  164. package/dist/modernize-502.test.js +38 -0
  165. package/dist/modernize-502.test.js.map +7 -0
  166. package/dist/multiple-subfield-0.js +23 -48
  167. package/dist/multiple-subfield-0.js.map +7 -1
  168. package/dist/multiple-subfield-0.test.js +44 -0
  169. package/dist/multiple-subfield-0.test.js.map +7 -0
  170. package/dist/non-breaking-space.js +11 -32
  171. package/dist/non-breaking-space.js.map +7 -1
  172. package/dist/non-breaking-space.test.js +38 -0
  173. package/dist/non-breaking-space.test.js.map +7 -0
  174. package/dist/normalize-dashes.js +18 -37
  175. package/dist/normalize-dashes.js.map +7 -1
  176. package/dist/normalize-dashes.test.js +44 -0
  177. package/dist/normalize-dashes.test.js.map +7 -0
  178. package/dist/normalize-identifiers.js +54 -140
  179. package/dist/normalize-identifiers.js.map +7 -1
  180. package/dist/normalize-identifiers.test.js +44 -0
  181. package/dist/normalize-identifiers.test.js.map +7 -0
  182. package/dist/normalize-qualifying-information.js +23 -48
  183. package/dist/normalize-qualifying-information.js.map +7 -1
  184. package/dist/normalize-qualifying-information.test.js +44 -0
  185. package/dist/normalize-qualifying-information.test.js.map +7 -0
  186. package/dist/normalize-utf8-diacritics.js +19 -105
  187. package/dist/normalize-utf8-diacritics.js.map +7 -1
  188. package/dist/normalize-utf8-diacritics.test.js +44 -0
  189. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  190. package/dist/normalizeFieldForComparison.js +91 -158
  191. package/dist/normalizeFieldForComparison.js.map +7 -1
  192. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  193. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  194. package/dist/prepublicationUtils.js +58 -111
  195. package/dist/prepublicationUtils.js.map +7 -1
  196. package/dist/punctuation/index.js +56 -72
  197. package/dist/punctuation/index.js.map +7 -1
  198. package/dist/punctuation/rules/aut.js +372 -331
  199. package/dist/punctuation/rules/aut.js.map +7 -1
  200. package/dist/punctuation/rules/bib.js +420 -373
  201. package/dist/punctuation/rules/bib.js.map +7 -1
  202. package/dist/punctuation/rules/index.js +7 -21
  203. package/dist/punctuation/rules/index.js.map +7 -1
  204. package/dist/punctuation.test.js +44 -0
  205. package/dist/punctuation.test.js.map +7 -0
  206. package/dist/punctuation2.js +259 -802
  207. package/dist/punctuation2.js.map +7 -1
  208. package/dist/punctuation2.test.js +44 -0
  209. package/dist/punctuation2.test.js.map +7 -0
  210. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  211. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  212. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  213. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  214. package/dist/removeDuplicateDataFields.js +102 -202
  215. package/dist/removeDuplicateDataFields.js.map +7 -1
  216. package/dist/removeDuplicateDataFields.test.js +44 -0
  217. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  218. package/dist/removeInferiorDataFields.js +104 -227
  219. package/dist/removeInferiorDataFields.js.map +7 -1
  220. package/dist/removeInferiorDataFields.test.js +44 -0
  221. package/dist/removeInferiorDataFields.test.js.map +7 -0
  222. package/dist/resolvable-ext-references-melinda.js +25 -60
  223. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  224. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  225. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  226. package/dist/resolveOrphanedSubfield6s.js +32 -63
  227. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  228. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  229. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  230. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  231. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  232. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  233. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  234. package/dist/sort-tags.js +13 -25
  235. package/dist/sort-tags.js.map +7 -1
  236. package/dist/sort-tags.test.js +261 -0
  237. package/dist/sort-tags.test.js.map +7 -0
  238. package/dist/sortFields.js +152 -222
  239. package/dist/sortFields.js.map +7 -1
  240. package/dist/sortFields.test.js +44 -0
  241. package/dist/sortFields.test.js.map +7 -0
  242. package/dist/sortRelatorTerms.js +30 -68
  243. package/dist/sortRelatorTerms.js.map +7 -1
  244. package/dist/sortRelatorTerms.test.js +44 -0
  245. package/dist/sortRelatorTerms.test.js.map +7 -0
  246. package/dist/sortSubfields.js +102 -255
  247. package/dist/sortSubfields.js.map +7 -1
  248. package/dist/sortSubfields.test.js +44 -0
  249. package/dist/sortSubfields.test.js.map +7 -0
  250. package/dist/stripPunctuation.js +13 -36
  251. package/dist/stripPunctuation.js.map +7 -1
  252. package/dist/stripPunctuation.test.js +44 -0
  253. package/dist/stripPunctuation.test.js.map +7 -0
  254. package/dist/subfield-exclusion.js +28 -75
  255. package/dist/subfield-exclusion.js.map +7 -1
  256. package/dist/subfield-exclusion.test.js +471 -0
  257. package/dist/subfield-exclusion.test.js.map +7 -0
  258. package/dist/subfield6Utils.js +107 -269
  259. package/dist/subfield6Utils.js.map +7 -1
  260. package/dist/subfield8Utils.js +26 -50
  261. package/dist/subfield8Utils.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.js +40 -74
  263. package/dist/subfieldValueNormalizations.js.map +7 -1
  264. package/dist/subfieldValueNormalizations.test.js +45 -0
  265. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  266. package/dist/sync-007-and-300.js +22 -53
  267. package/dist/sync-007-and-300.js.map +7 -1
  268. package/dist/sync-007-and-300.test.js +44 -0
  269. package/dist/sync-007-and-300.test.js.map +7 -0
  270. package/dist/translate-terms.js +67 -155
  271. package/dist/translate-terms.js.map +7 -1
  272. package/dist/translate-terms.test.js +54 -0
  273. package/dist/translate-terms.test.js.map +7 -0
  274. package/dist/typeOfDate-008.js +10 -25
  275. package/dist/typeOfDate-008.js.map +7 -1
  276. package/dist/typeOfDate-008.test.js +40 -0
  277. package/dist/typeOfDate-008.test.js.map +7 -0
  278. package/dist/unicode-decomposition.js +94 -107
  279. package/dist/unicode-decomposition.js.map +7 -1
  280. package/dist/unicode-decomposition.test.js +94 -0
  281. package/dist/unicode-decomposition.test.js.map +7 -0
  282. package/dist/update-field-540.js +30 -75
  283. package/dist/update-field-540.js.map +7 -1
  284. package/dist/update-field-540.test.js +44 -0
  285. package/dist/update-field-540.test.js.map +7 -0
  286. package/dist/urn.js +55 -128
  287. package/dist/urn.js.map +7 -1
  288. package/dist/urn.test.js +44 -0
  289. package/dist/urn.test.js.map +7 -0
  290. package/dist/utils.js +78 -126
  291. package/dist/utils.js.map +7 -1
  292. package/eslint.config.mjs +1 -2
  293. package/package.json +28 -101
  294. package/src/access-rights.js +1 -1
  295. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  296. package/src/addMissingField041.js +1 -1
  297. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  298. package/src/addMissingField336.js +3 -3
  299. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  300. package/src/addMissingField337.js +2 -2
  301. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  302. package/src/addMissingField338.js +2 -2
  303. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  304. package/src/cyrillux-usemarcon-replacement.js +18 -18
  305. package/src/{cyrillux-usemarcon-replacement.spec.js → cyrillux-usemarcon-replacement.test.js} +17 -14
  306. package/src/cyrillux.js +19 -12
  307. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  308. package/src/disambiguateSeriesStatements.js +2 -2
  309. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  310. package/src/double-commas.js +1 -1
  311. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  312. package/src/duplicates-ind1.js +1 -1
  313. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  314. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  315. package/src/ending-punctuation-conf.js +6 -5
  316. package/src/ending-punctuation.js +115 -24
  317. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +357 -275
  318. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  319. package/src/field-008-18-34-character-groups.js +2 -2
  320. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  321. package/src/field-505-separators.js +3 -3
  322. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  323. package/src/field-521-fix.js +2 -2
  324. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  325. package/src/field-exclusion.js +1 -1
  326. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  327. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  328. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  329. package/src/fix-33X.js +4 -4
  330. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  331. package/src/fix-country-codes.js +1 -1
  332. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  333. package/src/fix-language-codes.js +5 -5
  334. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  335. package/src/fixRelatorTerms.js +5 -5
  336. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  337. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  338. package/src/identical-fields.js +1 -1
  339. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  340. package/src/index.js +132 -59
  341. package/src/indicator-fixes.js +17 -4
  342. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  343. package/src/isbn-issn.js +12 -7
  344. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  345. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  346. package/src/melindaCustomMergeFields.js +1 -1
  347. package/src/merge-fields/controlSubfields.js +1 -1
  348. package/src/merge-fields/counterpartField.js +14 -9
  349. package/src/merge-fields/dataProvenance.js +41 -0
  350. package/src/merge-fields/index.js +12 -3
  351. package/src/merge-fields/mergableIndicator.js +1 -1
  352. package/src/merge-fields/mergeField.js +8 -8
  353. package/src/merge-fields/mergeIndicator.js +1 -1
  354. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  355. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  356. package/src/merge-fields/mergeSubfield.js +4 -4
  357. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  358. package/src/{merge-fields.spec.js → merge-fields.test.js} +18 -15
  359. package/src/mergeField500Lisapainokset.js +1 -1
  360. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  361. package/src/mergeRelatorTermFields.js +5 -7
  362. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  363. package/src/modernize-502.js +1 -1
  364. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  365. package/src/multiple-subfield-0.js +3 -3
  366. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  367. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  368. package/src/normalize-dashes.js +2 -2
  369. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  370. package/src/normalize-identifiers.js +1 -1
  371. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  372. package/src/normalize-qualifying-information.js +2 -2
  373. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  374. package/src/normalize-utf8-diacritics.js +2 -2
  375. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  376. package/src/normalizeFieldForComparison.js +32 -6
  377. package/src/normalizeSubfieldValueForComparison.js +1 -1
  378. package/src/prepublicationUtils.js +4 -4
  379. package/src/punctuation/index.js +1 -1
  380. package/src/punctuation/rules/index.js +2 -2
  381. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  382. package/src/punctuation2.js +17 -8
  383. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  384. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  385. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  386. package/src/removeDuplicateDataFields.js +11 -19
  387. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  388. package/src/removeInferiorDataFields.js +15 -12
  389. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  390. package/src/resolvable-ext-references-melinda.js +1 -1
  391. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  392. package/src/resolveOrphanedSubfield6s.js +6 -6
  393. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  394. package/src/sanitize-vocabulary-source-codes.js +4 -4
  395. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  396. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  397. package/src/sortFields.js +4 -4
  398. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  399. package/src/sortRelatorTerms.js +3 -3
  400. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  401. package/src/sortSubfields.js +8 -6
  402. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  403. package/src/stripPunctuation.js +3 -3
  404. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  405. package/src/subfield-exclusion.js +1 -1
  406. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  407. package/src/subfield6Utils.js +6 -10
  408. package/src/subfield8Utils.js +4 -4
  409. package/src/subfieldValueNormalizations.js +3 -3
  410. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  411. package/src/sync-007-and-300.js +2 -2
  412. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  413. package/src/translate-terms.js +3 -3
  414. package/src/translate-terms.test.js +75 -0
  415. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  416. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  417. package/src/update-field-540.js +2 -2
  418. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  419. package/src/urn.js +2 -2
  420. package/src/{urn.spec.js → urn.test.js} +12 -13
  421. package/src/utils.js +21 -5
  422. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  423. package/test-fixtures/field-505-separators/03/record.json +3 -0
  424. package/test-fixtures/indicator-fixes/10/expectedResult.json +11 -0
  425. package/test-fixtures/indicator-fixes/10/metadata.json +4 -0
  426. package/test-fixtures/indicator-fixes/10/record.json +11 -0
  427. package/test-fixtures/merge-fields/f05/expectedResult.json +24 -0
  428. package/test-fixtures/merge-fields/f05/metadata.json +6 -0
  429. package/test-fixtures/merge-fields/f05/record.json +30 -0
  430. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  431. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  432. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  433. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  434. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  435. package/test-fixtures/remove-inferior-datafields/f16/expectedResult.json +12 -0
  436. package/test-fixtures/remove-inferior-datafields/f16/metadata.json +5 -0
  437. package/test-fixtures/remove-inferior-datafields/f16/record.json +14 -0
  438. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  439. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  440. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  441. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  442. package/test-fixtures/translate-terms-data.js +42 -0
  443. package/dist/access-rights.spec.js +0 -195
  444. package/dist/access-rights.spec.js.map +0 -1
  445. package/dist/addMissingField041.spec.js +0 -45
  446. package/dist/addMissingField041.spec.js.map +0 -1
  447. package/dist/addMissingField336.spec.js +0 -45
  448. package/dist/addMissingField336.spec.js.map +0 -1
  449. package/dist/addMissingField337.spec.js +0 -43
  450. package/dist/addMissingField337.spec.js.map +0 -1
  451. package/dist/addMissingField338.spec.js +0 -45
  452. package/dist/addMissingField338.spec.js.map +0 -1
  453. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  454. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  455. package/dist/cyrillux.spec.js +0 -46
  456. package/dist/cyrillux.spec.js.map +0 -1
  457. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  458. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  459. package/dist/double-commas.spec.js +0 -73
  460. package/dist/double-commas.spec.js.map +0 -1
  461. package/dist/duplicates-ind1.spec.js +0 -45
  462. package/dist/duplicates-ind1.spec.js.map +0 -1
  463. package/dist/empty-fields.spec.js +0 -118
  464. package/dist/empty-fields.spec.js.map +0 -1
  465. package/dist/ending-punctuation.spec.js +0 -2654
  466. package/dist/ending-punctuation.spec.js.map +0 -1
  467. package/dist/ending-whitespace.spec.js +0 -42
  468. package/dist/ending-whitespace.spec.js.map +0 -1
  469. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  470. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  471. package/dist/field-505-separators.spec.js +0 -51
  472. package/dist/field-505-separators.spec.js.map +0 -1
  473. package/dist/field-521-fix.spec.js +0 -51
  474. package/dist/field-521-fix.spec.js.map +0 -1
  475. package/dist/field-exclusion.spec.js +0 -1054
  476. package/dist/field-exclusion.spec.js.map +0 -1
  477. package/dist/field-structure.spec.js +0 -535
  478. package/dist/field-structure.spec.js.map +0 -1
  479. package/dist/fields-present.spec.js +0 -121
  480. package/dist/fields-present.spec.js.map +0 -1
  481. package/dist/fix-33X.spec.js +0 -45
  482. package/dist/fix-33X.spec.js.map +0 -1
  483. package/dist/fix-country-codes.spec.js +0 -51
  484. package/dist/fix-country-codes.spec.js.map +0 -1
  485. package/dist/fix-language-codes.spec.js +0 -44
  486. package/dist/fix-language-codes.spec.js.map +0 -1
  487. package/dist/fixRelatorTerms.spec.js +0 -51
  488. package/dist/fixRelatorTerms.spec.js.map +0 -1
  489. package/dist/fixed-fields.spec.js +0 -140
  490. package/dist/fixed-fields.spec.js.map +0 -1
  491. package/dist/identical-fields.spec.js +0 -99
  492. package/dist/identical-fields.spec.js.map +0 -1
  493. package/dist/indicator-fixes.spec.js +0 -51
  494. package/dist/indicator-fixes.spec.js.map +0 -1
  495. package/dist/isbn-issn.spec.js +0 -595
  496. package/dist/isbn-issn.spec.js.map +0 -1
  497. package/dist/item-language.spec.js +0 -306
  498. package/dist/item-language.spec.js.map +0 -1
  499. package/dist/melindaCustomMergeFields.json +0 -5120
  500. package/dist/merge-fields.spec.js +0 -51
  501. package/dist/merge-fields.spec.js.map +0 -1
  502. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  503. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  504. package/dist/mergeRelatorTermFields.spec.js +0 -51
  505. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  506. package/dist/modernize-502.spec.js +0 -49
  507. package/dist/modernize-502.spec.js.map +0 -1
  508. package/dist/multiple-subfield-0.spec.js +0 -51
  509. package/dist/multiple-subfield-0.spec.js.map +0 -1
  510. package/dist/non-breaking-space.spec.js +0 -42
  511. package/dist/non-breaking-space.spec.js.map +0 -1
  512. package/dist/normalize-dashes.spec.js +0 -51
  513. package/dist/normalize-dashes.spec.js.map +0 -1
  514. package/dist/normalize-identifiers.spec.js +0 -51
  515. package/dist/normalize-identifiers.spec.js.map +0 -1
  516. package/dist/normalize-qualifying-information.spec.js +0 -51
  517. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  518. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  519. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  520. package/dist/punctuation.spec.js +0 -51
  521. package/dist/punctuation.spec.js.map +0 -1
  522. package/dist/punctuation2.spec.js +0 -51
  523. package/dist/punctuation2.spec.js.map +0 -1
  524. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  525. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  526. package/dist/removeDuplicateDataFields.spec.js +0 -51
  527. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  528. package/dist/removeInferiorDataFields.spec.js +0 -51
  529. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  530. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  531. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  532. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  533. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  534. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  535. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  536. package/dist/sort-tags.spec.js +0 -207
  537. package/dist/sort-tags.spec.js.map +0 -1
  538. package/dist/sortFields.spec.js +0 -51
  539. package/dist/sortFields.spec.js.map +0 -1
  540. package/dist/sortRelatorTerms.spec.js +0 -51
  541. package/dist/sortRelatorTerms.spec.js.map +0 -1
  542. package/dist/sortSubfields.spec.js +0 -52
  543. package/dist/sortSubfields.spec.js.map +0 -1
  544. package/dist/stripPunctuation.spec.js +0 -51
  545. package/dist/stripPunctuation.spec.js.map +0 -1
  546. package/dist/subfield-exclusion.spec.js +0 -523
  547. package/dist/subfield-exclusion.spec.js.map +0 -1
  548. package/dist/subfieldValueNormalizations.spec.js +0 -51
  549. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  550. package/dist/sync-007-and-300.spec.js +0 -51
  551. package/dist/sync-007-and-300.spec.js.map +0 -1
  552. package/dist/translate-terms.spec.js +0 -51
  553. package/dist/translate-terms.spec.js.map +0 -1
  554. package/dist/typeOfDate-008.spec.js +0 -47
  555. package/dist/typeOfDate-008.spec.js.map +0 -1
  556. package/dist/unicode-decomposition.spec.js +0 -91
  557. package/dist/unicode-decomposition.spec.js.map +0 -1
  558. package/dist/update-field-540.spec.js +0 -51
  559. package/dist/update-field-540.spec.js.map +0 -1
  560. package/dist/urn.spec.js +0 -52
  561. package/dist/urn.spec.js.map +0 -1
  562. package/src/melindaCustomMergeFields.json +0 -5120
  563. package/src/translate-terms.spec.js +0 -52
@@ -1 +1,7 @@
1
- {"version":3,"file":"addMissingField338.js","names":["_utils","require","_field33XUtils","description","_default","validate","fix","record","nvdebug","newField","getMissing338","res","message","valid","insertField","msg","fieldToString","trimExtent","value","replace","extractExtent","f300","get","undefined","a","subfields","filter","sf","code","extentToAudioCarrierType","extent","match","typeOfRecord","getTypeOfRecord","includes","fields","some","f","tag","extentToComputerCarrierType","formOfItem","extentToMicroformCarrierType","getFormOfItem","extentToProjectedImageCarrierType","extentToUnmediatedCarrierType","extentToVideoCarrierType","extentToCarrierType","getComputerCarrierType","formOfItem2","cand","getMicroformCarrierType","f007","length","materialDesignation","charAt","isUnmediatedVolume","fields337","fieldHasSubfield","fields336","formOfItemToField338","audioToField338","extentToCode","projectedToField338","objectToField338","educatedGuessIsOnlineResource","fields856","ind1","ind2","checkQualifyingInformation","identifierFields","educatedGuessToCarrierType","finalFallback","f337","guessMissing338B","b","catLang","getCatalogingLanguage","map338CodeToTerm","a2","data"],"sources":["../src/addMissingField338.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, getCatalogingLanguage, nvdebug} from './utils';\nimport {getFormOfItem, map338CodeToTerm} from './field33XUtils';\n\n// Based mostly on USEMARCON-RDA. However, many things have been rethought, modernized etc.\nconst description = 'Add missing 338 field(s)';\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const newField = getMissing338(record);\n const res = {message: [], fix: [], valid: true};\n\n if (newField) {\n record.insertField(newField);\n return res;\n }\n\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const newField = getMissing338(record);\n if (!newField) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(newField)}'`;\n return {message: [msg], valid: false};\n }\n\n\n function trimExtent(value) {\n return value.replace(/\\([^)]*\\)/gu, '').replace(/\\[[^\\]*]\\]/gu, '').replace(/[0-9]/gu, '').replace(/^ +/gu, '').replace(/[ :;+]+$/gu, '').replace(/ +/gu, ' ');\n }\n\n function extractExtent(record) {\n const [f300] = record.get('300');\n if (!f300) {\n return undefined;\n }\n const [a] = f300.subfields.filter(sf => sf.code === 'a');\n if (!a) {\n return undefined;\n }\n return trimExtent(a.value);\n }\n\n\n function extentToAudioCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n nvdebug(`AUDIO EXTENT: '${extent}`);\n if (extent.match(/^(?:audio discs?|[^ ]*ljudskiva|[^ ]*ljudskivor|LP-levy|LP-levyä|LP-skiva|LP-skivor|[^ ]*äänilevy)$/iu)) {\n return 'sd';\n }\n // Boldly assuming here that any cassette is audio\n if (extent.match(/^(?:audiocasettes?|C-kas[^ ]*|DAT-as[^ ]*|kasettia?|kassett|kassetter|ljudkassett|ljudkassetter|äänikasettia?)$/ui)) {\n return 'ss';\n }\n\n const typeOfRecord = record.getTypeOfRecord();\n if (['i', 'j'].includes(typeOfRecord) || record.fields.some(f => f.tag === '007' && f.value[0] === 's')) {\n if (extent.match(/^[^ ]*(?:levyä?|skiva|skivor)$/ui)) {\n return 'sd';\n }\n if (extent.match(/^[^ ]*(?:cassettes?|kasettia?|kassett|kassetter)$/ui)) {\n return 'ss';\n }\n }\n\n return undefined;\n }\n\n function extentToComputerCarrierType(record, formOfItem = '?') {\n const extent = extractExtent(record); // trimmed 300$a\n if (extent) {\n // What about USB etc?!?\n if (extent.match(/^(?:computer chip cartridge|datorminnesmodul|piirikotelo)$/ui)) {\n return 'cb'; // eg. Nintendo Switch games?\n }\n if (extent.match(/^(?:CD-ROM[^ ]*|levyke|levykettä)$/ui)) {\n return 'cd';\n }\n // Might be a video as well, thus the formOfItem check:\n if (['q', 's'].includes(formOfItem) && extent.match(/^(?:CD-levy|optinen levy|optisk skiva|optiska skivor|optista levyä)$/ui)) {\n return 'cd';\n }\n if (extent.match(/^(?:computer card|datorkort|minneskort|muistikortti)[^ ]*$/u)) { // Melinda only muistikortti\n return 'ck';\n }\n if (extent.match(/^(?:online resource|onlineresurs|verkkoaineisto)$/ui)) {\n return 'cr';\n }\n }\n\n return undefined;\n }\n\n function extentToMicroformCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n // No instances in Melinda map to 'ha', 'hb', 'hc'\n\n if (extent.match(/^(?:filmikorttia?|microfiches?|mikrokorttia?)$/ui)) {\n // May be 'hg' as well? (\"mikrokortti\" vs \"mikrokortti (läpinäkymätön)\")\n if (getFormOfItem(record) === 'c') {\n return 'hg'; // Mikrokortti (läpinäkymätön)\n }\n return 'he';\n }\n\n if (extent.match(/^(?:microfilm rolls?|mikrofilmirullaa?(?: kelalla)?|mikrofilmsrullar|mikrofilmsrulle)$/ui)) {\n return 'hj';\n }\n\n\n return undefined;\n }\n\n // extentToMicroscopicCarrierType not really needed\n\n function extentToProjectedImageCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n if (extent.match(/^(?:diaa?|diabild|diabilder|slides?)$/ui)) {\n return 'gs';\n }\n if (extent.match(/^(?:overhead transparencies|overhead transparency|piirtoheitinkalvoa?|transparang|transparanger)$/ui)) {\n return 'gt';\n }\n if (extent.match(/^(?:film rolls?|filmirullaa?|filmrullar|filmrulle)$/ui)) {\n return 'mo';\n }\n return undefined;\n }\n\n // StereographicCarrierType not needed\n\n function extentToUnmediatedCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n\n return undefined;\n }\n\n function extentToVideoCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n // DVD-videoskivor etc\n if (extent.match(/^[^ ]*(?:videodiscs?|videolevyä?|videoskiva|videoskivor)$/ui)) {\n return 'vd';\n }\n if (extent.match(/^(?:videocassettes?|videokassett|videokassetter|videokasettia?)$/ui) || extent.match(/^(?:VHS)/ui)) {\n return 'vf';\n }\n return undefined;\n }\n\n function extentToCarrierType(record) {\n nvdebug(`EXTENT2CARRIERTYPE`);\n return extentToAudioCarrierType(record) ||\n extentToComputerCarrierType(record) ||\n extentToMicroformCarrierType(record) ||\n // Microscopic carriers don't really exist in our data\n extentToProjectedImageCarrierType(record) ||\n // Stereographic carriers don't really exist in our data\n extentToUnmediatedCarrierType(record) ||\n extentToVideoCarrierType(record);\n }\n\n function getComputerCarrierType(record) {\n const formOfItem = getFormOfItem(record);\n\n if (formOfItem === 'o') { // Online resource\n return 'cr';\n }\n\n const typeOfRecord = record.getTypeOfRecord();\n\n if (typeOfRecord !== 'm') {\n if (!['o', 'q', 's'].includes(formOfItem)) { // (Actually 'o' was already handled.) Probably not a computer carrier type\n return undefined;\n }\n }\n\n /* After re-reading, this seems illegal\n if (typeOfRecord === 'm') {\n const f007 = record.get('007');\n if (f007.length === 1) {\n // ca: none, cb: 10 or so, probably errors (typically USB)\n if (f007[0].value[0] === 'c' && f007[0].value[1] === 'o') {\n return 'cd';\n }\n }\n }\n */\n\n // Check fields 300$a (extent), 256$a (computer file characteristics), 516$a (type of computer file or data note), and possible 245$h (medium)\n const formOfItem2 = typeOfRecord === 'm' && formOfItem === '|' ? 's' : formOfItem; // handle '|'\n const cand = extentToComputerCarrierType(record, formOfItem2);\n if (cand) {\n return cand;\n }\n\n return undefined;\n }\n\n function getMicroformCarrierType(record) {\n const f007 = record.get('007');\n if (f007.length === 1 && f007[0].value[0] === 'h') {\n const materialDesignation = f007[0].value.charAt(1);\n // 007/00-01 does not seem exactly trustworthy, but can't blame us for crappy metadata...\n if (['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j'].includes(materialDesignation)) {\n return `h${materialDesignation}`;\n }\n }\n\n const formOfItem = getFormOfItem(record);\n const cand = extentToMicroformCarrierType(record, formOfItem);\n if (cand) {\n return cand;\n }\n\n return undefined;\n }\n\n function isUnmediatedVolume(record) { // Volume/Nide\n const typeOfRecord = record.getTypeOfRecord();\n if (!['a', 'c', 'e', 't'].includes(typeOfRecord)) {\n return false;\n }\n const fields337 = record.get('337');\n if (!fields337 || !fields337.some(f => fieldHasSubfield(f, 'b', 'n'))) {\n return false;\n }\n\n const fields336 = record.get('336');\n\n if (fields336 && fields336.some(f => f.subfields.some(sf => sf.code === 'b' && ['txt', 'cri'].includes(sf.value)))) {\n return 'nc'; // HANDLE ARKKI! ETC...\n }\n // Add 300$a value-based guesses?\n return false;\n }\n\n function formOfItemToField338(record) {\n const formOfItem = getFormOfItem(record);\n if (formOfItem === 'a') {\n // The only notable exception found in Melinda's tag=300 fields:\n if (record.get('300').some(f => f.subfields.some(sf => sf.code === 'a' && sf.value.match(/mikrofilmikela/iu)))) {\n return 'hd';\n }\n // Empically observed default in Melinda:\n return 'hj'; // mikrofilmirulla\n }\n if (formOfItem === 'b') { // mikrokortti\n return 'he';\n }\n if (formOfItem === 'c') { // Deviates from usemarcon-bookwhere-rda. Fix it? Check data?\n return 'hg'; // Mikrokortti (läpinäkymätön). We have none in Melinda it seems... Add test?\n }\n // 'd' isoteksti\n // 'e' sanomalehti (for CR only)\n // 'f' pistekirjoitus\n if (formOfItem === 'o') { // online resource\n return 'cr'; // already handled elsewhere, but keep this here as well\n }\n // 'q' local electronic stuff, use 300 et al to guess. Implemented elsewhere.\n // 'r' painojäljenne, arkki vs nide?\n // 's' electronic (might be local or online). Implemented elsewhere.\n return undefined;\n }\n\n function audioToField338(record) {\n nvdebug('AUDIO-TO-338');\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord !== 'i' && typeOfRecord !== 'j') {\n return undefined;\n }\n const f007 = record.get('007');\n if (f007.length === 1 && f007[0].value[0] === 's') {\n const materialDesignation = f007[0].value.charAt(1);\n if (['d', 'e', 's', 't'].includes(materialDesignation)) {\n return `s${materialDesignation}`;\n }\n // 007/00-01 sr implies online resource, but we'll probably figure it out anyways\n }\n\n const extentToCode = extentToAudioCarrierType(record); // field 300\n if (extentToCode) {\n return extentToCode;\n }\n\n return undefined;\n }\n\n function projectedToField338(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord !== 'g') { // must be \"projected\"\n return undefined;\n }\n\n const f007 = record.get('007');\n if (f007.length === 1) {\n if (f007[0].value[0] === 'g') {\n const materialDesignation = f007[0].value.charAt(1);\n if (['c', 'd', 'f', 's', 't'].includes(materialDesignation)) {\n return `g${materialDesignation}`;\n }\n if (materialDesignation === 'o') {\n return 'gf';\n }\n }\n if (f007[0].value[0] === 'v') {\n const materialDesignation = f007[0].value.charAt(1);\n if (['c', 'd', 'f', 'r'].includes(materialDesignation)) {\n return `v${materialDesignation}`;\n }\n }\n }\n\n const extentToCode = extentToVideoCarrierType(record) || extentToProjectedImageCarrierType(record); // field 300\n if (extentToCode) {\n return extentToCode;\n }\n\n return undefined;\n }\n\n function objectToField338(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'r') {\n // The only subdivision might be card/no. Marginal, so I'm not checking that now.\n return 'nr';\n }\n\n return undefined;\n }\n\n function educatedGuessIsOnlineResource(record) {\n const fields856 = record.get('856');\n\n if (fields856.some(f => f.ind1 === '4' && f.ind2 === '0')) {\n return 'cr';\n }\n\n return undefined;\n }\n\n function checkQualifyingInformation(record) {\n const identifierFields = record.get('(?:015|020|024|028)').filter(f => f.subfields.some(sf => sf.code === 'q'));\n if (identifierFields.some(f => f.subfields.some(sf => sf.code === 'q' && sf.value.match(/\\b(?:hard-?cover|kierre|nid|sid|kovakant|pehmeäkant|pärmar)/iu)))) {\n return 'nc';\n }\n return undefined;\n }\n\n function educatedGuessToCarrierType(record) {\n\n\n return checkQualifyingInformation(record) || educatedGuessIsOnlineResource(record) || finalFallback();\n\n\n function finalFallback() {\n const [f337] = record.get('337');\n if (f337) {\n if (f337.subfields.some(sf => sf.code === 'b' && sf.value === 'n')) { // unmediated\n // As we are a library, most of the stuff are books\n return 'nc';\n }\n }\n return undefined;\n }\n\n\n }\n\n function guessMissing338B(record) {\n // Data sources (which should be trusted most?)\n // LDR/06\n // 007\n // 008/form of item\n // 300\n // 256\n // 516\n // 245$h...\n // First use form of item?\n return getComputerCarrierType(record) || // LDR/06=m (and 007 and 300)\n objectToField338(record) || // LDR/06=r\n audioToField338(record) || // LDR/06=i/j (and 007 and 300)\n projectedToField338(record) || // ...\n formOfItemToField338(record) || // 'a' 'b', 'c', 'o'\n getMicroformCarrierType(record) ||\n isUnmediatedVolume(record) ||\n extentToCarrierType(record) || // fallback: field 300-based guess\n educatedGuessToCarrierType(record); // 337$b='n' (käytettävissä ilman laitetta) -> nc\n\n /*\n const firstFunction = guessFunctions.find(f => f(record));\n if (firstFunction) {\n return firstFunction(record);\n }\n\n return undefined;\n */\n }\n\n function getMissing338(record) {\n // Field 773 and 973 means that the record is a component record, and doesn't need field 338.\n // This will return only a single value. Multivalues must be handled before this...\n if (record.fields.some(f => ['338', '773', '973'].includes(f.tag))) {\n return undefined;\n }\n\n const b = guessMissing338B(record) || 'zu';\n\n const catLang = getCatalogingLanguage(record) || 'fin';\n const a = map338CodeToTerm(b, catLang);\n const a2 = a ? a : 'z'; // unspecified\n\n const data = {tag: '338', ind1: ' ', ind2: ' ', subfields: [\n {code: 'a', value: a2},\n {code: 'b', value: b},\n {code: '2', value: 'rdacarrier'}\n ]};\n\n return data;\n }\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/addMissingField338.js"],
4
+ "sourcesContent": ["//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, getCatalogingLanguage, nvdebug} from './utils.js';\nimport {getFormOfItem, map338CodeToTerm} from './field33XUtils.js';\n\n// Based mostly on USEMARCON-RDA. However, many things have been rethought, modernized etc.\nconst description = 'Add missing 338 field(s)';\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const newField = getMissing338(record);\n const res = {message: [], fix: [], valid: true};\n\n if (newField) {\n record.insertField(newField);\n return res;\n }\n\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const newField = getMissing338(record);\n if (!newField) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(newField)}'`;\n return {message: [msg], valid: false};\n }\n\n\n function trimExtent(value) {\n return value.replace(/\\([^)]*\\)/gu, '').replace(/\\[[^\\]*]\\]/gu, '').replace(/[0-9]/gu, '').replace(/^ +/gu, '').replace(/[ :;+]+$/gu, '').replace(/ +/gu, ' ');\n }\n\n function extractExtent(record) {\n const [f300] = record.get('300');\n if (!f300) {\n return undefined;\n }\n const [a] = f300.subfields.filter(sf => sf.code === 'a');\n if (!a) {\n return undefined;\n }\n return trimExtent(a.value);\n }\n\n\n function extentToAudioCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n nvdebug(`AUDIO EXTENT: '${extent}`);\n if (extent.match(/^(?:audio discs?|[^ ]*ljudskiva|[^ ]*ljudskivor|LP-levy|LP-levy\u00E4|LP-skiva|LP-skivor|[^ ]*\u00E4\u00E4nilevy)$/iu)) {\n return 'sd';\n }\n // Boldly assuming here that any cassette is audio\n if (extent.match(/^(?:audiocasettes?|C-kas[^ ]*|DAT-as[^ ]*|kasettia?|kassett|kassetter|ljudkassett|ljudkassetter|\u00E4\u00E4nikasettia?)$/ui)) {\n return 'ss';\n }\n\n const typeOfRecord = record.getTypeOfRecord();\n if (['i', 'j'].includes(typeOfRecord) || record.fields.some(f => f.tag === '007' && f.value[0] === 's')) {\n if (extent.match(/^[^ ]*(?:levy\u00E4?|skiva|skivor)$/ui)) {\n return 'sd';\n }\n if (extent.match(/^[^ ]*(?:cassettes?|kasettia?|kassett|kassetter)$/ui)) {\n return 'ss';\n }\n }\n\n return undefined;\n }\n\n function extentToComputerCarrierType(record, formOfItem = '?') {\n const extent = extractExtent(record); // trimmed 300$a\n if (extent) {\n // What about USB etc?!?\n if (extent.match(/^(?:computer chip cartridge|datorminnesmodul|piirikotelo)$/ui)) {\n return 'cb'; // eg. Nintendo Switch games?\n }\n if (extent.match(/^(?:CD-ROM[^ ]*|levyke|levykett\u00E4)$/ui)) {\n return 'cd';\n }\n // Might be a video as well, thus the formOfItem check:\n if (['q', 's'].includes(formOfItem) && extent.match(/^(?:CD-levy|optinen levy|optisk skiva|optiska skivor|optista levy\u00E4)$/ui)) {\n return 'cd';\n }\n if (extent.match(/^(?:computer card|datorkort|minneskort|muistikortti)[^ ]*$/u)) { // Melinda only muistikortti\n return 'ck';\n }\n if (extent.match(/^(?:online resource|onlineresurs|verkkoaineisto)$/ui)) {\n return 'cr';\n }\n }\n\n return undefined;\n }\n\n function extentToMicroformCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n // No instances in Melinda map to 'ha', 'hb', 'hc'\n\n if (extent.match(/^(?:filmikorttia?|microfiches?|mikrokorttia?)$/ui)) {\n // May be 'hg' as well? (\"mikrokortti\" vs \"mikrokortti (l\u00E4pin\u00E4kym\u00E4t\u00F6n)\")\n if (getFormOfItem(record) === 'c') {\n return 'hg'; // Mikrokortti (l\u00E4pin\u00E4kym\u00E4t\u00F6n)\n }\n return 'he';\n }\n\n if (extent.match(/^(?:microfilm rolls?|mikrofilmirullaa?(?: kelalla)?|mikrofilmsrullar|mikrofilmsrulle)$/ui)) {\n return 'hj';\n }\n\n\n return undefined;\n }\n\n // extentToMicroscopicCarrierType not really needed\n\n function extentToProjectedImageCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n if (extent.match(/^(?:diaa?|diabild|diabilder|slides?)$/ui)) {\n return 'gs';\n }\n if (extent.match(/^(?:overhead transparencies|overhead transparency|piirtoheitinkalvoa?|transparang|transparanger)$/ui)) {\n return 'gt';\n }\n if (extent.match(/^(?:film rolls?|filmirullaa?|filmrullar|filmrulle)$/ui)) {\n return 'mo';\n }\n return undefined;\n }\n\n // StereographicCarrierType not needed\n\n function extentToUnmediatedCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n\n return undefined;\n }\n\n function extentToVideoCarrierType(record) {\n const extent = extractExtent(record); // trimmed 300$a\n if (!extent) {\n return undefined;\n }\n // DVD-videoskivor etc\n if (extent.match(/^[^ ]*(?:videodiscs?|videolevy\u00E4?|videoskiva|videoskivor)$/ui)) {\n return 'vd';\n }\n if (extent.match(/^(?:videocassettes?|videokassett|videokassetter|videokasettia?)$/ui) || extent.match(/^(?:VHS)/ui)) {\n return 'vf';\n }\n return undefined;\n }\n\n function extentToCarrierType(record) {\n nvdebug(`EXTENT2CARRIERTYPE`);\n return extentToAudioCarrierType(record) ||\n extentToComputerCarrierType(record) ||\n extentToMicroformCarrierType(record) ||\n // Microscopic carriers don't really exist in our data\n extentToProjectedImageCarrierType(record) ||\n // Stereographic carriers don't really exist in our data\n extentToUnmediatedCarrierType(record) ||\n extentToVideoCarrierType(record);\n }\n\n function getComputerCarrierType(record) {\n const formOfItem = getFormOfItem(record);\n\n if (formOfItem === 'o') { // Online resource\n return 'cr';\n }\n\n const typeOfRecord = record.getTypeOfRecord();\n\n if (typeOfRecord !== 'm') {\n if (!['o', 'q', 's'].includes(formOfItem)) { // (Actually 'o' was already handled.) Probably not a computer carrier type\n return undefined;\n }\n }\n\n /* After re-reading, this seems illegal\n if (typeOfRecord === 'm') {\n const f007 = record.get('007');\n if (f007.length === 1) {\n // ca: none, cb: 10 or so, probably errors (typically USB)\n if (f007[0].value[0] === 'c' && f007[0].value[1] === 'o') {\n return 'cd';\n }\n }\n }\n */\n\n // Check fields 300$a (extent), 256$a (computer file characteristics), 516$a (type of computer file or data note), and possible 245$h (medium)\n const formOfItem2 = typeOfRecord === 'm' && formOfItem === '|' ? 's' : formOfItem; // handle '|'\n const cand = extentToComputerCarrierType(record, formOfItem2);\n if (cand) {\n return cand;\n }\n\n return undefined;\n }\n\n function getMicroformCarrierType(record) {\n const f007 = record.get('007');\n if (f007.length === 1 && f007[0].value[0] === 'h') {\n const materialDesignation = f007[0].value.charAt(1);\n // 007/00-01 does not seem exactly trustworthy, but can't blame us for crappy metadata...\n if (['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j'].includes(materialDesignation)) {\n return `h${materialDesignation}`;\n }\n }\n\n const formOfItem = getFormOfItem(record);\n const cand = extentToMicroformCarrierType(record, formOfItem);\n if (cand) {\n return cand;\n }\n\n return undefined;\n }\n\n function isUnmediatedVolume(record) { // Volume/Nide\n const typeOfRecord = record.getTypeOfRecord();\n if (!['a', 'c', 'e', 't'].includes(typeOfRecord)) {\n return false;\n }\n const fields337 = record.get('337');\n if (!fields337 || !fields337.some(f => fieldHasSubfield(f, 'b', 'n'))) {\n return false;\n }\n\n const fields336 = record.get('336');\n\n if (fields336 && fields336.some(f => f.subfields.some(sf => sf.code === 'b' && ['txt', 'cri'].includes(sf.value)))) {\n return 'nc'; // HANDLE ARKKI! ETC...\n }\n // Add 300$a value-based guesses?\n return false;\n }\n\n function formOfItemToField338(record) {\n const formOfItem = getFormOfItem(record);\n if (formOfItem === 'a') {\n // The only notable exception found in Melinda's tag=300 fields:\n if (record.get('300').some(f => f.subfields.some(sf => sf.code === 'a' && sf.value.match(/mikrofilmikela/iu)))) {\n return 'hd';\n }\n // Empically observed default in Melinda:\n return 'hj'; // mikrofilmirulla\n }\n if (formOfItem === 'b') { // mikrokortti\n return 'he';\n }\n if (formOfItem === 'c') { // Deviates from usemarcon-bookwhere-rda. Fix it? Check data?\n return 'hg'; // Mikrokortti (l\u00E4pin\u00E4kym\u00E4t\u00F6n). We have none in Melinda it seems... Add test?\n }\n // 'd' isoteksti\n // 'e' sanomalehti (for CR only)\n // 'f' pistekirjoitus\n if (formOfItem === 'o') { // online resource\n return 'cr'; // already handled elsewhere, but keep this here as well\n }\n // 'q' local electronic stuff, use 300 et al to guess. Implemented elsewhere.\n // 'r' painoj\u00E4ljenne, arkki vs nide?\n // 's' electronic (might be local or online). Implemented elsewhere.\n return undefined;\n }\n\n function audioToField338(record) {\n nvdebug('AUDIO-TO-338');\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord !== 'i' && typeOfRecord !== 'j') {\n return undefined;\n }\n const f007 = record.get('007');\n if (f007.length === 1 && f007[0].value[0] === 's') {\n const materialDesignation = f007[0].value.charAt(1);\n if (['d', 'e', 's', 't'].includes(materialDesignation)) {\n return `s${materialDesignation}`;\n }\n // 007/00-01 sr implies online resource, but we'll probably figure it out anyways\n }\n\n const extentToCode = extentToAudioCarrierType(record); // field 300\n if (extentToCode) {\n return extentToCode;\n }\n\n return undefined;\n }\n\n function projectedToField338(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord !== 'g') { // must be \"projected\"\n return undefined;\n }\n\n const f007 = record.get('007');\n if (f007.length === 1) {\n if (f007[0].value[0] === 'g') {\n const materialDesignation = f007[0].value.charAt(1);\n if (['c', 'd', 'f', 's', 't'].includes(materialDesignation)) {\n return `g${materialDesignation}`;\n }\n if (materialDesignation === 'o') {\n return 'gf';\n }\n }\n if (f007[0].value[0] === 'v') {\n const materialDesignation = f007[0].value.charAt(1);\n if (['c', 'd', 'f', 'r'].includes(materialDesignation)) {\n return `v${materialDesignation}`;\n }\n }\n }\n\n const extentToCode = extentToVideoCarrierType(record) || extentToProjectedImageCarrierType(record); // field 300\n if (extentToCode) {\n return extentToCode;\n }\n\n return undefined;\n }\n\n function objectToField338(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'r') {\n // The only subdivision might be card/no. Marginal, so I'm not checking that now.\n return 'nr';\n }\n\n return undefined;\n }\n\n function educatedGuessIsOnlineResource(record) {\n const fields856 = record.get('856');\n\n if (fields856.some(f => f.ind1 === '4' && f.ind2 === '0')) {\n return 'cr';\n }\n\n return undefined;\n }\n\n function checkQualifyingInformation(record) {\n const identifierFields = record.get('(?:015|020|024|028)').filter(f => f.subfields.some(sf => sf.code === 'q'));\n if (identifierFields.some(f => f.subfields.some(sf => sf.code === 'q' && sf.value.match(/\\b(?:hard-?cover|kierre|nid|sid|kovakant|pehme\u00E4kant|p\u00E4rmar)/iu)))) {\n return 'nc';\n }\n return undefined;\n }\n\n function educatedGuessToCarrierType(record) {\n\n\n return checkQualifyingInformation(record) || educatedGuessIsOnlineResource(record) || finalFallback();\n\n\n function finalFallback() {\n const [f337] = record.get('337');\n if (f337) {\n if (f337.subfields.some(sf => sf.code === 'b' && sf.value === 'n')) { // unmediated\n // As we are a library, most of the stuff are books\n return 'nc';\n }\n }\n return undefined;\n }\n\n\n }\n\n function guessMissing338B(record) {\n // Data sources (which should be trusted most?)\n // LDR/06\n // 007\n // 008/form of item\n // 300\n // 256\n // 516\n // 245$h...\n // First use form of item?\n return getComputerCarrierType(record) || // LDR/06=m (and 007 and 300)\n objectToField338(record) || // LDR/06=r\n audioToField338(record) || // LDR/06=i/j (and 007 and 300)\n projectedToField338(record) || // ...\n formOfItemToField338(record) || // 'a' 'b', 'c', 'o'\n getMicroformCarrierType(record) ||\n isUnmediatedVolume(record) ||\n extentToCarrierType(record) || // fallback: field 300-based guess\n educatedGuessToCarrierType(record); // 337$b='n' (k\u00E4ytett\u00E4viss\u00E4 ilman laitetta) -> nc\n\n /*\n const firstFunction = guessFunctions.find(f => f(record));\n if (firstFunction) {\n return firstFunction(record);\n }\n\n return undefined;\n */\n }\n\n function getMissing338(record) {\n // Field 773 and 973 means that the record is a component record, and doesn't need field 338.\n // This will return only a single value. Multivalues must be handled before this...\n if (record.fields.some(f => ['338', '773', '973'].includes(f.tag))) {\n return undefined;\n }\n\n const b = guessMissing338B(record) || 'zu';\n\n const catLang = getCatalogingLanguage(record) || 'fin';\n const a = map338CodeToTerm(b, catLang);\n const a2 = a ? a : 'z'; // unspecified\n\n const data = {tag: '338', ind1: ' ', ind2: ' ', subfields: [\n {code: 'a', value: a2},\n {code: 'b', value: b},\n {code: '2', value: 'rdacarrier'}\n ]};\n\n return data;\n }\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,39 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./addMissingField338.js";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ generateTests({
7
+ callback,
8
+ path: [import.meta.dirname, "..", "test-fixtures", "addMissingField338"],
9
+ useMetadataFile: true,
10
+ recurse: false,
11
+ fixura: {
12
+ reader: READERS.JSON
13
+ },
14
+ hooks: {
15
+ before: async () => {
16
+ testValidatorFactory();
17
+ }
18
+ }
19
+ });
20
+ async function testValidatorFactory() {
21
+ const validator = await validatorFactory();
22
+ assert.equal(typeof validator, "object");
23
+ assert.equal(typeof validator.description, "string");
24
+ assert.equal(typeof validator.validate, "function");
25
+ assert.equal(validator.fix, "function");
26
+ }
27
+ async function callback({ getFixture, fix = false }) {
28
+ const validator = await validatorFactory();
29
+ const record = new MarcRecord(getFixture("record.json"));
30
+ const expectedResult = getFixture("expectedResult.json");
31
+ if (!fix) {
32
+ const result = await validator.validate(record);
33
+ assert.deepEqual(result, expectedResult);
34
+ return;
35
+ }
36
+ await validator.fix(record);
37
+ assert.deepEqual(record, expectedResult);
38
+ }
39
+ //# sourceMappingURL=addMissingField338.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/addMissingField338.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './addMissingField338.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'addMissingField338'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,oBAAoB;AAAA,EACvE,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAED,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAClD,SAAO,MAAM,UAAU,KAAK,UAAU;AACxC;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
+ "names": []
7
+ }