@pbkware/fielded-text-web 0.1.0

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 (482) hide show
  1. package/dist/api/ft-reader.js +59 -0
  2. package/dist/api/ft-reader.js.map +1 -0
  3. package/dist/api/ft-serialization.js +147 -0
  4. package/dist/api/ft-serialization.js.map +1 -0
  5. package/dist/api/ft-writer-settings.js +31 -0
  6. package/dist/api/ft-writer-settings.js.map +1 -0
  7. package/dist/api/ft-writer.js +22 -0
  8. package/dist/api/ft-writer.js.map +1 -0
  9. package/dist/factory/ft-field-factory.js +86 -0
  10. package/dist/factory/ft-field-factory.js.map +1 -0
  11. package/dist/factory/ft-meta-constructor.js +16 -0
  12. package/dist/factory/ft-meta-constructor.js.map +1 -0
  13. package/dist/factory/ft-meta-factory.js +30 -0
  14. package/dist/factory/ft-meta-factory.js.map +1 -0
  15. package/dist/factory/ft-sequence-constructor.js +11 -0
  16. package/dist/factory/ft-sequence-constructor.js.map +1 -0
  17. package/dist/factory/ft-sequence-factory.js +18 -0
  18. package/dist/factory/ft-sequence-factory.js.map +1 -0
  19. package/dist/factory/ft-sequence-item-constructor.js +11 -0
  20. package/dist/factory/ft-sequence-item-constructor.js.map +1 -0
  21. package/dist/factory/ft-sequence-item-factory.js +18 -0
  22. package/dist/factory/ft-sequence-item-factory.js.map +1 -0
  23. package/dist/factory/ft-sequence-redirect-constructor.js +13 -0
  24. package/dist/factory/ft-sequence-redirect-constructor.js.map +1 -0
  25. package/dist/factory/ft-sequence-redirect-factory.js +176 -0
  26. package/dist/factory/ft-sequence-redirect-factory.js.map +1 -0
  27. package/dist/factory/ft-substitution-constructor.js +23 -0
  28. package/dist/factory/ft-substitution-constructor.js.map +1 -0
  29. package/dist/factory/ft-substitution-factory.js +37 -0
  30. package/dist/factory/ft-substitution-factory.js.map +1 -0
  31. package/dist/fields/definitions/ft-boolean-field-definition.js +36 -0
  32. package/dist/fields/definitions/ft-boolean-field-definition.js.map +1 -0
  33. package/dist/fields/definitions/ft-date-time-field-definition.js +39 -0
  34. package/dist/fields/definitions/ft-date-time-field-definition.js.map +1 -0
  35. package/dist/fields/definitions/ft-decimal-field-definition.js +32 -0
  36. package/dist/fields/definitions/ft-decimal-field-definition.js.map +1 -0
  37. package/dist/fields/definitions/ft-field-definition-list.js +26 -0
  38. package/dist/fields/definitions/ft-field-definition-list.js.map +1 -0
  39. package/dist/fields/definitions/ft-field-definition.js +245 -0
  40. package/dist/fields/definitions/ft-field-definition.js.map +1 -0
  41. package/dist/fields/definitions/ft-float-field-definition.js +32 -0
  42. package/dist/fields/definitions/ft-float-field-definition.js.map +1 -0
  43. package/dist/fields/definitions/ft-generic-field-definition.js +30 -0
  44. package/dist/fields/definitions/ft-generic-field-definition.js.map +1 -0
  45. package/dist/fields/definitions/ft-integer-field-definition.js +33 -0
  46. package/dist/fields/definitions/ft-integer-field-definition.js.map +1 -0
  47. package/dist/fields/definitions/ft-string-field-definition.js +21 -0
  48. package/dist/fields/definitions/ft-string-field-definition.js.map +1 -0
  49. package/dist/fields/instances/ft-boolean-field.js +38 -0
  50. package/dist/fields/instances/ft-boolean-field.js.map +1 -0
  51. package/dist/fields/instances/ft-date-time-field.js +35 -0
  52. package/dist/fields/instances/ft-date-time-field.js.map +1 -0
  53. package/dist/fields/instances/ft-decimal-field.js +35 -0
  54. package/dist/fields/instances/ft-decimal-field.js.map +1 -0
  55. package/dist/fields/instances/ft-field-list.js +56 -0
  56. package/dist/fields/instances/ft-field-list.js.map +1 -0
  57. package/dist/fields/instances/ft-field.js +561 -0
  58. package/dist/fields/instances/ft-field.js.map +1 -0
  59. package/dist/fields/instances/ft-float-field.js +35 -0
  60. package/dist/fields/instances/ft-float-field.js.map +1 -0
  61. package/dist/fields/instances/ft-generic-field.js +173 -0
  62. package/dist/fields/instances/ft-generic-field.js.map +1 -0
  63. package/dist/fields/instances/ft-integer-field.js +35 -0
  64. package/dist/fields/instances/ft-integer-field.js.map +1 -0
  65. package/dist/fields/instances/ft-string-field.js +34 -0
  66. package/dist/fields/instances/ft-string-field.js.map +1 -0
  67. package/dist/index.d.ts +3483 -0
  68. package/dist/index.js +133 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/meta/fields/ft-boolean-meta-field.js +65 -0
  71. package/dist/meta/fields/ft-boolean-meta-field.js.map +1 -0
  72. package/dist/meta/fields/ft-date-time-meta-field.js +55 -0
  73. package/dist/meta/fields/ft-date-time-meta-field.js.map +1 -0
  74. package/dist/meta/fields/ft-decimal-meta-field.js +55 -0
  75. package/dist/meta/fields/ft-decimal-meta-field.js.map +1 -0
  76. package/dist/meta/fields/ft-float-meta-field.js +55 -0
  77. package/dist/meta/fields/ft-float-meta-field.js.map +1 -0
  78. package/dist/meta/fields/ft-generic-meta-field.js +32 -0
  79. package/dist/meta/fields/ft-generic-meta-field.js.map +1 -0
  80. package/dist/meta/fields/ft-integer-meta-field.js +55 -0
  81. package/dist/meta/fields/ft-integer-meta-field.js.map +1 -0
  82. package/dist/meta/fields/ft-meta-field-list.js +183 -0
  83. package/dist/meta/fields/ft-meta-field-list.js.map +1 -0
  84. package/dist/meta/fields/ft-meta-field.js +351 -0
  85. package/dist/meta/fields/ft-meta-field.js.map +1 -0
  86. package/dist/meta/fields/ft-string-meta-field.js +27 -0
  87. package/dist/meta/fields/ft-string-meta-field.js.map +1 -0
  88. package/dist/meta/ft-meta-defaults.js +152 -0
  89. package/dist/meta/ft-meta-defaults.js.map +1 -0
  90. package/dist/meta/ft-meta.js +391 -0
  91. package/dist/meta/ft-meta.js.map +1 -0
  92. package/dist/meta/sequences/core/ft-meta-sequence-item-list.js +82 -0
  93. package/dist/meta/sequences/core/ft-meta-sequence-item-list.js.map +1 -0
  94. package/dist/meta/sequences/core/ft-meta-sequence-item.js +62 -0
  95. package/dist/meta/sequences/core/ft-meta-sequence-item.js.map +1 -0
  96. package/dist/meta/sequences/core/ft-meta-sequence-list.js +164 -0
  97. package/dist/meta/sequences/core/ft-meta-sequence-list.js.map +1 -0
  98. package/dist/meta/sequences/core/ft-meta-sequence.js +96 -0
  99. package/dist/meta/sequences/core/ft-meta-sequence.js.map +1 -0
  100. package/dist/meta/sequences/redirects/ft-boolean-meta-sequence-redirect.js +40 -0
  101. package/dist/meta/sequences/redirects/ft-boolean-meta-sequence-redirect.js.map +1 -0
  102. package/dist/meta/sequences/redirects/ft-case-insensitive-string-meta-sequence-redirect.js +40 -0
  103. package/dist/meta/sequences/redirects/ft-case-insensitive-string-meta-sequence-redirect.js.map +1 -0
  104. package/dist/meta/sequences/redirects/ft-date-meta-sequence-redirect.js +45 -0
  105. package/dist/meta/sequences/redirects/ft-date-meta-sequence-redirect.js.map +1 -0
  106. package/dist/meta/sequences/redirects/ft-exact-date-time-meta-sequence-redirect.js +40 -0
  107. package/dist/meta/sequences/redirects/ft-exact-date-time-meta-sequence-redirect.js.map +1 -0
  108. package/dist/meta/sequences/redirects/ft-exact-decimal-meta-sequence-redirect.js +40 -0
  109. package/dist/meta/sequences/redirects/ft-exact-decimal-meta-sequence-redirect.js.map +1 -0
  110. package/dist/meta/sequences/redirects/ft-exact-float-meta-sequence-redirect.js +40 -0
  111. package/dist/meta/sequences/redirects/ft-exact-float-meta-sequence-redirect.js.map +1 -0
  112. package/dist/meta/sequences/redirects/ft-exact-integer-meta-sequence-redirect.js +40 -0
  113. package/dist/meta/sequences/redirects/ft-exact-integer-meta-sequence-redirect.js.map +1 -0
  114. package/dist/meta/sequences/redirects/ft-exact-string-meta-sequence-redirect.js +40 -0
  115. package/dist/meta/sequences/redirects/ft-exact-string-meta-sequence-redirect.js.map +1 -0
  116. package/dist/meta/sequences/redirects/ft-meta-sequence-redirect-list.js +85 -0
  117. package/dist/meta/sequences/redirects/ft-meta-sequence-redirect-list.js.map +1 -0
  118. package/dist/meta/sequences/redirects/ft-meta-sequence-redirect.js +68 -0
  119. package/dist/meta/sequences/redirects/ft-meta-sequence-redirect.js.map +1 -0
  120. package/dist/meta/sequences/redirects/ft-null-meta-sequence-redirect.js +21 -0
  121. package/dist/meta/sequences/redirects/ft-null-meta-sequence-redirect.js.map +1 -0
  122. package/dist/meta/substitutions/ft-meta-substitution-list.js +51 -0
  123. package/dist/meta/substitutions/ft-meta-substitution-list.js.map +1 -0
  124. package/dist/meta-serialization/format/ft-json-meta-serialization.js +283 -0
  125. package/dist/meta-serialization/format/ft-json-meta-serialization.js.map +1 -0
  126. package/dist/meta-serialization/format/ft-xml-meta-serialization.js +706 -0
  127. package/dist/meta-serialization/format/ft-xml-meta-serialization.js.map +1 -0
  128. package/dist/meta-serialization/format/meta-serializer-options.js +12 -0
  129. package/dist/meta-serialization/format/meta-serializer-options.js.map +1 -0
  130. package/dist/meta-serialization/ft-meta-serialization.js +59 -0
  131. package/dist/meta-serialization/ft-meta-serialization.js.map +1 -0
  132. package/dist/meta-serialization/styles/ft-boolean-styles-meta-serialization.js +83 -0
  133. package/dist/meta-serialization/styles/ft-boolean-styles-meta-serialization.js.map +1 -0
  134. package/dist/meta-serialization/styles/ft-date-time-styles-meta-serialization.js +54 -0
  135. package/dist/meta-serialization/styles/ft-date-time-styles-meta-serialization.js.map +1 -0
  136. package/dist/meta-serialization/styles/ft-number-styles-meta-serialization.js +199 -0
  137. package/dist/meta-serialization/styles/ft-number-styles-meta-serialization.js.map +1 -0
  138. package/dist/meta-serialization/types/boolean-meta-serialization.js +39 -0
  139. package/dist/meta-serialization/types/boolean-meta-serialization.js.map +1 -0
  140. package/dist/meta-serialization/types/char-meta-serialization.js +32 -0
  141. package/dist/meta-serialization/types/char-meta-serialization.js.map +1 -0
  142. package/dist/meta-serialization/types/date-time-meta-serialization.js +227 -0
  143. package/dist/meta-serialization/types/date-time-meta-serialization.js.map +1 -0
  144. package/dist/meta-serialization/types/decimal-meta-serialization.js +12 -0
  145. package/dist/meta-serialization/types/decimal-meta-serialization.js.map +1 -0
  146. package/dist/meta-serialization/types/enums/data-type-meta-serialisation.js +55 -0
  147. package/dist/meta-serialization/types/enums/data-type-meta-serialisation.js.map +1 -0
  148. package/dist/meta-serialization/types/enums/end-of-line-auto-write-type-meta-serialization.js +50 -0
  149. package/dist/meta-serialization/types/enums/end-of-line-auto-write-type-meta-serialization.js.map +1 -0
  150. package/dist/meta-serialization/types/enums/end-of-line-type-meta-serialization.js +49 -0
  151. package/dist/meta-serialization/types/enums/end-of-line-type-meta-serialization.js.map +1 -0
  152. package/dist/meta-serialization/types/enums/heading-constraint-meta-serialization.js +55 -0
  153. package/dist/meta-serialization/types/enums/heading-constraint-meta-serialization.js.map +1 -0
  154. package/dist/meta-serialization/types/enums/last-line-ended-type-meta-serialization.js +48 -0
  155. package/dist/meta-serialization/types/enums/last-line-ended-type-meta-serialization.js.map +1 -0
  156. package/dist/meta-serialization/types/enums/pad-alignment-meta-serialization.js +52 -0
  157. package/dist/meta-serialization/types/enums/pad-alignment-meta-serialization.js.map +1 -0
  158. package/dist/meta-serialization/types/enums/pad-char-type-meta-serialization.js +52 -0
  159. package/dist/meta-serialization/types/enums/pad-char-type-meta-serialization.js.map +1 -0
  160. package/dist/meta-serialization/types/enums/quoted-type-meta-serialization.js +52 -0
  161. package/dist/meta-serialization/types/enums/quoted-type-meta-serialization.js.map +1 -0
  162. package/dist/meta-serialization/types/enums/sequence-invokation-delay-meta-serialization.js +47 -0
  163. package/dist/meta-serialization/types/enums/sequence-invokation-delay-meta-serialization.js.map +1 -0
  164. package/dist/meta-serialization/types/enums/sequence-redirect-type-meta-serialisation.js +88 -0
  165. package/dist/meta-serialization/types/enums/sequence-redirect-type-meta-serialisation.js.map +1 -0
  166. package/dist/meta-serialization/types/enums/substitution-type-meta-serialization.js +47 -0
  167. package/dist/meta-serialization/types/enums/substitution-type-meta-serialization.js.map +1 -0
  168. package/dist/meta-serialization/types/enums/truncate-type-meta-serialization.js +56 -0
  169. package/dist/meta-serialization/types/enums/truncate-type-meta-serialization.js.map +1 -0
  170. package/dist/meta-serialization/types/float-meta-serialization.js +99 -0
  171. package/dist/meta-serialization/types/float-meta-serialization.js.map +1 -0
  172. package/dist/meta-serialization/types/integer-float-meta-serialization.js +52 -0
  173. package/dist/meta-serialization/types/integer-float-meta-serialization.js.map +1 -0
  174. package/dist/meta-serialization/types/integer-meta-serialization.js +50 -0
  175. package/dist/meta-serialization/types/integer-meta-serialization.js.map +1 -0
  176. package/dist/meta-serialization/types/string-meta-serialization.js +35 -0
  177. package/dist/meta-serialization/types/string-meta-serialization.js.map +1 -0
  178. package/dist/meta-serialization/utils/implicit-explicit-index-sorter.js +57 -0
  179. package/dist/meta-serialization/utils/implicit-explicit-index-sorter.js.map +1 -0
  180. package/dist/meta-serialization/utils/meta-serialization-redirect-sequence-resolver.js +33 -0
  181. package/dist/meta-serialization/utils/meta-serialization-redirect-sequence-resolver.js.map +1 -0
  182. package/dist/meta-serialization/utils/meta-serialization-sequence-name-resolver.js +67 -0
  183. package/dist/meta-serialization/utils/meta-serialization-sequence-name-resolver.js.map +1 -0
  184. package/dist/meta-serialization/utils/sequence-item-field-indices.js +70 -0
  185. package/dist/meta-serialization/utils/sequence-item-field-indices.js.map +1 -0
  186. package/dist/sequences/core/ft-sequence-invokation-list.js +91 -0
  187. package/dist/sequences/core/ft-sequence-invokation-list.js.map +1 -0
  188. package/dist/sequences/core/ft-sequence-invokation.js +143 -0
  189. package/dist/sequences/core/ft-sequence-invokation.js.map +1 -0
  190. package/dist/sequences/core/ft-sequence-item-list.js +34 -0
  191. package/dist/sequences/core/ft-sequence-item-list.js.map +1 -0
  192. package/dist/sequences/core/ft-sequence-item.js +46 -0
  193. package/dist/sequences/core/ft-sequence-item.js.map +1 -0
  194. package/dist/sequences/core/ft-sequence-list.js +62 -0
  195. package/dist/sequences/core/ft-sequence-list.js.map +1 -0
  196. package/dist/sequences/core/ft-sequence.js +59 -0
  197. package/dist/sequences/core/ft-sequence.js.map +1 -0
  198. package/dist/sequences/redirects/ft-boolean-sequence-redirect.js +33 -0
  199. package/dist/sequences/redirects/ft-boolean-sequence-redirect.js.map +1 -0
  200. package/dist/sequences/redirects/ft-case-insensitive-string-sequence-redirect.js +33 -0
  201. package/dist/sequences/redirects/ft-case-insensitive-string-sequence-redirect.js.map +1 -0
  202. package/dist/sequences/redirects/ft-date-sequence-redirect.js +37 -0
  203. package/dist/sequences/redirects/ft-date-sequence-redirect.js.map +1 -0
  204. package/dist/sequences/redirects/ft-exact-date-time-sequence-redirect.js +33 -0
  205. package/dist/sequences/redirects/ft-exact-date-time-sequence-redirect.js.map +1 -0
  206. package/dist/sequences/redirects/ft-exact-decimal-sequence-redirect.js +33 -0
  207. package/dist/sequences/redirects/ft-exact-decimal-sequence-redirect.js.map +1 -0
  208. package/dist/sequences/redirects/ft-exact-float-sequence-redirect.js +33 -0
  209. package/dist/sequences/redirects/ft-exact-float-sequence-redirect.js.map +1 -0
  210. package/dist/sequences/redirects/ft-exact-integer-sequence-redirect.js +33 -0
  211. package/dist/sequences/redirects/ft-exact-integer-sequence-redirect.js.map +1 -0
  212. package/dist/sequences/redirects/ft-exact-string-sequence-redirect.js +33 -0
  213. package/dist/sequences/redirects/ft-exact-string-sequence-redirect.js.map +1 -0
  214. package/dist/sequences/redirects/ft-null-sequence-redirect.js +20 -0
  215. package/dist/sequences/redirects/ft-null-sequence-redirect.js.map +1 -0
  216. package/dist/sequences/redirects/ft-sequence-redirect-list.js +35 -0
  217. package/dist/sequences/redirects/ft-sequence-redirect-list.js.map +1 -0
  218. package/dist/sequences/redirects/ft-sequence-redirect.js +47 -0
  219. package/dist/sequences/redirects/ft-sequence-redirect.js.map +1 -0
  220. package/dist/serialization/char-reader.js +178 -0
  221. package/dist/serialization/char-reader.js.map +1 -0
  222. package/dist/serialization/declaration-parser.js +176 -0
  223. package/dist/serialization/declaration-parser.js.map +1 -0
  224. package/dist/serialization/delimited-field-parser.js +278 -0
  225. package/dist/serialization/delimited-field-parser.js.map +1 -0
  226. package/dist/serialization/embedded-meta-parser.js +129 -0
  227. package/dist/serialization/embedded-meta-parser.js.map +1 -0
  228. package/dist/serialization/fixed-width-field-parser.js +196 -0
  229. package/dist/serialization/fixed-width-field-parser.js.map +1 -0
  230. package/dist/serialization/formatting/ft-boolean-field-formatter.js +113 -0
  231. package/dist/serialization/formatting/ft-boolean-field-formatter.js.map +1 -0
  232. package/dist/serialization/formatting/ft-date-time-field-formatter.js +54 -0
  233. package/dist/serialization/formatting/ft-date-time-field-formatter.js.map +1 -0
  234. package/dist/serialization/formatting/ft-decimal-field-formatter.js +46 -0
  235. package/dist/serialization/formatting/ft-decimal-field-formatter.js.map +1 -0
  236. package/dist/serialization/formatting/ft-declared-parameters-formatter.js +52 -0
  237. package/dist/serialization/formatting/ft-declared-parameters-formatter.js.map +1 -0
  238. package/dist/serialization/formatting/ft-field-formatter.js +15 -0
  239. package/dist/serialization/formatting/ft-field-formatter.js.map +1 -0
  240. package/dist/serialization/formatting/ft-float-field-formatter.js +46 -0
  241. package/dist/serialization/formatting/ft-float-field-formatter.js.map +1 -0
  242. package/dist/serialization/formatting/ft-integer-field-formatter.js +47 -0
  243. package/dist/serialization/formatting/ft-integer-field-formatter.js.map +1 -0
  244. package/dist/serialization/formatting/ft-string-field-formatter.js +14 -0
  245. package/dist/serialization/formatting/ft-string-field-formatter.js.map +1 -0
  246. package/dist/serialization/ft-declared-parameters.js +199 -0
  247. package/dist/serialization/ft-declared-parameters.js.map +1 -0
  248. package/dist/serialization/ft-serialization-reader.js +865 -0
  249. package/dist/serialization/ft-serialization-reader.js.map +1 -0
  250. package/dist/serialization/ft-serialization-writer.js +633 -0
  251. package/dist/serialization/ft-serialization-writer.js.map +1 -0
  252. package/dist/serialization/ft-text-reader.js +48 -0
  253. package/dist/serialization/ft-text-reader.js.map +1 -0
  254. package/dist/serialization/ft-text-writer.js +46 -0
  255. package/dist/serialization/ft-text-writer.js.map +1 -0
  256. package/dist/serialization/heading-line-record-parser.js +253 -0
  257. package/dist/serialization/heading-line-record-parser.js.map +1 -0
  258. package/dist/serialization/line-parser.js +205 -0
  259. package/dist/serialization/line-parser.js.map +1 -0
  260. package/dist/serialization/serialization-core.js +551 -0
  261. package/dist/serialization/serialization-core.js.map +1 -0
  262. package/dist/substitutions/ft-substitution-list.js +54 -0
  263. package/dist/substitutions/ft-substitution-list.js.map +1 -0
  264. package/dist/tsdoc-metadata.json +11 -0
  265. package/dist/types/enums/ft-boolean-styles.js +12 -0
  266. package/dist/types/enums/ft-boolean-styles.js.map +1 -0
  267. package/dist/types/enums/ft-data-type.js +12 -0
  268. package/dist/types/enums/ft-data-type.js.map +1 -0
  269. package/dist/types/enums/ft-end-of-line-auto-write-type.js +10 -0
  270. package/dist/types/enums/ft-end-of-line-auto-write-type.js.map +1 -0
  271. package/dist/types/enums/ft-end-of-line-type.js +9 -0
  272. package/dist/types/enums/ft-end-of-line-type.js.map +1 -0
  273. package/dist/types/enums/ft-heading-constraint.js +11 -0
  274. package/dist/types/enums/ft-heading-constraint.js.map +1 -0
  275. package/dist/types/enums/ft-last-line-ended-type.js +9 -0
  276. package/dist/types/enums/ft-last-line-ended-type.js.map +1 -0
  277. package/dist/types/enums/ft-line-type.js +13 -0
  278. package/dist/types/enums/ft-line-type.js.map +1 -0
  279. package/dist/types/enums/ft-meta-element-type.js +12 -0
  280. package/dist/types/enums/ft-meta-element-type.js.map +1 -0
  281. package/dist/types/enums/ft-meta-reference-type.js +10 -0
  282. package/dist/types/enums/ft-meta-reference-type.js.map +1 -0
  283. package/dist/types/enums/ft-meta-serialization-format.js +15 -0
  284. package/dist/types/enums/ft-meta-serialization-format.js.map +1 -0
  285. package/dist/types/enums/ft-pad-alignment.js +9 -0
  286. package/dist/types/enums/ft-pad-alignment.js.map +1 -0
  287. package/dist/types/enums/ft-pad-char-type.js +9 -0
  288. package/dist/types/enums/ft-pad-char-type.js.map +1 -0
  289. package/dist/types/enums/ft-quoted-type.js +9 -0
  290. package/dist/types/enums/ft-quoted-type.js.map +1 -0
  291. package/dist/types/enums/ft-read-record-result.js +9 -0
  292. package/dist/types/enums/ft-read-record-result.js.map +1 -0
  293. package/dist/types/enums/ft-sequence-invokation-delay.js +8 -0
  294. package/dist/types/enums/ft-sequence-invokation-delay.js.map +1 -0
  295. package/dist/types/enums/ft-sequence-redirect-type.js +15 -0
  296. package/dist/types/enums/ft-sequence-redirect-type.js.map +1 -0
  297. package/dist/types/enums/ft-substitution-type.js +12 -0
  298. package/dist/types/enums/ft-substitution-type.js.map +1 -0
  299. package/dist/types/enums/ft-truncate-type.js +11 -0
  300. package/dist/types/enums/ft-truncate-type.js.map +1 -0
  301. package/dist/types/errors/ft-internal-error.js +14 -0
  302. package/dist/types/errors/ft-internal-error.js.map +1 -0
  303. package/dist/types/errors/ft-serialization-error.js +49 -0
  304. package/dist/types/errors/ft-serialization-error.js.map +1 -0
  305. package/dist/types/errors/ft-serialization-exception.js +78 -0
  306. package/dist/types/errors/ft-serialization-exception.js.map +1 -0
  307. package/dist/types/events/ft-field-heading-ready-event-args.js +2 -0
  308. package/dist/types/events/ft-field-heading-ready-event-args.js.map +1 -0
  309. package/dist/types/events/ft-field-value-ready-event-args.js +2 -0
  310. package/dist/types/events/ft-field-value-ready-event-args.js.map +1 -0
  311. package/dist/types/events/ft-heading-line-finished-event-args.js +2 -0
  312. package/dist/types/events/ft-heading-line-finished-event-args.js.map +1 -0
  313. package/dist/types/events/ft-heading-line-started-event-args.js +2 -0
  314. package/dist/types/events/ft-heading-line-started-event-args.js.map +1 -0
  315. package/dist/types/events/ft-record-finished-event-args.js +2 -0
  316. package/dist/types/events/ft-record-finished-event-args.js.map +1 -0
  317. package/dist/types/events/ft-record-started-event-args.js +2 -0
  318. package/dist/types/events/ft-record-started-event-args.js.map +1 -0
  319. package/dist/types/events/ft-sequence-redirected-event-args.js +2 -0
  320. package/dist/types/events/ft-sequence-redirected-event-args.js.map +1 -0
  321. package/package.json +84 -0
  322. package/src/api/ft-reader.ts +106 -0
  323. package/src/api/ft-serialization.ts +216 -0
  324. package/src/api/ft-writer-settings.ts +76 -0
  325. package/src/api/ft-writer.ts +26 -0
  326. package/src/factory/ft-field-factory.ts +94 -0
  327. package/src/factory/ft-meta-constructor.ts +16 -0
  328. package/src/factory/ft-meta-factory.ts +34 -0
  329. package/src/factory/ft-sequence-constructor.ts +11 -0
  330. package/src/factory/ft-sequence-factory.ts +22 -0
  331. package/src/factory/ft-sequence-item-constructor.ts +11 -0
  332. package/src/factory/ft-sequence-item-factory.ts +22 -0
  333. package/src/factory/ft-sequence-redirect-constructor.ts +19 -0
  334. package/src/factory/ft-sequence-redirect-factory.ts +197 -0
  335. package/src/factory/ft-substitution-constructor.ts +24 -0
  336. package/src/factory/ft-substitution-factory.ts +43 -0
  337. package/src/fields/definitions/ft-boolean-field-definition.ts +49 -0
  338. package/src/fields/definitions/ft-date-time-field-definition.ts +52 -0
  339. package/src/fields/definitions/ft-decimal-field-definition.ts +43 -0
  340. package/src/fields/definitions/ft-field-definition-list.ts +33 -0
  341. package/src/fields/definitions/ft-field-definition.ts +276 -0
  342. package/src/fields/definitions/ft-float-field-definition.ts +43 -0
  343. package/src/fields/definitions/ft-generic-field-definition.ts +49 -0
  344. package/src/fields/definitions/ft-integer-field-definition.ts +44 -0
  345. package/src/fields/definitions/ft-string-field-definition.ts +26 -0
  346. package/src/fields/instances/ft-boolean-field.ts +49 -0
  347. package/src/fields/instances/ft-date-time-field.ts +44 -0
  348. package/src/fields/instances/ft-decimal-field.ts +44 -0
  349. package/src/fields/instances/ft-field-list.ts +68 -0
  350. package/src/fields/instances/ft-field.ts +691 -0
  351. package/src/fields/instances/ft-float-field.ts +44 -0
  352. package/src/fields/instances/ft-generic-field.ts +219 -0
  353. package/src/fields/instances/ft-integer-field.ts +44 -0
  354. package/src/fields/instances/ft-string-field.ts +40 -0
  355. package/src/index.ts +185 -0
  356. package/src/meta/fields/ft-boolean-meta-field.ts +79 -0
  357. package/src/meta/fields/ft-date-time-meta-field.ts +68 -0
  358. package/src/meta/fields/ft-decimal-meta-field.ts +68 -0
  359. package/src/meta/fields/ft-float-meta-field.ts +68 -0
  360. package/src/meta/fields/ft-generic-meta-field.ts +38 -0
  361. package/src/meta/fields/ft-integer-meta-field.ts +68 -0
  362. package/src/meta/fields/ft-meta-field-list.ts +208 -0
  363. package/src/meta/fields/ft-meta-field.ts +399 -0
  364. package/src/meta/fields/ft-string-meta-field.ts +34 -0
  365. package/src/meta/ft-meta-defaults.ts +151 -0
  366. package/src/meta/ft-meta.ts +453 -0
  367. package/src/meta/sequences/core/ft-meta-sequence-item-list.ts +97 -0
  368. package/src/meta/sequences/core/ft-meta-sequence-item.ts +78 -0
  369. package/src/meta/sequences/core/ft-meta-sequence-list.ts +203 -0
  370. package/src/meta/sequences/core/ft-meta-sequence.ts +127 -0
  371. package/src/meta/sequences/redirects/ft-boolean-meta-sequence-redirect.ts +49 -0
  372. package/src/meta/sequences/redirects/ft-case-insensitive-string-meta-sequence-redirect.ts +49 -0
  373. package/src/meta/sequences/redirects/ft-date-meta-sequence-redirect.ts +54 -0
  374. package/src/meta/sequences/redirects/ft-exact-date-time-meta-sequence-redirect.ts +49 -0
  375. package/src/meta/sequences/redirects/ft-exact-decimal-meta-sequence-redirect.ts +49 -0
  376. package/src/meta/sequences/redirects/ft-exact-float-meta-sequence-redirect.ts +49 -0
  377. package/src/meta/sequences/redirects/ft-exact-integer-meta-sequence-redirect.ts +49 -0
  378. package/src/meta/sequences/redirects/ft-exact-string-meta-sequence-redirect.ts +49 -0
  379. package/src/meta/sequences/redirects/ft-meta-sequence-redirect-list.ts +99 -0
  380. package/src/meta/sequences/redirects/ft-meta-sequence-redirect.ts +89 -0
  381. package/src/meta/sequences/redirects/ft-null-meta-sequence-redirect.ts +25 -0
  382. package/src/meta/substitutions/ft-meta-substitution-list.ts +54 -0
  383. package/src/meta-serialization/format/ft-json-meta-serialization.ts +288 -0
  384. package/src/meta-serialization/format/ft-xml-meta-serialization.ts +885 -0
  385. package/src/meta-serialization/format/meta-serializer-options.ts +21 -0
  386. package/src/meta-serialization/ft-meta-serialization.ts +60 -0
  387. package/src/meta-serialization/styles/ft-boolean-styles-meta-serialization.ts +88 -0
  388. package/src/meta-serialization/styles/ft-date-time-styles-meta-serialization.ts +50 -0
  389. package/src/meta-serialization/styles/ft-number-styles-meta-serialization.ts +212 -0
  390. package/src/meta-serialization/types/boolean-meta-serialization.ts +36 -0
  391. package/src/meta-serialization/types/char-meta-serialization.ts +28 -0
  392. package/src/meta-serialization/types/date-time-meta-serialization.ts +220 -0
  393. package/src/meta-serialization/types/decimal-meta-serialization.ts +13 -0
  394. package/src/meta-serialization/types/enums/data-type-meta-serialisation.ts +52 -0
  395. package/src/meta-serialization/types/enums/end-of-line-auto-write-type-meta-serialization.ts +47 -0
  396. package/src/meta-serialization/types/enums/end-of-line-type-meta-serialization.ts +46 -0
  397. package/src/meta-serialization/types/enums/heading-constraint-meta-serialization.ts +52 -0
  398. package/src/meta-serialization/types/enums/last-line-ended-type-meta-serialization.ts +45 -0
  399. package/src/meta-serialization/types/enums/meta-element-type-meta-serialization.ts +36 -0
  400. package/src/meta-serialization/types/enums/pad-alignment-meta-serialization.ts +54 -0
  401. package/src/meta-serialization/types/enums/pad-char-type-meta-serialization.ts +54 -0
  402. package/src/meta-serialization/types/enums/quoted-type-meta-serialization.ts +54 -0
  403. package/src/meta-serialization/types/enums/sequence-invokation-delay-meta-serialization.ts +44 -0
  404. package/src/meta-serialization/types/enums/sequence-redirect-type-meta-serialisation.ts +86 -0
  405. package/src/meta-serialization/types/enums/substitution-type-meta-serialization.ts +44 -0
  406. package/src/meta-serialization/types/enums/truncate-type-meta-serialization.ts +58 -0
  407. package/src/meta-serialization/types/float-meta-serialization.ts +96 -0
  408. package/src/meta-serialization/types/integer-float-meta-serialization.ts +46 -0
  409. package/src/meta-serialization/types/integer-meta-serialization.ts +44 -0
  410. package/src/meta-serialization/types/string-meta-serialization.ts +32 -0
  411. package/src/meta-serialization/utils/implicit-explicit-index-sorter.ts +61 -0
  412. package/src/meta-serialization/utils/meta-serialization-redirect-sequence-resolver.ts +43 -0
  413. package/src/meta-serialization/utils/meta-serialization-sequence-name-resolver.ts +85 -0
  414. package/src/meta-serialization/utils/sequence-item-field-indices.ts +76 -0
  415. package/src/sequences/core/ft-sequence-invokation-list.ts +109 -0
  416. package/src/sequences/core/ft-sequence-invokation.ts +166 -0
  417. package/src/sequences/core/ft-sequence-item-list.ts +40 -0
  418. package/src/sequences/core/ft-sequence-item.ts +59 -0
  419. package/src/sequences/core/ft-sequence-list.ts +73 -0
  420. package/src/sequences/core/ft-sequence.ts +75 -0
  421. package/src/sequences/redirects/ft-boolean-sequence-redirect.ts +42 -0
  422. package/src/sequences/redirects/ft-case-insensitive-string-sequence-redirect.ts +46 -0
  423. package/src/sequences/redirects/ft-date-sequence-redirect.ts +48 -0
  424. package/src/sequences/redirects/ft-exact-date-time-sequence-redirect.ts +46 -0
  425. package/src/sequences/redirects/ft-exact-decimal-sequence-redirect.ts +46 -0
  426. package/src/sequences/redirects/ft-exact-float-sequence-redirect.ts +46 -0
  427. package/src/sequences/redirects/ft-exact-integer-sequence-redirect.ts +46 -0
  428. package/src/sequences/redirects/ft-exact-string-sequence-redirect.ts +46 -0
  429. package/src/sequences/redirects/ft-null-sequence-redirect.ts +27 -0
  430. package/src/sequences/redirects/ft-sequence-redirect-list.ts +42 -0
  431. package/src/sequences/redirects/ft-sequence-redirect.ts +68 -0
  432. package/src/serialization/char-reader.ts +203 -0
  433. package/src/serialization/declaration-parser.ts +203 -0
  434. package/src/serialization/delimited-field-parser.ts +296 -0
  435. package/src/serialization/embedded-meta-parser.ts +147 -0
  436. package/src/serialization/fixed-width-field-parser.ts +220 -0
  437. package/src/serialization/formatting/ft-boolean-field-formatter.ts +114 -0
  438. package/src/serialization/formatting/ft-date-time-field-formatter.ts +61 -0
  439. package/src/serialization/formatting/ft-decimal-field-formatter.ts +52 -0
  440. package/src/serialization/formatting/ft-declared-parameters-formatter.ts +60 -0
  441. package/src/serialization/formatting/ft-field-formatter.ts +18 -0
  442. package/src/serialization/formatting/ft-float-field-formatter.ts +52 -0
  443. package/src/serialization/formatting/ft-integer-field-formatter.ts +53 -0
  444. package/src/serialization/formatting/ft-string-field-formatter.ts +15 -0
  445. package/src/serialization/formatting/index.ts +7 -0
  446. package/src/serialization/ft-declared-parameters.ts +232 -0
  447. package/src/serialization/ft-serialization-reader.ts +953 -0
  448. package/src/serialization/ft-serialization-writer.ts +760 -0
  449. package/src/serialization/ft-text-reader.ts +64 -0
  450. package/src/serialization/ft-text-writer.ts +61 -0
  451. package/src/serialization/heading-line-record-parser.ts +285 -0
  452. package/src/serialization/line-parser.ts +231 -0
  453. package/src/serialization/serialization-core.ts +632 -0
  454. package/src/substitutions/ft-substitution-list.ts +60 -0
  455. package/src/types/enums/ft-boolean-styles.ts +17 -0
  456. package/src/types/enums/ft-data-type.ts +21 -0
  457. package/src/types/enums/ft-end-of-line-auto-write-type.ts +14 -0
  458. package/src/types/enums/ft-end-of-line-type.ts +13 -0
  459. package/src/types/enums/ft-heading-constraint.ts +15 -0
  460. package/src/types/enums/ft-last-line-ended-type.ts +13 -0
  461. package/src/types/enums/ft-line-type.ts +17 -0
  462. package/src/types/enums/ft-meta-element-type.ts +16 -0
  463. package/src/types/enums/ft-meta-reference-type.ts +14 -0
  464. package/src/types/enums/ft-meta-serialization-format.ts +19 -0
  465. package/src/types/enums/ft-pad-alignment.ts +13 -0
  466. package/src/types/enums/ft-pad-char-type.ts +13 -0
  467. package/src/types/enums/ft-quoted-type.ts +13 -0
  468. package/src/types/enums/ft-read-record-result.ts +13 -0
  469. package/src/types/enums/ft-sequence-invokation-delay.ts +12 -0
  470. package/src/types/enums/ft-sequence-redirect-type.ts +19 -0
  471. package/src/types/enums/ft-substitution-type.ts +16 -0
  472. package/src/types/enums/ft-truncate-type.ts +15 -0
  473. package/src/types/errors/ft-internal-error.ts +15 -0
  474. package/src/types/errors/ft-serialization-error.ts +53 -0
  475. package/src/types/errors/ft-serialization-exception.ts +86 -0
  476. package/src/types/events/ft-field-heading-ready-event-args.ts +9 -0
  477. package/src/types/events/ft-field-value-ready-event-args.ts +9 -0
  478. package/src/types/events/ft-heading-line-finished-event-args.ts +6 -0
  479. package/src/types/events/ft-heading-line-started-event-args.ts +6 -0
  480. package/src/types/events/ft-record-finished-event-args.ts +6 -0
  481. package/src/types/events/ft-record-started-event-args.ts +6 -0
  482. package/src/types/events/ft-sequence-redirected-event-args.ts +9 -0
@@ -0,0 +1,706 @@
1
+ import { CommaText } from '@pbkware/js-utils';
2
+ import XMLBuilder from 'fast-xml-builder';
3
+ import { XMLParser } from 'fast-xml-parser';
4
+ import { FtFieldFactory } from '../../factory/ft-field-factory.js';
5
+ import { FtBooleanMetaField } from '../../meta/fields/ft-boolean-meta-field.js';
6
+ import { FtDateTimeMetaField } from '../../meta/fields/ft-date-time-meta-field.js';
7
+ import { FtDecimalMetaField } from '../../meta/fields/ft-decimal-meta-field.js';
8
+ import { FtFloatMetaField } from '../../meta/fields/ft-float-meta-field.js';
9
+ import { FtIntegerMetaField } from '../../meta/fields/ft-integer-meta-field.js';
10
+ import { FtStringMetaField } from '../../meta/fields/ft-string-meta-field.js';
11
+ import { FtMetaDefaults } from '../../meta/ft-meta-defaults.js';
12
+ import { FtMeta } from '../../meta/ft-meta.js';
13
+ import { FtMetaSequenceItem } from '../../meta/sequences/core/ft-meta-sequence-item.js';
14
+ import { FtMetaSequence } from '../../meta/sequences/core/ft-meta-sequence.js';
15
+ import { FtBooleanMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-boolean-meta-sequence-redirect.js';
16
+ import { FtCaseInsensitiveStringMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-case-insensitive-string-meta-sequence-redirect.js';
17
+ import { FtDateMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-date-meta-sequence-redirect.js';
18
+ import { FtExactDateTimeMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-exact-date-time-meta-sequence-redirect.js';
19
+ import { FtExactDecimalMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-exact-decimal-meta-sequence-redirect.js';
20
+ import { FtExactFloatMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-exact-float-meta-sequence-redirect.js';
21
+ import { FtExactIntegerMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-exact-integer-meta-sequence-redirect.js';
22
+ import { FtExactStringMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-exact-string-meta-sequence-redirect.js';
23
+ import { FtNullMetaSequenceRedirect } from '../../meta/sequences/redirects/ft-null-meta-sequence-redirect.js';
24
+ import { FtDataType } from '../../types/enums/ft-data-type.js';
25
+ import { FtSequenceRedirectType } from '../../types/enums/ft-sequence-redirect-type.js';
26
+ import { FtAssertError, FtUnreachableCaseError } from '../../types/errors/ft-internal-error.js';
27
+ import { FtBooleanStylesMetaSerialization } from '../styles/ft-boolean-styles-meta-serialization.js';
28
+ import { FtDateTimeStylesMetaSerialization } from '../styles/ft-date-time-styles-meta-serialization.js';
29
+ import { FtNumberStylesMetaSerialization } from '../styles/ft-number-styles-meta-serialization.js';
30
+ import { BooleanMetaSerialization } from '../types/boolean-meta-serialization.js';
31
+ import { CharMetaSerialization } from '../types/char-meta-serialization.js';
32
+ import { DateTimeMetaSerialization } from '../types/date-time-meta-serialization.js';
33
+ import { DecimalMetaSerialization } from '../types/decimal-meta-serialization.js';
34
+ import { DataTypeMetaSerialization } from '../types/enums/data-type-meta-serialisation.js';
35
+ import { EndOfLineAutoWriteTypeMetaSerialization } from '../types/enums/end-of-line-auto-write-type-meta-serialization.js';
36
+ import { EndOfLineTypeMetaSerialization } from '../types/enums/end-of-line-type-meta-serialization.js';
37
+ import { HeadingConstraintMetaSerialization } from '../types/enums/heading-constraint-meta-serialization.js';
38
+ import { LastLineEndedTypeMetaSerialization } from '../types/enums/last-line-ended-type-meta-serialization.js';
39
+ import { PadAlignmentMetaSerialization } from '../types/enums/pad-alignment-meta-serialization.js';
40
+ import { PadCharTypeMetaSerialization } from '../types/enums/pad-char-type-meta-serialization.js';
41
+ import { QuotedTypeMetaSerialization } from '../types/enums/quoted-type-meta-serialization.js';
42
+ import { SequenceInvokationDelayMetaSerialization } from '../types/enums/sequence-invokation-delay-meta-serialization.js';
43
+ import { SequenceRedirectTypeMetaSerialization } from '../types/enums/sequence-redirect-type-meta-serialisation.js';
44
+ import { SubstitutionTypeMetaSerialization } from '../types/enums/substitution-type-meta-serialization.js';
45
+ import { TruncateTypeMetaSerialization } from '../types/enums/truncate-type-meta-serialization.js';
46
+ import { FloatMetaSerialization } from '../types/float-meta-serialization.js';
47
+ import { IntegerFloatMetaSerialization } from '../types/integer-float-meta-serialization.js';
48
+ import { IntegerMetaSerialization } from '../types/integer-meta-serialization.js';
49
+ import { StringMetaSerialization } from '../types/string-meta-serialization.js';
50
+ import { ImplicitExplicitIndexSortRec } from '../utils/implicit-explicit-index-sorter.js';
51
+ import { MetaSerializationRedirectSequenceResolver } from '../utils/meta-serialization-redirect-sequence-resolver.js';
52
+ import { MetaSerializationSequenceNameResolver } from '../utils/meta-serialization-sequence-name-resolver.js';
53
+ import { SequenceItemFieldIndexSerialization } from '../utils/sequence-item-field-indices.js';
54
+ import { FtMetaSerializerOptions } from './meta-serializer-options.js';
55
+ /**
56
+ * Serializes and deserializes FtMeta to/from XML format.
57
+ * Compatible with the C# XmlMetaSerializationWriter/Reader implementation.
58
+ *
59
+ * Note: The "\@_" prefix is used by fast-xml-parser to distinguish XML attributes
60
+ * from XML elements. Properties starting with "\@_" become XML attributes when
61
+ * serialized, and XML attributes are prefixed with "\@_" when deserialized.
62
+ * @public
63
+ */
64
+ export class FtXmlMetaSerialization {
65
+ /**
66
+ * Serialize an FtMeta object to XML string.
67
+ */
68
+ serialize(meta, options) {
69
+ const explicitIndices = options?.explicitIndices ?? FtMetaSerializerOptions.DEFAULT_EXPLICIT_INDICES;
70
+ const rootObj = {
71
+ FieldedText: {
72
+ '@_Culture': StringMetaSerialization.serialize(meta.culture.name, FtMetaDefaults.Root.CultureName),
73
+ '@_DelimiterChar': CharMetaSerialization.serialize(meta.delimiterChar, FtMetaDefaults.Root.DelimiterChar),
74
+ '@_QuoteChar': CharMetaSerialization.serialize(meta.quoteChar, FtMetaDefaults.Root.QuoteChar),
75
+ '@_LineCommentChar': CharMetaSerialization.serialize(meta.lineCommentChar, FtMetaDefaults.Root.LineCommentChar),
76
+ '@_EndOfLineType': EndOfLineTypeMetaSerialization.serialize(meta.endOfLineType),
77
+ '@_EndOfLineChar': CharMetaSerialization.serialize(meta.endOfLineChar, FtMetaDefaults.Root.EndOfLineChar),
78
+ '@_EndOfLineAutoWriteType': EndOfLineAutoWriteTypeMetaSerialization.serialize(meta.endOfLineAutoWriteType),
79
+ '@_LastLineEndedType': LastLineEndedTypeMetaSerialization.serialize(meta.lastLineEndedType),
80
+ '@_AllowEndOfLineCharInQuotes': BooleanMetaSerialization.serialize(meta.allowEndOfLineCharInQuotes, FtMetaDefaults.Root.AllowEndOfLineCharInQuotes),
81
+ '@_IgnoreBlankLines': BooleanMetaSerialization.serialize(meta.ignoreBlankLines, FtMetaDefaults.Root.IgnoreBlankLines),
82
+ '@_IgnoreExtraChars': BooleanMetaSerialization.serialize(meta.ignoreExtraChars, FtMetaDefaults.Root.IgnoreExtraChars),
83
+ '@_AllowIncompleteRecords': BooleanMetaSerialization.serialize(meta.allowIncompleteRecords, FtMetaDefaults.Root.AllowIncompleteRecords),
84
+ '@_StuffedEmbeddedQuotes': BooleanMetaSerialization.serialize(meta.stuffedEmbeddedQuotes, FtMetaDefaults.Root.StuffedEmbeddedQuotes),
85
+ '@_SubstitutionChar': CharMetaSerialization.serialize(meta.substitutionChar, FtMetaDefaults.Root.SubstitutionChar),
86
+ '@_HeadingLineCount': IntegerFloatMetaSerialization.serialize(meta.headingLineCount, false, FtMetaDefaults.Root.HeadingLineCount),
87
+ '@_MainHeadingLineIndex': IntegerFloatMetaSerialization.serialize(meta.mainHeadingLineIndex, false, FtMetaDefaults.Root.MainHeadingLineIndex),
88
+ '@_HeadingConstraint': HeadingConstraintMetaSerialization.serialize(meta.headingConstraint, undefined),
89
+ '@_HeadingQuotedType': QuotedTypeMetaSerialization.serialize(meta.headingQuotedType, true, undefined),
90
+ '@_HeadingAlwaysWriteOptionalQuote': BooleanMetaSerialization.serialize(meta.headingAlwaysWriteOptionalQuote, FtMetaDefaults.Root.HeadingAlwaysWriteOptionalQuote),
91
+ '@_HeadingWritePrefixSpace': BooleanMetaSerialization.serialize(meta.headingWritePrefixSpace, FtMetaDefaults.Root.HeadingWritePrefixSpace),
92
+ '@_HeadingPadAlignment': PadAlignmentMetaSerialization.serialize(meta.headingPadAlignment, true, undefined),
93
+ '@_HeadingPadCharType': PadCharTypeMetaSerialization.serialize(meta.headingPadCharType, true, undefined),
94
+ '@_HeadingPadChar': CharMetaSerialization.serialize(meta.headingPadChar, FtMetaDefaults.Root.HeadingPadChar),
95
+ '@_HeadingTruncateType': TruncateTypeMetaSerialization.serialize(meta.headingTruncateType, true, undefined),
96
+ '@_HeadingTruncateChar': CharMetaSerialization.serialize(meta.headingTruncateChar, FtMetaDefaults.Root.HeadingTruncateChar),
97
+ '@_HeadingEndOfValueChar': CharMetaSerialization.serialize(meta.headingEndOfValueChar, FtMetaDefaults.Root.HeadingEndOfValueChar),
98
+ },
99
+ };
100
+ // Add substitutions
101
+ const substitutionList = meta.substitutionList;
102
+ const substitutionCount = substitutionList.count;
103
+ if (substitutionCount > 0) {
104
+ const substitutionObjs = new Array(substitutionCount);
105
+ for (let i = 0; i < substitutionCount; i++) {
106
+ const sub = substitutionList.get(i);
107
+ substitutionObjs[i] = this.serializeSubstitution(sub);
108
+ }
109
+ rootObj.FieldedText.Substitution = substitutionObjs;
110
+ }
111
+ const metaFieldList = meta.fieldList;
112
+ const metaFieldCount = metaFieldList.count;
113
+ // Add fields
114
+ if (metaFieldCount > 0) {
115
+ const fieldObjs = new Array(metaFieldCount);
116
+ for (let i = 0; i < metaFieldCount; i++) {
117
+ const field = metaFieldList.get(i);
118
+ const index = explicitIndices ? i : undefined;
119
+ fieldObjs[i] = this.serializeField(field, index, meta);
120
+ }
121
+ rootObj.FieldedText.Field = fieldObjs;
122
+ }
123
+ // Add sequences
124
+ const metaSequenceList = meta.sequenceList;
125
+ const metaSequenceCount = metaSequenceList.count;
126
+ if (metaSequenceCount > 0) {
127
+ const seqObjs = new Array(metaSequenceCount);
128
+ for (let i = 0; i < metaSequenceCount; i++) {
129
+ const seq = metaSequenceList.get(i);
130
+ seqObjs[i] = this.serializeSequence(explicitIndices, seq, metaFieldList);
131
+ }
132
+ rootObj.FieldedText.Sequence = seqObjs;
133
+ }
134
+ const indent = options?.indent ?? FtMetaSerializerOptions.DEFAULT_INDENT;
135
+ const indentChars = options?.indentChars ?? FtMetaSerializerOptions.DEFAULT_INDENT_CHARS;
136
+ // Note: fast-xml-parser doesn't support newLineOnAttributes, so we ignore it
137
+ const builder = new XMLBuilder({
138
+ attributeNamePrefix: '@_',
139
+ ignoreAttributes: false,
140
+ format: indent,
141
+ indentBy: indentChars,
142
+ suppressEmptyNode: false,
143
+ suppressBooleanAttributes: false,
144
+ });
145
+ const xmlContent = builder.build(rootObj);
146
+ return '<?xml version="1.0" encoding="utf-8"?>\n' + xmlContent;
147
+ }
148
+ /**
149
+ * Deserialize XML string to an FtMeta object.
150
+ */
151
+ deserialize(xml, warnings) {
152
+ const parser = new XMLParser({
153
+ attributeNamePrefix: '@_',
154
+ ignoreAttributes: false,
155
+ parseAttributeValue: false, // Keep as strings for proper type handling
156
+ isArray: (name, jpath, isLeafNode, isAttribute) => {
157
+ // These elements can appear multiple times
158
+ return name === 'Substitution' || name === 'Field' || name === 'Sequence' || name === 'Item' || name === 'Heading';
159
+ },
160
+ });
161
+ if (warnings === undefined) {
162
+ warnings = new Array();
163
+ }
164
+ const result = parser.parse(xml);
165
+ const meta = new FtMeta();
166
+ const ftObj = result.FieldedText;
167
+ if (!ftObj) {
168
+ throw new Error('Invalid XML: Missing FieldedText root element');
169
+ }
170
+ // Deserialize root properties
171
+ this.deserializeRootProperties(meta, ftObj, warnings);
172
+ // Deserialize substitutions
173
+ if (ftObj.Substitution) {
174
+ const subs = Array.isArray(ftObj.Substitution) ? ftObj.Substitution : [ftObj.Substitution];
175
+ for (const subObj of subs) {
176
+ const type = SubstitutionTypeMetaSerialization.deserialize(subObj['@_Type'], warnings);
177
+ const token = StringMetaSerialization.tryDeserialize(subObj['@_Token'], warnings);
178
+ const value = StringMetaSerialization.tryDeserialize(subObj['@_Value'], warnings);
179
+ if (token === undefined || value === undefined) {
180
+ warnings.push(`Substitution: Missing required attributes. Token: ${token}, Value: ${value}`);
181
+ continue; // Skip this substitution if required attributes are missing
182
+ }
183
+ else {
184
+ meta.substitutionList.new(type, token, value);
185
+ }
186
+ }
187
+ }
188
+ // Deserialize fields
189
+ if (ftObj.Field) {
190
+ const headingLineCount = meta.headingLineCount;
191
+ const fieldObjs = Array.isArray(ftObj.Field) ? ftObj.Field : [ftObj.Field];
192
+ const fieldCount = fieldObjs.length;
193
+ const fieldSortRecs = new Array(fieldCount);
194
+ for (let i = 0; i < fieldCount; i++) {
195
+ const fieldSortRec = this.deserializeField(fieldObjs[i], headingLineCount, meta, warnings);
196
+ fieldSortRec.implicitIndex = i;
197
+ fieldSortRecs[i] = fieldSortRec;
198
+ }
199
+ fieldSortRecs.sort((left, right) => ImplicitExplicitIndexSortRec.compare(left, right));
200
+ ImplicitExplicitIndexSortRec.checkSortedArray(fieldSortRecs, 'Field', warnings);
201
+ meta.fieldList.set(fieldSortRecs.map((rec) => rec.target));
202
+ }
203
+ const resolvedOrderedFieldList = meta.fieldList; // Field orders are resolved so can be used to resolve field references in sequences
204
+ // Deserialize sequences
205
+ const objSequence = ftObj.Sequence;
206
+ if (objSequence) {
207
+ const objSequences = Array.isArray(objSequence) ? objSequence : [objSequence];
208
+ const sequenceCount = objSequences.length;
209
+ const sequenceNameResolver = new MetaSerializationSequenceNameResolver();
210
+ const redirectSequenceResolver = new MetaSerializationRedirectSequenceResolver(sequenceNameResolver);
211
+ const redirectNames = new Array(sequenceCount); // We need to collect redirect names first before we can resolve them, so we create records with redirect names and resolve after deserializing all sequences
212
+ const sequenceNameRecs = new Array(sequenceCount);
213
+ for (let i = 0; i < sequenceCount; i++) {
214
+ const seqObj = objSequences[i];
215
+ const sequenceNameRec = this.deserializeSequence(seqObj, resolvedOrderedFieldList, redirectSequenceResolver, warnings);
216
+ sequenceNameResolver.add(sequenceNameRec);
217
+ }
218
+ redirectSequenceResolver.resolve(warnings);
219
+ const sequences = sequenceNameResolver.resolve(warnings);
220
+ meta.sequenceList.set(sequences);
221
+ }
222
+ return meta;
223
+ }
224
+ serializeSubstitution(sub) {
225
+ return {
226
+ '@_Token': StringMetaSerialization.serialize(sub.token),
227
+ '@_Type': SubstitutionTypeMetaSerialization.serialize(sub.type),
228
+ '@_Value': StringMetaSerialization.serialize(sub.value),
229
+ };
230
+ }
231
+ serializeField(field, index, meta) {
232
+ const fieldId = field.id;
233
+ const fieldHeadings = field.headings;
234
+ const obj = {
235
+ '@_DataType': DataTypeMetaSerialization.serialize(field.dataType),
236
+ '@_Index': index === undefined ? undefined : IntegerFloatMetaSerialization.serialize(index, false),
237
+ '@_Id': fieldId === undefined ? undefined : IntegerFloatMetaSerialization.serialize(fieldId, true, FtMetaDefaults.Field.Id),
238
+ '@_Name': StringMetaSerialization.serialize(field.name, FtMetaDefaults.Field.Name),
239
+ '@_FixedWidth': BooleanMetaSerialization.serialize(field.fixedWidth, FtMetaDefaults.Field.FixedWidth),
240
+ '@_Width': IntegerFloatMetaSerialization.serialize(field.width, false, FtMetaDefaults.Field.Width),
241
+ '@_Constant': BooleanMetaSerialization.serialize(field.constant, FtMetaDefaults.Field.Constant),
242
+ '@_Null': BooleanMetaSerialization.serialize(field.null, FtMetaDefaults.Field.Null),
243
+ '@_ValueQuotedType': QuotedTypeMetaSerialization.serialize(field.valueQuotedType, false, undefined),
244
+ '@_ValueAlwaysWriteOptionalQuote': BooleanMetaSerialization.serialize(field.valueAlwaysWriteOptionalQuote, false),
245
+ '@_ValueWritePrefixSpace': BooleanMetaSerialization.serialize(field.valueWritePrefixSpace, false),
246
+ '@_ValuePadAlignment': PadAlignmentMetaSerialization.serialize(field.valuePadAlignment, false, undefined),
247
+ '@_ValuePadCharType': PadCharTypeMetaSerialization.serialize(field.valuePadCharType, false, undefined),
248
+ '@_ValuePadChar': CharMetaSerialization.serialize(field.valuePadChar, FtMetaDefaults.Field.ValuePadChar),
249
+ '@_ValueTruncateType': TruncateTypeMetaSerialization.serialize(field.valueTruncateType, false, undefined),
250
+ '@_ValueTruncateChar': CharMetaSerialization.serialize(field.valueTruncateChar, FtMetaDefaults.Field.ValueTruncateChar),
251
+ '@_ValueEndOfValueChar': CharMetaSerialization.serialize(field.valueEndOfValueChar, FtMetaDefaults.Field.ValueEndOfValueChar),
252
+ '@_ValueNullChar': CharMetaSerialization.serialize(field.valueNullChar, FtMetaDefaults.Field.ValueNullChar),
253
+ '@_HeadingConstraint': HeadingConstraintMetaSerialization.serialize(field.headingConstraint, meta.headingConstraint),
254
+ '@_HeadingQuotedType': QuotedTypeMetaSerialization.serialize(field.headingQuotedType, true, meta.headingQuotedType),
255
+ '@_HeadingAlwaysWriteOptionalQuote': BooleanMetaSerialization.serialize(field.headingAlwaysWriteOptionalQuote, meta.headingAlwaysWriteOptionalQuote),
256
+ '@_HeadingWritePrefixSpace': BooleanMetaSerialization.serialize(field.headingWritePrefixSpace, meta.headingWritePrefixSpace),
257
+ '@_HeadingPadAlignment': PadAlignmentMetaSerialization.serialize(field.headingPadAlignment, true, meta.headingPadAlignment),
258
+ '@_HeadingPadCharType': PadCharTypeMetaSerialization.serialize(field.headingPadCharType, true, meta.headingPadCharType),
259
+ '@_HeadingPadChar': CharMetaSerialization.serialize(field.headingPadChar, meta.headingPadChar),
260
+ '@_HeadingTruncateType': TruncateTypeMetaSerialization.serialize(field.headingTruncateType, true, meta.headingTruncateType),
261
+ '@_HeadingTruncateChar': CharMetaSerialization.serialize(field.headingTruncateChar, meta.headingTruncateChar),
262
+ '@_HeadingEndOfValueChar': CharMetaSerialization.serialize(field.headingEndOfValueChar, meta.headingEndOfValueChar),
263
+ '@_Headings': fieldHeadings.length === 0 ? undefined : StringMetaSerialization.serialize(CommaText.fromStringArray(fieldHeadings)),
264
+ };
265
+ // Type-specific properties
266
+ const fieldDataType = field.dataType;
267
+ const valueSerializable = field.constant && !field.null;
268
+ switch (fieldDataType) {
269
+ case FtDataType.String: {
270
+ const stringField = field;
271
+ if (valueSerializable) {
272
+ obj['@_Value'] = StringMetaSerialization.serialize(stringField.value, FtStringMetaField.DEFAULT_VALUE);
273
+ }
274
+ break;
275
+ }
276
+ case FtDataType.Boolean: {
277
+ const booleanField = field;
278
+ obj['@_Styles'] = FtBooleanStylesMetaSerialization.serialize(booleanField.styles);
279
+ obj['@_TrueText'] = StringMetaSerialization.serialize(booleanField.trueText, FtBooleanMetaField.DEFAULT_TRUE_TEXT);
280
+ obj['@_FalseText'] = StringMetaSerialization.serialize(booleanField.falseText, FtBooleanMetaField.DEFAULT_FALSE_TEXT);
281
+ if (valueSerializable) {
282
+ obj['@_Value'] = BooleanMetaSerialization.serialize(booleanField.value, FtBooleanMetaField.DEFAULT_VALUE);
283
+ }
284
+ break;
285
+ }
286
+ case FtDataType.Integer: {
287
+ const integerField = field;
288
+ obj['@_Format'] = StringMetaSerialization.serialize(integerField.format, FtIntegerMetaField.DEFAULT_FORMAT);
289
+ obj['@_Styles'] = FtNumberStylesMetaSerialization.serialize(integerField.styles, fieldDataType);
290
+ if (valueSerializable) {
291
+ obj['@_Value'] = IntegerMetaSerialization.serialize(integerField.value, FtIntegerMetaField.DEFAULT_VALUE);
292
+ }
293
+ break;
294
+ }
295
+ case FtDataType.Float: {
296
+ const floatField = field;
297
+ obj['@_Format'] = StringMetaSerialization.serialize(floatField.format, FtFloatMetaField.DEFAULT_FORMAT);
298
+ obj['@_Styles'] = FtNumberStylesMetaSerialization.serialize(floatField.styles, fieldDataType);
299
+ if (valueSerializable) {
300
+ obj['@_Value'] = FloatMetaSerialization.serialize(floatField.value, FtFloatMetaField.DEFAULT_VALUE);
301
+ }
302
+ break;
303
+ }
304
+ case FtDataType.Decimal: {
305
+ const decimalField = field;
306
+ obj['@_Format'] = StringMetaSerialization.serialize(decimalField.format, FtDecimalMetaField.DEFAULT_FORMAT);
307
+ obj['@_Styles'] = FtNumberStylesMetaSerialization.serialize(decimalField.styles, fieldDataType);
308
+ if (valueSerializable) {
309
+ obj['@_Value'] = DecimalMetaSerialization.serialize(decimalField.value, FtDecimalMetaField.DEFAULT_VALUE);
310
+ }
311
+ break;
312
+ }
313
+ case FtDataType.DateTime: {
314
+ const dateTimeField = field;
315
+ obj['@_Format'] = StringMetaSerialization.serialize(dateTimeField.format, FtDateTimeMetaField.DEFAULT_FORMAT);
316
+ obj['@_Styles'] = FtDateTimeStylesMetaSerialization.serialize(dateTimeField.styles);
317
+ if (valueSerializable) {
318
+ obj['@_Value'] = DateTimeMetaSerialization.serialize(dateTimeField.value, FtDateTimeMetaField.DEFAULT_VALUE);
319
+ }
320
+ break;
321
+ }
322
+ }
323
+ return obj;
324
+ }
325
+ serializeSequence(explicitIndices, seq, metaFieldList) {
326
+ // If explicitIndices is true, we can optimise serialization by including by specifying items using Meta field indices up until an item has redirects.
327
+ const { commaTextFieldIndices, count: fieldIndicesCount } = explicitIndices
328
+ ? SequenceItemFieldIndexSerialization.serializeUpToRedirect(seq, metaFieldList)
329
+ : { commaTextFieldIndices: undefined, count: 0 };
330
+ const seqObj = {
331
+ '@_Name': StringMetaSerialization.serialize(seq.name),
332
+ '@_Root': BooleanMetaSerialization.serialize(seq.root, FtMetaDefaults.Sequence.Root),
333
+ '@_FieldIndices': commaTextFieldIndices,
334
+ };
335
+ const seqItemList = seq.itemList;
336
+ const seqItemCount = seqItemList.count;
337
+ if (fieldIndicesCount < seqItemCount) {
338
+ // Add sequence items not included in field indices as separate elements
339
+ const itemObjs = new Array(seqItemCount - fieldIndicesCount);
340
+ for (let i = fieldIndicesCount; i < seqItemCount; i++) {
341
+ const item = seqItemList.get(i);
342
+ const explicityItemIndex = explicitIndices ? i : undefined;
343
+ itemObjs[i - fieldIndicesCount] = this.serializeSequenceItem(item, explicityItemIndex, metaFieldList);
344
+ }
345
+ seqObj.Item = itemObjs;
346
+ }
347
+ return seqObj;
348
+ }
349
+ serializeSequenceItem(item, explicityItemIndex, metaFieldList) {
350
+ const field = item.field;
351
+ const itemObj = {
352
+ '@_Index': explicityItemIndex == undefined ? undefined : IntegerFloatMetaSerialization.serialize(explicityItemIndex, false),
353
+ '@_FieldIndex': SequenceItemFieldIndexSerialization.serializeField(field, metaFieldList),
354
+ };
355
+ const redirectList = item.redirectList;
356
+ const redirectCount = redirectList.count;
357
+ if (redirectCount > 0) {
358
+ const redirectObjs = new Array(redirectCount);
359
+ for (let i = 0; i < redirectCount; i++) {
360
+ const redirect = redirectList.get(i);
361
+ const explicitRedirectIndex = explicityItemIndex === undefined ? undefined : i; // explicitRedirectIndex is defined when explicitIndices is true
362
+ redirectObjs[i] = this.serializeRedirect(redirect, explicitRedirectIndex, field.dataType);
363
+ }
364
+ itemObj.Redirect = redirectObjs;
365
+ }
366
+ return itemObj;
367
+ }
368
+ serializeRedirect(redirect, explicityRedirectIndex, fieldDataType) {
369
+ const sequence = redirect.sequence;
370
+ if (sequence === undefined) {
371
+ throw new FtAssertError('XMSSR99312', 'Redirect sequence is undefined');
372
+ }
373
+ else {
374
+ const redirectType = redirect.type;
375
+ const redirectObj = {
376
+ '@_Index': explicityRedirectIndex == undefined ? undefined : IntegerFloatMetaSerialization.serialize(explicityRedirectIndex, false),
377
+ '@_SequenceName': StringMetaSerialization.serialize(sequence.name),
378
+ '@_Type': SequenceRedirectTypeMetaSerialization.serialize(redirectType, fieldDataType),
379
+ '@_InvokationDelay': SequenceInvokationDelayMetaSerialization.serialize(redirect.invokationDelay),
380
+ };
381
+ let value;
382
+ switch (redirectType) {
383
+ case FtSequenceRedirectType.Null:
384
+ value = undefined; // Null redirects don't have a value
385
+ break;
386
+ case FtSequenceRedirectType.ExactString:
387
+ value = StringMetaSerialization.serialize(redirect.value, FtExactStringMetaSequenceRedirect.DEFAULT_VALUE);
388
+ break;
389
+ case FtSequenceRedirectType.CaseInsensitiveString:
390
+ value = StringMetaSerialization.serialize(redirect.value, FtCaseInsensitiveStringMetaSequenceRedirect.DEFAULT_VALUE);
391
+ break;
392
+ case FtSequenceRedirectType.Boolean:
393
+ value = BooleanMetaSerialization.serialize(redirect.value, FtBooleanMetaSequenceRedirect.DEFAULT_VALUE);
394
+ break;
395
+ case FtSequenceRedirectType.ExactInteger:
396
+ value = IntegerMetaSerialization.serialize(redirect.value, FtExactIntegerMetaSequenceRedirect.DEFAULT_VALUE);
397
+ break;
398
+ case FtSequenceRedirectType.ExactFloat:
399
+ value = FloatMetaSerialization.serialize(redirect.value, FtExactFloatMetaSequenceRedirect.DEFAULT_VALUE);
400
+ break;
401
+ case FtSequenceRedirectType.ExactDateTime:
402
+ value = DateTimeMetaSerialization.serialize(redirect.value, FtExactDateTimeMetaSequenceRedirect.DEFAULT_VALUE);
403
+ break;
404
+ case FtSequenceRedirectType.Date:
405
+ value = DateTimeMetaSerialization.serialize(redirect.value, FtDateMetaSequenceRedirect.DEFAULT_VALUE);
406
+ break;
407
+ case FtSequenceRedirectType.ExactDecimal:
408
+ value = DecimalMetaSerialization.serialize(redirect.value, FtExactDecimalMetaSequenceRedirect.DEFAULT_VALUE);
409
+ break;
410
+ default:
411
+ throw new FtUnreachableCaseError('XMSSR99313', redirectType);
412
+ }
413
+ redirectObj['@_Value'] = value;
414
+ return redirectObj;
415
+ }
416
+ }
417
+ deserializeRootProperties(meta, obj, warnings) {
418
+ // Basic properties
419
+ meta.delimiterChar = CharMetaSerialization.deserialize(obj['@_DelimiterChar'], FtMetaDefaults.Root.DelimiterChar, warnings);
420
+ meta.quoteChar = CharMetaSerialization.deserialize(obj['@_QuoteChar'], FtMetaDefaults.Root.QuoteChar, warnings);
421
+ meta.lineCommentChar = CharMetaSerialization.deserialize(obj['@_LineCommentChar'], FtMetaDefaults.Root.LineCommentChar, warnings);
422
+ meta.endOfLineChar = CharMetaSerialization.deserialize(obj['@_EndOfLineChar'], FtMetaDefaults.Root.EndOfLineChar, warnings);
423
+ meta.substitutionChar = CharMetaSerialization.deserialize(obj['@_SubstitutionChar'], FtMetaDefaults.Root.SubstitutionChar, warnings);
424
+ meta.headingPadChar = CharMetaSerialization.deserialize(obj['@_HeadingPadChar'], FtMetaDefaults.Root.HeadingPadChar, warnings);
425
+ meta.headingTruncateChar = CharMetaSerialization.deserialize(obj['@_HeadingTruncateChar'], FtMetaDefaults.Root.HeadingTruncateChar, warnings);
426
+ meta.headingEndOfValueChar = CharMetaSerialization.deserialize(obj['@_HeadingEndOfValueChar'], FtMetaDefaults.Root.HeadingEndOfValueChar, warnings);
427
+ // Numeric properties
428
+ meta.endOfLineType = EndOfLineTypeMetaSerialization.deserialize(obj['@_EndOfLineType'], warnings);
429
+ meta.endOfLineAutoWriteType = EndOfLineAutoWriteTypeMetaSerialization.deserialize(obj['@_EndOfLineAutoWriteType'], warnings);
430
+ meta.lastLineEndedType = LastLineEndedTypeMetaSerialization.deserialize(obj['@_LastLineEndedType'], warnings);
431
+ meta.headingLineCount = IntegerFloatMetaSerialization.deserialize(obj['@_HeadingLineCount'], FtMetaDefaults.Root.HeadingLineCount, false, warnings);
432
+ meta.mainHeadingLineIndex = IntegerFloatMetaSerialization.deserialize(obj['@_MainHeadingLineIndex'], FtMetaDefaults.Root.MainHeadingLineIndex, false, warnings);
433
+ meta.headingConstraint = HeadingConstraintMetaSerialization.deserialize(obj['@_HeadingConstraint'], undefined, warnings);
434
+ meta.headingQuotedType = QuotedTypeMetaSerialization.deserialize(obj['@_HeadingQuotedType'], true, undefined, warnings);
435
+ meta.headingPadAlignment = PadAlignmentMetaSerialization.deserialize(obj['@_HeadingPadAlignment'], true, undefined, warnings);
436
+ meta.headingPadCharType = PadCharTypeMetaSerialization.deserialize(obj['@_HeadingPadCharType'], true, undefined, warnings);
437
+ meta.headingTruncateType = TruncateTypeMetaSerialization.deserialize(obj['@_HeadingTruncateType'], true, undefined, warnings);
438
+ // Boolean properties
439
+ meta.allowEndOfLineCharInQuotes = BooleanMetaSerialization.deserialize(obj['@_AllowEndOfLineCharInQuotes'], FtMetaDefaults.Root.AllowEndOfLineCharInQuotes, warnings);
440
+ meta.ignoreBlankLines = BooleanMetaSerialization.deserialize(obj['@_IgnoreBlankLines'], FtMetaDefaults.Root.IgnoreBlankLines, warnings);
441
+ meta.ignoreExtraChars = BooleanMetaSerialization.deserialize(obj['@_IgnoreExtraChars'], FtMetaDefaults.Root.IgnoreExtraChars, warnings);
442
+ meta.allowIncompleteRecords = BooleanMetaSerialization.deserialize(obj['@_AllowIncompleteRecords'], FtMetaDefaults.Root.AllowIncompleteRecords, warnings);
443
+ meta.stuffedEmbeddedQuotes = BooleanMetaSerialization.deserialize(obj['@_StuffedEmbeddedQuotes'], FtMetaDefaults.Root.StuffedEmbeddedQuotes, warnings);
444
+ meta.headingAlwaysWriteOptionalQuote = BooleanMetaSerialization.deserialize(obj['@_HeadingAlwaysWriteOptionalQuote'], FtMetaDefaults.Root.HeadingAlwaysWriteOptionalQuote, warnings);
445
+ meta.headingWritePrefixSpace = BooleanMetaSerialization.deserialize(obj['@_HeadingWritePrefixSpace'], FtMetaDefaults.Root.HeadingWritePrefixSpace, warnings);
446
+ }
447
+ deserializeField(obj, headingLineCount, meta, warnings) {
448
+ const dataType = DataTypeMetaSerialization.deserialize(obj['@_DataType'], warnings);
449
+ const field = FtFieldFactory.createMetaField(dataType, headingLineCount);
450
+ field.name = StringMetaSerialization.deserialize(obj['@_Name'], FtMetaDefaults.Field.Name, warnings);
451
+ field.id = IntegerFloatMetaSerialization.deserialize(obj['@_Id'], FtMetaDefaults.Field.Id, true, warnings);
452
+ field.fixedWidth = BooleanMetaSerialization.deserialize(obj['@_FixedWidth'], FtMetaDefaults.Field.FixedWidth, warnings);
453
+ field.width = IntegerFloatMetaSerialization.deserialize(obj['@_Width'], FtMetaDefaults.Field.Width, false, warnings);
454
+ field.constant = BooleanMetaSerialization.deserialize(obj['@_Constant'], FtMetaDefaults.Field.Constant, warnings);
455
+ field.null = BooleanMetaSerialization.deserialize(obj['@_Null'], FtMetaDefaults.Field.Null, warnings);
456
+ // Value formatting properties
457
+ field.valueQuotedType = QuotedTypeMetaSerialization.deserialize(obj['@_ValueQuotedType'], false, undefined, warnings);
458
+ field.valueAlwaysWriteOptionalQuote = BooleanMetaSerialization.deserialize(obj['@_ValueAlwaysWriteOptionalQuote'], FtMetaDefaults.Field.ValueAlwaysWriteOptionalQuote, warnings);
459
+ field.valueWritePrefixSpace = BooleanMetaSerialization.deserialize(obj['@_ValueWritePrefixSpace'], FtMetaDefaults.Field.ValueWritePrefixSpace, warnings);
460
+ field.valuePadAlignment = PadAlignmentMetaSerialization.deserialize(obj['@_ValuePadAlignment'], false, undefined, warnings);
461
+ field.valuePadCharType = PadCharTypeMetaSerialization.deserialize(obj['@_ValuePadCharType'], false, undefined, warnings);
462
+ field.valuePadChar = CharMetaSerialization.deserialize(obj['@_ValuePadChar'], FtMetaDefaults.Field.ValuePadChar, warnings);
463
+ field.valueTruncateType = TruncateTypeMetaSerialization.deserialize(obj['@_ValueTruncateType'], false, undefined, warnings);
464
+ field.valueTruncateChar = CharMetaSerialization.deserialize(obj['@_ValueTruncateChar'], FtMetaDefaults.Field.ValueTruncateChar, warnings);
465
+ field.valueEndOfValueChar = CharMetaSerialization.deserialize(obj['@_ValueEndOfValueChar'], FtMetaDefaults.Field.ValueEndOfValueChar, warnings);
466
+ field.headingConstraint = HeadingConstraintMetaSerialization.deserialize(obj['@_HeadingConstraint'], meta.headingConstraint, warnings);
467
+ field.headingQuotedType = QuotedTypeMetaSerialization.deserialize(obj['@_HeadingQuotedType'], true, meta.headingQuotedType, warnings);
468
+ field.headingAlwaysWriteOptionalQuote = BooleanMetaSerialization.deserialize(obj['@_HeadingAlwaysWriteOptionalQuote'], meta.headingAlwaysWriteOptionalQuote, warnings);
469
+ field.headingWritePrefixSpace = BooleanMetaSerialization.deserialize(obj['@_HeadingWritePrefixSpace'], meta.headingWritePrefixSpace, warnings);
470
+ field.headingPadAlignment = PadAlignmentMetaSerialization.deserialize(obj['@_HeadingPadAlignment'], true, meta.headingPadAlignment, warnings);
471
+ field.headingPadCharType = PadCharTypeMetaSerialization.deserialize(obj['@_HeadingPadCharType'], true, meta.headingPadCharType, warnings);
472
+ field.headingPadChar = CharMetaSerialization.deserialize(obj['@_HeadingPadChar'], meta.headingPadChar, warnings);
473
+ field.headingTruncateType = TruncateTypeMetaSerialization.deserialize(obj['@_HeadingTruncateType'], true, meta.headingTruncateType, warnings);
474
+ field.headingTruncateChar = CharMetaSerialization.deserialize(obj['@_HeadingTruncateChar'], meta.headingTruncateChar, warnings);
475
+ field.headingEndOfValueChar = CharMetaSerialization.deserialize(obj['@_HeadingEndOfValueChar'], meta.headingEndOfValueChar, warnings);
476
+ // Headings
477
+ if (headingLineCount > 0) {
478
+ const headingsCommaText = StringMetaSerialization.deserialize(obj['@_Headings'], '', warnings);
479
+ const headingsResult = CommaText.tryToStringArray(headingsCommaText, true);
480
+ if (headingsResult.isErr()) {
481
+ warnings.push(`Headings: Invalid: Field ${field.name}: Value: "${headingsCommaText}"`);
482
+ }
483
+ else {
484
+ const headings = headingsResult.value;
485
+ const deserializedCount = headings.length;
486
+ if (deserializedCount !== headingLineCount) {
487
+ headings.length = headingLineCount;
488
+ if (deserializedCount < headingLineCount) {
489
+ for (let i = deserializedCount; i < headingLineCount; i++) {
490
+ headings[i] = '';
491
+ }
492
+ }
493
+ }
494
+ field.headings = headings;
495
+ }
496
+ }
497
+ const fieldDataType = field.dataType;
498
+ const valueDeserializable = field.constant && !field.null;
499
+ const deserializableValue = valueDeserializable ? obj['@_Value'] : undefined;
500
+ switch (fieldDataType) {
501
+ case FtDataType.String: {
502
+ const stringField = field;
503
+ stringField.value = StringMetaSerialization.deserialize(deserializableValue, FtStringMetaField.DEFAULT_VALUE, warnings);
504
+ break;
505
+ }
506
+ case FtDataType.Boolean: {
507
+ const booleanField = field;
508
+ booleanField.styles = FtBooleanStylesMetaSerialization.deserialize(obj['@_Styles'], warnings);
509
+ booleanField.trueText = StringMetaSerialization.deserialize(obj['@_TrueText'], FtBooleanMetaField.DEFAULT_TRUE_TEXT, warnings);
510
+ booleanField.falseText = StringMetaSerialization.deserialize(obj['@_FalseText'], FtBooleanMetaField.DEFAULT_FALSE_TEXT, warnings);
511
+ booleanField.value = BooleanMetaSerialization.deserialize(deserializableValue, FtBooleanMetaField.DEFAULT_VALUE, warnings);
512
+ break;
513
+ }
514
+ case FtDataType.Integer: {
515
+ const integerField = field;
516
+ integerField.format = StringMetaSerialization.deserialize(obj['@_Format'], FtIntegerMetaField.DEFAULT_FORMAT, warnings);
517
+ integerField.styles = FtNumberStylesMetaSerialization.deserialize(obj['@_Styles'], fieldDataType, warnings);
518
+ integerField.value = IntegerMetaSerialization.deserialize(deserializableValue, FtIntegerMetaField.DEFAULT_VALUE, warnings);
519
+ break;
520
+ }
521
+ case FtDataType.Float: {
522
+ const floatField = field;
523
+ floatField.format = StringMetaSerialization.deserialize(obj['@_Format'], FtFloatMetaField.DEFAULT_FORMAT, warnings);
524
+ floatField.styles = FtNumberStylesMetaSerialization.deserialize(obj['@_Styles'], fieldDataType, warnings);
525
+ floatField.value = FloatMetaSerialization.deserialize(deserializableValue, FtFloatMetaField.DEFAULT_VALUE, warnings);
526
+ break;
527
+ }
528
+ case FtDataType.Decimal: {
529
+ const decimalField = field;
530
+ decimalField.format = StringMetaSerialization.deserialize(obj['@_Format'], FtDecimalMetaField.DEFAULT_FORMAT, warnings);
531
+ decimalField.styles = FtNumberStylesMetaSerialization.deserialize(obj['@_Styles'], fieldDataType, warnings);
532
+ decimalField.value = DecimalMetaSerialization.deserialize(deserializableValue, FtDecimalMetaField.DEFAULT_VALUE, warnings);
533
+ break;
534
+ }
535
+ case FtDataType.DateTime: {
536
+ const dateTimeField = field;
537
+ dateTimeField.styles = FtDateTimeStylesMetaSerialization.deserialize(obj['@_Styles'], warnings);
538
+ dateTimeField.format = StringMetaSerialization.deserialize(obj['@_Format'], FtDateTimeMetaField.DEFAULT_FORMAT, warnings);
539
+ dateTimeField.value = DateTimeMetaSerialization.deserialize(deserializableValue, FtDateTimeMetaField.DEFAULT_VALUE, warnings);
540
+ break;
541
+ }
542
+ default:
543
+ throw new FtUnreachableCaseError('XMSDFP', fieldDataType);
544
+ }
545
+ const explicitIndex = IntegerFloatMetaSerialization.deserialize(obj['@_Index'], ImplicitExplicitIndexSortRec.INDEX_NOT_SET, false, warnings);
546
+ return { target: field, implicitIndex: ImplicitExplicitIndexSortRec.INDEX_NOT_SET, explicitIndex };
547
+ }
548
+ deserializeSequence(seqObj, resolvedOrderedFieldList, redirectSequenceResolver, warnings) {
549
+ const sequence = new FtMetaSequence();
550
+ const objName = seqObj['@_Name'];
551
+ let result;
552
+ if (typeof objName === 'string') {
553
+ result = { sequence, name: objName };
554
+ }
555
+ else {
556
+ result = { sequence, name: undefined };
557
+ if (objName === undefined) {
558
+ warnings.push('Sequence: Missing required attribute: Name');
559
+ }
560
+ else {
561
+ warnings.push(`Sequence: Invalid Name attribute: ${objName}`);
562
+ }
563
+ }
564
+ sequence.name = result.name ?? '';
565
+ sequence.root = BooleanMetaSerialization.deserialize(seqObj['@_Root'], FtMetaDefaults.Sequence.Root, warnings);
566
+ // Deserialize sequence items
567
+ if (seqObj.Item) {
568
+ const itemObjs = Array.isArray(seqObj.Item) ? seqObj.Item : [seqObj.Item];
569
+ const itemCount = itemObjs.length;
570
+ const itemSortRecs = new Array(itemCount);
571
+ let count = 0;
572
+ for (let i = 0; i < itemCount; i++) {
573
+ const itemSortRec = this.deserializeSequenceItem(itemObjs[i], resolvedOrderedFieldList, redirectSequenceResolver, warnings);
574
+ if (itemSortRec !== undefined) {
575
+ const index = count++;
576
+ itemSortRec.implicitIndex = index;
577
+ itemSortRecs[index] = itemSortRec;
578
+ }
579
+ }
580
+ itemSortRecs.length = count; // In case some items were skipped due to deserialization errors
581
+ itemSortRecs.sort((left, right) => ImplicitExplicitIndexSortRec.compare(left, right));
582
+ ImplicitExplicitIndexSortRec.checkSortedArray(itemSortRecs, 'Sequence Item', warnings);
583
+ sequence.setItemList(itemSortRecs.map((rec) => rec.target));
584
+ }
585
+ return result;
586
+ }
587
+ deserializeSequenceItem(itemObj, resolvedOrderedFieldList, redirectSequenceResolver, warnings) {
588
+ const field = SequenceItemFieldIndexSerialization.deserializeField(itemObj['@_FieldIndex'], resolvedOrderedFieldList, warnings);
589
+ if (field === undefined) {
590
+ return undefined; // We can't deserialize this item without a valid field reference, but we can continue deserializing other items and sequences, so we return undefined and log a warning instead of throwing an error
591
+ }
592
+ else {
593
+ const item = new FtMetaSequenceItem(field);
594
+ // Deserialize redirects
595
+ if (itemObj.Redirect) {
596
+ const redirectObjs = Array.isArray(itemObj.Redirect) ? itemObj.Redirect : [itemObj.Redirect];
597
+ const redirectCount = redirectObjs.length;
598
+ const redirectSortRecs = new Array(redirectCount);
599
+ for (let i = 0; i < redirectCount; i++) {
600
+ const redirectRec = this.deserializeRedirect(redirectObjs[i], field.dataType, warnings);
601
+ redirectRec.implicitIndex = i;
602
+ redirectSortRecs[i] = redirectRec;
603
+ }
604
+ redirectSortRecs.sort((left, right) => ImplicitExplicitIndexSortRec.compare(left, right));
605
+ ImplicitExplicitIndexSortRec.checkSortedArray(redirectSortRecs, 'Sequence Redirect', warnings);
606
+ const redirects = new Array(redirectCount);
607
+ for (let i = 0; i < redirectCount; i++) {
608
+ const sortRec = redirectSortRecs[i];
609
+ const redirectNameRec = sortRec.target;
610
+ const redirect = redirectNameRec.redirect;
611
+ const sequenceName = redirectNameRec.sequenceName;
612
+ redirects[i] = redirect;
613
+ redirectSequenceResolver.add(redirect, sequenceName);
614
+ }
615
+ item.setRedirectList(redirects);
616
+ }
617
+ const explicitIndex = IntegerFloatMetaSerialization.deserialize(itemObj['@_Index'], ImplicitExplicitIndexSortRec.INDEX_NOT_SET, false, warnings);
618
+ return { target: item, implicitIndex: ImplicitExplicitIndexSortRec.INDEX_NOT_SET, explicitIndex };
619
+ }
620
+ }
621
+ deserializeRedirect(redirectObj, fieldDataType, warnings) {
622
+ const explicitIndex = IntegerFloatMetaSerialization.deserialize(redirectObj['@_Index'], ImplicitExplicitIndexSortRec.INDEX_NOT_SET, false, warnings);
623
+ const objSequenceName = redirectObj['@_SequenceName'];
624
+ const sequenceName = typeof objSequenceName === 'string' ? objSequenceName : undefined;
625
+ const redirectType = SequenceRedirectTypeMetaSerialization.deserialize(redirectObj['@_Type'], fieldDataType, warnings);
626
+ const invokationDelay = SequenceInvokationDelayMetaSerialization.deserialize(redirectObj['@_InvokationDelay'], warnings);
627
+ let redirect;
628
+ switch (redirectType) {
629
+ case FtSequenceRedirectType.Null:
630
+ redirect = new FtNullMetaSequenceRedirect();
631
+ // Null redirects don't have a value
632
+ break;
633
+ case FtSequenceRedirectType.ExactString: {
634
+ const exactStringRedirect = new FtExactStringMetaSequenceRedirect();
635
+ exactStringRedirect.value = StringMetaSerialization.deserialize(redirectObj['@_Value'], FtExactStringMetaSequenceRedirect.DEFAULT_VALUE, warnings);
636
+ redirect = exactStringRedirect;
637
+ break;
638
+ }
639
+ case FtSequenceRedirectType.CaseInsensitiveString: {
640
+ const caseInsensitiveStringRedirect = new FtCaseInsensitiveStringMetaSequenceRedirect();
641
+ caseInsensitiveStringRedirect.value = StringMetaSerialization.deserialize(redirectObj['@_Value'], FtCaseInsensitiveStringMetaSequenceRedirect.DEFAULT_VALUE, warnings);
642
+ redirect = caseInsensitiveStringRedirect;
643
+ break;
644
+ }
645
+ case FtSequenceRedirectType.Boolean: {
646
+ const booleanRedirect = new FtBooleanMetaSequenceRedirect();
647
+ booleanRedirect.value = BooleanMetaSerialization.deserialize(redirectObj['@_Value'], FtBooleanMetaSequenceRedirect.DEFAULT_VALUE, warnings);
648
+ redirect = booleanRedirect;
649
+ break;
650
+ }
651
+ case FtSequenceRedirectType.ExactInteger: {
652
+ const exactIntegerRedirect = new FtExactIntegerMetaSequenceRedirect();
653
+ exactIntegerRedirect.value = IntegerMetaSerialization.deserialize(redirectObj['@_Value'], FtExactIntegerMetaSequenceRedirect.DEFAULT_VALUE, warnings);
654
+ redirect = exactIntegerRedirect;
655
+ break;
656
+ }
657
+ case FtSequenceRedirectType.ExactFloat: {
658
+ const exactFloatRedirect = new FtExactFloatMetaSequenceRedirect();
659
+ exactFloatRedirect.value = FloatMetaSerialization.deserialize(redirectObj['@_Value'], FtExactFloatMetaSequenceRedirect.DEFAULT_VALUE, warnings);
660
+ redirect = exactFloatRedirect;
661
+ break;
662
+ }
663
+ case FtSequenceRedirectType.ExactDateTime: {
664
+ const exactDateTimeRedirect = new FtExactDateTimeMetaSequenceRedirect();
665
+ exactDateTimeRedirect.value = DateTimeMetaSerialization.deserialize(redirectObj['@_Value'], FtExactDateTimeMetaSequenceRedirect.DEFAULT_VALUE, warnings);
666
+ redirect = exactDateTimeRedirect;
667
+ break;
668
+ }
669
+ case FtSequenceRedirectType.Date: {
670
+ const dateRedirect = new FtDateMetaSequenceRedirect();
671
+ dateRedirect.value = DateTimeMetaSerialization.deserialize(redirectObj['@_Value'], FtDateMetaSequenceRedirect.DEFAULT_VALUE, warnings);
672
+ redirect = dateRedirect;
673
+ break;
674
+ }
675
+ case FtSequenceRedirectType.ExactDecimal: {
676
+ const exactDecimalRedirect = new FtExactDecimalMetaSequenceRedirect();
677
+ exactDecimalRedirect.value = DecimalMetaSerialization.deserialize(redirectObj['@_Value'], FtExactDecimalMetaSequenceRedirect.DEFAULT_VALUE, warnings);
678
+ redirect = exactDecimalRedirect;
679
+ break;
680
+ }
681
+ default:
682
+ throw new FtUnreachableCaseError('XMSSR99315', redirectType);
683
+ }
684
+ redirect.invokationDelay = invokationDelay;
685
+ const nameRec = { redirect, sequenceName: sequenceName };
686
+ return {
687
+ target: nameRec,
688
+ implicitIndex: ImplicitExplicitIndexSortRec.INDEX_NOT_SET,
689
+ explicitIndex,
690
+ };
691
+ }
692
+ }
693
+ /** @public */
694
+ (function (FtXmlMetaSerialization) {
695
+ function serialize(meta, options) {
696
+ const serializer = new FtXmlMetaSerialization();
697
+ return serializer.serialize(meta, options);
698
+ }
699
+ FtXmlMetaSerialization.serialize = serialize;
700
+ function deserialize(xml, warnings) {
701
+ const deserializer = new FtXmlMetaSerialization();
702
+ return deserializer.deserialize(xml, warnings);
703
+ }
704
+ FtXmlMetaSerialization.deserialize = deserialize;
705
+ })(FtXmlMetaSerialization || (FtXmlMetaSerialization = {}));
706
+ //# sourceMappingURL=ft-xml-meta-serialization.js.map