@aidc-toolkit/gs1 1.0.26-beta → 1.0.27-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 (199) hide show
  1. package/dist/abstract-identifier-creator.d.ts +66 -66
  2. package/dist/abstract-identifier-creator.d.ts.map +1 -1
  3. package/dist/abstract-identifier-creator.js +68 -45
  4. package/dist/abstract-identifier-creator.js.map +1 -1
  5. package/dist/abstract-non-gtin-numeric-identifier-creator.d.ts +42 -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 +40 -0
  8. package/dist/abstract-non-gtin-numeric-identifier-creator.js.map +1 -0
  9. package/dist/abstract-numeric-identifier-creator.d.ts +37 -86
  10. package/dist/abstract-numeric-identifier-creator.d.ts.map +1 -1
  11. package/dist/abstract-numeric-identifier-creator.js +144 -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 +7 -12
  18. package/dist/gtin-creator.d.ts.map +1 -1
  19. package/dist/gtin-creator.js +11 -14
  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} +16 -7
  38. package/dist/identifier-creators.d.ts.map +1 -0
  39. package/dist/{creators.js → identifier-creators.js} +19 -7
  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} +21 -11
  54. package/dist/identifier-validators.d.ts.map +1 -0
  55. package/dist/{validators.js → identifier-validators.js} +25 -12
  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 +7 -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 +6 -102
  120. package/dist/prefix-manager.d.ts.map +1 -1
  121. package/dist/prefix-manager.js +65 -60
  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 +155 -74
  139. package/src/abstract-non-gtin-numeric-identifier-creator.ts +86 -0
  140. package/src/abstract-numeric-identifier-creator.ts +202 -133
  141. package/src/content-character-set-creators.ts +9 -0
  142. package/src/gtin-creator.ts +16 -15
  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/{creators.ts → identifier-creators.ts} +40 -26
  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} +51 -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 +17 -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 +12 -0
  163. package/src/non-serializable-numeric-identifier-descriptor.ts +7 -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 +67 -64
  171. package/src/serializable-numeric-identifier-creator.ts +11 -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/non-gtin-numeric-identifier-validator.ts +7 -2
  179. package/test/non-serializable-numeric-identifier-creator.ts +64 -0
  180. package/test/non-serializable-numeric-identifier-validator.ts +6 -0
  181. package/test/numeric-identifier-creator.ts +7 -2
  182. package/test/validator.test.ts +11 -10
  183. package/test/variable-measure-rcn.test.ts +23 -23
  184. package/dist/abstract-identifier-validator.d.ts +0 -95
  185. package/dist/abstract-identifier-validator.d.ts.map +0 -1
  186. package/dist/abstract-identifier-validator.js +0 -123
  187. package/dist/abstract-identifier-validator.js.map +0 -1
  188. package/dist/abstract-numeric-identifier-validator.d.ts +0 -35
  189. package/dist/abstract-numeric-identifier-validator.d.ts.map +0 -1
  190. package/dist/abstract-numeric-identifier-validator.js +0 -61
  191. package/dist/abstract-numeric-identifier-validator.js.map +0 -1
  192. package/dist/creators.d.ts.map +0 -1
  193. package/dist/creators.js.map +0 -1
  194. package/dist/descriptors.d.ts.map +0 -1
  195. package/dist/descriptors.js.map +0 -1
  196. package/dist/validators.d.ts.map +0 -1
  197. package/dist/validators.js.map +0 -1
  198. package/src/abstract-identifier-validator.ts +0 -140
  199. package/src/abstract-numeric-identifier-validator.ts +0 -69
@@ -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 {
2
- isGTINDescriptor,
3
- isGTINDescriptors,
4
- isNonGTINNumericIdentifierDescriptor,
5
- isNonNumericIdentifierDescriptor,
6
- isNumericIdentifierDescriptor,
7
- isSerializableNumericIdentifierDescriptor
8
- } from "./descriptors.js";
9
- import type { GTINBaseType } from "./gtin-type.js";
1
+ import type { GTINBaseLength } from "./gtin-length.js";
2
+ import type { GTINType } from "./gtin-type.js";
10
3
  import { GTIN_VALIDATORS, type GTINValidator } from "./gtin-validator.js";
4
+ import { isGTINDescriptors } from "./identifier-descriptors.js";
5
+ import {
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,15 +97,15 @@ 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
  /**
103
105
  * Identifier validators record type.
104
106
  */
105
107
  export type IdentifierValidatorsRecord = {
106
- [TIdentifierType in IdentifierType]: IdentifierValidatorsEntry<TIdentifierType>;
108
+ readonly [TIdentifierType in IdentifierType]: IdentifierValidatorsEntry<TIdentifierType>;
107
109
  };
108
110
 
109
111
  /**
@@ -122,7 +124,7 @@ 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
+ };
126
128
 
127
129
  /**
128
130
  * Determine if identifier validators or validator is GTIN validators.
@@ -133,7 +135,7 @@ export const IdentifierValidators: IdentifierValidatorsRecord = {
133
135
  * @returns
134
136
  * True if GTIN validators.
135
137
  */
136
- export function isGTINValidators(identifierValidatorsOrValidator: IdentifierValidatorsEntry<IdentifierType>): identifierValidatorsOrValidator is Readonly<Record<GTINBaseType, GTINValidator>> {
138
+ export function isGTINValidators(identifierValidatorsOrValidator: IdentifierValidatorsEntry<IdentifierType>): identifierValidatorsOrValidator is Readonly<Record<GTINBaseLength, GTINValidator>> {
137
139
  return isGTINDescriptors(identifierValidatorsOrValidator);
138
140
  }
139
141
 
@@ -147,7 +149,7 @@ export function isGTINValidators(identifierValidatorsOrValidator: IdentifierVali
147
149
  * True if identifier validator is a numeric identifier validator.
148
150
  */
149
151
  export function isNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NumericIdentifierValidator {
150
- return isNumericIdentifierDescriptor(identifierValidator);
152
+ return isNumericIdentifierExtension(identifierValidator);
151
153
  }
152
154
 
153
155
  /**
@@ -160,7 +162,7 @@ export function isNumericIdentifierValidator(identifierValidator: IdentifierVali
160
162
  * True if identifier validator is a GTIN validator.
161
163
  */
162
164
  export function isGTINValidator(identifierValidator: IdentifierValidator): identifierValidator is GTINValidator {
163
- return isGTINDescriptor(identifierValidator);
165
+ return isGTINExtension(identifierValidator);
164
166
  }
165
167
 
166
168
  /**
@@ -173,7 +175,20 @@ export function isGTINValidator(identifierValidator: IdentifierValidator): ident
173
175
  * True if identifier validator is a non-GTIN numeric identifier validator.
174
176
  */
175
177
  export function isNonGTINNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NonGTINNumericIdentifierValidator {
176
- return isNonGTINNumericIdentifierDescriptor(identifierValidator);
178
+ return isNonGTINNumericIdentifierExtension(identifierValidator);
179
+ }
180
+
181
+ /**
182
+ * Determine if identifier validator is a non-serializable numeric identifier validator.
183
+ *
184
+ * @param identifierValidator
185
+ * Identifier validator.
186
+ *
187
+ * @returns
188
+ * True if identifier validator is a non-serializable numeric identifier validator.
189
+ */
190
+ export function isNonSerializableNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NonSerializableNumericIdentifierValidator {
191
+ return isNonSerializableNumericIdentifierExtension(identifierValidator);
177
192
  }
178
193
 
179
194
  /**
@@ -186,7 +201,7 @@ export function isNonGTINNumericIdentifierValidator(identifierValidator: Identif
186
201
  * True if identifier validator is a serializable numeric identifier validator.
187
202
  */
188
203
  export function isSerializableNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is SerializableNumericIdentifierValidator {
189
- return isSerializableNumericIdentifierDescriptor(identifierValidator);
204
+ return isSerializableNumericIdentifierExtension(identifierValidator);
190
205
  }
191
206
 
192
207
  /**
@@ -199,5 +214,5 @@ export function isSerializableNumericIdentifierValidator(identifierValidator: Id
199
214
  * True if identifier validator is a non-numeric identifier validator.
200
215
  */
201
216
  export function isNonNumericIdentifierValidator(identifierValidator: IdentifierValidator): identifierValidator is NonNumericIdentifierValidator {
202
- return isNonNumericIdentifierDescriptor(identifierValidator);
217
+ return isNonNumericIdentifierExtension(identifierValidator);
203
218
  }
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
  /**
@@ -1,7 +1,18 @@
1
- import type { IdentifierTypes } from "./identifier-type.js";
2
- import type { NumericIdentifierType } from "./numeric-identifier-type.js";
1
+ import { exclude } from "@aidc-toolkit/core";
2
+ import { GTINTypes } from "./gtin-type.js";
3
+ import { NumericIdentifierTypes } from "./numeric-identifier-type.js";
4
+
5
+ /**
6
+ * Non-GTIN numeric identifier types.
7
+ */
8
+ export const NonGTINNumericIdentifierTypes = exclude(NumericIdentifierTypes, GTINTypes);
9
+
10
+ /**
11
+ * Non-GTIN numeric identifier type key.
12
+ */
13
+ export type NonGTINNumericIdentifierTypeKey = keyof typeof NonGTINNumericIdentifierTypes;
3
14
 
4
15
  /**
5
16
  * Non-GTIN numeric identifier type.
6
17
  */
7
- export type NonGTINNumericIdentifierType = Exclude<NumericIdentifierType, typeof IdentifierTypes.GTIN>;
18
+ export type NonGTINNumericIdentifierType = typeof NonGTINNumericIdentifierTypes[NonGTINNumericIdentifierTypeKey];
@@ -1,20 +1,12 @@
1
- import { AbstractNumericIdentifierValidator } from "./abstract-numeric-identifier-validator.js";
2
- import { IdentifierDescriptors } from "./descriptors.js";
3
1
  import type { NonGTINNumericIdentifierDescriptor } from "./non-gtin-numeric-identifier-descriptor.js";
4
2
  import type { NonGTINNumericIdentifierType } from "./non-gtin-numeric-identifier-type.js";
5
- import type { SerializableNumericIdentifierType } from "./serializable-numeric-identifier-type.js";
3
+ import { NumericIdentifierValidator } from "./numeric-identifier-validator.js";
6
4
 
7
5
  /**
8
6
  * Non-GTIN numeric identifier validator.
7
+ *
8
+ * @template TNonGTINNumericIdentifierType
9
+ * Non-GTIN numeric identifier type type.
9
10
  */
10
- export class NonGTINNumericIdentifierValidator extends AbstractNumericIdentifierValidator<NonGTINNumericIdentifierDescriptor> {
11
- /**
12
- * Constructor.
13
- *
14
- * @param identifierType
15
- * Identifier type.
16
- */
17
- constructor(identifierType: Exclude<NonGTINNumericIdentifierType, SerializableNumericIdentifierType>) {
18
- super(IdentifierDescriptors[identifierType]);
19
- }
11
+ export abstract class NonGTINNumericIdentifierValidator<TNonGTINNumericIdentifierType extends NonGTINNumericIdentifierType = NonGTINNumericIdentifierType> extends NumericIdentifierValidator<TNonGTINNumericIdentifierType> implements NonGTINNumericIdentifierDescriptor {
20
12
  }