@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,953 @@
1
+ import { FtField } from '../fields/instances/ft-field.js';
2
+ import { FtMetaSerialization } from '../meta-serialization/ft-meta-serialization.js';
3
+ import { FtMeta } from '../meta/ft-meta.js';
4
+ import { FtLastLineEndedType } from '../types/enums/ft-last-line-ended-type.js';
5
+ import { FtLineType } from '../types/enums/ft-line-type.js';
6
+ import { FtMetaReferenceType } from '../types/enums/ft-meta-reference-type.js';
7
+ import { FtMetaSerializationFormat } from '../types/enums/ft-meta-serialization-format.js';
8
+ import { FtReadRecordResult } from '../types/enums/ft-read-record-result.js';
9
+ import { FtUnreachableCaseError } from '../types/errors/ft-internal-error.js';
10
+ import { FtSerializationError } from '../types/errors/ft-serialization-error.js';
11
+ import { FtSerializationException } from '../types/errors/ft-serialization-exception.js';
12
+ import { CharReader } from './char-reader.js';
13
+ import { DeclarationParser } from './declaration-parser.js';
14
+ import { EmbeddedMetaParser } from './embedded-meta-parser.js';
15
+ import { FtDeclaredParameters } from './ft-declared-parameters.js';
16
+ import { FtTextReader } from './ft-text-reader.js';
17
+ import { HeadingLineRecordParser } from './heading-line-record-parser.js';
18
+ import { LineEndedType, LineParser } from './line-parser.js';
19
+ import { SerializationCore } from './serialization-core.js';
20
+
21
+ /**
22
+ * Reader for fielded text streams. Coordinates all parsing components.
23
+ * @public
24
+ */
25
+ export class FtSerializationReader extends SerializationCore {
26
+ /**
27
+ * Event fired when seeking through records.
28
+ */
29
+ onRecordSeeked: FtSerializationReader.OnRecordSeeked | undefined = undefined;
30
+
31
+ /**
32
+ * Event fired when needing to access file to get meta. This library is browser-compatible and does not have direct file system access, so this event allows the consumer to provide file content as text.
33
+ */
34
+ onRequireFileMetaAsText: FtSerializationReader.OnRequireFileMetaAsText | undefined = undefined;
35
+ /**
36
+ * Event fired when needing to access URL to get meta. Deferred to consumer as need to handle encoding and also must be returned synchronously
37
+ */
38
+ onRequireUrlMetaAsText: FtSerializationReader.OnRequireUrlMetaAsText | undefined = undefined;
39
+
40
+ private readonly _charReader: CharReader;
41
+ private readonly _lineParser: LineParser;
42
+ private readonly _declarationParser: DeclarationParser;
43
+ private readonly _declaredParameters: FtDeclaredParameters;
44
+ private readonly _embeddedMetaParser: EmbeddedMetaParser;
45
+ private readonly _headingLineParser: HeadingLineRecordParser;
46
+ private readonly _recordParser: HeadingLineRecordParser;
47
+ private readonly _lineBuilder: string[] = [];
48
+
49
+ private _headerRead = false;
50
+ private _declarationRead = false;
51
+ private _embeddedMetaRead = false;
52
+ private _headingLineReadCount = 0;
53
+ private _headingLinesRead = false;
54
+ private _finished = false;
55
+
56
+ private _declared = false;
57
+ private _metaReferenceType: FtMetaReferenceType = FtMetaReferenceType.None;
58
+ private _metaReference = '';
59
+ private _metaEmbedded = false;
60
+ private _newTableStarted = false;
61
+ private _tableStartSuspended = false;
62
+ private _tableStartRecordPeeked = false;
63
+ private _lineType: FtLineType = FtLineType.Blank;
64
+
65
+ private _autoNextTable = false;
66
+
67
+ constructor() {
68
+ super();
69
+ this._charReader = new CharReader();
70
+ this._declaredParameters = new FtDeclaredParameters();
71
+ this._lineParser = new LineParser(this._charReader, this.endOfLineType, this.endOfLineChar);
72
+ this._declarationParser = new DeclarationParser(this._charReader, this._declaredParameters);
73
+ this._embeddedMetaParser = new EmbeddedMetaParser();
74
+ this._headingLineParser = new HeadingLineRecordParser(this, this._charReader, true);
75
+ this._recordParser = new HeadingLineRecordParser(this, this._charReader, false);
76
+ }
77
+
78
+ /**
79
+ * Gets or sets whether Read() will automatically continue reading records when new tables begin.
80
+ */
81
+ get autoNextTable(): boolean {
82
+ return this._autoNextTable;
83
+ }
84
+ set autoNextTable(value: boolean) {
85
+ this._autoNextTable = value;
86
+ }
87
+
88
+ /**
89
+ * Gets whether the fielded text stream was declared (has |!Fielded Text^| signature).
90
+ */
91
+ get declared(): boolean {
92
+ return this._declared;
93
+ }
94
+
95
+ /**
96
+ * Gets the number of heading lines read.
97
+ */
98
+ get headingLineReadCount(): number {
99
+ return this._headingLineReadCount;
100
+ }
101
+
102
+ /**
103
+ * Gets whether the header has been fully read.
104
+ */
105
+ get headerRead(): boolean {
106
+ return this._headerRead;
107
+ }
108
+
109
+ /**
110
+ * Gets the meta reference type.
111
+ */
112
+ get metaReferenceType(): FtMetaReferenceType {
113
+ return this._metaReferenceType;
114
+ }
115
+
116
+ /**
117
+ * Gets the meta reference (file path or URL).
118
+ */
119
+ get metaReference(): string {
120
+ return this._metaReference;
121
+ }
122
+
123
+ /**
124
+ * Gets the type of the last line read.
125
+ */
126
+ get lineType(): FtLineType {
127
+ return this._lineType;
128
+ }
129
+
130
+ /**
131
+ * Gets the last line read as a string.
132
+ */
133
+ get line(): string {
134
+ return this._lineBuilder.join('');
135
+ }
136
+
137
+ /**
138
+ * Gets whether the last record read was the start of a new table.
139
+ */
140
+ get newTableStarted(): boolean {
141
+ return this._newTableStarted;
142
+ }
143
+
144
+ /**
145
+ * Gets the number of records read (accounting for table start peeking).
146
+ */
147
+ override get recordCount(): number {
148
+ return this._tableStartRecordPeeked ? this._recordCount - 1 : this._recordCount;
149
+ }
150
+
151
+ /**
152
+ * Gets the number of tables read (accounting for table start suspension).
153
+ */
154
+ override get tableCount(): number {
155
+ return this._tableStartSuspended ? this._tableCount - 1 : this._tableCount;
156
+ }
157
+
158
+ /**
159
+ * Gets the active field index for the current line.
160
+ */
161
+ get activeFieldIndex(): number {
162
+ switch (this._lineType) {
163
+ case FtLineType.Heading:
164
+ return this._headingLineParser.getActiveFieldIndex();
165
+ case FtLineType.Record:
166
+ return this._recordParser.getActiveFieldIndex();
167
+ default:
168
+ return -1;
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Gets the line position where extra characters started being ignored.
174
+ */
175
+ get ignoreExtraCharsLinePosition(): number {
176
+ switch (this._lineType) {
177
+ case FtLineType.Heading:
178
+ return this._headingLineParser.getIgnoreExtraCharsLinePosition();
179
+ case FtLineType.Record:
180
+ return this._recordParser.getIgnoreExtraCharsLinePosition();
181
+ default:
182
+ return -1;
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Gets whether the reader is closed.
188
+ */
189
+ override get isClosed(): boolean {
190
+ return this._charReader.isClosed;
191
+ }
192
+
193
+ /**
194
+ * Close the reader and reset state.
195
+ */
196
+ override close(): void {
197
+ this._charReader.close();
198
+ this.reset();
199
+ }
200
+
201
+ /**
202
+ * Read the header (declaration, embedded meta, heading lines).
203
+ */
204
+ readHeader(): void {
205
+ if (this._declared && !this._declarationRead) {
206
+ this.readDeclaration();
207
+ }
208
+
209
+ if (this._metaReferenceType === FtMetaReferenceType.Embedded && !this._embeddedMetaRead) {
210
+ this.readEmbeddedMeta();
211
+ }
212
+
213
+ if (this.headingLineCount > 0 && !this._headingLinesRead) {
214
+ this.readHeadingLines();
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Read the next line from the stream.
220
+ * Always reads regardless of table boundaries.
221
+ * @returns true if a line was read, false if at end of stream.
222
+ */
223
+ readLine(): boolean {
224
+ let result: boolean;
225
+ if (!this._tableStartRecordPeeked) {
226
+ result = this.internalReadLine();
227
+ } else {
228
+ this._tableStartRecordPeeked = false;
229
+ result = true;
230
+ }
231
+
232
+ if (result && this._tableStartSuspended && this._lineType === FtLineType.Record) {
233
+ this._tableStartSuspended = false;
234
+ }
235
+
236
+ return result;
237
+ }
238
+
239
+ /**
240
+ * Read the next record from the stream.
241
+ * Respects autoNextTable setting for table boundaries.
242
+ * @returns true if a record was read, false otherwise.
243
+ */
244
+ read(): boolean {
245
+ if (this._tableStartSuspended) {
246
+ if (!this._autoNextTable) {
247
+ return false;
248
+ } else {
249
+ this._tableStartSuspended = false;
250
+ return this.read();
251
+ }
252
+ } else {
253
+ if (this._tableStartRecordPeeked) {
254
+ this._tableStartRecordPeeked = false;
255
+ return true;
256
+ } else {
257
+ let lineRead: boolean;
258
+ do {
259
+ lineRead = this.internalReadLine();
260
+ } while (lineRead && this._lineType !== FtLineType.Record);
261
+
262
+ if (!lineRead) {
263
+ return false;
264
+ } else {
265
+ if (!this._newTableStarted) {
266
+ return true;
267
+ } else {
268
+ if (this._autoNextTable || this.recordCount === 1) {
269
+ return true;
270
+ } else {
271
+ this._tableStartSuspended = true;
272
+ this._tableStartRecordPeeked = true;
273
+ return false;
274
+ }
275
+ }
276
+ }
277
+ }
278
+ }
279
+ }
280
+
281
+ /**
282
+ * Read all remaining records.
283
+ * Normally used with event handlers.
284
+ */
285
+ readToEnd(): void {
286
+ while (this.read()) {
287
+ // Loop until no more records
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Read the next record and indicate table boundaries.
293
+ * Always reads regardless of table boundaries.
294
+ * @returns Result indicating same table, new table, or no more records.
295
+ */
296
+ readRecord(): FtReadRecordResult {
297
+ if (this._tableStartSuspended) {
298
+ this._tableStartSuspended = false;
299
+ if (this._tableStartRecordPeeked) {
300
+ this._tableStartRecordPeeked = false;
301
+ } else {
302
+ // Should never happen
303
+ this.readRecord();
304
+ }
305
+ return FtReadRecordResult.NewTable;
306
+ } else {
307
+ let lineRead: boolean;
308
+ do {
309
+ lineRead = this.internalReadLine();
310
+ } while (lineRead && this._lineType !== FtLineType.Record);
311
+
312
+ if (!lineRead) {
313
+ return FtReadRecordResult.NoMoreRecords;
314
+ } else {
315
+ if (this._newTableStarted) {
316
+ return FtReadRecordResult.NewTable;
317
+ } else {
318
+ return FtReadRecordResult.SameTable;
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ /**
325
+ * Move to the next table in the stream.
326
+ * @returns true if a new table was found, false if at end of stream.
327
+ */
328
+ nextTable(): boolean {
329
+ if (this._tableStartSuspended) {
330
+ this._tableStartSuspended = false;
331
+ return true;
332
+ } else {
333
+ let result: boolean;
334
+ do {
335
+ result = this.read();
336
+ } while (result && !this._newTableStarted);
337
+
338
+ if (result) {
339
+ this._tableStartRecordPeeked = true;
340
+ }
341
+ return result;
342
+ }
343
+ }
344
+
345
+ /**
346
+ * Alias for nextTable() (IDataReader compatibility).
347
+ * @returns true if a new table was found, false if at end of stream.
348
+ */
349
+ nextResult(): boolean {
350
+ return this.nextTable();
351
+ }
352
+
353
+ /**
354
+ * Seek to a specific record offset.
355
+ * @param offset - The 1-based record offset to seek to.
356
+ * @returns true if seek succeeded, false if offset beyond end.
357
+ */
358
+ seek(offset: number): boolean {
359
+ let result = true;
360
+ this.setSeeking(true);
361
+ try {
362
+ for (let i = 0; i < offset - 1; i++) {
363
+ if (this.readRecord() !== FtReadRecordResult.NoMoreRecords) {
364
+ if (this.onRecordSeeked) {
365
+ this.onRecordSeeked();
366
+ }
367
+ } else {
368
+ result = false;
369
+ break;
370
+ }
371
+ }
372
+ } finally {
373
+ this.setSeeking(false);
374
+ }
375
+
376
+ if (result) {
377
+ result = this.readRecord() !== FtReadRecordResult.NoMoreRecords;
378
+ }
379
+
380
+ return result;
381
+ }
382
+
383
+ /**
384
+ * Seek to the end of the stream.
385
+ */
386
+ seekEnd(): void {
387
+ this.setSeeking(true);
388
+ try {
389
+ while (this.readRecord() !== FtReadRecordResult.NoMoreRecords) {
390
+ if (this.onRecordSeeked) {
391
+ this.onRecordSeeked();
392
+ }
393
+ }
394
+ } finally {
395
+ this.setSeeking(false);
396
+ }
397
+ }
398
+
399
+ /**
400
+ * Get a field object by index.
401
+ */
402
+ getField(idx: number): FtField {
403
+ return this.fieldList.get(idx);
404
+ }
405
+
406
+ /**
407
+ * Get a field object by name.
408
+ */
409
+ getFieldByName(name: string): FtField | undefined {
410
+ return this.fieldList.getByName(name);
411
+ }
412
+
413
+ /**
414
+ * Get a field value by index.
415
+ */
416
+ getFieldValue(idx: number): unknown {
417
+ return this.fieldList.get(idx).asObject;
418
+ }
419
+
420
+ /**
421
+ * Get a field value by name.
422
+ */
423
+ getFieldValueByName(name: string): unknown {
424
+ const field = this.fieldList.getByName(name);
425
+ if (!field) {
426
+ throw new Error(`Field not found: ${name}`);
427
+ }
428
+ return field.asObject;
429
+ }
430
+
431
+ /**
432
+ * Load metadata from a pre-parsed FtMeta object.
433
+ * @param meta - The metadata to load.
434
+ */
435
+ loadMetaFromObject(meta: FtMeta): void {
436
+ this.loadMeta(meta);
437
+ }
438
+
439
+ protected override reset(): void {
440
+ super.reset();
441
+
442
+ this._declarationRead = false;
443
+ this._embeddedMetaRead = false;
444
+ this._headingLineReadCount = 0;
445
+ this._headingLinesRead = false;
446
+ this._headerRead = !this._declared && this.headingLineCount === 0;
447
+ this._finished = false;
448
+
449
+ this._declaredParameters.clear();
450
+ this._lineParser.reset();
451
+ this._embeddedMetaParser.reset();
452
+ this._metaReferenceType = FtMetaReferenceType.None;
453
+ this._metaReference = '';
454
+ this._metaEmbedded = false;
455
+ this._newTableStarted = false;
456
+ this._tableStartSuspended = false;
457
+ this._tableStartRecordPeeked = false;
458
+ this._lineType = FtLineType.Blank;
459
+
460
+ this._lineBuilder.length = 0;
461
+ }
462
+
463
+ /**
464
+ * Open the reader with a TextReader.
465
+ * @param textReader - The text reader to read from.
466
+ * @param immediatelyReadHeader - Whether to immediately read the header.
467
+ */
468
+ protected open(textReader: FtTextReader, immediatelyReadHeader: boolean): void {
469
+ this._charReader.setTextReader(textReader);
470
+ const signature = this._charReader.peekSignature();
471
+ this._declared = signature !== undefined;
472
+ if (this._declared && signature !== undefined) {
473
+ this._declarationParser.signature = signature;
474
+ }
475
+
476
+ this.reset();
477
+
478
+ if (!this._headerRead && immediatelyReadHeader) {
479
+ this.readHeader();
480
+ }
481
+ }
482
+
483
+ protected getFileMetaAsText(fileMetaReference: string): FtSerializationReader.FileMetaAsTextResult | string {
484
+ // Descendants can override this method. Clients can subscribe to onRequireFileMetaAsText event
485
+ if (!this.onRequireFileMetaAsText) {
486
+ throw new FtSerializationException(
487
+ FtSerializationError.MetaReferenceFileNoHandler,
488
+ 'Meta reference is file but no handler provided to retrieve file content',
489
+ );
490
+ } else {
491
+ return this.onRequireFileMetaAsText(fileMetaReference);
492
+ }
493
+ }
494
+
495
+ protected getUrlMetaAsText(urlMetaReference: string): FtSerializationReader.FileMetaAsTextResult | string {
496
+ // Descendants can override this method. Clients can subscribe to onRequireUrlMetaAsText event
497
+ if (!this.onRequireUrlMetaAsText) {
498
+ throw new FtSerializationException(
499
+ FtSerializationError.MetaReferenceUrlNoHandler,
500
+ 'Meta reference is URL but no handler provided to retrieve URL content',
501
+ );
502
+ } else {
503
+ return this.onRequireUrlMetaAsText(urlMetaReference);
504
+ }
505
+ }
506
+
507
+ private internalReadLine(): boolean {
508
+ let result = true;
509
+ do {
510
+ const readCharAsInt = this._charReader.read();
511
+ if (readCharAsInt !== FtTextReader.EofReadResult) {
512
+ this.parseChar(String.fromCharCode(readCharAsInt));
513
+ } else {
514
+ result = this.finish();
515
+ }
516
+ } while (this._lineParser.inLine);
517
+
518
+ return result;
519
+ }
520
+
521
+ private parseChar(aChar: string): void {
522
+ if (!this._lineParser.inLine) {
523
+ // New line starting
524
+ this._lineBuilder.length = 0;
525
+
526
+ this._lineType = this.calculateStartLineType(aChar);
527
+ switch (this._lineType) {
528
+ case FtLineType.Signature:
529
+ this._declarationParser.startLine();
530
+ this.setLineCommentChar(aChar);
531
+ break;
532
+ case FtLineType.Declaration2:
533
+ this._declarationParser.startLine();
534
+ break;
535
+ case FtLineType.Comment:
536
+ if (!this._headerRead) {
537
+ if (this._metaEmbedded && !this._embeddedMetaRead) {
538
+ this._embeddedMetaParser.startLine();
539
+ }
540
+ }
541
+ break;
542
+ case FtLineType.EmbeddedMeta:
543
+ this._embeddedMetaParser.startLine();
544
+ break;
545
+ case FtLineType.Heading: {
546
+ this.invokeRootSequence();
547
+ const headingLineReadIndex = this._headingLineReadCount++;
548
+ this._headingLineParser.start(headingLineReadIndex);
549
+ this.fireHeadingLineStarted(headingLineReadIndex);
550
+ break;
551
+ }
552
+ }
553
+ }
554
+
555
+ const endOfLineToBeEmbedded = this._recordParser.isEndOfLineToBeEmbedded();
556
+ const lineEndedType = this._lineParser.parseChar(aChar, endOfLineToBeEmbedded);
557
+
558
+ if (lineEndedType !== LineEndedType.Continued) {
559
+ const lineEndInitiated = lineEndedType === LineEndedType.Initiated;
560
+
561
+ if (!lineEndInitiated) {
562
+ this._lineBuilder.push(aChar);
563
+ }
564
+
565
+ switch (this._lineType) {
566
+ case FtLineType.Signature:
567
+ if (!lineEndInitiated) {
568
+ this._declarationParser.parseSignatureLineChar(aChar);
569
+ } else {
570
+ this._declarationParser.finishSignatureLine();
571
+ }
572
+ break;
573
+
574
+ case FtLineType.Declaration2:
575
+ if (!lineEndInitiated) {
576
+ this._declarationParser.parseDeclaration2LineChar(aChar);
577
+ } else {
578
+ this.finishDeclaration();
579
+ }
580
+ break;
581
+
582
+ case FtLineType.Comment:
583
+ if (!this._headerRead) {
584
+ if (this._metaEmbedded && !this._embeddedMetaRead) {
585
+ if (!lineEndInitiated) {
586
+ const embeddedMetaPresent = this._embeddedMetaParser.parseNotYetDetectedChar(aChar);
587
+ if (embeddedMetaPresent) {
588
+ this._lineType = FtLineType.EmbeddedMeta;
589
+ }
590
+ }
591
+ }
592
+ }
593
+ break;
594
+
595
+ case FtLineType.EmbeddedMeta:
596
+ if (!lineEndInitiated) {
597
+ this._embeddedMetaParser.parseChar(aChar);
598
+ } else {
599
+ this._embeddedMetaParser.appendLine();
600
+ if (this._embeddedMetaParser.ready) {
601
+ this.finishEmbeddedMeta();
602
+ }
603
+ }
604
+ break;
605
+
606
+ case FtLineType.Blank:
607
+ if (!this._headerRead) {
608
+ if (!lineEndInitiated) {
609
+ // Must be a heading line
610
+ this._lineType = FtLineType.Heading;
611
+ if (this._metaEmbedded && !this._embeddedMetaRead) {
612
+ throw new FtSerializationException(FtSerializationError.EmbeddedMetaNotFound, 'Embedded meta line not blank or comment');
613
+ } else {
614
+ if (!(this.headingLineCount > 0 && !this._headingLinesRead)) {
615
+ throw new Error('Unexpected heading line state');
616
+ }
617
+ this.invokeRootSequence();
618
+ const headingLineReadIndex = this._headingLineReadCount++;
619
+ this._headingLineParser.start(headingLineReadIndex);
620
+ this.fireHeadingLineStarted(headingLineReadIndex);
621
+ this._headingLineParser.parseChar(aChar);
622
+ }
623
+ }
624
+ } else {
625
+ if (!lineEndInitiated) {
626
+ // Is actually a record line
627
+ this._lineType = FtLineType.Record;
628
+ if (this._newTableStarted) {
629
+ // Copy previous invokation list
630
+ this.previousRecordSequenceInvokationList.assign(this.sequenceInvokationList);
631
+ this._newTableStarted = false;
632
+ }
633
+ this.invokeRootSequence();
634
+ const recordIndex = this._recordCount++;
635
+ this._recordParser.start(recordIndex);
636
+ this.fireRecordStarted(recordIndex);
637
+ this._recordParser.parseChar(aChar);
638
+ } else {
639
+ if (!this.ignoreBlankLines) {
640
+ throw new FtSerializationException(FtSerializationError.RecordNotEnoughFields, 'Blank records not allowed');
641
+ }
642
+ }
643
+ }
644
+ break;
645
+
646
+ case FtLineType.Heading:
647
+ if (!lineEndInitiated) {
648
+ this._headingLineParser.parseChar(aChar);
649
+ } else {
650
+ this.finishHeadingLine();
651
+ }
652
+ break;
653
+
654
+ case FtLineType.Record:
655
+ if (!lineEndInitiated) {
656
+ this._recordParser.parseChar(aChar);
657
+ } else {
658
+ this.finishRecord();
659
+ }
660
+ break;
661
+
662
+ default:
663
+ throw new FtUnreachableCaseError('SRPC93356', this._lineType);
664
+ }
665
+ }
666
+ }
667
+
668
+ private calculateStartLineType(startChar: string): FtLineType {
669
+ if (this._headerRead) {
670
+ return startChar === this.lineCommentChar ? FtLineType.Comment : FtLineType.Blank;
671
+ } else {
672
+ if (this._declared && this._lineParser.lineCount < 2) {
673
+ // Declaration Line Type
674
+ switch (this._lineParser.lineCount) {
675
+ case 0:
676
+ return FtLineType.Signature;
677
+ case 1:
678
+ return FtLineType.Declaration2;
679
+ default:
680
+ throw new Error(`Unexpected declaration line count: ${this._lineParser.lineCount}`);
681
+ }
682
+ } else {
683
+ if (this._metaEmbedded && !this._embeddedMetaRead) {
684
+ // Expecting or in Embedded Meta lines
685
+ if (this._lineType === FtLineType.EmbeddedMeta) {
686
+ return FtLineType.EmbeddedMeta;
687
+ } else {
688
+ if (startChar === this.lineCommentChar) {
689
+ return FtLineType.Comment;
690
+ } else {
691
+ return FtLineType.Blank;
692
+ }
693
+ }
694
+ } else {
695
+ // If Declaration done or not present and Embedded Meta done or not present,
696
+ // then only reason still in header is to read heading lines.
697
+ if (!(this.headingLineCount > 0 && !this._headingLinesRead)) {
698
+ throw new Error('Unexpected header state');
699
+ }
700
+
701
+ if (this._lineType === FtLineType.Heading) {
702
+ return FtLineType.Heading;
703
+ } else {
704
+ if (startChar === this.lineCommentChar) {
705
+ return FtLineType.Comment;
706
+ } else {
707
+ return FtLineType.Blank; // assume this - may also be first heading line
708
+ }
709
+ }
710
+ }
711
+ }
712
+ }
713
+ }
714
+
715
+ private finish(): boolean {
716
+ let result: boolean;
717
+
718
+ if (this._finished) {
719
+ result = false;
720
+ } else {
721
+ if (this._lineParser.inLine) {
722
+ this.finishLastLine();
723
+
724
+ if (this.lastLineEndedType === FtLastLineEndedType.Always) {
725
+ throw new FtSerializationException(FtSerializationError.LastLineEndedError, 'Always ended but in line');
726
+ } else {
727
+ this._lineParser.exitLine();
728
+ result = true;
729
+ }
730
+ } else {
731
+ if (this.lastLineEndedType !== FtLastLineEndedType.Never) {
732
+ result = false;
733
+ } else {
734
+ if (!this.ignoreBlankLines) {
735
+ throw new FtSerializationException(FtSerializationError.LastLineEndedError, 'Never ended but out of line');
736
+ } else {
737
+ // Since last line cannot be ended, there is another ignored blank line
738
+
739
+ // Throw exception if blank line not allowed
740
+ switch (this._lineType) {
741
+ case FtLineType.Signature:
742
+ throw new FtSerializationException(FtSerializationError.IncompleteDeclaration, 'Declaration missing second line');
743
+ case FtLineType.Heading:
744
+ if (!this._headingLinesRead) {
745
+ throw new FtSerializationException(FtSerializationError.InsufficientHeadingLines, '');
746
+ }
747
+ break;
748
+ }
749
+
750
+ // Set up blank line
751
+ this._lineParser.addBlankLine();
752
+ this._lineType = FtLineType.Blank;
753
+ result = true;
754
+ }
755
+ }
756
+ }
757
+
758
+ this._finished = true;
759
+ }
760
+
761
+ if (!result) {
762
+ this._newTableStarted = false;
763
+ this.checkCompleteness();
764
+ }
765
+
766
+ return result;
767
+ }
768
+
769
+ private finishLastLine(): void {
770
+ switch (this._lineType) {
771
+ case FtLineType.Signature:
772
+ this._declarationParser.finishSignatureLine();
773
+ break;
774
+
775
+ case FtLineType.Declaration2:
776
+ this.finishDeclaration();
777
+ break;
778
+
779
+ case FtLineType.Comment:
780
+ if (!this._headerRead) {
781
+ if (this._metaEmbedded && !this._embeddedMetaRead) {
782
+ throw new FtSerializationException(FtSerializationError.EmbeddedMetaNotFound, 'End of file encountered');
783
+ }
784
+ }
785
+ break;
786
+
787
+ case FtLineType.EmbeddedMeta:
788
+ if (this._embeddedMetaParser.ready) {
789
+ this.finishEmbeddedMeta();
790
+ } else {
791
+ throw new FtSerializationException(FtSerializationError.IncompleteEmbeddedMeta, 'End of file encountered');
792
+ }
793
+ break;
794
+
795
+ case FtLineType.Blank:
796
+ break; // nothing to do
797
+
798
+ case FtLineType.Heading:
799
+ this.finishHeadingLine();
800
+ break;
801
+
802
+ case FtLineType.Record:
803
+ this.finishRecord();
804
+ break;
805
+
806
+ default:
807
+ throw new FtUnreachableCaseError('SRFLL93357', this._lineType);
808
+ }
809
+ }
810
+
811
+ private readDeclaration(): void {
812
+ if (!this._declared) {
813
+ throw new Error('ReadDeclaration called but not declared');
814
+ }
815
+
816
+ while (!this._declarationRead) {
817
+ if (!this.internalReadLine()) {
818
+ break;
819
+ }
820
+ }
821
+ }
822
+
823
+ private readEmbeddedMeta(): void {
824
+ if (this._metaReferenceType !== FtMetaReferenceType.Embedded) {
825
+ throw new Error('ReadEmbeddedMeta called but meta not embedded');
826
+ }
827
+
828
+ while (!this._embeddedMetaRead) {
829
+ if (!this.internalReadLine()) {
830
+ break;
831
+ }
832
+ }
833
+ }
834
+
835
+ private readHeadingLines(): void {
836
+ if (!(this.headingLineCount > 0)) {
837
+ throw new Error('ReadHeadingLines called but no headings');
838
+ }
839
+
840
+ while (!this._headingLinesRead) {
841
+ if (!this.internalReadLine()) {
842
+ break;
843
+ }
844
+ }
845
+ }
846
+
847
+ private finishDeclaration(): void {
848
+ this._declarationParser.finish();
849
+
850
+ const metaRefResult = this._declaredParameters.getMetaReference();
851
+ this._metaReferenceType = metaRefResult.type;
852
+ this._metaReference = metaRefResult.reference;
853
+
854
+ switch (this._metaReferenceType) {
855
+ case FtMetaReferenceType.Embedded:
856
+ this._metaEmbedded = true;
857
+ break;
858
+
859
+ case FtMetaReferenceType.File: {
860
+ const fileMetaAsText = this.getFileMetaAsText(this._metaReference);
861
+ if (typeof fileMetaAsText === 'string') {
862
+ this.loadMetaFromText(fileMetaAsText, FtMetaSerializationFormat.XML);
863
+ } else {
864
+ this.loadMetaFromText(fileMetaAsText.content, fileMetaAsText.format);
865
+ }
866
+ break;
867
+ }
868
+ case FtMetaReferenceType.Url: {
869
+ const fileMetaAsText = this.getUrlMetaAsText(this._metaReference);
870
+ if (typeof fileMetaAsText === 'string') {
871
+ this.loadMetaFromText(fileMetaAsText, FtMetaSerializationFormat.XML);
872
+ } else {
873
+ this.loadMetaFromText(fileMetaAsText.content, fileMetaAsText.format);
874
+ }
875
+ break;
876
+ }
877
+ }
878
+
879
+ this._declarationRead = true;
880
+
881
+ if (!this._metaEmbedded && this.headingLineCount === 0) {
882
+ this._headerRead = true;
883
+ }
884
+ }
885
+
886
+ private finishEmbeddedMeta(): void {
887
+ const metaAsString = this._embeddedMetaParser.takeMetaAsString();
888
+ this.loadMetaFromText(metaAsString, FtMetaSerializationFormat.XML); // Currently only XML supported for embedded meta
889
+ this._embeddedMetaRead = true;
890
+
891
+ if (this.headingLineCount === 0) {
892
+ this._headerRead = true;
893
+ }
894
+ }
895
+
896
+ private finishHeadingLine(): void {
897
+ this._headingLineParser.finish();
898
+ this.fireHeadingLineFinished(this._headingLineReadCount - 1);
899
+
900
+ if (this._headingLineReadCount >= this.headingLineCount) {
901
+ this._headingLinesRead = true;
902
+ this._headerRead = true;
903
+ }
904
+ }
905
+
906
+ private finishRecord(): void {
907
+ this._recordParser.finish();
908
+ this.fireRecordFinished(this._recordCount - 1);
909
+
910
+ if (!this.sequenceInvokationList.matches(this.previousRecordSequenceInvokationList)) {
911
+ this._tableCount++;
912
+ this._newTableStarted = true;
913
+ }
914
+ }
915
+
916
+ private checkCompleteness(): void {
917
+ if (!this._headerRead) {
918
+ if (this._declared && !this._declarationRead) {
919
+ throw new FtSerializationException(FtSerializationError.IncompleteDeclaration, '');
920
+ } else {
921
+ if (this._metaEmbedded && !this._embeddedMetaRead) {
922
+ throw new FtSerializationException(FtSerializationError.IncompleteEmbeddedMeta, '');
923
+ } else {
924
+ if (this.headingLineCount > 0 && !this._headingLinesRead) {
925
+ throw new FtSerializationException(FtSerializationError.InsufficientHeadingLines, this._headingLineReadCount.toString());
926
+ }
927
+ }
928
+ }
929
+ }
930
+ }
931
+
932
+ private loadMetaFromText(metaAsString: string, format: FtMetaSerializationFormat): void {
933
+ const meta = FtMetaSerialization.deserialize(metaAsString, undefined, format);
934
+ this.loadMeta(meta);
935
+ }
936
+ }
937
+
938
+ /** @public */
939
+ export namespace FtSerializationReader {
940
+ export type OnRecordSeeked = (this: void) => void;
941
+ export type OnRequireFileMetaAsText = (this: void, filePath: string) => FtSerializationReader.FileMetaAsTextResult | string;
942
+ export type OnRequireUrlMetaAsText = (this: void, url: string) => FtSerializationReader.UrlMetaAsTextResult | string;
943
+
944
+ export interface FileMetaAsTextResult {
945
+ content: string;
946
+ format: FtMetaSerializationFormat;
947
+ }
948
+
949
+ export interface UrlMetaAsTextResult {
950
+ content: string;
951
+ format: FtMetaSerializationFormat;
952
+ }
953
+ }