@aidc-toolkit/gs1 1.0.26-beta → 1.0.28-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 (205) hide show
  1. package/dist/abstract-identifier-creator.d.ts +32 -66
  2. package/dist/abstract-identifier-creator.d.ts.map +1 -1
  3. package/dist/abstract-identifier-creator.js +62 -45
  4. package/dist/abstract-identifier-creator.js.map +1 -1
  5. package/dist/abstract-non-gtin-numeric-identifier-creator.d.ts +36 -0
  6. package/dist/abstract-non-gtin-numeric-identifier-creator.d.ts.map +1 -0
  7. package/dist/abstract-non-gtin-numeric-identifier-creator.js +37 -0
  8. package/dist/abstract-non-gtin-numeric-identifier-creator.js.map +1 -0
  9. package/dist/abstract-numeric-identifier-creator.d.ts +28 -86
  10. package/dist/abstract-numeric-identifier-creator.d.ts.map +1 -1
  11. package/dist/abstract-numeric-identifier-creator.js +138 -121
  12. package/dist/abstract-numeric-identifier-creator.js.map +1 -1
  13. package/dist/content-character-set-creators.d.ts +4 -0
  14. package/dist/content-character-set-creators.d.ts.map +1 -0
  15. package/dist/content-character-set-creators.js +9 -0
  16. package/dist/content-character-set-creators.js.map +1 -0
  17. package/dist/gtin-creator.d.ts +8 -13
  18. package/dist/gtin-creator.d.ts.map +1 -1
  19. package/dist/gtin-creator.js +12 -15
  20. package/dist/gtin-creator.js.map +1 -1
  21. package/dist/gtin-descriptor.d.ts +8 -3
  22. package/dist/gtin-descriptor.d.ts.map +1 -1
  23. package/dist/gtin-length.d.ts +64 -0
  24. package/dist/gtin-length.d.ts.map +1 -0
  25. package/dist/gtin-length.js +36 -0
  26. package/dist/gtin-length.js.map +1 -0
  27. package/dist/gtin-type.d.ts +15 -28
  28. package/dist/gtin-type.d.ts.map +1 -1
  29. package/dist/gtin-type.js +4 -28
  30. package/dist/gtin-type.js.map +1 -1
  31. package/dist/gtin-validator.d.ts +9 -23
  32. package/dist/gtin-validator.d.ts.map +1 -1
  33. package/dist/gtin-validator.js +32 -39
  34. package/dist/gtin-validator.js.map +1 -1
  35. package/dist/identifier-creator.d.ts +4 -4
  36. package/dist/identifier-creator.d.ts.map +1 -1
  37. package/dist/{creators.d.ts → identifier-creators.d.ts} +47 -10
  38. package/dist/identifier-creators.d.ts.map +1 -0
  39. package/dist/identifier-creators.js +92 -0
  40. package/dist/identifier-creators.js.map +1 -0
  41. package/dist/{descriptors.d.ts → identifier-descriptors.d.ts} +20 -10
  42. package/dist/identifier-descriptors.d.ts.map +1 -0
  43. package/dist/{descriptors.js → identifier-descriptors.js} +27 -31
  44. package/dist/identifier-descriptors.js.map +1 -0
  45. package/dist/identifier-extension.d.ts +82 -0
  46. package/dist/identifier-extension.d.ts.map +1 -0
  47. package/dist/identifier-extension.js +79 -0
  48. package/dist/identifier-extension.js.map +1 -0
  49. package/dist/identifier-validator.d.ts +44 -9
  50. package/dist/identifier-validator.d.ts.map +1 -1
  51. package/dist/identifier-validator.js +109 -1
  52. package/dist/identifier-validator.js.map +1 -1
  53. package/dist/{validators.d.ts → identifier-validators.d.ts} +47 -12
  54. package/dist/identifier-validators.d.ts.map +1 -0
  55. package/dist/{validators.js → identifier-validators.js} +40 -13
  56. package/dist/identifier-validators.js.map +1 -0
  57. package/dist/index.d.ts +15 -9
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +13 -4
  60. package/dist/index.js.map +1 -1
  61. package/dist/leader-type.d.ts +26 -0
  62. package/dist/leader-type.d.ts.map +1 -0
  63. package/dist/leader-type.js +18 -0
  64. package/dist/leader-type.js.map +1 -0
  65. package/dist/non-gtin-numeric-identifier-creator.d.ts +7 -19
  66. package/dist/non-gtin-numeric-identifier-creator.d.ts.map +1 -1
  67. package/dist/non-gtin-numeric-identifier-creator.js +1 -22
  68. package/dist/non-gtin-numeric-identifier-creator.js.map +1 -1
  69. package/dist/non-gtin-numeric-identifier-descriptor.d.ts +1 -1
  70. package/dist/non-gtin-numeric-identifier-descriptor.d.ts.map +1 -1
  71. package/dist/non-gtin-numeric-identifier-type.d.ts +22 -3
  72. package/dist/non-gtin-numeric-identifier-type.d.ts.map +1 -1
  73. package/dist/non-gtin-numeric-identifier-type.js +7 -1
  74. package/dist/non-gtin-numeric-identifier-type.js.map +1 -1
  75. package/dist/non-gtin-numeric-identifier-validator.d.ts +5 -10
  76. package/dist/non-gtin-numeric-identifier-validator.d.ts.map +1 -1
  77. package/dist/non-gtin-numeric-identifier-validator.js +5 -12
  78. package/dist/non-gtin-numeric-identifier-validator.js.map +1 -1
  79. package/dist/non-numeric-identifier-creator.d.ts +4 -9
  80. package/dist/non-numeric-identifier-creator.d.ts.map +1 -1
  81. package/dist/non-numeric-identifier-creator.js +8 -10
  82. package/dist/non-numeric-identifier-creator.js.map +1 -1
  83. package/dist/non-numeric-identifier-type.d.ts +22 -3
  84. package/dist/non-numeric-identifier-type.d.ts.map +1 -1
  85. package/dist/non-numeric-identifier-type.js +7 -1
  86. package/dist/non-numeric-identifier-type.js.map +1 -1
  87. package/dist/non-numeric-identifier-validator.d.ts +3 -11
  88. package/dist/non-numeric-identifier-validator.d.ts.map +1 -1
  89. package/dist/non-numeric-identifier-validator.js +8 -8
  90. package/dist/non-numeric-identifier-validator.js.map +1 -1
  91. package/dist/non-serializable-numeric-identifier-creator.d.ts +10 -0
  92. package/dist/non-serializable-numeric-identifier-creator.d.ts.map +1 -0
  93. package/dist/non-serializable-numeric-identifier-creator.js +8 -0
  94. package/dist/non-serializable-numeric-identifier-creator.js.map +1 -0
  95. package/dist/non-serializable-numeric-identifier-descriptor.d.ts +12 -0
  96. package/dist/non-serializable-numeric-identifier-descriptor.d.ts.map +1 -0
  97. package/dist/non-serializable-numeric-identifier-descriptor.js +2 -0
  98. package/dist/non-serializable-numeric-identifier-descriptor.js.map +1 -0
  99. package/dist/non-serializable-numeric-identifier-type.d.ts +26 -0
  100. package/dist/non-serializable-numeric-identifier-type.d.ts.map +1 -0
  101. package/dist/non-serializable-numeric-identifier-type.js +7 -0
  102. package/dist/non-serializable-numeric-identifier-type.js.map +1 -0
  103. package/dist/non-serializable-numeric-identifier-validator.d.ts +16 -0
  104. package/dist/non-serializable-numeric-identifier-validator.d.ts.map +1 -0
  105. package/dist/non-serializable-numeric-identifier-validator.js +17 -0
  106. package/dist/non-serializable-numeric-identifier-validator.js.map +1 -0
  107. package/dist/numeric-identifier-creator.d.ts +6 -6
  108. package/dist/numeric-identifier-creator.d.ts.map +1 -1
  109. package/dist/numeric-identifier-descriptor.d.ts +2 -1
  110. package/dist/numeric-identifier-descriptor.d.ts.map +1 -1
  111. package/dist/numeric-identifier-type.d.ts +19 -24
  112. package/dist/numeric-identifier-type.d.ts.map +1 -1
  113. package/dist/numeric-identifier-type.js +4 -15
  114. package/dist/numeric-identifier-type.js.map +1 -1
  115. package/dist/numeric-identifier-validator.d.ts +20 -6
  116. package/dist/numeric-identifier-validator.d.ts.map +1 -1
  117. package/dist/numeric-identifier-validator.js +60 -1
  118. package/dist/numeric-identifier-validator.js.map +1 -1
  119. package/dist/prefix-manager.d.ts +13 -94
  120. package/dist/prefix-manager.d.ts.map +1 -1
  121. package/dist/prefix-manager.js +65 -102
  122. package/dist/prefix-manager.js.map +1 -1
  123. package/dist/serializable-numeric-identifier-creator.d.ts +3 -31
  124. package/dist/serializable-numeric-identifier-creator.d.ts.map +1 -1
  125. package/dist/serializable-numeric-identifier-creator.js +7 -21
  126. package/dist/serializable-numeric-identifier-creator.js.map +1 -1
  127. package/dist/serializable-numeric-identifier-descriptor.d.ts +1 -1
  128. package/dist/serializable-numeric-identifier-descriptor.d.ts.map +1 -1
  129. package/dist/serializable-numeric-identifier-type.d.ts +22 -2
  130. package/dist/serializable-numeric-identifier-type.d.ts.map +1 -1
  131. package/dist/serializable-numeric-identifier-type.js +7 -1
  132. package/dist/serializable-numeric-identifier-type.js.map +1 -1
  133. package/dist/serializable-numeric-identifier-validator.d.ts +3 -18
  134. package/dist/serializable-numeric-identifier-validator.d.ts.map +1 -1
  135. package/dist/serializable-numeric-identifier-validator.js +17 -16
  136. package/dist/serializable-numeric-identifier-validator.js.map +1 -1
  137. package/package.json +4 -5
  138. package/src/abstract-identifier-creator.ts +104 -75
  139. package/src/abstract-non-gtin-numeric-identifier-creator.ts +81 -0
  140. package/src/abstract-numeric-identifier-creator.ts +185 -133
  141. package/src/content-character-set-creators.ts +9 -0
  142. package/src/gtin-creator.ts +15 -16
  143. package/src/gtin-descriptor.ts +9 -3
  144. package/src/gtin-length.ts +61 -0
  145. package/src/gtin-type.ts +6 -37
  146. package/src/gtin-validator.ts +34 -41
  147. package/src/identifier-creator.ts +4 -4
  148. package/src/identifier-creators.ts +177 -0
  149. package/src/{descriptors.ts → identifier-descriptors.ts} +56 -54
  150. package/src/identifier-extension.ts +155 -0
  151. package/src/identifier-validator.ts +93 -10
  152. package/src/{validators.ts → identifier-validators.ts} +98 -36
  153. package/src/index.ts +15 -9
  154. package/src/leader-type.ts +29 -0
  155. package/src/non-gtin-numeric-identifier-creator.ts +7 -22
  156. package/src/non-gtin-numeric-identifier-descriptor.ts +1 -1
  157. package/src/non-gtin-numeric-identifier-type.ts +14 -3
  158. package/src/non-gtin-numeric-identifier-validator.ts +5 -13
  159. package/src/non-numeric-identifier-creator.ts +15 -12
  160. package/src/non-numeric-identifier-type.ts +14 -3
  161. package/src/non-numeric-identifier-validator.ts +8 -9
  162. package/src/non-serializable-numeric-identifier-creator.ts +11 -0
  163. package/src/non-serializable-numeric-identifier-descriptor.ts +12 -0
  164. package/src/non-serializable-numeric-identifier-type.ts +22 -0
  165. package/src/non-serializable-numeric-identifier-validator.ts +19 -0
  166. package/src/numeric-identifier-creator.ts +7 -6
  167. package/src/numeric-identifier-descriptor.ts +2 -1
  168. package/src/numeric-identifier-type.ts +17 -35
  169. package/src/numeric-identifier-validator.ts +61 -6
  170. package/src/prefix-manager.ts +76 -112
  171. package/src/serializable-numeric-identifier-creator.ts +10 -25
  172. package/src/serializable-numeric-identifier-descriptor.ts +1 -1
  173. package/src/serializable-numeric-identifier-type.ts +14 -5
  174. package/src/serializable-numeric-identifier-validator.ts +17 -16
  175. package/test/gtin-creator.ts +9 -2
  176. package/test/gtin-validator.test.ts +8 -10
  177. package/test/identifier-creator.ts +7 -7
  178. package/test/mixin.test.ts +35 -0
  179. package/test/non-gtin-numeric-identifier-validator.ts +7 -2
  180. package/test/non-numeric-identifier-validator.ts +2 -2
  181. package/test/non-serializable-numeric-identifier-creator.ts +64 -0
  182. package/test/non-serializable-numeric-identifier-validator.ts +6 -0
  183. package/test/numeric-identifier-creator.ts +7 -2
  184. package/test/serializable-numeric-identifier-validator.ts +2 -2
  185. package/test/utility.ts +6 -6
  186. package/test/validator.test.ts +11 -10
  187. package/test/variable-measure-rcn.test.ts +23 -23
  188. package/dist/abstract-identifier-validator.d.ts +0 -95
  189. package/dist/abstract-identifier-validator.d.ts.map +0 -1
  190. package/dist/abstract-identifier-validator.js +0 -123
  191. package/dist/abstract-identifier-validator.js.map +0 -1
  192. package/dist/abstract-numeric-identifier-validator.d.ts +0 -35
  193. package/dist/abstract-numeric-identifier-validator.d.ts.map +0 -1
  194. package/dist/abstract-numeric-identifier-validator.js +0 -61
  195. package/dist/abstract-numeric-identifier-validator.js.map +0 -1
  196. package/dist/creators.d.ts.map +0 -1
  197. package/dist/creators.js +0 -62
  198. package/dist/creators.js.map +0 -1
  199. package/dist/descriptors.d.ts.map +0 -1
  200. package/dist/descriptors.js.map +0 -1
  201. package/dist/validators.d.ts.map +0 -1
  202. package/dist/validators.js.map +0 -1
  203. package/src/abstract-identifier-validator.ts +0 -140
  204. package/src/abstract-numeric-identifier-validator.ts +0 -69
  205. package/src/creators.ts +0 -113
@@ -0,0 +1,155 @@
1
+ import type { GTINDescriptor } from "./gtin-descriptor.js";
2
+ import { type GTINType, GTINTypes } from "./gtin-type.js";
3
+ import type { IdentifierDescriptor } from "./identifier-descriptor.js";
4
+ import type { IdentifierType } from "./identifier-type.js";
5
+ import type { NonGTINNumericIdentifierDescriptor } from "./non-gtin-numeric-identifier-descriptor.js";
6
+ import {
7
+ type NonGTINNumericIdentifierType,
8
+ NonGTINNumericIdentifierTypes
9
+ } from "./non-gtin-numeric-identifier-type.js";
10
+ import type { NonNumericIdentifierDescriptor } from "./non-numeric-identifier-descriptor.js";
11
+ import { type NonNumericIdentifierType, NonNumericIdentifierTypes } from "./non-numeric-identifier-type.js";
12
+ import type { NonSerializableNumericIdentifierDescriptor } from "./non-serializable-numeric-identifier-descriptor.js";
13
+ import {
14
+ type NonSerializableNumericIdentifierType,
15
+ NonSerializableNumericIdentifierTypes
16
+ } from "./non-serializable-numeric-identifier-type.js";
17
+ import type { NumericIdentifierDescriptor } from "./numeric-identifier-descriptor.js";
18
+ import { type NumericIdentifierType, NumericIdentifierTypes } from "./numeric-identifier-type.js";
19
+ import type { SerializableNumericIdentifierDescriptor } from "./serializable-numeric-identifier-descriptor.js";
20
+ import {
21
+ type SerializableNumericIdentifierType,
22
+ SerializableNumericIdentifierTypes
23
+ } from "./serializable-numeric-identifier-type.js";
24
+
25
+ /**
26
+ * Identifier extension type based on identifier type type.
27
+ *
28
+ * @template TIdentifierType
29
+ * Identifier type type.
30
+ */
31
+ export type IdentifierTypeExtension<
32
+ TIdentifierType extends IdentifierType,
33
+ TIdentifierExtension extends IdentifierDescriptor,
34
+ TNumericIdentifierExtension extends TIdentifierExtension & NumericIdentifierDescriptor,
35
+ TGTINExtension extends TNumericIdentifierExtension & GTINDescriptor,
36
+ TNonGTINNumericIdentifierExtension extends TNumericIdentifierExtension & NonGTINNumericIdentifierDescriptor,
37
+ TNonSerializableNumericIdentifierExtension extends TNonGTINNumericIdentifierExtension & NonSerializableNumericIdentifierDescriptor,
38
+ TSerializableNumericIdentifierExtension extends TNonGTINNumericIdentifierExtension & SerializableNumericIdentifierDescriptor,
39
+ TNonNumericIdentifierExtension extends TIdentifierExtension & NonNumericIdentifierDescriptor
40
+ > =
41
+ TIdentifierType extends NumericIdentifierType ?
42
+ TIdentifierType extends GTINType ?
43
+ TGTINExtension :
44
+ TIdentifierType extends NonGTINNumericIdentifierType ?
45
+ TIdentifierType extends NonSerializableNumericIdentifierType ?
46
+ TNonSerializableNumericIdentifierExtension :
47
+ TIdentifierType extends SerializableNumericIdentifierType ?
48
+ TSerializableNumericIdentifierExtension :
49
+ TNonGTINNumericIdentifierExtension :
50
+ TNumericIdentifierExtension :
51
+ TIdentifierType extends NonNumericIdentifierType ?
52
+ TNonNumericIdentifierExtension :
53
+ TIdentifierExtension;
54
+
55
+ /**
56
+ * Determine if identifier extension is a numeric identifier extension.
57
+ *
58
+ * @param identifierDescriptor
59
+ * Identifier extension.
60
+ *
61
+ * @returns
62
+ * True if identifier extension is a numeric identifier extension.
63
+ */
64
+ export function isNumericIdentifierExtension<
65
+ TIdentifierExtension extends IdentifierDescriptor,
66
+ TNumericIdentifierExtension extends TIdentifierExtension & NumericIdentifierDescriptor
67
+ >(identifierDescriptor: IdentifierDescriptor): identifierDescriptor is TNumericIdentifierExtension {
68
+ return identifierDescriptor.identifierType in NumericIdentifierTypes;
69
+ }
70
+
71
+ /**
72
+ * Determine if identifier extension is a GTIN extension.
73
+ *
74
+ * @param identifierDescriptor
75
+ * Identifier extension.
76
+ *
77
+ * @returns
78
+ * True if identifier extension is a GTIN extension.
79
+ */
80
+ export function isGTINExtension<
81
+ TIdentifierExtension extends IdentifierDescriptor,
82
+ TNumericIdentifierExtension extends TIdentifierExtension & NumericIdentifierDescriptor,
83
+ TGTINExtension extends TNumericIdentifierExtension & GTINDescriptor
84
+ >(identifierDescriptor: IdentifierDescriptor): identifierDescriptor is TGTINExtension {
85
+ return identifierDescriptor.identifierType in GTINTypes;
86
+ }
87
+
88
+ /**
89
+ * Determine if identifier extension is a non-GTIN numeric identifier extension.
90
+ *
91
+ * @param identifierDescriptor
92
+ * Identifier extension.
93
+ *
94
+ * @returns
95
+ * True if identifier extension is a non-GTIN numeric identifier extension.
96
+ */
97
+ export function isNonGTINNumericIdentifierExtension<
98
+ TIdentifierExtension extends IdentifierDescriptor,
99
+ TNumericIdentifierExtension extends TIdentifierExtension & NumericIdentifierDescriptor,
100
+ TNonGTINNumericIdentifierExtension extends TNumericIdentifierExtension & NonGTINNumericIdentifierDescriptor
101
+ >(identifierDescriptor: IdentifierDescriptor): identifierDescriptor is TNonGTINNumericIdentifierExtension {
102
+ return identifierDescriptor.identifierType in NonGTINNumericIdentifierTypes;
103
+ }
104
+
105
+ /**
106
+ * Determine if identifier extension is a non-serializable numeric identifier extension.
107
+ *
108
+ * @param identifierDescriptor
109
+ * Identifier extension.
110
+ *
111
+ * @returns
112
+ * True if identifier extension is a non-serializable numeric identifier extension.
113
+ */
114
+ export function isNonSerializableNumericIdentifierExtension<
115
+ TIdentifierExtension extends IdentifierDescriptor,
116
+ TNumericIdentifierExtension extends TIdentifierExtension & NumericIdentifierDescriptor,
117
+ TNonGTINNumericIdentifierExtension extends TNumericIdentifierExtension & NonGTINNumericIdentifierDescriptor,
118
+ TNonSerializableNumericIdentifierExtension extends TNonGTINNumericIdentifierExtension & NonSerializableNumericIdentifierDescriptor
119
+ >(identifierDescriptor: IdentifierDescriptor): identifierDescriptor is TNonSerializableNumericIdentifierExtension {
120
+ return identifierDescriptor.identifierType in NonSerializableNumericIdentifierTypes;
121
+ }
122
+
123
+ /**
124
+ * Determine if identifier extension is a serializable numeric identifier extension.
125
+ *
126
+ * @param identifierDescriptor
127
+ * Identifier extension.
128
+ *
129
+ * @returns
130
+ * True if identifier extension is a serializable numeric identifier extension.
131
+ */
132
+ export function isSerializableNumericIdentifierExtension<
133
+ TIdentifierExtension extends IdentifierDescriptor,
134
+ TNumericIdentifierExtension extends TIdentifierExtension & NumericIdentifierDescriptor,
135
+ TNonGTINNumericIdentifierExtension extends TNumericIdentifierExtension & NonGTINNumericIdentifierDescriptor,
136
+ TSerializableNumericIdentifierExtension extends TNonGTINNumericIdentifierExtension & SerializableNumericIdentifierDescriptor
137
+ >(identifierDescriptor: IdentifierDescriptor): identifierDescriptor is TSerializableNumericIdentifierExtension {
138
+ return identifierDescriptor.identifierType in SerializableNumericIdentifierTypes;
139
+ }
140
+
141
+ /**
142
+ * Determine if identifier extension is a non-numeric identifier extension.
143
+ *
144
+ * @param identifierDescriptor
145
+ * Identifier extension.
146
+ *
147
+ * @returns
148
+ * True if identifier extension is a non-numeric identifier extension.
149
+ */
150
+ export function isNonNumericIdentifierExtension<
151
+ TIdentifierExtension extends IdentifierDescriptor,
152
+ TNonNumericIdentifierExtension extends TIdentifierExtension & NonNumericIdentifierDescriptor
153
+ >(identifierDescriptor: IdentifierDescriptor): identifierDescriptor is TNonNumericIdentifierExtension {
154
+ return identifierDescriptor.identifierType in NonNumericIdentifierTypes;
155
+ }
@@ -1,5 +1,11 @@
1
1
  import type { CharacterSetCreator, StringValidation, StringValidator } from "@aidc-toolkit/utility";
2
+ import { CONTENT_CHARACTER_SET_CREATORS } from "./content-character-set-creators.js";
3
+ import { ContentCharacterSets } from "./content-character-set.js";
2
4
  import type { IdentifierDescriptor } from "./identifier-descriptor.js";
5
+ import type { IdentifierTypeDescriptor } from "./identifier-descriptors.js";
6
+ import type { IdentifierType } from "./identifier-type.js";
7
+ import { PrefixTypes } from "./prefix-type.js";
8
+ import { PrefixValidator } from "./prefix-validator.js";
3
9
 
4
10
  /**
5
11
  * Identifier validation parameters.
@@ -9,42 +15,119 @@ export interface IdentifierValidation extends StringValidation {
9
15
 
10
16
  /**
11
17
  * Identifier validator. Validates an identifier against its definition in section 3 of the {@link
12
- * https://ref.gs1.org/standards/genspecs/ | GS1 General Specifications}.
18
+ * https://ref.gs1.org/standards/genspecs/ | GS1 General Specifications}. Implements common functionality for an
19
+ * identifier validator.
13
20
  *
14
- * @template TIdentifierDescriptor
15
- * Identifier descriptor type.
21
+ * @template TIdentifierType
22
+ * Identifier type type.
16
23
  *
17
24
  * @template TIdentifierValidation
18
25
  * Identifier validation type.
19
26
  */
20
- export interface IdentifierValidator<TIdentifierDescriptor extends IdentifierDescriptor = IdentifierDescriptor, TIdentifierValidation extends IdentifierValidation = IdentifierValidation> extends StringValidator<TIdentifierValidation> {
27
+ export abstract class IdentifierValidator<TIdentifierType extends IdentifierType = IdentifierType, TIdentifierValidation extends IdentifierValidation = IdentifierValidation> implements IdentifierDescriptor, StringValidator<TIdentifierValidation> {
28
+ /**
29
+ * Identifier type.
30
+ */
31
+ readonly #identifierType: IdentifierTypeDescriptor<TIdentifierType>["identifierType"];
32
+
33
+ /**
34
+ * Length.
35
+ */
36
+ readonly #length: IdentifierTypeDescriptor<TIdentifierType>["length"];
37
+
38
+ /**
39
+ * Reference character set.
40
+ */
41
+ readonly #referenceCharacterSet: IdentifierTypeDescriptor<TIdentifierType>["referenceCharacterSet"];
42
+
43
+ /**
44
+ * Reference creator.
45
+ */
46
+ readonly #referenceCreator: CharacterSetCreator;
47
+
48
+ /**
49
+ * Constructor.
50
+ *
51
+ * @param identifierDescriptor
52
+ * Identifier descriptor.
53
+ */
54
+ protected constructor(identifierDescriptor: IdentifierTypeDescriptor<TIdentifierType>) {
55
+ this.#identifierType = identifierDescriptor.identifierType;
56
+ this.#length = identifierDescriptor.length;
57
+ this.#referenceCharacterSet = identifierDescriptor.referenceCharacterSet;
58
+ this.#referenceCreator = CONTENT_CHARACTER_SET_CREATORS[identifierDescriptor.referenceCharacterSet];
59
+ }
60
+
21
61
  /**
22
62
  * Get the identifier type. Per the GS1 General Specifications, the identifier type determines the remaining
23
63
  * properties.
24
64
  */
25
- get identifierType(): TIdentifierDescriptor["identifierType"];
65
+ get identifierType(): IdentifierTypeDescriptor<TIdentifierType>["identifierType"] {
66
+ return this.#identifierType;
67
+ }
26
68
 
27
69
  /**
28
70
  * Get the prefix type supported by the identifier type. For all identifier types except the GTIN, this is a GS1
29
71
  * Company Prefix. For the GTIN, the prefix type determines the length.
30
72
  */
31
- get prefixType(): TIdentifierDescriptor["prefixType"];
73
+ get prefixType(): IdentifierTypeDescriptor<TIdentifierType>["prefixType"] {
74
+ // All identifier types except GTIN support only the GS1 Company Prefix.
75
+ return PrefixTypes.GS1CompanyPrefix;
76
+ }
32
77
 
33
78
  /**
34
79
  * Get the length. For numeric identifier types, the length is fixed; for alphanumeric identifier types, the length
35
80
  * is the maximum.
36
81
  */
37
- get length(): number;
82
+ get length(): IdentifierTypeDescriptor<TIdentifierType>["length"] {
83
+ return this.#length;
84
+ }
38
85
 
39
86
  /**
40
87
  * Get the reference character set.
41
88
  */
42
- get referenceCharacterSet(): TIdentifierDescriptor["referenceCharacterSet"];
89
+ get referenceCharacterSet(): IdentifierTypeDescriptor<TIdentifierType>["referenceCharacterSet"] {
90
+ return this.#referenceCharacterSet;
91
+ }
43
92
 
44
93
  /**
45
94
  * Get the reference creator.
46
95
  */
47
- get referenceCreator(): CharacterSetCreator;
96
+ get referenceCreator(): CharacterSetCreator {
97
+ return this.#referenceCreator;
98
+ }
99
+
100
+ /**
101
+ * Pad an identifier on the left with zero-value character for validation purposes. This is done to align an
102
+ * identifier with a position offset for any error message that may be thrown by the reference validator.
103
+ *
104
+ * @param identifier
105
+ * Identifier.
106
+ *
107
+ * @param positionOffset
108
+ * Position offset within a larger string.
109
+ *
110
+ * @returns
111
+ * Padded identifier.
112
+ */
113
+ protected padIdentifier(identifier: string, positionOffset?: number): string {
114
+ // Identifier is returned as is if position offset is undefined.
115
+ return positionOffset === undefined ? identifier : this.referenceCreator.character(0).repeat(positionOffset).concat(identifier);
116
+ }
117
+
118
+ /**
119
+ * Validate the prefix within an identifier.
120
+ *
121
+ * @param partialIdentifier
122
+ * Partial identifier.
123
+ *
124
+ * @param positionOffset
125
+ * Position offset within a larger string.
126
+ */
127
+ protected validatePrefix(partialIdentifier: string, positionOffset?: number): void {
128
+ // Delegate to prefix validator with support for U.P.C. Company Prefix but not GS1-8 Prefix.
129
+ PrefixValidator.validate(this.prefixType, true, false, partialIdentifier, true, this.referenceCharacterSet === ContentCharacterSets.Numeric, positionOffset);
130
+ }
48
131
 
49
132
  /**
50
133
  * Validate an identifier and throw an error if validation fails.
@@ -55,5 +138,5 @@ export interface IdentifierValidator<TIdentifierDescriptor extends IdentifierDes
55
138
  * @param validation
56
139
  * Identifier validation parameters.
57
140
  */
58
- validate: (identifier: string, validation?: TIdentifierValidation) => void;
141
+ abstract validate(identifier: string, validation?: TIdentifierValidation): void;
59
142
  }
@@ -1,32 +1,33 @@
1
+ import type { GTINBaseLength } from "./gtin-length.js";
2
+ import type { GTINType } from "./gtin-type.js";
3
+ import { GTIN_VALIDATORS, GTINValidator } from "./gtin-validator.js";
4
+ import { isGTINDescriptors } from "./identifier-descriptors.js";
1
5
  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";
6
+ type IdentifierTypeExtension,
7
+ isGTINExtension,
8
+ isNonGTINNumericIdentifierExtension,
9
+ isNonNumericIdentifierExtension,
10
+ isNonSerializableNumericIdentifierExtension,
11
+ isNumericIdentifierExtension,
12
+ isSerializableNumericIdentifierExtension
13
+ } from "./identifier-extension.js";
11
14
  import { type IdentifierType, IdentifierTypes } from "./identifier-type.js";
12
15
  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 type { NonGTINNumericIdentifierValidator } from "./non-gtin-numeric-identifier-validator.js";
16
17
  import { NonNumericIdentifierValidator } from "./non-numeric-identifier-validator.js";
18
+ import { NonSerializableNumericIdentifierValidator } from "./non-serializable-numeric-identifier-validator.js";
17
19
  import type { NumericIdentifierValidator } from "./numeric-identifier-validator.js";
18
- import type { SerializableNumericIdentifierType } from "./serializable-numeric-identifier-type.js";
19
20
  import { SerializableNumericIdentifierValidator } from "./serializable-numeric-identifier-validator.js";
20
21
 
21
22
  /**
22
23
  * GLN validator.
23
24
  */
24
- const GLN_VALIDATOR = new NonGTINNumericIdentifierValidator(IdentifierTypes.GLN);
25
+ const GLN_VALIDATOR = new NonSerializableNumericIdentifierValidator(IdentifierTypes.GLN);
25
26
 
26
27
  /**
27
28
  * SSCC validator.
28
29
  */
29
- const SSCC_VALIDATOR = new NonGTINNumericIdentifierValidator(IdentifierTypes.SSCC);
30
+ const SSCC_VALIDATOR = new NonSerializableNumericIdentifierValidator(IdentifierTypes.SSCC);
30
31
 
31
32
  /**
32
33
  * GRAI validator.
@@ -41,7 +42,7 @@ const GIAI_VALIDATOR = new NonNumericIdentifierValidator(IdentifierTypes.GIAI);
41
42
  /**
42
43
  * GSRN validator.
43
44
  */
44
- const GSRN_VALIDATOR = new NonGTINNumericIdentifierValidator(IdentifierTypes.GSRN);
45
+ const GSRN_VALIDATOR = new NonSerializableNumericIdentifierValidator(IdentifierTypes.GSRN);
45
46
 
46
47
  /**
47
48
  * GDTI validator.
@@ -56,7 +57,7 @@ const GINC_VALIDATOR = new NonNumericIdentifierValidator(IdentifierTypes.GINC);
56
57
  /**
57
58
  * GSIN validator.
58
59
  */
59
- const GSIN_VALIDATOR = new NonGTINNumericIdentifierValidator(IdentifierTypes.GSIN);
60
+ const GSIN_VALIDATOR = new NonSerializableNumericIdentifierValidator(IdentifierTypes.GSIN);
60
61
 
61
62
  /**
62
63
  * GCN validator.
@@ -79,15 +80,16 @@ const GMN_VALIDATOR = new NonNumericIdentifierValidator(IdentifierTypes.GMN);
79
80
  * @template TIdentifierType
80
81
  * Identifier type type.
81
82
  */
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;
83
+ export type IdentifierTypeValidator<TIdentifierType extends IdentifierType> = IdentifierTypeExtension<
84
+ TIdentifierType,
85
+ IdentifierValidator,
86
+ NumericIdentifierValidator,
87
+ GTINValidator,
88
+ NonGTINNumericIdentifierValidator,
89
+ NonSerializableNumericIdentifierValidator,
90
+ SerializableNumericIdentifierValidator,
91
+ NonNumericIdentifierValidator
92
+ >;
91
93
 
92
94
  /**
93
95
  * Identifier validators entry type based on identifier type type.
@@ -95,8 +97,8 @@ export type IdentifierTypeValidator<TIdentifierType extends IdentifierType> = TI
95
97
  * @template TIdentifierType
96
98
  * Identifier type type.
97
99
  */
98
- export type IdentifierValidatorsEntry<TIdentifierType extends IdentifierType> = TIdentifierType extends typeof IdentifierTypes.GTIN ?
99
- Readonly<Record<GTINBaseType, GTINValidator>> :
100
+ export type IdentifierValidatorsEntry<TIdentifierType extends IdentifierType> = TIdentifierType extends GTINType ?
101
+ Readonly<Record<GTINBaseLength, GTINValidator>> :
100
102
  IdentifierTypeValidator<TIdentifierType>;
101
103
 
102
104
  /**
@@ -109,7 +111,7 @@ export type IdentifierValidatorsRecord = {
109
111
  /**
110
112
  * Identifier validators for all identifier types.
111
113
  */
112
- export const IdentifierValidators: IdentifierValidatorsRecord = {
114
+ export const IdentifierValidators: Readonly<IdentifierValidatorsRecord> = {
113
115
  [IdentifierTypes.GTIN]: GTIN_VALIDATORS,
114
116
  [IdentifierTypes.GLN]: GLN_VALIDATOR,
115
117
  [IdentifierTypes.SSCC]: SSCC_VALIDATOR,
@@ -122,7 +124,54 @@ export const IdentifierValidators: IdentifierValidatorsRecord = {
122
124
  [IdentifierTypes.GCN]: GCN_VALIDATOR,
123
125
  [IdentifierTypes.CPID]: CPID_VALIDATOR,
124
126
  [IdentifierTypes.GMN]: GMN_VALIDATOR
125
- } as const;
127
+ };
128
+
129
+ /**
130
+ * GTIN validator constructor type.
131
+ */
132
+ export type GTINValidatorConstructor =
133
+ new (gtinBaseLength: GTINBaseLength) => GTINValidator;
134
+
135
+ /**
136
+ * Non-GTIN validator constructor type.
137
+ *
138
+ * @template TIdentifierType
139
+ * Identifier type type.
140
+ */
141
+ export type NonGTINValidatorConstructor<TIdentifierType extends Exclude<IdentifierType, GTINType>> =
142
+ new (identifierType: TIdentifierType) => IdentifierValidatorsRecord[TIdentifierType];
143
+
144
+ /**
145
+ * Identifier validator constructors entry type based on identifier type type.
146
+ *
147
+ * @template TIdentifierType
148
+ * Identifier type type.
149
+ */
150
+ export type IdentifierValidatorConstructorsEntry<TIdentifierType extends IdentifierType> = TIdentifierType extends GTINType ?
151
+ GTINValidatorConstructor :
152
+ NonGTINValidatorConstructor<Exclude<TIdentifierType, GTINType>>;
153
+
154
+ /**
155
+ * Identifier validator constructors record type.
156
+ */
157
+ export type IdentifierValidatorConstructorsRecord = {
158
+ readonly [TIdentifierType in IdentifierType]: IdentifierValidatorConstructorsEntry<TIdentifierType>;
159
+ };
160
+
161
+ export const IdentifierValidatorConstructors: IdentifierValidatorConstructorsRecord = {
162
+ GTIN: GTINValidator,
163
+ GLN: NonSerializableNumericIdentifierValidator,
164
+ SSCC: NonSerializableNumericIdentifierValidator,
165
+ GRAI: SerializableNumericIdentifierValidator,
166
+ GIAI: NonNumericIdentifierValidator,
167
+ GSRN: NonSerializableNumericIdentifierValidator,
168
+ GDTI: SerializableNumericIdentifierValidator,
169
+ GINC: NonNumericIdentifierValidator,
170
+ GSIN: NonSerializableNumericIdentifierValidator,
171
+ GCN: SerializableNumericIdentifierValidator,
172
+ CPID: NonNumericIdentifierValidator,
173
+ GMN: NonNumericIdentifierValidator
174
+ };
126
175
 
127
176
  /**
128
177
  * Determine if identifier validators or validator is GTIN validators.
@@ -133,7 +182,7 @@ export const IdentifierValidators: IdentifierValidatorsRecord = {
133
182
  * @returns
134
183
  * True if GTIN validators.
135
184
  */
136
- export function isGTINValidators(identifierValidatorsOrValidator: IdentifierValidatorsEntry<IdentifierType>): identifierValidatorsOrValidator is Readonly<Record<GTINBaseType, GTINValidator>> {
185
+ export function isGTINValidators(identifierValidatorsOrValidator: IdentifierValidatorsEntry<IdentifierType>): identifierValidatorsOrValidator is Readonly<Record<GTINBaseLength, GTINValidator>> {
137
186
  return isGTINDescriptors(identifierValidatorsOrValidator);
138
187
  }
139
188
 
@@ -147,7 +196,7 @@ export function isGTINValidators(identifierValidatorsOrValidator: IdentifierVali
147
196
  * True if identifier validator is a numeric identifier validator.
148
197
  */
149
198
  export function isNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NumericIdentifierValidator {
150
- return isNumericIdentifierDescriptor(identifierValidator);
199
+ return isNumericIdentifierExtension(identifierValidator);
151
200
  }
152
201
 
153
202
  /**
@@ -160,7 +209,7 @@ export function isNumericIdentifierValidator(identifierValidator: IdentifierVali
160
209
  * True if identifier validator is a GTIN validator.
161
210
  */
162
211
  export function isGTINValidator(identifierValidator: IdentifierValidator): identifierValidator is GTINValidator {
163
- return isGTINDescriptor(identifierValidator);
212
+ return isGTINExtension(identifierValidator);
164
213
  }
165
214
 
166
215
  /**
@@ -173,7 +222,20 @@ export function isGTINValidator(identifierValidator: IdentifierValidator): ident
173
222
  * True if identifier validator is a non-GTIN numeric identifier validator.
174
223
  */
175
224
  export function isNonGTINNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NonGTINNumericIdentifierValidator {
176
- return isNonGTINNumericIdentifierDescriptor(identifierValidator);
225
+ return isNonGTINNumericIdentifierExtension(identifierValidator);
226
+ }
227
+
228
+ /**
229
+ * Determine if identifier validator is a non-serializable numeric identifier validator.
230
+ *
231
+ * @param identifierValidator
232
+ * Identifier validator.
233
+ *
234
+ * @returns
235
+ * True if identifier validator is a non-serializable numeric identifier validator.
236
+ */
237
+ export function isNonSerializableNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NonSerializableNumericIdentifierValidator {
238
+ return isNonSerializableNumericIdentifierExtension(identifierValidator);
177
239
  }
178
240
 
179
241
  /**
@@ -186,7 +248,7 @@ export function isNonGTINNumericIdentifierValidator(identifierValidator: Identif
186
248
  * True if identifier validator is a serializable numeric identifier validator.
187
249
  */
188
250
  export function isSerializableNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is SerializableNumericIdentifierValidator {
189
- return isSerializableNumericIdentifierDescriptor(identifierValidator);
251
+ return isSerializableNumericIdentifierExtension(identifierValidator);
190
252
  }
191
253
 
192
254
  /**
@@ -199,5 +261,5 @@ export function isSerializableNumericIdentifierValidator(identifierValidator: Id
199
261
  * True if identifier validator is a non-numeric identifier validator.
200
262
  */
201
263
  export function isNonNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NonNumericIdentifierValidator {
202
- return isNonNumericIdentifierDescriptor(identifierValidator);
264
+ return isNonNumericIdentifierExtension(identifierValidator);
203
265
  }
package/src/index.ts CHANGED
@@ -27,34 +27,40 @@ export * from "./prefix-validator.js";
27
27
  export * from "./content-character-set.js";
28
28
 
29
29
  export * from "./identifier-type.js";
30
+ export * from "./leader-type.js";
30
31
  export * from "./numeric-identifier-type.js";
31
32
  export * from "./gtin-type.js";
32
- export type * from "./non-gtin-numeric-identifier-type.js";
33
- export type * from "./serializable-numeric-identifier-type.js";
34
- export type * from "./non-numeric-identifier-type.js";
33
+ export * from "./non-gtin-numeric-identifier-type.js";
34
+ export * from "./non-serializable-numeric-identifier-type.js";
35
+ export * from "./serializable-numeric-identifier-type.js";
36
+ export * from "./non-numeric-identifier-type.js";
35
37
 
36
38
  export type * from "./identifier-descriptor.js";
37
39
  export type * from "./numeric-identifier-descriptor.js";
40
+ export * from "./gtin-length.js";
38
41
  export type * from "./gtin-descriptor.js";
39
42
  export type * from "./non-gtin-numeric-identifier-descriptor.js";
43
+ export type * from "./non-serializable-numeric-identifier-descriptor.js";
40
44
  export type * from "./serializable-numeric-identifier-descriptor.js";
41
45
  export type * from "./non-numeric-identifier-descriptor.js";
42
- export * from "./descriptors.js";
46
+ export * from "./identifier-descriptors.js";
43
47
 
44
- export type * from "./identifier-validator.js";
45
- export type * from "./numeric-identifier-validator.js";
48
+ export * from "./identifier-validator.js";
49
+ export * from "./numeric-identifier-validator.js";
46
50
  export { GTINLevels, type GTINLevelKey, type GTINLevel, type RCNReference, GTINValidator } from "./gtin-validator.js";
47
51
  export * from "./non-gtin-numeric-identifier-validator.js";
52
+ export * from "./non-serializable-numeric-identifier-validator.js";
48
53
  export * from "./serializable-numeric-identifier-validator.js";
49
54
  export * from "./non-numeric-identifier-validator.js";
50
- export * from "./validators.js";
55
+ export * from "./identifier-validators.js";
51
56
 
52
57
  export type * from "./identifier-creator.js";
53
58
  export type * from "./numeric-identifier-creator.js";
54
59
  export * from "./gtin-creator.js";
55
- export * from "./non-gtin-numeric-identifier-creator.js";
60
+ export type * from "./non-gtin-numeric-identifier-creator.js";
61
+ export * from "./non-serializable-numeric-identifier-creator.js";
56
62
  export * from "./serializable-numeric-identifier-creator.js";
57
63
  export * from "./non-numeric-identifier-creator.js";
58
- export * from "./creators.js";
64
+ export * from "./identifier-creators.js";
59
65
 
60
66
  export * from "./prefix-manager.js";
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Leader type.
3
+ */
4
+ export const LeaderTypes = {
5
+ /**
6
+ * No leader.
7
+ */
8
+ None: "None",
9
+
10
+ /**
11
+ * Indicator digit (GTIN only).
12
+ */
13
+ IndicatorDigit: "Indicator digit",
14
+
15
+ /**
16
+ * Extension digit (SSCC only).
17
+ */
18
+ ExtensionDigit: "Extension digit"
19
+ } as const;
20
+
21
+ /**
22
+ * Leader type key.
23
+ */
24
+ export type LeaderTypeKey = keyof typeof LeaderTypes;
25
+
26
+ /**
27
+ * Leader type.
28
+ */
29
+ export type LeaderType = typeof LeaderTypes[LeaderTypeKey];
@@ -1,27 +1,12 @@
1
- import { Mixin } from "ts-mixer";
2
- import { AbstractNumericIdentifierCreator } from "./abstract-numeric-identifier-creator.js";
3
1
  import type { NonGTINNumericIdentifierType } from "./non-gtin-numeric-identifier-type.js";
4
- import { NonGTINNumericIdentifierValidator } from "./non-gtin-numeric-identifier-validator.js";
5
- import type { PrefixProvider } from "./prefix-provider.js";
6
- import type { SerializableNumericIdentifierType } from "./serializable-numeric-identifier-type.js";
2
+ import type { NonGTINNumericIdentifierValidator } from "./non-gtin-numeric-identifier-validator.js";
3
+ import type { NumericIdentifierCreator } from "./numeric-identifier-creator.js";
7
4
 
8
5
  /**
9
- * Non-GTIN numeric identifier creator.
6
+ * Non-GTIN numeric identifier creator. Creates one or many non-GTIN numeric identifiers.
7
+ *
8
+ * @template TNonGTINNumericIdentifierType
9
+ * Non-GTIN numeric identifier type type.
10
10
  */
11
- export class NonGTINNumericIdentifierCreator extends Mixin(NonGTINNumericIdentifierValidator, AbstractNumericIdentifierCreator) {
12
- /**
13
- * Constructor. Typically called internally by a prefix manager but may be called by other code with another prefix
14
- * provider type.
15
- *
16
- * @param prefixProvider
17
- * Prefix provider.
18
- *
19
- * @param identifierType
20
- * Identifier type.
21
- */
22
- constructor(prefixProvider: PrefixProvider, identifierType: Exclude<NonGTINNumericIdentifierType, SerializableNumericIdentifierType>) {
23
- super(identifierType);
24
-
25
- this.init(prefixProvider, prefixProvider.gs1CompanyPrefix);
26
- }
11
+ export interface NonGTINNumericIdentifierCreator<TNonGTINNumericIdentifierType extends NonGTINNumericIdentifierType = NonGTINNumericIdentifierType> extends NonGTINNumericIdentifierValidator<TNonGTINNumericIdentifierType>, NumericIdentifierCreator<TNonGTINNumericIdentifierType> {
27
12
  }
@@ -1,6 +1,6 @@
1
+ import type { LeaderType, LeaderTypes } from "./leader-type.js";
1
2
  import type { NonGTINNumericIdentifierType } from "./non-gtin-numeric-identifier-type.js";
2
3
  import type { NumericIdentifierDescriptor } from "./numeric-identifier-descriptor.js";
3
- import type { LeaderType, LeaderTypes } from "./numeric-identifier-type.js";
4
4
  import type { PrefixTypes } from "./prefix-type.js";
5
5
 
6
6
  /**