@svta/cml-structured-field-values 0.19.0 → 0.20.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 (276) hide show
  1. package/README.md +24 -0
  2. package/dist/index.d.ts +395 -20
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +710 -13
  5. package/dist/index.js.map +1 -1
  6. package/package.json +5 -24
  7. package/NOTICE +0 -36
  8. package/dist/SfBareItem.d.ts +0 -9
  9. package/dist/SfBareItem.d.ts.map +0 -1
  10. package/dist/SfBareItem.js +0 -2
  11. package/dist/SfBareItem.js.map +0 -1
  12. package/dist/SfDecodeOptions.d.ts +0 -13
  13. package/dist/SfDecodeOptions.d.ts.map +0 -1
  14. package/dist/SfDecodeOptions.js +0 -2
  15. package/dist/SfDecodeOptions.js.map +0 -1
  16. package/dist/SfDictionary.d.ts +0 -9
  17. package/dist/SfDictionary.d.ts.map +0 -1
  18. package/dist/SfDictionary.js +0 -2
  19. package/dist/SfDictionary.js.map +0 -1
  20. package/dist/SfEncodeOptions.d.ts +0 -13
  21. package/dist/SfEncodeOptions.d.ts.map +0 -1
  22. package/dist/SfEncodeOptions.js +0 -2
  23. package/dist/SfEncodeOptions.js.map +0 -1
  24. package/dist/SfInnerList.d.ts +0 -14
  25. package/dist/SfInnerList.d.ts.map +0 -1
  26. package/dist/SfInnerList.js +0 -2
  27. package/dist/SfInnerList.js.map +0 -1
  28. package/dist/SfItem.d.ts +0 -14
  29. package/dist/SfItem.d.ts.map +0 -1
  30. package/dist/SfItem.js +0 -16
  31. package/dist/SfItem.js.map +0 -1
  32. package/dist/SfMember.d.ts +0 -11
  33. package/dist/SfMember.d.ts.map +0 -1
  34. package/dist/SfMember.js +0 -2
  35. package/dist/SfMember.js.map +0 -1
  36. package/dist/SfParameters.d.ts +0 -8
  37. package/dist/SfParameters.d.ts.map +0 -1
  38. package/dist/SfParameters.js +0 -2
  39. package/dist/SfParameters.js.map +0 -1
  40. package/dist/SfToken.d.ts +0 -11
  41. package/dist/SfToken.d.ts.map +0 -1
  42. package/dist/SfToken.js +0 -12
  43. package/dist/SfToken.js.map +0 -1
  44. package/dist/decodeSfDict.d.ts +0 -13
  45. package/dist/decodeSfDict.d.ts.map +0 -1
  46. package/dist/decodeSfDict.js +0 -25
  47. package/dist/decodeSfDict.js.map +0 -1
  48. package/dist/decodeSfItem.d.ts +0 -13
  49. package/dist/decodeSfItem.d.ts.map +0 -1
  50. package/dist/decodeSfItem.js +0 -46
  51. package/dist/decodeSfItem.js.map +0 -1
  52. package/dist/decodeSfList.d.ts +0 -13
  53. package/dist/decodeSfList.d.ts.map +0 -1
  54. package/dist/decodeSfList.js +0 -25
  55. package/dist/decodeSfList.js.map +0 -1
  56. package/dist/encodeSfDict.d.ts +0 -14
  57. package/dist/encodeSfDict.d.ts.map +0 -1
  58. package/dist/encodeSfDict.js +0 -16
  59. package/dist/encodeSfDict.js.map +0 -1
  60. package/dist/encodeSfItem.d.ts +0 -26
  61. package/dist/encodeSfItem.d.ts.map +0 -1
  62. package/dist/encodeSfItem.js +0 -9
  63. package/dist/encodeSfItem.js.map +0 -1
  64. package/dist/encodeSfList.d.ts +0 -15
  65. package/dist/encodeSfList.d.ts.map +0 -1
  66. package/dist/encodeSfList.js +0 -16
  67. package/dist/encodeSfList.js.map +0 -1
  68. package/dist/parse/ParsedValue.d.ts +0 -6
  69. package/dist/parse/ParsedValue.d.ts.map +0 -1
  70. package/dist/parse/ParsedValue.js +0 -4
  71. package/dist/parse/ParsedValue.js.map +0 -1
  72. package/dist/parse/index.d.ts +0 -22
  73. package/dist/parse/index.d.ts.map +0 -1
  74. package/dist/parse/index.js +0 -21
  75. package/dist/parse/index.js.map +0 -1
  76. package/dist/parse/parseBareItem.d.ts +0 -5
  77. package/dist/parse/parseBareItem.d.ts.map +0 -1
  78. package/dist/parse/parseBareItem.js +0 -59
  79. package/dist/parse/parseBareItem.js.map +0 -1
  80. package/dist/parse/parseBoolean.d.ts +0 -3
  81. package/dist/parse/parseBoolean.d.ts.map +0 -1
  82. package/dist/parse/parseBoolean.js +0 -34
  83. package/dist/parse/parseBoolean.js.map +0 -1
  84. package/dist/parse/parseByteSequence.d.ts +0 -3
  85. package/dist/parse/parseByteSequence.d.ts.map +0 -1
  86. package/dist/parse/parseByteSequence.js +0 -59
  87. package/dist/parse/parseByteSequence.js.map +0 -1
  88. package/dist/parse/parseDate.d.ts +0 -3
  89. package/dist/parse/parseDate.d.ts.map +0 -1
  90. package/dist/parse/parseDate.js +0 -32
  91. package/dist/parse/parseDate.js.map +0 -1
  92. package/dist/parse/parseDict.d.ts +0 -5
  93. package/dist/parse/parseDict.d.ts.map +0 -1
  94. package/dist/parse/parseDict.js +0 -90
  95. package/dist/parse/parseDict.js.map +0 -1
  96. package/dist/parse/parseError.d.ts +0 -2
  97. package/dist/parse/parseError.d.ts.map +0 -1
  98. package/dist/parse/parseError.js +0 -5
  99. package/dist/parse/parseError.js.map +0 -1
  100. package/dist/parse/parseInnerList.d.ts +0 -5
  101. package/dist/parse/parseInnerList.d.ts.map +0 -1
  102. package/dist/parse/parseInnerList.js +0 -62
  103. package/dist/parse/parseInnerList.js.map +0 -1
  104. package/dist/parse/parseIntegerOrDecimal.d.ts +0 -3
  105. package/dist/parse/parseIntegerOrDecimal.d.ts.map +0 -1
  106. package/dist/parse/parseIntegerOrDecimal.js +0 -123
  107. package/dist/parse/parseIntegerOrDecimal.js.map +0 -1
  108. package/dist/parse/parseItem.d.ts +0 -5
  109. package/dist/parse/parseItem.d.ts.map +0 -1
  110. package/dist/parse/parseItem.js +0 -25
  111. package/dist/parse/parseItem.js.map +0 -1
  112. package/dist/parse/parseItemOrInnerList.d.ts +0 -6
  113. package/dist/parse/parseItemOrInnerList.d.ts.map +0 -1
  114. package/dist/parse/parseItemOrInnerList.js +0 -22
  115. package/dist/parse/parseItemOrInnerList.js.map +0 -1
  116. package/dist/parse/parseKey.d.ts +0 -3
  117. package/dist/parse/parseKey.d.ts.map +0 -1
  118. package/dist/parse/parseKey.js +0 -40
  119. package/dist/parse/parseKey.js.map +0 -1
  120. package/dist/parse/parseList.d.ts +0 -5
  121. package/dist/parse/parseList.d.ts.map +0 -1
  122. package/dist/parse/parseList.js +0 -51
  123. package/dist/parse/parseList.js.map +0 -1
  124. package/dist/parse/parseParameters.d.ts +0 -5
  125. package/dist/parse/parseParameters.d.ts.map +0 -1
  126. package/dist/parse/parseParameters.js +0 -68
  127. package/dist/parse/parseParameters.js.map +0 -1
  128. package/dist/parse/parseString.d.ts +0 -3
  129. package/dist/parse/parseString.d.ts.map +0 -1
  130. package/dist/parse/parseString.js +0 -73
  131. package/dist/parse/parseString.js.map +0 -1
  132. package/dist/parse/parseToken.d.ts +0 -5
  133. package/dist/parse/parseToken.d.ts.map +0 -1
  134. package/dist/parse/parseToken.js +0 -35
  135. package/dist/parse/parseToken.js.map +0 -1
  136. package/dist/serialize/index.d.ts +0 -21
  137. package/dist/serialize/index.d.ts.map +0 -1
  138. package/dist/serialize/index.js +0 -21
  139. package/dist/serialize/index.js.map +0 -1
  140. package/dist/serialize/serializeBareItem.d.ts +0 -2
  141. package/dist/serialize/serializeBareItem.d.ts.map +0 -1
  142. package/dist/serialize/serializeBareItem.js +0 -69
  143. package/dist/serialize/serializeBareItem.js.map +0 -1
  144. package/dist/serialize/serializeBoolean.d.ts +0 -2
  145. package/dist/serialize/serializeBoolean.d.ts.map +0 -1
  146. package/dist/serialize/serializeBoolean.js +0 -25
  147. package/dist/serialize/serializeBoolean.js.map +0 -1
  148. package/dist/serialize/serializeByteSequence.d.ts +0 -2
  149. package/dist/serialize/serializeByteSequence.d.ts.map +0 -1
  150. package/dist/serialize/serializeByteSequence.js +0 -34
  151. package/dist/serialize/serializeByteSequence.js.map +0 -1
  152. package/dist/serialize/serializeDate.d.ts +0 -2
  153. package/dist/serialize/serializeDate.d.ts.map +0 -1
  154. package/dist/serialize/serializeDate.js +0 -13
  155. package/dist/serialize/serializeDate.js.map +0 -1
  156. package/dist/serialize/serializeDecimal.d.ts +0 -2
  157. package/dist/serialize/serializeDecimal.d.ts.map +0 -1
  158. package/dist/serialize/serializeDecimal.js +0 -46
  159. package/dist/serialize/serializeDecimal.js.map +0 -1
  160. package/dist/serialize/serializeDict.d.ts +0 -3
  161. package/dist/serialize/serializeDict.d.ts.map +0 -1
  162. package/dist/serialize/serializeDict.js +0 -74
  163. package/dist/serialize/serializeDict.js.map +0 -1
  164. package/dist/serialize/serializeError.d.ts +0 -2
  165. package/dist/serialize/serializeError.d.ts.map +0 -1
  166. package/dist/serialize/serializeError.js +0 -5
  167. package/dist/serialize/serializeError.js.map +0 -1
  168. package/dist/serialize/serializeInnerList.d.ts +0 -3
  169. package/dist/serialize/serializeInnerList.d.ts.map +0 -1
  170. package/dist/serialize/serializeInnerList.js +0 -28
  171. package/dist/serialize/serializeInnerList.js.map +0 -1
  172. package/dist/serialize/serializeInteger.d.ts +0 -2
  173. package/dist/serialize/serializeInteger.d.ts.map +0 -1
  174. package/dist/serialize/serializeInteger.js +0 -28
  175. package/dist/serialize/serializeInteger.js.map +0 -1
  176. package/dist/serialize/serializeItem.d.ts +0 -4
  177. package/dist/serialize/serializeItem.d.ts.map +0 -1
  178. package/dist/serialize/serializeItem.js +0 -26
  179. package/dist/serialize/serializeItem.js.map +0 -1
  180. package/dist/serialize/serializeKey.d.ts +0 -2
  181. package/dist/serialize/serializeKey.d.ts.map +0 -1
  182. package/dist/serialize/serializeKey.js +0 -28
  183. package/dist/serialize/serializeKey.js.map +0 -1
  184. package/dist/serialize/serializeList.d.ts +0 -4
  185. package/dist/serialize/serializeList.d.ts.map +0 -1
  186. package/dist/serialize/serializeList.js +0 -48
  187. package/dist/serialize/serializeList.js.map +0 -1
  188. package/dist/serialize/serializeParams.d.ts +0 -2
  189. package/dist/serialize/serializeParams.d.ts.map +0 -1
  190. package/dist/serialize/serializeParams.js +0 -40
  191. package/dist/serialize/serializeParams.js.map +0 -1
  192. package/dist/serialize/serializeString.d.ts +0 -2
  193. package/dist/serialize/serializeString.d.ts.map +0 -1
  194. package/dist/serialize/serializeString.js +0 -34
  195. package/dist/serialize/serializeString.js.map +0 -1
  196. package/dist/serialize/serializeToken.d.ts +0 -4
  197. package/dist/serialize/serializeToken.d.ts.map +0 -1
  198. package/dist/serialize/serializeToken.js +0 -11
  199. package/dist/serialize/serializeToken.js.map +0 -1
  200. package/dist/tsconfig.tsbuildinfo +0 -1
  201. package/dist/utils/BARE_ITEM.d.ts +0 -2
  202. package/dist/utils/BARE_ITEM.d.ts.map +0 -1
  203. package/dist/utils/BARE_ITEM.js +0 -2
  204. package/dist/utils/BARE_ITEM.js.map +0 -1
  205. package/dist/utils/BOOLEAN.d.ts +0 -2
  206. package/dist/utils/BOOLEAN.d.ts.map +0 -1
  207. package/dist/utils/BOOLEAN.js +0 -2
  208. package/dist/utils/BOOLEAN.js.map +0 -1
  209. package/dist/utils/BYTES.d.ts +0 -2
  210. package/dist/utils/BYTES.d.ts.map +0 -1
  211. package/dist/utils/BYTES.js +0 -2
  212. package/dist/utils/BYTES.js.map +0 -1
  213. package/dist/utils/DATE.d.ts +0 -2
  214. package/dist/utils/DATE.d.ts.map +0 -1
  215. package/dist/utils/DATE.js +0 -2
  216. package/dist/utils/DATE.js.map +0 -1
  217. package/dist/utils/DECIMAL.d.ts +0 -2
  218. package/dist/utils/DECIMAL.d.ts.map +0 -1
  219. package/dist/utils/DECIMAL.js +0 -2
  220. package/dist/utils/DECIMAL.js.map +0 -1
  221. package/dist/utils/DICT.d.ts +0 -2
  222. package/dist/utils/DICT.d.ts.map +0 -1
  223. package/dist/utils/DICT.js +0 -2
  224. package/dist/utils/DICT.js.map +0 -1
  225. package/dist/utils/INNER.d.ts +0 -2
  226. package/dist/utils/INNER.d.ts.map +0 -1
  227. package/dist/utils/INNER.js +0 -2
  228. package/dist/utils/INNER.js.map +0 -1
  229. package/dist/utils/INTEGER.d.ts +0 -2
  230. package/dist/utils/INTEGER.d.ts.map +0 -1
  231. package/dist/utils/INTEGER.js +0 -2
  232. package/dist/utils/INTEGER.js.map +0 -1
  233. package/dist/utils/INTEGER_DECIMAL.d.ts +0 -2
  234. package/dist/utils/INTEGER_DECIMAL.d.ts.map +0 -1
  235. package/dist/utils/INTEGER_DECIMAL.js +0 -4
  236. package/dist/utils/INTEGER_DECIMAL.js.map +0 -1
  237. package/dist/utils/ITEM.d.ts +0 -2
  238. package/dist/utils/ITEM.d.ts.map +0 -1
  239. package/dist/utils/ITEM.js +0 -2
  240. package/dist/utils/ITEM.js.map +0 -1
  241. package/dist/utils/KEY.d.ts +0 -2
  242. package/dist/utils/KEY.d.ts.map +0 -1
  243. package/dist/utils/KEY.js +0 -2
  244. package/dist/utils/KEY.js.map +0 -1
  245. package/dist/utils/LIST.d.ts +0 -2
  246. package/dist/utils/LIST.d.ts.map +0 -1
  247. package/dist/utils/LIST.js +0 -2
  248. package/dist/utils/LIST.js.map +0 -1
  249. package/dist/utils/STRING.d.ts +0 -2
  250. package/dist/utils/STRING.d.ts.map +0 -1
  251. package/dist/utils/STRING.js +0 -2
  252. package/dist/utils/STRING.js.map +0 -1
  253. package/dist/utils/STRING_REGEX.d.ts +0 -2
  254. package/dist/utils/STRING_REGEX.d.ts.map +0 -1
  255. package/dist/utils/STRING_REGEX.js +0 -2
  256. package/dist/utils/STRING_REGEX.js.map +0 -1
  257. package/dist/utils/TOKEN.d.ts +0 -2
  258. package/dist/utils/TOKEN.d.ts.map +0 -1
  259. package/dist/utils/TOKEN.js +0 -2
  260. package/dist/utils/TOKEN.js.map +0 -1
  261. package/dist/utils/index.d.ts +0 -10
  262. package/dist/utils/index.d.ts.map +0 -1
  263. package/dist/utils/index.js +0 -10
  264. package/dist/utils/index.js.map +0 -1
  265. package/dist/utils/isInvalidInt.d.ts +0 -2
  266. package/dist/utils/isInvalidInt.d.ts.map +0 -1
  267. package/dist/utils/isInvalidInt.js +0 -4
  268. package/dist/utils/isInvalidInt.js.map +0 -1
  269. package/dist/utils/symbolToStr.d.ts +0 -13
  270. package/dist/utils/symbolToStr.d.ts.map +0 -1
  271. package/dist/utils/symbolToStr.js +0 -14
  272. package/dist/utils/symbolToStr.js.map +0 -1
  273. package/dist/utils/throwError.d.ts +0 -2
  274. package/dist/utils/throwError.d.ts.map +0 -1
  275. package/dist/utils/throwError.js +0 -19
  276. package/dist/utils/throwError.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,15 +1,712 @@
1
+ import { decodeBase64, encodeBase64, roundToEven } from "@svta/cml-utils";
2
+
3
+ //#region src/SfItem.ts
1
4
  /**
2
- * A collection of tools for working with structured fields.
3
- *
4
- * @packageDocumentation
5
- */
6
- export * from './decodeSfDict.js';
7
- export * from './decodeSfItem.js';
8
- export * from './decodeSfList.js';
9
- export * from './encodeSfDict.js';
10
- export * from './encodeSfItem.js';
11
- export * from './encodeSfList.js';
12
- export * from './SfItem.js';
13
- export * from './SfToken.js';
14
- export * from './utils/symbolToStr.js';
5
+ * Structured Field Item
6
+ *
7
+ *
8
+ * @beta
9
+ */
10
+ var SfItem = class SfItem {
11
+ constructor(value, params) {
12
+ if (Array.isArray(value)) value = value.map((v) => v instanceof SfItem ? v : new SfItem(v));
13
+ this.value = value;
14
+ this.params = params;
15
+ }
16
+ };
17
+
18
+ //#endregion
19
+ //#region src/utils/DICT.ts
20
+ const DICT = "Dict";
21
+
22
+ //#endregion
23
+ //#region src/parse/ParsedValue.ts
24
+ /**
25
+ * @internal
26
+ */
27
+ function parsedValue(value, src) {
28
+ return {
29
+ value,
30
+ src
31
+ };
32
+ }
33
+
34
+ //#endregion
35
+ //#region src/utils/throwError.ts
36
+ function format(value) {
37
+ if (Array.isArray(value)) return JSON.stringify(value);
38
+ if (value instanceof Map) return "Map{}";
39
+ if (value instanceof Set) return "Set{}";
40
+ if (typeof value === "object") return JSON.stringify(value);
41
+ return String(value);
42
+ }
43
+ function throwError(action, src, type, cause) {
44
+ return new Error(`failed to ${action} "${format(src)}" as ${type}`, { cause });
45
+ }
46
+
47
+ //#endregion
48
+ //#region src/parse/parseError.ts
49
+ /**
50
+ * @internal
51
+ */
52
+ function parseError(src, type, cause) {
53
+ return throwError("parse", src, type, cause);
54
+ }
55
+
56
+ //#endregion
57
+ //#region src/utils/INNER.ts
58
+ const INNER = "Inner List";
59
+
60
+ //#endregion
61
+ //#region src/utils/BARE_ITEM.ts
62
+ const BARE_ITEM = "Bare Item";
63
+
64
+ //#endregion
65
+ //#region src/utils/BOOLEAN.ts
66
+ const BOOLEAN = "Boolean";
67
+
68
+ //#endregion
69
+ //#region src/parse/parseBoolean.ts
70
+ /**
71
+ * @internal
72
+ */
73
+ function parseBoolean(src) {
74
+ let i = 0;
75
+ if (src[i] !== "?") throw parseError(src, BOOLEAN);
76
+ i++;
77
+ if (src[i] === "1") return parsedValue(true, src.substring(++i));
78
+ if (src[i] === "0") return parsedValue(false, src.substring(++i));
79
+ throw parseError(src, BOOLEAN);
80
+ }
81
+
82
+ //#endregion
83
+ //#region src/utils/BYTES.ts
84
+ const BYTES = "Byte Sequence";
85
+
86
+ //#endregion
87
+ //#region src/parse/parseByteSequence.ts
88
+ /**
89
+ * @internal
90
+ */
91
+ function parseByteSequence(src) {
92
+ if (src[0] !== ":") throw parseError(src, BYTES);
93
+ src = src.substring(1);
94
+ if (src.includes(":") === false) throw parseError(src, BYTES);
95
+ const re = /(^.*?)(:)/g;
96
+ const b64_content = re.exec(src)[1];
97
+ src = src.substring(re.lastIndex);
98
+ return parsedValue(decodeBase64(b64_content), src);
99
+ }
100
+
101
+ //#endregion
102
+ //#region src/utils/DATE.ts
103
+ const DATE = "Date";
104
+
105
+ //#endregion
106
+ //#region src/utils/DECIMAL.ts
107
+ const DECIMAL = "Decimal";
108
+
109
+ //#endregion
110
+ //#region src/utils/INTEGER.ts
111
+ const INTEGER = "Integer";
112
+
113
+ //#endregion
114
+ //#region src/utils/INTEGER_DECIMAL.ts
115
+ const INTEGER_DECIMAL = `${INTEGER} or ${DECIMAL}`;
116
+
117
+ //#endregion
118
+ //#region src/utils/isInvalidInt.ts
119
+ function isInvalidInt(value) {
120
+ return value < -999999999999999 || 999999999999999 < value;
121
+ }
122
+
123
+ //#endregion
124
+ //#region src/parse/parseIntegerOrDecimal.ts
125
+ /**
126
+ * @internal
127
+ */
128
+ function parseIntegerOrDecimal(src) {
129
+ const orig = src;
130
+ let sign = 1;
131
+ let num = "";
132
+ let value;
133
+ const i = 0;
134
+ const error = parseError(orig, INTEGER_DECIMAL);
135
+ if (src[i] === "-") {
136
+ sign = -1;
137
+ src = src.substring(1);
138
+ }
139
+ if (src.length <= 0) throw error;
140
+ const re_integer = /^(\d+)?/g;
141
+ const result_integer = re_integer.exec(src);
142
+ if (result_integer[0].length === 0) throw error;
143
+ num += result_integer[1];
144
+ src = src.substring(re_integer.lastIndex);
145
+ if (src[0] === ".") {
146
+ if (num.length > 12) throw error;
147
+ const re_decimal = /^(\.\d+)?/g;
148
+ const result_decimal = re_decimal.exec(src);
149
+ src = src.substring(re_decimal.lastIndex);
150
+ if (result_decimal[0].length === 0 || result_decimal[1].length > 4) throw error;
151
+ num += result_decimal[1];
152
+ if (num.length > 16) throw error;
153
+ value = parseFloat(num) * sign;
154
+ } else {
155
+ if (num.length > 15) throw error;
156
+ value = parseInt(num) * sign;
157
+ if (isInvalidInt(value)) throw parseError(num, INTEGER_DECIMAL);
158
+ }
159
+ return parsedValue(value, src);
160
+ }
161
+
162
+ //#endregion
163
+ //#region src/parse/parseDate.ts
164
+ /**
165
+ * @internal
166
+ */
167
+ function parseDate(src) {
168
+ let i = 0;
169
+ if (src[i] !== "@") throw parseError(src, DATE);
170
+ i++;
171
+ const date = parseIntegerOrDecimal(src.substring(i));
172
+ if (Number.isInteger(date.value) === false) throw parseError(src, DATE);
173
+ return parsedValue(/* @__PURE__ */ new Date(date.value * 1e3), date.src);
174
+ }
175
+
176
+ //#endregion
177
+ //#region src/utils/STRING.ts
178
+ const STRING = "String";
179
+
180
+ //#endregion
181
+ //#region src/utils/STRING_REGEX.ts
182
+ const STRING_REGEX = /[\x00-\x1f\x7f]+/;
183
+
184
+ //#endregion
185
+ //#region src/parse/parseString.ts
186
+ /**
187
+ * @internal
188
+ */
189
+ function parseString(src) {
190
+ let output = "";
191
+ let i = 0;
192
+ if (src[i] !== `"`) throw parseError(src, STRING);
193
+ i++;
194
+ while (src.length > i) {
195
+ if (src[i] === `\\`) {
196
+ if (src.length <= i + 1) throw parseError(src, STRING);
197
+ i++;
198
+ if (src[i] !== `"` && src[i] !== `\\`) throw parseError(src, STRING);
199
+ output += src[i];
200
+ } else if (src[i] === `"`) return parsedValue(output, src.substring(++i));
201
+ else if (STRING_REGEX.test(src[i])) throw parseError(src, STRING);
202
+ else output += src[i];
203
+ i++;
204
+ }
205
+ throw parseError(src, STRING);
206
+ }
207
+
208
+ //#endregion
209
+ //#region src/SfToken.ts
210
+ /**
211
+ * A class to represent structured field tokens when `Symbol` is not available.
212
+ *
213
+ *
214
+ * @beta
215
+ */
216
+ var SfToken = class {
217
+ constructor(description) {
218
+ this.description = description;
219
+ }
220
+ };
221
+
222
+ //#endregion
223
+ //#region src/utils/TOKEN.ts
224
+ const TOKEN = "Token";
225
+
226
+ //#endregion
227
+ //#region src/parse/parseToken.ts
228
+ /**
229
+ * @internal
230
+ */
231
+ function parseToken(src, options) {
232
+ if (/^[a-zA-Z*]$/.test(src[0]) === false) throw parseError(src, TOKEN);
233
+ const re = /^([!#$%&'*+\-.^_`|~\w:/]+)/g;
234
+ const value = re.exec(src)[1];
235
+ src = src.substring(re.lastIndex);
236
+ return parsedValue(options?.useSymbol === false ? new SfToken(value) : Symbol.for(value), src);
237
+ }
238
+
239
+ //#endregion
240
+ //#region src/parse/parseBareItem.ts
241
+ /**
242
+ * @internal
243
+ */
244
+ function parseBareItem(src, options) {
245
+ const first = src[0];
246
+ if (first === `"`) return parseString(src);
247
+ if (/^[-0-9]/.test(first)) return parseIntegerOrDecimal(src);
248
+ if (first === `?`) return parseBoolean(src);
249
+ if (first === `:`) return parseByteSequence(src);
250
+ if (/^[a-zA-Z*]/.test(first)) return parseToken(src, options);
251
+ if (first === `@`) return parseDate(src);
252
+ throw parseError(src, BARE_ITEM);
253
+ }
254
+
255
+ //#endregion
256
+ //#region src/utils/KEY.ts
257
+ const KEY = "Key";
258
+
259
+ //#endregion
260
+ //#region src/parse/parseKey.ts
261
+ /**
262
+ * @internal
263
+ */
264
+ function parseKey(src) {
265
+ let i = 0;
266
+ if (/^[a-z*]$/.test(src[i]) === false) throw parseError(src, KEY);
267
+ let value = "";
268
+ while (src.length > i) {
269
+ if (/^[a-z0-9_\-.*]$/.test(src[i]) === false) return parsedValue(value, src.substring(i));
270
+ value += src[i];
271
+ i++;
272
+ }
273
+ return parsedValue(value, src.substring(i));
274
+ }
275
+
276
+ //#endregion
277
+ //#region src/parse/parseParameters.ts
278
+ /**
279
+ * @internal
280
+ */
281
+ function parseParameters(src, options) {
282
+ let parameters = void 0;
283
+ while (src.length > 0) {
284
+ if (src[0] !== ";") break;
285
+ src = src.substring(1).trim();
286
+ const parsedKey = parseKey(src);
287
+ const key = parsedKey.value;
288
+ let value = true;
289
+ src = parsedKey.src;
290
+ if (src[0] === "=") {
291
+ src = src.substring(1);
292
+ const parsedBareItem = parseBareItem(src, options);
293
+ value = parsedBareItem.value;
294
+ src = parsedBareItem.src;
295
+ }
296
+ if (parameters == null) parameters = {};
297
+ parameters[key] = value;
298
+ }
299
+ return parsedValue(parameters, src);
300
+ }
301
+
302
+ //#endregion
303
+ //#region src/parse/parseItem.ts
304
+ /**
305
+ * @internal
306
+ */
307
+ function parseItem(src, options) {
308
+ const parsedBareItem = parseBareItem(src, options);
309
+ src = parsedBareItem.src;
310
+ const parsedParameters = parseParameters(src, options);
311
+ src = parsedParameters.src;
312
+ return parsedValue(new SfItem(parsedBareItem.value, parsedParameters.value), src);
313
+ }
314
+
315
+ //#endregion
316
+ //#region src/parse/parseInnerList.ts
317
+ /**
318
+ * @internal
319
+ */
320
+ function parseInnerList(src, options) {
321
+ if (src[0] !== "(") throw parseError(src, INNER);
322
+ src = src.substring(1);
323
+ const innerList = [];
324
+ while (src.length > 0) {
325
+ src = src.trim();
326
+ if (src[0] === ")") {
327
+ src = src.substring(1);
328
+ const parsedParameters = parseParameters(src, options);
329
+ return parsedValue(new SfItem(innerList, parsedParameters.value), parsedParameters.src);
330
+ }
331
+ const parsedItem = parseItem(src, options);
332
+ innerList.push(parsedItem.value);
333
+ src = parsedItem.src;
334
+ if (src[0] !== " " && src[0] !== ")") throw parseError(src, INNER);
335
+ }
336
+ throw parseError(src, INNER);
337
+ }
338
+
339
+ //#endregion
340
+ //#region src/parse/parseItemOrInnerList.ts
341
+ /**
342
+ * @internal
343
+ */
344
+ function parseItemOrInnerList(src, options) {
345
+ if (src[0] === "(") return parseInnerList(src, options);
346
+ return parseItem(src, options);
347
+ }
348
+
349
+ //#endregion
350
+ //#region src/parse/parseDict.ts
351
+ /**
352
+ * @internal
353
+ */
354
+ function parseDict(src, options) {
355
+ const value = {};
356
+ while (src.length > 0) {
357
+ let member;
358
+ const parsedKey = parseKey(src);
359
+ const key = parsedKey.value;
360
+ src = parsedKey.src;
361
+ if (src[0] === "=") {
362
+ const parsedItemOrInnerList = parseItemOrInnerList(src.substring(1), options);
363
+ member = parsedItemOrInnerList.value;
364
+ src = parsedItemOrInnerList.src;
365
+ } else {
366
+ const parsedParameters = parseParameters(src, options);
367
+ member = new SfItem(true, parsedParameters.value);
368
+ src = parsedParameters.src;
369
+ }
370
+ value[key] = member;
371
+ src = src.trim();
372
+ if (src.length === 0) return parsedValue(value, src);
373
+ if (src[0] !== ",") throw parseError(src, DICT);
374
+ src = src.substring(1).trim();
375
+ if (src.length === 0 || src[0] === ",") throw parseError(src, DICT);
376
+ }
377
+ return parsedValue(value, src);
378
+ }
379
+
380
+ //#endregion
381
+ //#region src/decodeSfDict.ts
382
+ /**
383
+ * Decode a structured field string into a structured field dictionary
384
+ *
385
+ * @param input - The structured field string to decode
386
+ * @returns The structured field dictionary
387
+ *
388
+ *
389
+ * @beta
390
+ */
391
+ function decodeSfDict(input, options) {
392
+ try {
393
+ const { src, value } = parseDict(input.trim(), options);
394
+ if (src !== "") throw parseError(src, DICT);
395
+ return value;
396
+ } catch (cause) {
397
+ throw parseError(input, DICT, cause);
398
+ }
399
+ }
400
+
401
+ //#endregion
402
+ //#region src/utils/ITEM.ts
403
+ const ITEM = "Item";
404
+
405
+ //#endregion
406
+ //#region src/decodeSfItem.ts
407
+ /**
408
+ * Decode a structured field string into a structured field item
409
+ *
410
+ * @param input - The structured field string to decode
411
+ * @returns The structured field item
412
+ *
413
+ *
414
+ * @beta
415
+ */
416
+ function decodeSfItem(input, options) {
417
+ try {
418
+ const { src, value } = parseItem(input.trim(), options);
419
+ if (src !== "") throw parseError(src, ITEM);
420
+ return value;
421
+ } catch (cause) {
422
+ throw parseError(input, ITEM, cause);
423
+ }
424
+ }
425
+
426
+ //#endregion
427
+ //#region src/utils/LIST.ts
428
+ const LIST = "List";
429
+
430
+ //#endregion
431
+ //#region src/parse/parseList.ts
432
+ /**
433
+ * @internal
434
+ */
435
+ function parseList(src, options) {
436
+ const value = [];
437
+ while (src.length > 0) {
438
+ const parsedItemOrInnerList = parseItemOrInnerList(src, options);
439
+ value.push(parsedItemOrInnerList.value);
440
+ src = parsedItemOrInnerList.src.trim();
441
+ if (src.length === 0) return parsedValue(value, src);
442
+ if (src[0] !== ",") throw parseError(src, LIST);
443
+ src = src.substring(1).trim();
444
+ if (src.length === 0 || src[0] === ",") throw parseError(src, LIST);
445
+ }
446
+ return parsedValue(value, src);
447
+ }
448
+
449
+ //#endregion
450
+ //#region src/decodeSfList.ts
451
+ /**
452
+ * Decode a structured field string into a structured field list
453
+ *
454
+ * @param input - The structured field string to decode
455
+ * @returns The structured field list
456
+ *
457
+ *
458
+ * @beta
459
+ */
460
+ function decodeSfList(input, options) {
461
+ try {
462
+ const { src, value } = parseList(input.trim(), options);
463
+ if (src !== "") throw parseError(src, LIST);
464
+ return value;
465
+ } catch (cause) {
466
+ throw parseError(input, LIST, cause);
467
+ }
468
+ }
469
+
470
+ //#endregion
471
+ //#region src/serialize/serializeError.ts
472
+ /**
473
+ * @internal
474
+ */
475
+ function serializeError(src, type, cause) {
476
+ return throwError("serialize", src, type, cause);
477
+ }
478
+
479
+ //#endregion
480
+ //#region src/serialize/serializeBoolean.ts
481
+ /**
482
+ * @internal
483
+ */
484
+ function serializeBoolean(value) {
485
+ if (typeof value !== "boolean") throw serializeError(value, BOOLEAN);
486
+ return value ? "?1" : "?0";
487
+ }
488
+
489
+ //#endregion
490
+ //#region src/serialize/serializeByteSequence.ts
491
+ /**
492
+ * @internal
493
+ */
494
+ function serializeByteSequence(value) {
495
+ if (ArrayBuffer.isView(value) === false) throw serializeError(value, BYTES);
496
+ return `:${encodeBase64(value)}:`;
497
+ }
498
+
499
+ //#endregion
500
+ //#region src/serialize/serializeInteger.ts
501
+ /**
502
+ * @internal
503
+ */
504
+ function serializeInteger(value) {
505
+ if (isInvalidInt(value)) throw serializeError(value, INTEGER);
506
+ return value.toString();
507
+ }
508
+
509
+ //#endregion
510
+ //#region src/serialize/serializeDate.ts
511
+ /**
512
+ * @internal
513
+ */
514
+ function serializeDate(value) {
515
+ return `@${serializeInteger(value.getTime() / 1e3)}`;
516
+ }
517
+
518
+ //#endregion
519
+ //#region src/serialize/serializeDecimal.ts
520
+ /**
521
+ * @internal
522
+ */
523
+ function serializeDecimal(value) {
524
+ const roundedValue = roundToEven(value, 3);
525
+ if (Math.floor(Math.abs(roundedValue)).toString().length > 12) throw serializeError(value, DECIMAL);
526
+ const stringValue = roundedValue.toString();
527
+ return stringValue.includes(".") ? stringValue : `${stringValue}.0`;
528
+ }
529
+
530
+ //#endregion
531
+ //#region src/serialize/serializeString.ts
532
+ /**
533
+ * @internal
534
+ */
535
+ function serializeString(value) {
536
+ if (STRING_REGEX.test(value)) throw serializeError(value, STRING);
537
+ return `"${value.replace(/\\/g, `\\\\`).replace(/"/g, `\\"`)}"`;
538
+ }
539
+
540
+ //#endregion
541
+ //#region src/utils/symbolToStr.ts
542
+ /**
543
+ * Converts a symbol to a string.
544
+ *
545
+ * @param symbol - The symbol to convert.
546
+ *
547
+ * @returns The string representation of the symbol.
548
+ *
549
+ *
550
+ * @beta
551
+ */
552
+ function symbolToStr(symbol) {
553
+ return symbol.description || symbol.toString().slice(7, -1);
554
+ }
555
+
556
+ //#endregion
557
+ //#region src/serialize/serializeToken.ts
558
+ /**
559
+ * @internal
560
+ */
561
+ function serializeToken(token) {
562
+ const value = symbolToStr(token);
563
+ if (/^([a-zA-Z*])([!#$%&'*+\-.^_`|~\w:/]*)$/.test(value) === false) throw serializeError(value, TOKEN);
564
+ return value;
565
+ }
566
+
567
+ //#endregion
568
+ //#region src/serialize/serializeBareItem.ts
569
+ /**
570
+ * @internal
571
+ */
572
+ function serializeBareItem(value) {
573
+ switch (typeof value) {
574
+ case "number":
575
+ if (!Number.isFinite(value)) throw serializeError(value, BARE_ITEM);
576
+ if (Number.isInteger(value)) return serializeInteger(value);
577
+ return serializeDecimal(value);
578
+ case "string": return serializeString(value);
579
+ case "symbol": return serializeToken(value);
580
+ case "boolean": return serializeBoolean(value);
581
+ case "object":
582
+ if (value instanceof Date) return serializeDate(value);
583
+ if (value instanceof Uint8Array) return serializeByteSequence(value);
584
+ if (value instanceof SfToken) return serializeToken(value);
585
+ default: throw serializeError(value, BARE_ITEM);
586
+ }
587
+ }
588
+
589
+ //#endregion
590
+ //#region src/serialize/serializeKey.ts
591
+ /**
592
+ * @internal
593
+ */
594
+ function serializeKey(value) {
595
+ if (/^[a-z*][a-z0-9\-_.*]*$/.test(value) === false) throw serializeError(value, KEY);
596
+ return value;
597
+ }
598
+
599
+ //#endregion
600
+ //#region src/serialize/serializeParams.ts
601
+ /**
602
+ * @internal
603
+ */
604
+ function serializeParams(params) {
605
+ if (params == null) return "";
606
+ return Object.entries(params).map(([key, value]) => {
607
+ if (value === true) return `;${serializeKey(key)}`;
608
+ return `;${serializeKey(key)}=${serializeBareItem(value)}`;
609
+ }).join("");
610
+ }
611
+
612
+ //#endregion
613
+ //#region src/serialize/serializeItem.ts
614
+ /**
615
+ * @internal
616
+ */
617
+ function serializeItem(value) {
618
+ if (value instanceof SfItem) return `${serializeBareItem(value.value)}${serializeParams(value.params)}`;
619
+ else return serializeBareItem(value);
620
+ }
621
+
622
+ //#endregion
623
+ //#region src/serialize/serializeInnerList.ts
624
+ /**
625
+ * @internal
626
+ */
627
+ function serializeInnerList(value) {
628
+ return `(${value.value.map(serializeItem).join(" ")})${serializeParams(value.params)}`;
629
+ }
630
+
631
+ //#endregion
632
+ //#region src/serialize/serializeDict.ts
633
+ /**
634
+ * @internal
635
+ */
636
+ function serializeDict(dict, options = { whitespace: true }) {
637
+ if (typeof dict !== "object" || dict == null) throw serializeError(dict, DICT);
638
+ const entries = dict instanceof Map ? dict.entries() : Object.entries(dict);
639
+ const optionalWhiteSpace = options?.whitespace ? " " : "";
640
+ return Array.from(entries).map(([key, item]) => {
641
+ if (item instanceof SfItem === false) item = new SfItem(item);
642
+ let output = serializeKey(key);
643
+ if (item.value === true) output += serializeParams(item.params);
644
+ else {
645
+ output += "=";
646
+ if (Array.isArray(item.value)) output += serializeInnerList(item);
647
+ else output += serializeItem(item);
648
+ }
649
+ return output;
650
+ }).join(`,${optionalWhiteSpace}`);
651
+ }
652
+
653
+ //#endregion
654
+ //#region src/encodeSfDict.ts
655
+ /**
656
+ * Encode an object into a structured field dictionary
657
+ *
658
+ * @param value - The structured field dictionary to encode
659
+ * @param options - Encoding options
660
+ *
661
+ * @returns The structured field string
662
+ *
663
+ *
664
+ * @beta
665
+ */
666
+ function encodeSfDict(value, options) {
667
+ return serializeDict(value, options);
668
+ }
669
+
670
+ //#endregion
671
+ //#region src/encodeSfItem.ts
672
+ function encodeSfItem(value, params) {
673
+ if (!(value instanceof SfItem)) value = new SfItem(value, params);
674
+ return serializeItem(value);
675
+ }
676
+
677
+ //#endregion
678
+ //#region src/serialize/serializeList.ts
679
+ /**
680
+ * @internal
681
+ */
682
+ function serializeList(list, options = { whitespace: true }) {
683
+ if (Array.isArray(list) === false) throw serializeError(list, LIST);
684
+ const optionalWhiteSpace = options?.whitespace ? " " : "";
685
+ return list.map((item) => {
686
+ if (item instanceof SfItem === false) item = new SfItem(item);
687
+ const i = item;
688
+ if (Array.isArray(i.value)) return serializeInnerList(i);
689
+ return serializeItem(i);
690
+ }).join(`,${optionalWhiteSpace}`);
691
+ }
692
+
693
+ //#endregion
694
+ //#region src/encodeSfList.ts
695
+ /**
696
+ * Encode a list into a structured field dictionary
697
+ *
698
+ * @param value - The structured field list to encode
699
+ * @param options - Encoding options
700
+ *
701
+ * @returns The structured field string
702
+ *
703
+ *
704
+ * @beta
705
+ */
706
+ function encodeSfList(value, options) {
707
+ return serializeList(value, options);
708
+ }
709
+
710
+ //#endregion
711
+ export { SfItem, SfToken, decodeSfDict, decodeSfItem, decodeSfList, encodeSfDict, encodeSfItem, encodeSfList, parseBareItem, parseBoolean, parseByteSequence, parseDate, parseDict, parseError, parseInnerList, parseIntegerOrDecimal, parseItem, parseItemOrInnerList, parseKey, parseList, parseParameters, parseString, parseToken, serializeBareItem, serializeBoolean, serializeByteSequence, serializeDate, serializeDecimal, serializeDict, serializeError, serializeInnerList, serializeInteger, serializeItem, serializeKey, serializeList, serializeParams, serializeString, serializeToken, symbolToStr };
15
712
  //# sourceMappingURL=index.js.map