@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,220 @@
1
+ import { FtField } from '../fields/instances/ft-field.js';
2
+ import { FtPadCharType } from '../types/enums/ft-pad-char-type.js';
3
+ import { FtAssertError, FtUnreachableCaseError } from '../types/errors/ft-internal-error.js';
4
+ import { CharReader } from './char-reader.js';
5
+ import { SerializationCore } from './serialization-core.js';
6
+
7
+ const State = {
8
+ WaitingLeftEndOfValue: 'WaitingLeftEndOfValue',
9
+ LeftPadding: 'LeftPadding',
10
+ NoMorePadding: 'NoMorePadding',
11
+ WaitingRightEndOfValue: 'WaitingRightEndOfValue',
12
+ WaitingRightPadding: 'WaitingRightPadding',
13
+ RightPadding: 'RightPadding',
14
+ RestIsPadding: 'RestIsPadding',
15
+ } as const;
16
+
17
+ type State = (typeof State)[keyof typeof State];
18
+
19
+ /**
20
+ * Parser for fixed-width fields.
21
+ * Handles padding (left/right), end-of-value characters, and width validation.
22
+ * @internal
23
+ */
24
+ export class FixedWidthFieldParser {
25
+ private readonly _headings: boolean;
26
+ private readonly _charReader: CharReader;
27
+ private readonly _core: SerializationCore;
28
+ private _textBuilder: string[] = [];
29
+
30
+ private _state: State = State.NoMorePadding;
31
+ private _field: FtField | undefined = undefined;
32
+ private _position = -1;
33
+ private _fieldLength = 0;
34
+ private _rawOffset = -1;
35
+ private _rawLength = 0;
36
+
37
+ // Cached field values
38
+ private _fieldWidth = 0;
39
+ private _fieldLeftPad = false;
40
+ private _fieldPadCharType: FtPadCharType = FtPadCharType.Auto;
41
+ private _fieldEndOfValueChar = '';
42
+ private _fieldPadChar = '';
43
+ private _rightPaddingCharCount = 0;
44
+
45
+ constructor(core: SerializationCore, charReader: CharReader, forHeadings: boolean) {
46
+ this._headings = forHeadings;
47
+ this._charReader = charReader;
48
+ this._core = core;
49
+ }
50
+
51
+ /**
52
+ * Enter a new field for parsing.
53
+ */
54
+ enterField(field: FtField): void {
55
+ this._field = field;
56
+
57
+ // Cache field values
58
+ this._fieldWidth = field.width;
59
+
60
+ if (this._headings) {
61
+ this._fieldLeftPad = field.definition_.headingLeftPad;
62
+ this._fieldPadCharType = field.headingPadCharType;
63
+ this._fieldEndOfValueChar = field.headingEndOfValueChar;
64
+ this._fieldPadChar = field.headingPadChar;
65
+ } else {
66
+ this._fieldLeftPad = field.definition_.valueLeftPad;
67
+ this._fieldPadCharType = field.valuePadCharType;
68
+ this._fieldEndOfValueChar = field.valueEndOfValueChar;
69
+ this._fieldPadChar = field.valuePadChar;
70
+ }
71
+
72
+ if (this._fieldLeftPad) {
73
+ if (this._fieldPadCharType === FtPadCharType.EndOfValue) {
74
+ this._state = State.WaitingLeftEndOfValue;
75
+ } else {
76
+ this._state = State.LeftPadding;
77
+ }
78
+ } else {
79
+ if (this._fieldPadCharType === FtPadCharType.EndOfValue) {
80
+ this._state = State.WaitingRightEndOfValue;
81
+ } else {
82
+ this._state = State.WaitingRightPadding;
83
+ }
84
+ }
85
+
86
+ this._textBuilder = [];
87
+ this._position = this._charReader.position;
88
+ this._fieldLength = 0;
89
+ this._rawOffset = 0;
90
+ this._rawLength = 0;
91
+ this._rightPaddingCharCount = 0;
92
+ }
93
+
94
+ /**
95
+ * Exit the current field.
96
+ */
97
+ exitField(): void {
98
+ this._textBuilder = [];
99
+ this._field = undefined;
100
+ }
101
+
102
+ /**
103
+ * Parse a single character.
104
+ * @param aChar The character to parse.
105
+ * @returns True if the previous field is finished (width reached), false otherwise.
106
+ */
107
+ parseChar(aChar: string): boolean {
108
+ if (this._fieldLength >= this._fieldWidth) {
109
+ return true;
110
+ } else {
111
+ this._fieldLength++;
112
+
113
+ switch (this._state) {
114
+ case State.WaitingLeftEndOfValue:
115
+ if (aChar !== this._fieldEndOfValueChar) {
116
+ this._textBuilder.push(aChar); // May not encounter any EndOfValue char
117
+ } else {
118
+ this._textBuilder = [];
119
+ this._rawOffset = this._fieldLength;
120
+ this._state = State.NoMorePadding;
121
+ }
122
+ break;
123
+
124
+ case State.LeftPadding:
125
+ if (aChar !== this._fieldPadChar) {
126
+ this._textBuilder.push(aChar);
127
+ this._rawOffset = this._fieldLength - 1;
128
+ this._state = State.NoMorePadding;
129
+ }
130
+ break;
131
+
132
+ case State.NoMorePadding:
133
+ this._textBuilder.push(aChar);
134
+ break;
135
+
136
+ case State.WaitingRightEndOfValue:
137
+ if (aChar !== this._fieldEndOfValueChar) {
138
+ this._textBuilder.push(aChar); // May not encounter any EndOfValue char
139
+ } else {
140
+ this._state = State.RestIsPadding;
141
+ }
142
+ break;
143
+
144
+ case State.WaitingRightPadding:
145
+ if (aChar !== this._fieldPadChar) {
146
+ this._textBuilder.push(aChar);
147
+ } else {
148
+ this._rightPaddingCharCount = 1;
149
+ this._state = State.RightPadding;
150
+ }
151
+ break;
152
+
153
+ case State.RightPadding:
154
+ if (aChar === this._fieldPadChar) {
155
+ this._rightPaddingCharCount++;
156
+ } else {
157
+ // Prematurely identified right padding previous start. Still not started
158
+ this._textBuilder.push(this._fieldPadChar.repeat(this._rightPaddingCharCount));
159
+ this._textBuilder.push(aChar);
160
+ this._rightPaddingCharCount = 0;
161
+ this._state = State.WaitingRightPadding;
162
+ }
163
+ break;
164
+
165
+ case State.RestIsPadding:
166
+ // Ignore remaining characters
167
+ break;
168
+
169
+ default:
170
+ throw new FtUnreachableCaseError('FWFPPC93358', this._state);
171
+ }
172
+
173
+ return false;
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Load the parsed heading into the field.
179
+ */
180
+ loadFieldHeading(headingLineIndex: number): void {
181
+ if (!this._field) {
182
+ throw new Error('No field to load heading into');
183
+ }
184
+ const headingText = this.finishText();
185
+ this._field.loadPosition(this._position, this._fieldLength, this._rawOffset, this._rawLength);
186
+ this._field.loadHeading(headingLineIndex, headingText);
187
+ }
188
+
189
+ /**
190
+ * Load the parsed value into the field.
191
+ */
192
+ loadFieldValue(): void {
193
+ if (!this._field) {
194
+ throw new Error('No field to load value into');
195
+ }
196
+ const valueText = this.finishText();
197
+ this._field.loadPosition(this._position, this._fieldLength, this._rawOffset, this._rawLength);
198
+ this._field.loadFixedWidthValue(valueText);
199
+ }
200
+
201
+ private finishText(): string {
202
+ this._rawLength = this._textBuilder.length;
203
+
204
+ if (this._fieldLength < this._fieldWidth) {
205
+ const errorType = this._headings ? 'HeadingWidthNotReached' : 'ValueWidthNotReached';
206
+ throw new FtAssertError(
207
+ 'FWFPFTR22115',
208
+ `${errorType}: Field width not reached in field ${this._field?.name ?? 'unknown'}: expected ${this._fieldWidth}, got ${this._fieldLength}`,
209
+ );
210
+ } else if (this._fieldLength > this._fieldWidth) {
211
+ const errorType = this._headings ? 'HeadingWidthExceeded' : 'ValueWidthExceeded';
212
+ throw new FtAssertError(
213
+ 'FWFPFTR22116',
214
+ `${errorType}: Field width exceeded in field ${this._field?.name ?? 'unknown'}: expected ${this._fieldWidth}, got ${this._fieldLength}`,
215
+ );
216
+ } else {
217
+ return this._textBuilder.join('');
218
+ }
219
+ }
220
+ }
@@ -0,0 +1,114 @@
1
+ import { FtMetaDefaults } from '../../meta/ft-meta-defaults.js';
2
+ import { FtBooleanStyles } from '../../types/enums/ft-boolean-styles.js';
3
+ import { FtFieldFormatter } from './ft-field-formatter.js';
4
+
5
+ /**
6
+ * Formatter for boolean fields.
7
+ * Supports various parsing styles including case sensitivity, partial matching, and more.
8
+ * @public
9
+ */
10
+ export class FtBooleanFieldFormatter extends FtFieldFormatter {
11
+ private _falseText: string = FtMetaDefaults.BooleanField.FalseText;
12
+ private _trueText: string = FtMetaDefaults.BooleanField.TrueText;
13
+ private _styles: FtBooleanStyles = FtMetaDefaults.BooleanField.Styles;
14
+
15
+ get falseText(): string {
16
+ return this._falseText;
17
+ }
18
+
19
+ set falseText(value: string) {
20
+ this._falseText = value;
21
+ }
22
+
23
+ get trueText(): string {
24
+ return this._trueText;
25
+ }
26
+
27
+ set trueText(value: string) {
28
+ this._trueText = value;
29
+ }
30
+
31
+ get styles(): FtBooleanStyles {
32
+ return this._styles;
33
+ }
34
+
35
+ set styles(value: FtBooleanStyles) {
36
+ this._styles = value;
37
+ }
38
+
39
+ toText(value: boolean): string {
40
+ return value ? this._trueText : this._falseText;
41
+ }
42
+
43
+ parse(text: string): boolean {
44
+ if (this.compareText(text, this._trueText)) {
45
+ return true;
46
+ } else {
47
+ if ((this._styles & FtBooleanStyles.FalseIfNotMatchTrue) !== 0) {
48
+ return false;
49
+ } else {
50
+ if (this.compareText(text, this._falseText)) {
51
+ return false;
52
+ } else {
53
+ throw new Error(`Boolean parse failed: text '${text}' does not match '${this._trueText}' or '${this._falseText}'`);
54
+ }
55
+ }
56
+ }
57
+ }
58
+
59
+ private compareText(text: string, stateText: string): boolean {
60
+ if (stateText === '') {
61
+ if (text === '') {
62
+ return true;
63
+ } else {
64
+ return (this._styles & FtBooleanStyles.IgnoreTrailingChars) !== 0;
65
+ }
66
+ } else {
67
+ if (text === '') {
68
+ return false;
69
+ } else {
70
+ const ignoreCase = (this._styles & FtBooleanStyles.IgnoreCase) !== 0;
71
+
72
+ if ((this._styles & FtBooleanStyles.MatchFirstCharOnly) !== 0) {
73
+ // Match only the first character
74
+ const textChar = ignoreCase ? this.toUpperCaseChar(text[0]) : text[0];
75
+ const stateChar = ignoreCase ? this.toUpperCaseChar(stateText[0]) : stateText[0];
76
+ return textChar === stateChar;
77
+ } else {
78
+ // Full or partial match
79
+ if ((this._styles & FtBooleanStyles.IgnoreTrailingChars) === 0) {
80
+ // Exact match required
81
+ if (ignoreCase) {
82
+ return text.toUpperCase() === stateText.toUpperCase();
83
+ } else {
84
+ return text === stateText;
85
+ }
86
+ } else {
87
+ // Match prefix, ignore trailing characters
88
+ const textLength = text.length;
89
+ const stateTextLength = stateText.length;
90
+ if (textLength < stateTextLength) {
91
+ return false;
92
+ } else {
93
+ const adjustedText = textLength === stateTextLength ? text : text.substring(0, stateTextLength);
94
+
95
+ if (ignoreCase) {
96
+ return adjustedText.toUpperCase() === stateText.toUpperCase();
97
+ } else {
98
+ return adjustedText === stateText;
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+ private toUpperCaseChar(char: string): string {
108
+ // Use culture-aware character case conversion if culture is available
109
+ if (this.culture) {
110
+ return this.culture.toUpperChar(char);
111
+ }
112
+ return char.toUpperCase();
113
+ }
114
+ }
@@ -0,0 +1,61 @@
1
+ import { DotNetDateTimeFormatter, DotNetDateTimeStyles } from '@pbkware/dot-net-date-number-formatting';
2
+ import { FtMetaDefaults } from '../../meta/ft-meta-defaults.js';
3
+ import { FtFieldFormatter } from './ft-field-formatter.js';
4
+
5
+ /**
6
+ * Formatter for DateTime fields using .NET-compatible formatting.
7
+ * Implementation delegates to DotNetDateTimeFormatter from dot-net-date-number-formatting package.
8
+ * @public
9
+ */
10
+ export class FtDateTimeFieldFormatter extends FtFieldFormatter {
11
+ private _format: string = FtMetaDefaults.DateTimeField.Format;
12
+ private _styles: DotNetDateTimeStyles = FtMetaDefaults.DateTimeField.Styles;
13
+ private _formatter: DotNetDateTimeFormatter = new DotNetDateTimeFormatter();
14
+
15
+ constructor() {
16
+ super();
17
+ // Initialize formatter with default format
18
+ const result = this._formatter.trySetFormat(this._format);
19
+ if (!result.isOk()) {
20
+ throw new Error(`Failed to set default datetime format: ${this._format}`);
21
+ }
22
+ }
23
+
24
+ get format(): string {
25
+ return this._format;
26
+ }
27
+
28
+ set format(value: string) {
29
+ this._format = value;
30
+ const result = this._formatter.trySetFormat(value);
31
+ if (!result.isOk()) {
32
+ throw new Error(`Invalid datetime format: ${value}`);
33
+ }
34
+ }
35
+
36
+ get styles(): DotNetDateTimeStyles {
37
+ return this._styles;
38
+ }
39
+
40
+ set styles(value: DotNetDateTimeStyles) {
41
+ this._styles = value;
42
+ }
43
+
44
+ toText(value: Date): string {
45
+ if (this.culture) {
46
+ this._formatter.localeSettings = this.culture;
47
+ }
48
+ return this._formatter.toString(value);
49
+ }
50
+
51
+ parse(text: string): Date {
52
+ if (this.culture) {
53
+ this._formatter.localeSettings = this.culture;
54
+ }
55
+ const result = this._formatter.tryFromString(text);
56
+ if (!result.isOk()) {
57
+ throw new Error(`Failed to parse datetime: ${text}`);
58
+ }
59
+ return result.value;
60
+ }
61
+ }
@@ -0,0 +1,52 @@
1
+ import { DotNetDecimalFormatter, DotNetNumberStyles } from '@pbkware/dot-net-date-number-formatting';
2
+ import { FtMetaDefaults } from '../../meta/ft-meta-defaults.js';
3
+ import { FtFieldFormatter } from './ft-field-formatter.js';
4
+
5
+ /**
6
+ * Formatter for decimal fields using .NET-compatible formatting.
7
+ * Implementation delegates to DotNetDecimalFormatter from dot-net-date-number-formatting package.
8
+ * @public
9
+ */
10
+ export class FtDecimalFieldFormatter extends FtFieldFormatter {
11
+ private _styles: DotNetNumberStyles = FtMetaDefaults.DecimalField.Styles;
12
+ private _format: string = FtMetaDefaults.DecimalField.Format;
13
+ private _formatter: DotNetDecimalFormatter = new DotNetDecimalFormatter();
14
+
15
+ get styles(): DotNetNumberStyles {
16
+ return this._styles;
17
+ }
18
+
19
+ set styles(value: DotNetNumberStyles) {
20
+ this._styles = value;
21
+ }
22
+
23
+ get format(): string {
24
+ return this._format;
25
+ }
26
+
27
+ set format(value: string) {
28
+ this._format = value;
29
+ const result = this._formatter.trySetFormat(value);
30
+ if (!result.isOk()) {
31
+ throw new Error(`Invalid decimal format: ${value}`);
32
+ }
33
+ }
34
+
35
+ toText(value: number): string {
36
+ if (this.culture) {
37
+ this._formatter.localeSettings = this.culture;
38
+ }
39
+ return this._formatter.toString(value);
40
+ }
41
+
42
+ parse(text: string): number {
43
+ if (this.culture) {
44
+ this._formatter.localeSettings = this.culture;
45
+ }
46
+ const result = this._formatter.tryFromString(text);
47
+ if (!result.isOk()) {
48
+ throw new Error(`Failed to parse decimal: ${text}`);
49
+ }
50
+ return result.value;
51
+ }
52
+ }
@@ -0,0 +1,60 @@
1
+ import { FtDeclaredParameterRec, FtDeclaredParameters } from '../ft-declared-parameters.js';
2
+
3
+ /**
4
+ * Formatter for declared parameters in .ftx file headers.
5
+ * @public
6
+ */
7
+ // eslint-disable-next-line @typescript-eslint/no-extraneous-class
8
+ export class FtDeclaredParametersFormatter {
9
+ private static readonly NAME_VALUE_SEPARATOR = '=';
10
+ private static readonly QUOTE_CHAR = '"';
11
+ private static readonly DOUBLE_QUOTE_STRING = '""';
12
+ private static readonly SPACE_CHARACTER = ' ';
13
+
14
+ /**
15
+ * Format the signature line (first declaration line with version).
16
+ */
17
+ static toSignatureLineText(parameters: FtDeclaredParameters): string {
18
+ const versionRecResult = parameters.tryGetVersionRec();
19
+ if (!versionRecResult.success) {
20
+ throw new Error('Version not specified in declared parameters');
21
+ }
22
+
23
+ const recArray: FtDeclaredParameterRec[] = [versionRecResult.rec];
24
+ return FtDeclaredParametersFormatter.toText(recArray);
25
+ }
26
+
27
+ /**
28
+ * Format the second declaration line (all parameters except version).
29
+ */
30
+ static toLine2Text(parameters: FtDeclaredParameters): string {
31
+ const recs = parameters.getAllRecsExceptVersion();
32
+ return FtDeclaredParametersFormatter.toText(recs);
33
+ }
34
+
35
+ /**
36
+ * Convert parameter records to text format.
37
+ */
38
+ private static toText(recs: FtDeclaredParameterRec[]): string {
39
+ const parts: string[] = [];
40
+ for (let i = 0; i < recs.length; i++) {
41
+ const rec = recs[i];
42
+ if (rec.name.includes(FtDeclaredParametersFormatter.NAME_VALUE_SEPARATOR)) {
43
+ throw new Error(`Parameter name contains separator character: ${rec.name}`);
44
+ }
45
+
46
+ const value = rec.value.replace(FtDeclaredParametersFormatter.QUOTE_CHAR, FtDeclaredParametersFormatter.DOUBLE_QUOTE_STRING);
47
+
48
+ if (i > 0) {
49
+ parts.push(FtDeclaredParametersFormatter.SPACE_CHARACTER);
50
+ }
51
+ parts.push(rec.name);
52
+ parts.push(FtDeclaredParametersFormatter.NAME_VALUE_SEPARATOR);
53
+ parts.push(FtDeclaredParametersFormatter.QUOTE_CHAR);
54
+ parts.push(value);
55
+ parts.push(FtDeclaredParametersFormatter.QUOTE_CHAR);
56
+ }
57
+
58
+ return parts.join('');
59
+ }
60
+ }
@@ -0,0 +1,18 @@
1
+ import { DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';
2
+
3
+ /**
4
+ * Abstract base class for all field formatters.
5
+ * Concrete formatters handle type-specific formatting and parsing.
6
+ * @public
7
+ */
8
+ export abstract class FtFieldFormatter {
9
+ private _culture: DotNetLocaleSettings | undefined;
10
+
11
+ get culture(): DotNetLocaleSettings | undefined {
12
+ return this._culture;
13
+ }
14
+
15
+ set culture(value: DotNetLocaleSettings | undefined) {
16
+ this._culture = value;
17
+ }
18
+ }
@@ -0,0 +1,52 @@
1
+ import { DotNetFloatFormatter, DotNetNumberStyles } from '@pbkware/dot-net-date-number-formatting';
2
+ import { FtMetaDefaults } from '../../meta/ft-meta-defaults.js';
3
+ import { FtFieldFormatter } from './ft-field-formatter.js';
4
+
5
+ /**
6
+ * Formatter for float (number) fields using .NET-compatible formatting.
7
+ * Implementation delegates to DotNetFloatFormatter from dot-net-date-number-formatting package.
8
+ * @public
9
+ */
10
+ export class FtFloatFieldFormatter extends FtFieldFormatter {
11
+ private _styles: DotNetNumberStyles = FtMetaDefaults.FloatField.Styles;
12
+ private _format: string = FtMetaDefaults.FloatField.Format;
13
+ private _formatter: DotNetFloatFormatter = new DotNetFloatFormatter();
14
+
15
+ get styles(): DotNetNumberStyles {
16
+ return this._styles;
17
+ }
18
+
19
+ set styles(value: DotNetNumberStyles) {
20
+ this._styles = value;
21
+ }
22
+
23
+ get format(): string {
24
+ return this._format;
25
+ }
26
+
27
+ set format(value: string) {
28
+ this._format = value;
29
+ const result = this._formatter.trySetFormat(value);
30
+ if (!result.isOk()) {
31
+ throw new Error(`Invalid float format: ${value}`);
32
+ }
33
+ }
34
+
35
+ toText(value: number): string {
36
+ if (this.culture) {
37
+ this._formatter.localeSettings = this.culture;
38
+ }
39
+ return this._formatter.toString(value);
40
+ }
41
+
42
+ parse(text: string): number {
43
+ if (this.culture) {
44
+ this._formatter.localeSettings = this.culture;
45
+ }
46
+ const result = this._formatter.tryFromString(text);
47
+ if (!result.isOk()) {
48
+ throw new Error(`Failed to parse float: ${text}`);
49
+ }
50
+ return result.value;
51
+ }
52
+ }
@@ -0,0 +1,53 @@
1
+ import { DotNetIntegerFormatter, DotNetNumberStyles } from '@pbkware/dot-net-date-number-formatting';
2
+ import { FtMetaDefaults } from '../../meta/ft-meta-defaults.js';
3
+ import { FtFieldFormatter } from './ft-field-formatter.js';
4
+
5
+ /**
6
+ * Formatter for integer (long) fields using .NET-compatible formatting.
7
+ * Implementation delegates to DotNetIntegerFormatter from dot-net-date-number-formatting package.
8
+ * @public
9
+ */
10
+ export class FtIntegerFieldFormatter extends FtFieldFormatter {
11
+ private _styles: DotNetNumberStyles = FtMetaDefaults.IntegerField.Styles;
12
+ private _format: string = FtMetaDefaults.IntegerField.Format;
13
+ private _formatter: DotNetIntegerFormatter = new DotNetIntegerFormatter();
14
+
15
+ get styles(): DotNetNumberStyles {
16
+ return this._styles;
17
+ }
18
+
19
+ set styles(value: DotNetNumberStyles) {
20
+ this._styles = value;
21
+ }
22
+
23
+ get format(): string {
24
+ return this._format;
25
+ }
26
+
27
+ set format(value: string) {
28
+ this._format = value;
29
+ const result = this._formatter.trySetFormat(value);
30
+ if (!result.isOk()) {
31
+ throw new Error(`Invalid integer format: ${value}`);
32
+ }
33
+ }
34
+
35
+ toText(value: bigint | number): string {
36
+ const bigintValue = typeof value === 'bigint' ? value : BigInt(value);
37
+ if (this.culture) {
38
+ this._formatter.localeSettings = this.culture;
39
+ }
40
+ return this._formatter.toString(bigintValue);
41
+ }
42
+
43
+ parse(text: string): bigint {
44
+ if (this.culture) {
45
+ this._formatter.localeSettings = this.culture;
46
+ }
47
+ const result = this._formatter.tryFromString(text);
48
+ if (!result.isOk()) {
49
+ throw new Error(`Failed to parse integer: ${text}`);
50
+ }
51
+ return result.value;
52
+ }
53
+ }
@@ -0,0 +1,15 @@
1
+ import { FtFieldFormatter } from './ft-field-formatter.js';
2
+
3
+ /**
4
+ * Formatter for string fields.
5
+ * @public
6
+ */
7
+ export class FtStringFieldFormatter extends FtFieldFormatter {
8
+ toText(value: string): string {
9
+ return value;
10
+ }
11
+
12
+ parse(text: string): string {
13
+ return text;
14
+ }
15
+ }
@@ -0,0 +1,7 @@
1
+ export { FtBooleanFieldFormatter } from './ft-boolean-field-formatter.js';
2
+ export { FtDateTimeFieldFormatter } from './ft-date-time-field-formatter.js';
3
+ export { FtDecimalFieldFormatter } from './ft-decimal-field-formatter.js';
4
+ export { FtFieldFormatter } from './ft-field-formatter.js';
5
+ export { FtFloatFieldFormatter } from './ft-float-field-formatter.js';
6
+ export { FtIntegerFieldFormatter } from './ft-integer-field-formatter.js';
7
+ export { FtStringFieldFormatter } from './ft-string-field-formatter.js';