@aidc-toolkit/gs1 1.0.24-beta → 1.0.26-beta

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 (240) hide show
  1. package/dist/abstract-identifier-creator.d.ts +75 -0
  2. package/dist/abstract-identifier-creator.d.ts.map +1 -0
  3. package/dist/abstract-identifier-creator.js +56 -0
  4. package/dist/abstract-identifier-creator.js.map +1 -0
  5. package/dist/abstract-identifier-validator.d.ts +95 -0
  6. package/dist/abstract-identifier-validator.d.ts.map +1 -0
  7. package/dist/abstract-identifier-validator.js +123 -0
  8. package/dist/abstract-identifier-validator.js.map +1 -0
  9. package/dist/abstract-numeric-identifier-creator.d.ts +92 -0
  10. package/dist/abstract-numeric-identifier-creator.d.ts.map +1 -0
  11. package/dist/abstract-numeric-identifier-creator.js +137 -0
  12. package/dist/abstract-numeric-identifier-creator.js.map +1 -0
  13. package/dist/abstract-numeric-identifier-validator.d.ts +35 -0
  14. package/dist/abstract-numeric-identifier-validator.d.ts.map +1 -0
  15. package/dist/abstract-numeric-identifier-validator.js +61 -0
  16. package/dist/abstract-numeric-identifier-validator.js.map +1 -0
  17. package/dist/character-set.d.ts +27 -0
  18. package/dist/character-set.d.ts.map +1 -0
  19. package/dist/character-set.js +50 -0
  20. package/dist/character-set.js.map +1 -0
  21. package/dist/check.d.ts +81 -0
  22. package/dist/check.d.ts.map +1 -0
  23. package/dist/check.js +218 -0
  24. package/dist/check.js.map +1 -0
  25. package/dist/content-character-set.d.ts +26 -0
  26. package/dist/content-character-set.d.ts.map +1 -0
  27. package/dist/content-character-set.js +18 -0
  28. package/dist/content-character-set.js.map +1 -0
  29. package/dist/creators.d.ts +81 -0
  30. package/dist/creators.d.ts.map +1 -0
  31. package/dist/creators.js +62 -0
  32. package/dist/creators.js.map +1 -0
  33. package/dist/descriptors.d.ts +96 -0
  34. package/dist/descriptors.d.ts.map +1 -0
  35. package/dist/descriptors.js +266 -0
  36. package/dist/descriptors.js.map +1 -0
  37. package/dist/gtin-creator.d.ts +69 -0
  38. package/dist/gtin-creator.d.ts.map +1 -0
  39. package/dist/gtin-creator.js +159 -0
  40. package/dist/gtin-creator.js.map +1 -0
  41. package/dist/gtin-descriptor.d.ts +17 -0
  42. package/dist/gtin-descriptor.d.ts.map +1 -0
  43. package/dist/gtin-descriptor.js +2 -0
  44. package/dist/gtin-descriptor.js.map +1 -0
  45. package/dist/gtin-type.d.ts +39 -0
  46. package/dist/gtin-type.d.ts.map +1 -0
  47. package/dist/gtin-type.js +31 -0
  48. package/dist/gtin-type.js.map +1 -0
  49. package/dist/gtin-validator.d.ts +191 -0
  50. package/dist/gtin-validator.d.ts.map +1 -0
  51. package/dist/gtin-validator.js +450 -0
  52. package/dist/gtin-validator.js.map +1 -0
  53. package/dist/identifier-creator.d.ts +31 -0
  54. package/dist/identifier-creator.d.ts.map +1 -0
  55. package/dist/identifier-creator.js +2 -0
  56. package/dist/identifier-creator.js.map +1 -0
  57. package/dist/identifier-descriptor.d.ts +27 -0
  58. package/dist/identifier-descriptor.d.ts.map +1 -0
  59. package/dist/identifier-descriptor.js +2 -0
  60. package/dist/identifier-descriptor.js.map +1 -0
  61. package/dist/identifier-type.d.ts +62 -0
  62. package/dist/identifier-type.d.ts.map +1 -0
  63. package/dist/identifier-type.js +54 -0
  64. package/dist/identifier-type.js.map +1 -0
  65. package/dist/identifier-validator.d.ts +53 -0
  66. package/dist/identifier-validator.d.ts.map +1 -0
  67. package/dist/identifier-validator.js +2 -0
  68. package/dist/identifier-validator.js.map +1 -0
  69. package/dist/index.d.ts +52 -1588
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +21 -4541
  72. package/dist/index.js.map +1 -1
  73. package/dist/locale/en/locale-resources.d.ts +42 -0
  74. package/dist/locale/en/locale-resources.d.ts.map +1 -0
  75. package/dist/locale/en/locale-resources.js +41 -0
  76. package/dist/locale/en/locale-resources.js.map +1 -0
  77. package/dist/locale/fr/locale-resources.d.ts +42 -0
  78. package/dist/locale/fr/locale-resources.d.ts.map +1 -0
  79. package/dist/locale/fr/locale-resources.js +41 -0
  80. package/dist/locale/fr/locale-resources.js.map +1 -0
  81. package/dist/locale/i18n.d.ts +27 -0
  82. package/dist/locale/i18n.d.ts.map +1 -0
  83. package/dist/locale/i18n.js +36 -0
  84. package/dist/locale/i18n.js.map +1 -0
  85. package/dist/non-gtin-numeric-identifier-creator.d.ts +24 -0
  86. package/dist/non-gtin-numeric-identifier-creator.d.ts.map +1 -0
  87. package/dist/non-gtin-numeric-identifier-creator.js +23 -0
  88. package/dist/non-gtin-numeric-identifier-creator.js.map +1 -0
  89. package/dist/non-gtin-numeric-identifier-descriptor.d.ts +22 -0
  90. package/dist/non-gtin-numeric-identifier-descriptor.d.ts.map +1 -0
  91. package/dist/non-gtin-numeric-identifier-descriptor.js +2 -0
  92. package/dist/non-gtin-numeric-identifier-descriptor.js.map +1 -0
  93. package/dist/non-gtin-numeric-identifier-type.d.ts +7 -0
  94. package/dist/non-gtin-numeric-identifier-type.d.ts.map +1 -0
  95. package/dist/non-gtin-numeric-identifier-type.js +2 -0
  96. package/dist/non-gtin-numeric-identifier-type.js.map +1 -0
  97. package/dist/non-gtin-numeric-identifier-validator.d.ts +17 -0
  98. package/dist/non-gtin-numeric-identifier-validator.d.ts.map +1 -0
  99. package/dist/non-gtin-numeric-identifier-validator.js +17 -0
  100. package/dist/non-gtin-numeric-identifier-validator.js.map +1 -0
  101. package/dist/non-numeric-identifier-creator.d.ts +45 -0
  102. package/dist/non-numeric-identifier-creator.d.ts.map +1 -0
  103. package/dist/non-numeric-identifier-creator.js +84 -0
  104. package/dist/non-numeric-identifier-creator.js.map +1 -0
  105. package/dist/non-numeric-identifier-descriptor.d.ts +26 -0
  106. package/dist/non-numeric-identifier-descriptor.d.ts.map +1 -0
  107. package/dist/non-numeric-identifier-descriptor.js +2 -0
  108. package/dist/non-numeric-identifier-descriptor.js.map +1 -0
  109. package/dist/non-numeric-identifier-type.d.ts +7 -0
  110. package/dist/non-numeric-identifier-type.d.ts.map +1 -0
  111. package/dist/non-numeric-identifier-type.js +2 -0
  112. package/dist/non-numeric-identifier-type.js.map +1 -0
  113. package/dist/non-numeric-identifier-validator.d.ts +49 -0
  114. package/dist/non-numeric-identifier-validator.d.ts.map +1 -0
  115. package/dist/non-numeric-identifier-validator.js +69 -0
  116. package/dist/non-numeric-identifier-validator.js.map +1 -0
  117. package/dist/numeric-identifier-creator.d.ts +53 -0
  118. package/dist/numeric-identifier-creator.d.ts.map +1 -0
  119. package/dist/numeric-identifier-creator.js +2 -0
  120. package/dist/numeric-identifier-creator.js.map +1 -0
  121. package/dist/numeric-identifier-descriptor.d.ts +21 -0
  122. package/dist/numeric-identifier-descriptor.d.ts.map +1 -0
  123. package/dist/numeric-identifier-descriptor.js +2 -0
  124. package/dist/numeric-identifier-descriptor.js.map +1 -0
  125. package/dist/numeric-identifier-type.d.ts +31 -0
  126. package/dist/numeric-identifier-type.d.ts.map +1 -0
  127. package/dist/numeric-identifier-type.js +18 -0
  128. package/dist/numeric-identifier-type.js.map +1 -0
  129. package/dist/numeric-identifier-validator.d.ts +24 -0
  130. package/dist/numeric-identifier-validator.d.ts.map +1 -0
  131. package/dist/numeric-identifier-validator.js +2 -0
  132. package/dist/numeric-identifier-validator.js.map +1 -0
  133. package/dist/prefix-manager.d.ts +232 -0
  134. package/dist/prefix-manager.d.ts.map +1 -0
  135. package/dist/prefix-manager.js +334 -0
  136. package/dist/prefix-manager.js.map +1 -0
  137. package/dist/prefix-provider.d.ts +27 -0
  138. package/dist/prefix-provider.d.ts.map +1 -0
  139. package/dist/prefix-provider.js +2 -0
  140. package/dist/prefix-provider.js.map +1 -0
  141. package/dist/prefix-type.d.ts +26 -0
  142. package/dist/prefix-type.d.ts.map +1 -0
  143. package/dist/prefix-type.js +18 -0
  144. package/dist/prefix-type.js.map +1 -0
  145. package/dist/prefix-validator.d.ts +70 -0
  146. package/dist/prefix-validator.d.ts.map +1 -0
  147. package/dist/prefix-validator.js +208 -0
  148. package/dist/prefix-validator.js.map +1 -0
  149. package/dist/serializable-numeric-identifier-creator.d.ts +76 -0
  150. package/dist/serializable-numeric-identifier-creator.d.ts.map +1 -0
  151. package/dist/serializable-numeric-identifier-creator.js +107 -0
  152. package/dist/serializable-numeric-identifier-creator.js.map +1 -0
  153. package/dist/serializable-numeric-identifier-descriptor.d.ts +26 -0
  154. package/dist/serializable-numeric-identifier-descriptor.d.ts.map +1 -0
  155. package/dist/serializable-numeric-identifier-descriptor.js +2 -0
  156. package/dist/serializable-numeric-identifier-descriptor.js.map +1 -0
  157. package/dist/serializable-numeric-identifier-type.d.ts +6 -0
  158. package/dist/serializable-numeric-identifier-type.d.ts.map +1 -0
  159. package/dist/serializable-numeric-identifier-type.js +2 -0
  160. package/dist/serializable-numeric-identifier-type.js.map +1 -0
  161. package/dist/serializable-numeric-identifier-validator.d.ts +56 -0
  162. package/dist/serializable-numeric-identifier-validator.d.ts.map +1 -0
  163. package/dist/serializable-numeric-identifier-validator.js +77 -0
  164. package/dist/serializable-numeric-identifier-validator.js.map +1 -0
  165. package/dist/validators.d.ts +96 -0
  166. package/dist/validators.d.ts.map +1 -0
  167. package/dist/validators.js +140 -0
  168. package/dist/validators.js.map +1 -0
  169. package/package.json +12 -8
  170. package/src/abstract-identifier-creator.ts +97 -0
  171. package/src/abstract-identifier-validator.ts +140 -0
  172. package/src/abstract-numeric-identifier-creator.ts +168 -0
  173. package/src/abstract-numeric-identifier-validator.ts +69 -0
  174. package/src/character-set.ts +10 -10
  175. package/src/check.ts +9 -9
  176. package/src/content-character-set.ts +29 -0
  177. package/src/creators.ts +113 -0
  178. package/src/descriptors.ts +332 -0
  179. package/src/gtin-creator.ts +10 -9
  180. package/src/gtin-descriptor.ts +18 -0
  181. package/src/gtin-type.ts +50 -0
  182. package/src/gtin-validator.ts +40 -64
  183. package/src/identifier-creator.ts +12 -76
  184. package/src/identifier-descriptor.ts +30 -0
  185. package/src/identifier-type.ts +6 -1
  186. package/src/identifier-validator.ts +12 -188
  187. package/src/index.ts +44 -19
  188. package/src/locale/en/locale-resources.ts +0 -1
  189. package/src/locale/fr/locale-resources.ts +0 -1
  190. package/src/locale/i18n.ts +3 -3
  191. package/src/locale/i18next.d.ts +1 -1
  192. package/src/non-gtin-numeric-identifier-creator.ts +7 -13
  193. package/src/non-gtin-numeric-identifier-descriptor.ts +24 -0
  194. package/src/non-gtin-numeric-identifier-type.ts +7 -0
  195. package/src/non-gtin-numeric-identifier-validator.ts +8 -42
  196. package/src/non-numeric-identifier-creator.ts +9 -19
  197. package/src/non-numeric-identifier-descriptor.ts +29 -0
  198. package/src/non-numeric-identifier-type.ts +7 -0
  199. package/src/non-numeric-identifier-validator.ts +17 -55
  200. package/src/numeric-identifier-creator.ts +20 -163
  201. package/src/numeric-identifier-descriptor.ts +23 -0
  202. package/src/numeric-identifier-type.ts +44 -0
  203. package/src/numeric-identifier-validator.ts +13 -116
  204. package/src/prefix-manager.ts +94 -152
  205. package/src/prefix-provider.ts +3 -3
  206. package/src/prefix-type.ts +6 -1
  207. package/src/prefix-validator.ts +143 -81
  208. package/src/serializable-numeric-identifier-creator.ts +6 -16
  209. package/src/serializable-numeric-identifier-descriptor.ts +29 -0
  210. package/src/serializable-numeric-identifier-type.ts +9 -0
  211. package/src/serializable-numeric-identifier-validator.ts +18 -46
  212. package/src/validators.ts +203 -0
  213. package/test/check.test.ts +1 -1
  214. package/test/creator.test.ts +5 -7
  215. package/test/gtin-creator.ts +6 -2
  216. package/test/gtin-validator.test.ts +7 -10
  217. package/test/identifier-creator.ts +6 -5
  218. package/test/identifier-validator.ts +2 -2
  219. package/test/non-gtin-numeric-identifier-creator.ts +9 -93
  220. package/test/non-gtin-numeric-identifier-validator.ts +3 -3
  221. package/test/non-numeric-identifier-creator.ts +93 -0
  222. package/test/non-numeric-identifier-validator.ts +3 -3
  223. package/test/numeric-identifier-creator.ts +11 -5
  224. package/test/numeric-identifier-validator.ts +5 -9
  225. package/test/prefix-manager.test.ts +2 -2
  226. package/test/serializable-numeric-identifier-creator.ts +11 -3
  227. package/test/serializable-numeric-identifier-validator.ts +3 -3
  228. package/test/setup.ts +1 -1
  229. package/test/sparse.test.ts +1 -1
  230. package/test/utility.ts +1 -1
  231. package/test/validator.test.ts +64 -40
  232. package/test/variable-measure-rcn.test.ts +1 -1
  233. package/tsconfig-config.json +4 -0
  234. package/tsconfig-src.json +8 -0
  235. package/tsconfig-test.json +9 -0
  236. package/tsconfig.json +12 -1
  237. package/tsup.config.ts +3 -2
  238. package/dist/index.cjs +0 -4624
  239. package/dist/index.cjs.map +0 -1
  240. package/dist/index.d.cts +0 -1588
@@ -1,6 +1,7 @@
1
1
  import { type CharacterSetValidation, NUMERIC_CREATOR } from "@aidc-toolkit/utility";
2
- import { i18nextGS1 } from "./locale/i18n";
3
- import { type PrefixType, PrefixTypes } from "./prefix-type";
2
+ import { i18nextGS1 } from "./locale/i18n.js";
3
+ import type { PrefixProvider } from "./prefix-provider.js";
4
+ import { type PrefixType, PrefixTypes } from "./prefix-type.js";
4
5
 
5
6
  /**
6
7
  * Prefix validation parameters.
@@ -98,94 +99,155 @@ const GS1_8_PREFIX_VALIDATION: Readonly<PrefixValidation> = {
98
99
  };
99
100
 
100
101
  /**
101
- * Validate a prefix.
102
- *
103
- * @param prefixType
104
- * Prefix type.
105
- *
106
- * @param allowUPCCompanyPrefix
107
- * If true, a U.P.C. Company Prefix expressed as a GS1 Company Prefix is permitted.
108
- *
109
- * @param allowGS18Prefix
110
- * If true, a GS1-8 Prefix expressed as a GS1 Company Prefix is permitted.
111
- *
112
- * @param prefix
113
- * Prefix.
114
- *
115
- * @param isFromIdentifier
116
- * If true, the prefix is from an identifier and should be trimmed before its character set is validated.
117
- *
118
- * @param isNumericIdentifier
119
- * If true, the prefix is from a numeric identifier and its character set will be validated by the caller.
120
- *
121
- * @param positionOffset
122
- * Position offset within a larger string.
102
+ * Prefix validator.
123
103
  */
124
- function validate(prefixType: PrefixType, allowUPCCompanyPrefix: boolean, allowGS18Prefix: boolean, prefix: string, isFromIdentifier = false, isNumericIdentifier = false, positionOffset?: number): void {
125
- let baseValidation: PrefixValidation;
126
-
127
- // Validate the prefix type and determine the prefix validation parameters.
128
- switch (prefixType) {
129
- case PrefixTypes.GS1CompanyPrefix:
130
- if (!prefix.startsWith("0")) {
131
- baseValidation = GS1_COMPANY_PREFIX_VALIDATION;
132
- } else if (!prefix.startsWith("00000")) {
133
- if (!allowUPCCompanyPrefix) {
134
- throw new RangeError(i18nextGS1.t("Prefix.gs1CompanyPrefixCantStartWith0"));
104
+ export const PrefixValidator = {
105
+ GS1_COMPANY_PREFIX_MINIMUM_LENGTH,
106
+ GS1_COMPANY_PREFIX_MAXIMUM_LENGTH,
107
+ UPC_COMPANY_PREFIX_MINIMUM_LENGTH,
108
+ UPC_COMPANY_PREFIX_MAXIMUM_LENGTH,
109
+ GS1_8_PREFIX_MINIMUM_LENGTH,
110
+ GS1_8_PREFIX_MAXIMUM_LENGTH,
111
+
112
+ /**
113
+ * Validate a prefix.
114
+ *
115
+ * @param prefixType
116
+ * Prefix type.
117
+ *
118
+ * @param allowUPCCompanyPrefix
119
+ * If true, a U.P.C. Company Prefix expressed as a GS1 Company Prefix is permitted.
120
+ *
121
+ * @param allowGS18Prefix
122
+ * If true, a GS1-8 Prefix expressed as a GS1 Company Prefix is permitted.
123
+ *
124
+ * @param prefix
125
+ * Prefix.
126
+ *
127
+ * @param isFromIdentifier
128
+ * If true, the prefix is from an identifier and should be trimmed before its character set is validated.
129
+ *
130
+ * @param isNumericIdentifier
131
+ * If true, the prefix is from a numeric identifier and its character set will be validated by the caller.
132
+ *
133
+ * @param positionOffset
134
+ * Position offset within a larger string.
135
+ */
136
+ validate(prefixType: PrefixType, allowUPCCompanyPrefix: boolean, allowGS18Prefix: boolean, prefix: string, isFromIdentifier = false, isNumericIdentifier = false, positionOffset?: number): void {
137
+ let baseValidation: PrefixValidation;
138
+
139
+ // Validate the prefix type and determine the prefix validation parameters.
140
+ switch (prefixType) {
141
+ case PrefixTypes.GS1CompanyPrefix:
142
+ if (!prefix.startsWith("0")) {
143
+ baseValidation = GS1_COMPANY_PREFIX_VALIDATION;
144
+ } else if (!prefix.startsWith("00000")) {
145
+ if (!allowUPCCompanyPrefix) {
146
+ throw new RangeError(i18nextGS1.t("Prefix.gs1CompanyPrefixCantStartWith0"));
147
+ }
148
+
149
+ baseValidation = UPC_COMPANY_PREFIX_AS_GS1_COMPANY_PREFIX_VALIDATION;
150
+ } else if (!prefix.startsWith("000000")) {
151
+ if (!allowGS18Prefix) {
152
+ throw new RangeError(i18nextGS1.t("Prefix.gs1CompanyPrefixCantStartWith00000"));
153
+ }
154
+
155
+ baseValidation = GS1_8_PREFIX_AS_GS1_COMPANY_PREFIX_VALIDATION;
156
+ } else {
157
+ throw new RangeError(i18nextGS1.t("Prefix.gs1CompanyPrefixCantStartWith000000"));
135
158
  }
159
+ break;
136
160
 
137
- baseValidation = UPC_COMPANY_PREFIX_AS_GS1_COMPANY_PREFIX_VALIDATION;
138
- } else if (!prefix.startsWith("000000")) {
139
- if (!allowGS18Prefix) {
140
- throw new RangeError(i18nextGS1.t("Prefix.gs1CompanyPrefixCantStartWith00000"));
161
+ case PrefixTypes.UPCCompanyPrefix:
162
+ if (prefix.startsWith("0000")) {
163
+ throw new RangeError(i18nextGS1.t("Prefix.upcCompanyPrefixCantStartWith0000"));
141
164
  }
142
165
 
143
- baseValidation = GS1_8_PREFIX_AS_GS1_COMPANY_PREFIX_VALIDATION;
144
- } else {
145
- throw new RangeError(i18nextGS1.t("Prefix.gs1CompanyPrefixCantStartWith000000"));
146
- }
147
- break;
166
+ baseValidation = UPC_COMPANY_PREFIX_VALIDATION;
167
+ break;
148
168
 
149
- case PrefixTypes.UPCCompanyPrefix:
150
- if (prefix.startsWith("0000")) {
151
- throw new RangeError(i18nextGS1.t("Prefix.upcCompanyPrefixCantStartWith0000"));
152
- }
169
+ case PrefixTypes.GS18Prefix:
170
+ if (prefix.startsWith("0")) {
171
+ throw new RangeError(i18nextGS1.t("Prefix.gs18PrefixCantStartWith0"));
172
+ }
153
173
 
154
- baseValidation = UPC_COMPANY_PREFIX_VALIDATION;
155
- break;
174
+ baseValidation = GS1_8_PREFIX_VALIDATION;
175
+ break;
176
+ }
156
177
 
157
- case PrefixTypes.GS18Prefix:
158
- if (prefix.startsWith("0")) {
159
- throw new RangeError(i18nextGS1.t("Prefix.gs18PrefixCantStartWith0"));
160
- }
178
+ const mergedValidation: PrefixValidation = {
179
+ ...baseValidation,
180
+ positionOffset
181
+ };
161
182
 
162
- baseValidation = GS1_8_PREFIX_VALIDATION;
163
- break;
164
- }
183
+ // If from key and numeric, key validation will take care of character set validation.
184
+ if (!isFromIdentifier) {
185
+ NUMERIC_CREATOR.validate(prefix, mergedValidation);
186
+ } else if (!isNumericIdentifier) {
187
+ // Validate only the minimum length, allowing at least one character for the (possibly non-numeric) reference.
188
+ NUMERIC_CREATOR.validate(prefix.substring(0, Math.min(mergedValidation.minimumLength, prefix.length - 1)), mergedValidation);
189
+ }
190
+ },
165
191
 
166
- const mergedValidation: PrefixValidation = {
167
- ...baseValidation,
168
- positionOffset
169
- };
170
-
171
- // If from key and numeric, key validation will take care of character set validation.
172
- if (!isFromIdentifier) {
173
- NUMERIC_CREATOR.validate(prefix, mergedValidation);
174
- } else if (!isNumericIdentifier) {
175
- // Validate only the minimum length, allowing at least one character for the (possibly non-numeric) reference.
176
- NUMERIC_CREATOR.validate(prefix.substring(0, Math.min(mergedValidation.minimumLength, prefix.length - 1)), mergedValidation);
192
+ /**
193
+ * Normalize a prefix.
194
+ *
195
+ * @param prefixType
196
+ * Prefix type.
197
+ *
198
+ * @param prefix
199
+ * Prefix.
200
+ *
201
+ * @returns
202
+ * Prefix provider with normalized prefix type and prefix.
203
+ */
204
+ normalize(prefixType: PrefixType, prefix: string): PrefixProvider {
205
+ // Validate first.
206
+ this.validate(prefixType, true, true, prefix);
207
+
208
+ let gs1CompanyPrefix: string;
209
+
210
+ // First step is to map the prefix to a GS1 Company Prefix.
211
+ switch (prefixType) {
212
+ case PrefixTypes.GS1CompanyPrefix:
213
+ gs1CompanyPrefix = prefix;
214
+ break;
215
+
216
+ case PrefixTypes.UPCCompanyPrefix:
217
+ gs1CompanyPrefix = "0" + prefix;
218
+ break;
219
+
220
+ case PrefixTypes.GS18Prefix:
221
+ gs1CompanyPrefix = "00000" + prefix;
222
+ break;
223
+ }
224
+
225
+ let normalizedPrefixType: PrefixType;
226
+ let normalizedPrefix: string;
227
+
228
+ let upcCompanyPrefix: string | undefined = undefined;
229
+ let gs18Prefix: string | undefined = undefined;
230
+
231
+ // Determine the prefix type and populate the remaining fields.
232
+ if (!gs1CompanyPrefix.startsWith("0")) {
233
+ normalizedPrefixType = PrefixTypes.GS1CompanyPrefix;
234
+ normalizedPrefix = gs1CompanyPrefix;
235
+ } else if (!gs1CompanyPrefix.startsWith("00000")) {
236
+ normalizedPrefixType = PrefixTypes.UPCCompanyPrefix;
237
+ upcCompanyPrefix = gs1CompanyPrefix.substring(1);
238
+ normalizedPrefix = upcCompanyPrefix;
239
+ } else {
240
+ normalizedPrefixType = PrefixTypes.GS18Prefix;
241
+ gs18Prefix = gs1CompanyPrefix.substring(5);
242
+ normalizedPrefix = gs18Prefix;
243
+ }
244
+
245
+ return {
246
+ prefixType: normalizedPrefixType,
247
+ prefix: normalizedPrefix,
248
+ gs1CompanyPrefix,
249
+ upcCompanyPrefix,
250
+ gs18Prefix
251
+ };
177
252
  }
178
- }
179
-
180
- /**
181
- * Prefix validator.
182
- */
183
- export const PrefixValidator = {
184
- GS1_COMPANY_PREFIX_MINIMUM_LENGTH,
185
- GS1_COMPANY_PREFIX_MAXIMUM_LENGTH,
186
- UPC_COMPANY_PREFIX_MINIMUM_LENGTH,
187
- UPC_COMPANY_PREFIX_MAXIMUM_LENGTH,
188
- GS1_8_PREFIX_MINIMUM_LENGTH,
189
- GS1_8_PREFIX_MAXIMUM_LENGTH,
190
- validate
191
253
  } as const;
@@ -1,10 +1,9 @@
1
1
  import { mapIterable, type TransformerInput, type TransformerOutput } from "@aidc-toolkit/utility";
2
2
  import { Mixin } from "ts-mixer";
3
- import type { IdentifierType } from "./identifier-type";
4
- import type { ContentCharacterSet } from "./identifier-validator";
5
- import { AbstractNumericIdentifierCreator } from "./numeric-identifier-creator";
6
- import type { PrefixProvider } from "./prefix-provider";
7
- import { SerializableNumericIdentifierValidator } from "./serializable-numeric-identifier-validator";
3
+ import { AbstractNumericIdentifierCreator } from "./abstract-numeric-identifier-creator.js";
4
+ import type { PrefixProvider } from "./prefix-provider.js";
5
+ import type { SerializableNumericIdentifierType } from "./serializable-numeric-identifier-type.js";
6
+ import { SerializableNumericIdentifierValidator } from "./serializable-numeric-identifier-validator.js";
8
7
 
9
8
  /**
10
9
  * Serializable numeric identifier creator.
@@ -19,18 +18,9 @@ export class SerializableNumericIdentifierCreator extends Mixin(SerializableNume
19
18
  *
20
19
  * @param identifierType
21
20
  * Identifier type.
22
- *
23
- * @param length
24
- * Length.
25
- *
26
- * @param serialComponentLength
27
- * Serial component length.
28
- *
29
- * @param serialComponentCharacterSet
30
- * Serial component character set.
31
21
  */
32
- constructor(prefixProvider: PrefixProvider, identifierType: IdentifierType, length: number, serialComponentLength: number, serialComponentCharacterSet: ContentCharacterSet) {
33
- super(identifierType, length, serialComponentLength, serialComponentCharacterSet);
22
+ constructor(prefixProvider: PrefixProvider, identifierType: SerializableNumericIdentifierType) {
23
+ super(identifierType);
34
24
 
35
25
  this.init(prefixProvider, prefixProvider.gs1CompanyPrefix);
36
26
  }
@@ -0,0 +1,29 @@
1
+ import type { ContentCharacterSet } from "./content-character-set.js";
2
+ import type { NonGTINNumericIdentifierDescriptor } from "./non-gtin-numeric-identifier-descriptor.js";
3
+ import type { LeaderTypes } from "./numeric-identifier-type.js";
4
+ import type { SerializableNumericIdentifierType } from "./serializable-numeric-identifier-type.js";
5
+
6
+ /**
7
+ * Serializable numeric identifier descriptor.
8
+ */
9
+ export interface SerializableNumericIdentifierDescriptor extends NonGTINNumericIdentifierDescriptor {
10
+ /**
11
+ * @inheritDoc
12
+ */
13
+ readonly identifierType: SerializableNumericIdentifierType;
14
+
15
+ /**
16
+ * @inheritDoc
17
+ */
18
+ readonly leaderType: typeof LeaderTypes.None;
19
+
20
+ /**
21
+ * Serial component length.
22
+ */
23
+ readonly serialComponentLength: number;
24
+
25
+ /**
26
+ * Serial component character set.
27
+ */
28
+ readonly serialComponentCharacterSet: ContentCharacterSet;
29
+ }
@@ -0,0 +1,9 @@
1
+ import type { IdentifierTypes } from "./identifier-type.js";
2
+
3
+ /**
4
+ * Serializable numeric identifier type.
5
+ */
6
+ export type SerializableNumericIdentifierType =
7
+ typeof IdentifierTypes.GRAI |
8
+ typeof IdentifierTypes.GDTI |
9
+ typeof IdentifierTypes.GCN;
@@ -1,23 +1,17 @@
1
1
  import type { CharacterSetCreator, CharacterSetValidation } from "@aidc-toolkit/utility";
2
- import { type IdentifierType, IdentifierTypes } from "./identifier-type";
3
- import { type ContentCharacterSet, ContentCharacterSets, type IdentifierValidation } from "./identifier-validator";
4
- import { i18nextGS1 } from "./locale/i18n";
5
- import {
6
- type NonGTINNumericIdentifierType,
7
- NonGTINNumericIdentifierValidator
8
- } from "./non-gtin-numeric-identifier-validator";
9
- import { LeaderTypes } from "./numeric-identifier-validator";
2
+ import { AbstractNumericIdentifierValidator } from "./abstract-numeric-identifier-validator.js";
3
+ import type { ContentCharacterSet } from "./content-character-set.js";
4
+ import { IdentifierDescriptors } from "./descriptors.js";
5
+ import type { IdentifierValidation } from "./identifier-validator.js";
6
+ import { i18nextGS1 } from "./locale/i18n.js";
7
+ import type { SerializableNumericIdentifierDescriptor } from "./serializable-numeric-identifier-descriptor.js";
8
+ import type { SerializableNumericIdentifierType } from "./serializable-numeric-identifier-type.js";
10
9
 
11
10
  /**
12
- * Serializable numeric identifier type.
11
+ * Serializable numeric identifier validator. Validates both serialized and non-serialized forms of numeric identifiers
12
+ * that support serialization.
13
13
  */
14
- export type SerializableNumericIdentifierType = Exclude<NonGTINNumericIdentifierType, typeof IdentifierTypes.GLN | typeof IdentifierTypes.SSCC | typeof IdentifierTypes.GSRN | typeof IdentifierTypes.GSIN>;
15
-
16
- /**
17
- * Serializable numeric identifier validator. Validates both serialized and non-serialized forms of
18
- * numeric identifiers that support serialization.
19
- */
20
- export class SerializableNumericIdentifierValidator extends NonGTINNumericIdentifierValidator {
14
+ export class SerializableNumericIdentifierValidator extends AbstractNumericIdentifierValidator<SerializableNumericIdentifierDescriptor> {
21
15
  /**
22
16
  * Serial component length.
23
17
  */
@@ -43,29 +37,22 @@ export class SerializableNumericIdentifierValidator extends NonGTINNumericIdenti
43
37
  *
44
38
  * @param identifierType
45
39
  * Identifier type.
46
- *
47
- * @param length
48
- * Length.
49
- *
50
- * @param serialComponentLength
51
- * Serial component length.
52
- *
53
- * @param serialComponentCharacterSet
54
- * Serial component character set.
55
40
  */
56
- constructor(identifierType: IdentifierType, length: number, serialComponentLength: number, serialComponentCharacterSet: ContentCharacterSet) {
57
- super(identifierType, length, LeaderTypes.None);
41
+ constructor(identifierType: SerializableNumericIdentifierType) {
42
+ const identifierDescriptor = IdentifierDescriptors[identifierType];
43
+
44
+ super(identifierDescriptor);
58
45
 
59
- this._serialComponentLength = serialComponentLength;
60
- this._serialComponentCharacterSet = serialComponentCharacterSet;
46
+ this._serialComponentLength = identifierDescriptor.serialComponentLength;
47
+ this._serialComponentCharacterSet = identifierDescriptor.serialComponentCharacterSet;
61
48
 
62
49
  this._serialComponentValidation = {
63
50
  minimumLength: 1,
64
- maximumLength: serialComponentLength,
51
+ maximumLength: identifierDescriptor.serialComponentLength,
65
52
  component: () => i18nextGS1.t("Identifier.serialComponent")
66
53
  };
67
54
 
68
- this._serialComponentCreator = SerializableNumericIdentifierValidator.creatorFor(serialComponentCharacterSet);
55
+ this._serialComponentCreator = SerializableNumericIdentifierValidator.creatorFor(identifierDescriptor.serialComponentCharacterSet);
69
56
  }
70
57
 
71
58
  /**
@@ -107,18 +94,3 @@ export class SerializableNumericIdentifierValidator extends NonGTINNumericIdenti
107
94
  }
108
95
  }
109
96
  }
110
-
111
- /**
112
- * GRAI validator.
113
- */
114
- export const GRAI_VALIDATOR = new SerializableNumericIdentifierValidator(IdentifierTypes.GRAI, 13, 16, ContentCharacterSets.AI82);
115
-
116
- /**
117
- * GDTI validator.
118
- */
119
- export const GDTI_VALIDATOR = new SerializableNumericIdentifierValidator(IdentifierTypes.GDTI, 13, 17, ContentCharacterSets.AI82);
120
-
121
- /**
122
- * GCN validator.
123
- */
124
- export const GCN_VALIDATOR = new SerializableNumericIdentifierValidator(IdentifierTypes.GCN, 13, 12, ContentCharacterSets.Numeric);
@@ -0,0 +1,203 @@
1
+ import {
2
+ isGTINDescriptor,
3
+ isGTINDescriptors,
4
+ isNonGTINNumericIdentifierDescriptor,
5
+ isNonNumericIdentifierDescriptor,
6
+ isNumericIdentifierDescriptor,
7
+ isSerializableNumericIdentifierDescriptor
8
+ } from "./descriptors.js";
9
+ import type { GTINBaseType } from "./gtin-type.js";
10
+ import { GTIN_VALIDATORS, type GTINValidator } from "./gtin-validator.js";
11
+ import { type IdentifierType, IdentifierTypes } from "./identifier-type.js";
12
+ import type { IdentifierValidator } from "./identifier-validator.js";
13
+ import type { NonGTINNumericIdentifierType } from "./non-gtin-numeric-identifier-type.js";
14
+ import { NonGTINNumericIdentifierValidator } from "./non-gtin-numeric-identifier-validator.js";
15
+ import type { NonNumericIdentifierType } from "./non-numeric-identifier-type.js";
16
+ import { NonNumericIdentifierValidator } from "./non-numeric-identifier-validator.js";
17
+ import type { NumericIdentifierValidator } from "./numeric-identifier-validator.js";
18
+ import type { SerializableNumericIdentifierType } from "./serializable-numeric-identifier-type.js";
19
+ import { SerializableNumericIdentifierValidator } from "./serializable-numeric-identifier-validator.js";
20
+
21
+ /**
22
+ * GLN validator.
23
+ */
24
+ const GLN_VALIDATOR = new NonGTINNumericIdentifierValidator(IdentifierTypes.GLN);
25
+
26
+ /**
27
+ * SSCC validator.
28
+ */
29
+ const SSCC_VALIDATOR = new NonGTINNumericIdentifierValidator(IdentifierTypes.SSCC);
30
+
31
+ /**
32
+ * GRAI validator.
33
+ */
34
+ const GRAI_VALIDATOR = new SerializableNumericIdentifierValidator(IdentifierTypes.GRAI);
35
+
36
+ /**
37
+ * GIAI validator.
38
+ */
39
+ const GIAI_VALIDATOR = new NonNumericIdentifierValidator(IdentifierTypes.GIAI);
40
+
41
+ /**
42
+ * GSRN validator.
43
+ */
44
+ const GSRN_VALIDATOR = new NonGTINNumericIdentifierValidator(IdentifierTypes.GSRN);
45
+
46
+ /**
47
+ * GDTI validator.
48
+ */
49
+ const GDTI_VALIDATOR = new SerializableNumericIdentifierValidator(IdentifierTypes.GDTI);
50
+
51
+ /**
52
+ * GINC validator.
53
+ */
54
+ const GINC_VALIDATOR = new NonNumericIdentifierValidator(IdentifierTypes.GINC);
55
+
56
+ /**
57
+ * GSIN validator.
58
+ */
59
+ const GSIN_VALIDATOR = new NonGTINNumericIdentifierValidator(IdentifierTypes.GSIN);
60
+
61
+ /**
62
+ * GCN validator.
63
+ */
64
+ const GCN_VALIDATOR = new SerializableNumericIdentifierValidator(IdentifierTypes.GCN);
65
+
66
+ /**
67
+ * CPID validator.
68
+ */
69
+ const CPID_VALIDATOR = new NonNumericIdentifierValidator(IdentifierTypes.CPID);
70
+
71
+ /**
72
+ * GMN validator.
73
+ */
74
+ const GMN_VALIDATOR = new NonNumericIdentifierValidator(IdentifierTypes.GMN);
75
+
76
+ /**
77
+ * Identifier validator type based on identifier type type.
78
+ *
79
+ * @template TIdentifierType
80
+ * Identifier type type.
81
+ */
82
+ export type IdentifierTypeValidator<TIdentifierType extends IdentifierType> = TIdentifierType extends NonNumericIdentifierType ?
83
+ NonNumericIdentifierValidator :
84
+ TIdentifierType extends SerializableNumericIdentifierType ?
85
+ SerializableNumericIdentifierValidator :
86
+ TIdentifierType extends NonGTINNumericIdentifierType ?
87
+ NonGTINNumericIdentifierValidator :
88
+ TIdentifierType extends typeof IdentifierTypes.GTIN ?
89
+ GTINValidator :
90
+ IdentifierValidator;
91
+
92
+ /**
93
+ * Identifier validators entry type based on identifier type type.
94
+ *
95
+ * @template TIdentifierType
96
+ * Identifier type type.
97
+ */
98
+ export type IdentifierValidatorsEntry<TIdentifierType extends IdentifierType> = TIdentifierType extends typeof IdentifierTypes.GTIN ?
99
+ Readonly<Record<GTINBaseType, GTINValidator>> :
100
+ IdentifierTypeValidator<TIdentifierType>;
101
+
102
+ /**
103
+ * Identifier validators record type.
104
+ */
105
+ export type IdentifierValidatorsRecord = {
106
+ [TIdentifierType in IdentifierType]: IdentifierValidatorsEntry<TIdentifierType>;
107
+ };
108
+
109
+ /**
110
+ * Identifier validators for all identifier types.
111
+ */
112
+ export const IdentifierValidators: IdentifierValidatorsRecord = {
113
+ [IdentifierTypes.GTIN]: GTIN_VALIDATORS,
114
+ [IdentifierTypes.GLN]: GLN_VALIDATOR,
115
+ [IdentifierTypes.SSCC]: SSCC_VALIDATOR,
116
+ [IdentifierTypes.GRAI]: GRAI_VALIDATOR,
117
+ [IdentifierTypes.GIAI]: GIAI_VALIDATOR,
118
+ [IdentifierTypes.GSRN]: GSRN_VALIDATOR,
119
+ [IdentifierTypes.GDTI]: GDTI_VALIDATOR,
120
+ [IdentifierTypes.GINC]: GINC_VALIDATOR,
121
+ [IdentifierTypes.GSIN]: GSIN_VALIDATOR,
122
+ [IdentifierTypes.GCN]: GCN_VALIDATOR,
123
+ [IdentifierTypes.CPID]: CPID_VALIDATOR,
124
+ [IdentifierTypes.GMN]: GMN_VALIDATOR
125
+ } as const;
126
+
127
+ /**
128
+ * Determine if identifier validators or validator is GTIN validators.
129
+ *
130
+ * @param identifierValidatorsOrValidator
131
+ * Identifier validators or validator.
132
+ *
133
+ * @returns
134
+ * True if GTIN validators.
135
+ */
136
+ export function isGTINValidators(identifierValidatorsOrValidator: IdentifierValidatorsEntry<IdentifierType>): identifierValidatorsOrValidator is Readonly<Record<GTINBaseType, GTINValidator>> {
137
+ return isGTINDescriptors(identifierValidatorsOrValidator);
138
+ }
139
+
140
+ /**
141
+ * Determine if identifier validator is a numeric identifier validator.
142
+ *
143
+ * @param identifierValidator
144
+ * Identifier validator.
145
+ *
146
+ * @returns
147
+ * True if identifier validator is a numeric identifier validator.
148
+ */
149
+ export function isNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NumericIdentifierValidator {
150
+ return isNumericIdentifierDescriptor(identifierValidator);
151
+ }
152
+
153
+ /**
154
+ * Determine if identifier validator is a GTIN validator.
155
+ *
156
+ * @param identifierValidator
157
+ * Identifier validator.
158
+ *
159
+ * @returns
160
+ * True if identifier validator is a GTIN validator.
161
+ */
162
+ export function isGTINValidator(identifierValidator: IdentifierValidator): identifierValidator is GTINValidator {
163
+ return isGTINDescriptor(identifierValidator);
164
+ }
165
+
166
+ /**
167
+ * Determine if identifier validator is a non-GTIN numeric identifier validator.
168
+ *
169
+ * @param identifierValidator
170
+ * Identifier validator.
171
+ *
172
+ * @returns
173
+ * True if identifier validator is a non-GTIN numeric identifier validator.
174
+ */
175
+ export function isNonGTINNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NonGTINNumericIdentifierValidator {
176
+ return isNonGTINNumericIdentifierDescriptor(identifierValidator);
177
+ }
178
+
179
+ /**
180
+ * Determine if identifier validator is a serializable numeric identifier validator.
181
+ *
182
+ * @param identifierValidator
183
+ * Identifier validator.
184
+ *
185
+ * @returns
186
+ * True if identifier validator is a serializable numeric identifier validator.
187
+ */
188
+ export function isSerializableNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is SerializableNumericIdentifierValidator {
189
+ return isSerializableNumericIdentifierDescriptor(identifierValidator);
190
+ }
191
+
192
+ /**
193
+ * Determine if identifier validator is a non-numeric identifier validator.
194
+ *
195
+ * @param identifierValidator
196
+ * Identifier validator.
197
+ *
198
+ * @returns
199
+ * True if identifier validator is a non-numeric identifier validator.
200
+ */
201
+ export function isNonNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NonNumericIdentifierValidator {
202
+ return isNonNumericIdentifierDescriptor(identifierValidator);
203
+ }
@@ -8,7 +8,7 @@ import {
8
8
  hasValidCheckDigit,
9
9
  isValidPriceOrWeightCheckDigit,
10
10
  priceOrWeightCheckDigit
11
- } from "../src";
11
+ } from "../src/index.js";
12
12
 
13
13
  describe("Check digit", () => {
14
14
  const testNumericString = "1234567890";
@@ -1,11 +1,9 @@
1
1
  import { describe } from "vitest";
2
- import { PrefixManager, PrefixTypes } from "../src";
3
- import { testGTINCreator } from "./gtin-creator";
4
- import {
5
- testNonGTINNumericIdentifierCreator,
6
- testNonNumericIdentifierCreator
7
- } from "./non-gtin-numeric-identifier-creator";
8
- import { testSerializableNumericIdentifierCreator } from "./serializable-numeric-identifier-creator";
2
+ import { PrefixManager, PrefixTypes } from "../src/index.js";
3
+ import { testGTINCreator } from "./gtin-creator.js";
4
+ import { testNonGTINNumericIdentifierCreator } from "./non-gtin-numeric-identifier-creator.js";
5
+ import { testNonNumericIdentifierCreator } from "./non-numeric-identifier-creator.js";
6
+ import { testSerializableNumericIdentifierCreator } from "./serializable-numeric-identifier-creator.js";
9
7
 
10
8
  describe("Creators", () => {
11
9
  testGTINCreator(PrefixManager.get(PrefixTypes.GS1CompanyPrefix, "952123456").gtinCreator);
@@ -1,10 +1,14 @@
1
1
  import { CharacterSetCreator, Sequence } from "@aidc-toolkit/utility";
2
2
  import { expect, test } from "vitest";
3
- import { type GTINCreator, GTINTypes, GTINValidator, hasValidCheckDigit, PrefixTypes } from "../src";
4
- import { testNumericIdentifierCreator } from "./numeric-identifier-creator";
3
+ import { type GTINCreator, GTINTypes, GTINValidator, hasValidCheckDigit, isGTINCreator, PrefixTypes } from "../src/index.js";
4
+ import { testNumericIdentifierCreator } from "./numeric-identifier-creator.js";
5
5
 
6
6
  export function testGTINCreator(creator: GTINCreator): void {
7
7
  testNumericIdentifierCreator(creator, () => {
8
+ test("Mapping", () => {
9
+ expect(isGTINCreator(creator)).toBe(true);
10
+ });
11
+
8
12
  test("Length", () => {
9
13
  switch (creator.prefixType) {
10
14
  case PrefixTypes.GS1CompanyPrefix: