@wemush/wols 0.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/README.md +204 -31
  3. package/dist/cjs/compact-url.d.ts +150 -0
  4. package/dist/cjs/compact-url.d.ts.map +1 -0
  5. package/dist/cjs/compact-url.js +64 -0
  6. package/dist/cjs/compact-url.js.map +1 -1
  7. package/dist/cjs/crypto/decrypt.d.ts +110 -0
  8. package/dist/cjs/crypto/decrypt.d.ts.map +1 -0
  9. package/dist/cjs/crypto/decrypt.js +521 -90
  10. package/dist/cjs/crypto/decrypt.js.map +1 -1
  11. package/dist/cjs/crypto/encrypt.d.ts +132 -0
  12. package/dist/cjs/crypto/encrypt.d.ts.map +1 -0
  13. package/dist/cjs/crypto/encrypt.js +288 -105
  14. package/dist/cjs/crypto/encrypt.js.map +1 -1
  15. package/dist/cjs/crypto/index.d.ts +12 -0
  16. package/dist/cjs/crypto/index.d.ts.map +1 -0
  17. package/dist/cjs/crypto/index.js +15 -2
  18. package/dist/cjs/crypto/index.js.map +1 -1
  19. package/dist/cjs/crypto/shared.d.ts +116 -0
  20. package/dist/cjs/crypto/shared.d.ts.map +1 -0
  21. package/dist/cjs/crypto/shared.js +238 -0
  22. package/dist/cjs/crypto/shared.js.map +1 -0
  23. package/dist/cjs/errors.d.ts +133 -0
  24. package/dist/cjs/errors.d.ts.map +1 -0
  25. package/dist/cjs/errors.js +39 -1
  26. package/dist/cjs/errors.js.map +1 -1
  27. package/dist/cjs/index.d.ts +29 -0
  28. package/dist/cjs/index.d.ts.map +1 -0
  29. package/dist/cjs/index.js +70 -3
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/package.json +3 -0
  32. package/dist/cjs/parser.d.ts +30 -0
  33. package/dist/cjs/parser.d.ts.map +1 -0
  34. package/dist/cjs/parser.js +3 -0
  35. package/dist/cjs/parser.js.map +1 -1
  36. package/dist/cjs/qr/generate.d.ts +62 -0
  37. package/dist/cjs/qr/generate.d.ts.map +1 -0
  38. package/dist/cjs/qr/index.d.ts +10 -0
  39. package/dist/cjs/qr/index.d.ts.map +1 -0
  40. package/dist/cjs/specimen.d.ts +96 -0
  41. package/dist/cjs/specimen.d.ts.map +1 -0
  42. package/dist/cjs/specimen.js +95 -9
  43. package/dist/cjs/specimen.js.map +1 -1
  44. package/dist/cjs/types.d.ts +735 -0
  45. package/dist/cjs/types.d.ts.map +1 -0
  46. package/dist/cjs/types.js +327 -3
  47. package/dist/cjs/types.js.map +1 -1
  48. package/dist/cjs/utils/cuid.d.ts +46 -0
  49. package/dist/cjs/utils/cuid.d.ts.map +1 -0
  50. package/dist/cjs/utils/cuid.js +6 -4
  51. package/dist/cjs/utils/cuid.js.map +1 -1
  52. package/dist/cjs/utils/environment.d.ts +137 -0
  53. package/dist/cjs/utils/environment.d.ts.map +1 -0
  54. package/dist/cjs/utils/environment.js +206 -0
  55. package/dist/cjs/utils/environment.js.map +1 -0
  56. package/dist/cjs/utils/iso8601.d.ts +79 -0
  57. package/dist/cjs/utils/iso8601.d.ts.map +1 -0
  58. package/dist/cjs/utils/migration.d.ts +162 -0
  59. package/dist/cjs/utils/migration.d.ts.map +1 -0
  60. package/dist/cjs/utils/migration.js +248 -0
  61. package/dist/cjs/utils/migration.js.map +1 -0
  62. package/dist/cjs/validator.d.ts +25 -0
  63. package/dist/cjs/validator.d.ts.map +1 -0
  64. package/dist/cjs/validator.js +85 -21
  65. package/dist/cjs/validator.js.map +1 -1
  66. package/dist/esm/compact-url.js +62 -0
  67. package/dist/esm/compact-url.js.map +1 -1
  68. package/dist/esm/crypto/decrypt.js +517 -90
  69. package/dist/esm/crypto/decrypt.js.map +1 -1
  70. package/dist/esm/crypto/encrypt.js +284 -105
  71. package/dist/esm/crypto/encrypt.js.map +1 -1
  72. package/dist/esm/crypto/index.js +5 -3
  73. package/dist/esm/crypto/index.js.map +1 -1
  74. package/dist/esm/crypto/shared.js +222 -0
  75. package/dist/esm/crypto/shared.js.map +1 -0
  76. package/dist/esm/errors.js +37 -0
  77. package/dist/esm/errors.js.map +1 -1
  78. package/dist/esm/index.js +26 -6
  79. package/dist/esm/index.js.map +1 -1
  80. package/dist/esm/parser.js +3 -0
  81. package/dist/esm/parser.js.map +1 -1
  82. package/dist/esm/specimen.js +95 -10
  83. package/dist/esm/specimen.js.map +1 -1
  84. package/dist/esm/types.js +317 -2
  85. package/dist/esm/types.js.map +1 -1
  86. package/dist/esm/utils/cuid.js +6 -4
  87. package/dist/esm/utils/cuid.js.map +1 -1
  88. package/dist/esm/utils/environment.js +193 -0
  89. package/dist/esm/utils/environment.js.map +1 -0
  90. package/dist/esm/utils/migration.js +237 -0
  91. package/dist/esm/utils/migration.js.map +1 -0
  92. package/dist/esm/validator.js +86 -22
  93. package/dist/esm/validator.js.map +1 -1
  94. package/dist/types/compact-url.d.ts +46 -0
  95. package/dist/types/compact-url.d.ts.map +1 -1
  96. package/dist/types/crypto/decrypt.d.ts +95 -18
  97. package/dist/types/crypto/decrypt.d.ts.map +1 -1
  98. package/dist/types/crypto/encrypt.d.ts +114 -14
  99. package/dist/types/crypto/encrypt.d.ts.map +1 -1
  100. package/dist/types/crypto/index.d.ts +5 -3
  101. package/dist/types/crypto/index.d.ts.map +1 -1
  102. package/dist/types/crypto/shared.d.ts +116 -0
  103. package/dist/types/crypto/shared.d.ts.map +1 -0
  104. package/dist/types/errors.d.ts +31 -1
  105. package/dist/types/errors.d.ts.map +1 -1
  106. package/dist/types/index.d.ts +15 -7
  107. package/dist/types/index.d.ts.map +1 -1
  108. package/dist/types/parser.d.ts.map +1 -1
  109. package/dist/types/specimen.d.ts +29 -4
  110. package/dist/types/specimen.d.ts.map +1 -1
  111. package/dist/types/types.d.ts +483 -17
  112. package/dist/types/types.d.ts.map +1 -1
  113. package/dist/types/utils/cuid.d.ts +5 -3
  114. package/dist/types/utils/cuid.d.ts.map +1 -1
  115. package/dist/types/utils/environment.d.ts +137 -0
  116. package/dist/types/utils/environment.d.ts.map +1 -0
  117. package/dist/types/utils/migration.d.ts +162 -0
  118. package/dist/types/utils/migration.d.ts.map +1 -0
  119. package/dist/types/validator.d.ts +1 -1
  120. package/dist/types/validator.d.ts.map +1 -1
  121. package/package.json +32 -14
package/dist/esm/types.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * WOLS TypeScript Library - Core Types
3
3
  *
4
4
  * This module defines all the core types, interfaces, and enums
5
- * for the WeMush Open Labeling Standard (WOLS) v1.1.0.
5
+ * for the WeMush Open Labeling Standard (WOLS) v1.3.0.
6
6
  *
7
7
  * @packageDocumentation
8
8
  * @module @wemush/wols
@@ -13,7 +13,7 @@
13
13
  /**
14
14
  * WOLS specification version implemented by this library.
15
15
  */
16
- export const WOLS_VERSION = '1.1.0';
16
+ export const WOLS_VERSION = '1.3.0';
17
17
  /**
18
18
  * JSON-LD context URL for WOLS specimens.
19
19
  */
@@ -35,15 +35,330 @@ export const SPECIMEN_TYPES = [
35
35
  'FRUITING',
36
36
  'HARVEST',
37
37
  ];
38
+ // =============================================================================
39
+ // TYPE ALIAS SYSTEM (v1.2.0)
40
+ // =============================================================================
41
+ /**
42
+ * Type alias registry for mapping platform-specific types to WOLS types.
43
+ * @internal
44
+ */
45
+ const TYPE_ALIAS_REGISTRY = new Map([
46
+ // Culture aliases
47
+ ['LIQUID_CULTURE', 'CULTURE'],
48
+ ['LC', 'CULTURE'],
49
+ ['AGAR', 'CULTURE'],
50
+ ['PETRI', 'CULTURE'],
51
+ ['SLANT', 'CULTURE'],
52
+ ['CULTURE_PLATE', 'CULTURE'],
53
+ // Spawn aliases
54
+ ['GRAIN_SPAWN', 'SPAWN'],
55
+ ['SAWDUST_SPAWN', 'SPAWN'],
56
+ ['PLUG_SPAWN', 'SPAWN'],
57
+ ['DOWEL', 'SPAWN'],
58
+ // Substrate aliases
59
+ ['BLOCK', 'SUBSTRATE'],
60
+ ['BAG', 'SUBSTRATE'],
61
+ ['BED', 'SUBSTRATE'],
62
+ ['LOG', 'SUBSTRATE'],
63
+ ['BUCKET', 'SUBSTRATE'],
64
+ // Fruiting aliases
65
+ ['FLUSH', 'FRUITING'],
66
+ ['PINNING', 'FRUITING'],
67
+ // PRIMORDIA is a reserved alias (v1.3.0): it resolves to FRUITING, and
68
+ // createSpecimen() additionally sets stage PRIMORDIA. See PRIMORDIA_TYPE_ALIAS.
69
+ ['PRIMORDIA', 'FRUITING'],
70
+ ['FRUIT', 'FRUITING'],
71
+ ['FIRST_FLUSH', 'FRUITING'],
72
+ // Harvest aliases
73
+ ['FRESH', 'HARVEST'],
74
+ ['DRIED', 'HARVEST'],
75
+ ['PROCESSED', 'HARVEST'],
76
+ ['EXTRACT', 'HARVEST'],
77
+ ]);
78
+ /**
79
+ * Reserved type alias with special handling (WOLS v1.3.0).
80
+ *
81
+ * `PRIMORDIA` is a GrowthStage, not a SpecimenType. When it is supplied as a
82
+ * type, it resolves to `FRUITING` and `createSpecimen()` sets
83
+ * `stage: 'PRIMORDIA'` unless a stage was supplied.
84
+ *
85
+ * @since 1.3.0
86
+ */
87
+ export const PRIMORDIA_TYPE_ALIAS = 'PRIMORDIA';
88
+ /**
89
+ * Register a custom type alias.
90
+ *
91
+ * @param alias - The alias string (case-insensitive, stored uppercase)
92
+ * @param wolsType - The canonical WOLS SpecimenType
93
+ * @throws Error if `alias` is the reserved `PRIMORDIA` alias
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * registerTypeAlias('MYCELIUM_BLOCK', 'SUBSTRATE');
98
+ * ```
99
+ */
100
+ export function registerTypeAlias(alias, wolsType) {
101
+ const upper = alias.toUpperCase();
102
+ if (upper === PRIMORDIA_TYPE_ALIAS && wolsType !== 'FRUITING') {
103
+ throw new Error(`'${PRIMORDIA_TYPE_ALIAS}' is a reserved alias for FRUITING and cannot be remapped`);
104
+ }
105
+ TYPE_ALIAS_REGISTRY.set(upper, wolsType);
106
+ }
107
+ /**
108
+ * Resolve a type alias to its canonical WOLS type.
109
+ * Returns the input if it's already a valid SpecimenType or no alias exists.
110
+ *
111
+ * @param typeOrAlias - Type string or alias to resolve
112
+ * @returns Canonical SpecimenType or original string if not found
113
+ *
114
+ * @example
115
+ * ```typescript
116
+ * resolveTypeAlias('LIQUID_CULTURE') // Returns 'CULTURE'
117
+ * resolveTypeAlias('CULTURE') // Returns 'CULTURE'
118
+ * resolveTypeAlias('unknown') // Returns 'unknown'
119
+ * ```
120
+ *
121
+ * @remarks Maps the type only. `PRIMORDIA` resolves to `FRUITING` here and
122
+ * the PRIMORDIA stage is lost; use {@link resolveTypeAndStage} when building
123
+ * a specimen from user input.
124
+ */
125
+ export function resolveTypeAlias(typeOrAlias) {
126
+ const upper = typeOrAlias.toUpperCase();
127
+ // Already a valid type?
128
+ if (SPECIMEN_TYPES.includes(upper)) {
129
+ return upper;
130
+ }
131
+ // Check alias registry
132
+ const resolved = TYPE_ALIAS_REGISTRY.get(upper);
133
+ return resolved ?? typeOrAlias;
134
+ }
135
+ /**
136
+ * Resolve a supplied specimen type (canonical or alias, any case) together
137
+ * with its stage, applying the reserved `PRIMORDIA` rule (WOLS v1.3.0).
138
+ *
139
+ * This is the single source of truth used by `createSpecimen()` and
140
+ * `serializeSpecimen()`. `resolveTypeAlias()` and `mapToWolsType()` map the
141
+ * type only; integrations that map a type and then build a specimen
142
+ * themselves should use this function so the `PRIMORDIA` stage is not lost.
143
+ *
144
+ * - `PRIMORDIA` resolves to `FRUITING`, and `stage` becomes `'PRIMORDIA'`
145
+ * only when no stage was supplied (a supplied stage is never overridden).
146
+ * `primordia` is `true` so callers can warn.
147
+ * - Other aliases resolve the type and leave `stage` unchanged.
148
+ * - Unknown types return `null`.
149
+ *
150
+ * @example
151
+ * ```typescript
152
+ * resolveTypeAndStage('primordia') // { type: 'FRUITING', stage: 'PRIMORDIA', primordia: true }
153
+ * resolveTypeAndStage('PRIMORDIA', 'FRUITING') // { type: 'FRUITING', stage: 'FRUITING', primordia: true }
154
+ * resolveTypeAndStage('LC') // { type: 'CULTURE', stage: undefined, primordia: false }
155
+ * ```
156
+ *
157
+ * @since 1.3.0
158
+ */
159
+ export function resolveTypeAndStage(type, stage) {
160
+ if (typeof type !== 'string') {
161
+ return null;
162
+ }
163
+ if (type.toUpperCase() === PRIMORDIA_TYPE_ALIAS) {
164
+ return { type: 'FRUITING', stage: stage ?? 'PRIMORDIA', primordia: true };
165
+ }
166
+ const resolved = resolveTypeAlias(type);
167
+ return isSpecimenType(resolved) ? { type: resolved, stage, primordia: false } : null;
168
+ }
169
+ /**
170
+ * Get all registered type aliases.
171
+ *
172
+ * @returns ReadonlyMap of alias -> SpecimenType mappings
173
+ */
174
+ export function getTypeAliases() {
175
+ return TYPE_ALIAS_REGISTRY;
176
+ }
177
+ // =============================================================================
178
+ // TYPE MAPPING EXPORTS (v1.2.0)
179
+ // =============================================================================
180
+ /**
181
+ * Mapping from WOLS types to common platform type names.
182
+ *
183
+ * This provides a centralized lookup for integrations that need to
184
+ * display user-friendly type names or map to platform-specific values.
185
+ *
186
+ * @since 1.2.0
187
+ */
188
+ export const WOLS_TO_PLATFORM_MAP = {
189
+ CULTURE: ['Liquid Culture', 'LC', 'Agar', 'Petri', 'Slant', 'Culture Plate'],
190
+ SPAWN: ['Grain Spawn', 'Sawdust Spawn', 'Plug Spawn', 'Dowel'],
191
+ SUBSTRATE: ['Block', 'Bag', 'Bed', 'Log', 'Bucket'],
192
+ FRUITING: ['Pinning', 'Primordia', 'Fruiting', 'Flush', 'First Flush'],
193
+ HARVEST: ['Fresh', 'Dried', 'Processed', 'Extract'],
194
+ };
195
+ /**
196
+ * Map a platform-specific type to a WOLS SpecimenType.
197
+ *
198
+ * First checks registered aliases, then falls back to direct lookup.
199
+ *
200
+ * @param platformType - Platform-specific type name
201
+ * @returns Matching SpecimenType or null if not found
202
+ *
203
+ * @example
204
+ * ```typescript
205
+ * mapToWolsType('Liquid Culture') // Returns 'CULTURE'
206
+ * mapToWolsType('LC') // Returns 'CULTURE'
207
+ * mapToWolsType('Unknown Type') // Returns null
208
+ * ```
209
+ *
210
+ * @remarks Maps the type only. `PRIMORDIA` maps to `FRUITING` and the
211
+ * PRIMORDIA stage is lost; use {@link resolveTypeAndStage} when building a
212
+ * specimen from user input.
213
+ *
214
+ * @since 1.2.0
215
+ */
216
+ export function mapToWolsType(platformType) {
217
+ // First try the alias registry
218
+ const resolved = resolveTypeAlias(platformType);
219
+ if (isSpecimenType(resolved)) {
220
+ return resolved;
221
+ }
222
+ // Fall back to searching WOLS_TO_PLATFORM_MAP
223
+ const normalized = platformType.toUpperCase().replace(/\s+/g, '_');
224
+ for (const [wolsType, platformTypes] of Object.entries(WOLS_TO_PLATFORM_MAP)) {
225
+ for (const pt of platformTypes) {
226
+ if (pt.toUpperCase().replace(/\s+/g, '_') === normalized) {
227
+ return wolsType;
228
+ }
229
+ }
230
+ }
231
+ return null;
232
+ }
233
+ /**
234
+ * Get all platform type names for a WOLS SpecimenType.
235
+ *
236
+ * @param wolsType - WOLS SpecimenType
237
+ * @returns Array of platform type names
238
+ *
239
+ * @example
240
+ * ```typescript
241
+ * mapFromWolsType('CULTURE')
242
+ * // Returns ['Liquid Culture', 'LC', 'Agar', 'Petri', 'Slant', 'Culture Plate']
243
+ * ```
244
+ *
245
+ * @since 1.2.0
246
+ */
247
+ export function mapFromWolsType(wolsType) {
248
+ return WOLS_TO_PLATFORM_MAP[wolsType] ?? [];
249
+ }
250
+ /**
251
+ * Register a custom platform type mapping.
252
+ *
253
+ * This adds to both the alias registry (for resolveTypeAlias) and
254
+ * can be used for custom platform integrations.
255
+ *
256
+ * @param platformType - Platform-specific type name
257
+ * @param wolsType - WOLS SpecimenType to map to
258
+ *
259
+ * @example
260
+ * ```typescript
261
+ * registerPlatformType('Mycelium Block', 'SUBSTRATE');
262
+ * mapToWolsType('Mycelium Block') // Returns 'SUBSTRATE'
263
+ * ```
264
+ *
265
+ * @since 1.2.0
266
+ */
267
+ export function registerPlatformType(platformType, wolsType) {
268
+ // Add to alias registry for resolveTypeAlias support
269
+ registerTypeAlias(platformType, wolsType);
270
+ }
38
271
  /**
39
272
  * Array of valid growth stages for validation.
273
+ * Ordered by typical lifecycle progression.
40
274
  */
41
275
  export const GROWTH_STAGES = [
42
276
  'INOCULATION',
277
+ 'INCUBATION',
43
278
  'COLONIZATION',
279
+ 'PRIMORDIA',
44
280
  'FRUITING',
281
+ 'SENESCENCE',
45
282
  'HARVEST',
46
283
  ];
284
+ /**
285
+ * Pattern for parsing generation strings.
286
+ * Matches: P, P1, F{n}, G{n}, or plain numbers.
287
+ */
288
+ const GENERATION_PARSE_PATTERN = /^(P|P1|F(\d+)|G(\d+)|(\d+))$/i;
289
+ /**
290
+ * Normalize a generation string to the specified format.
291
+ *
292
+ * Accepts multiple input formats:
293
+ * - Filial: F1, F2, F3, etc.
294
+ * - Parental: P or P1
295
+ * - Generational: G1, G2, G3, etc.
296
+ * - Numeric: 1, 2, 3, etc.
297
+ *
298
+ * @param generation - The generation string to normalize
299
+ * @param format - Target format (default: 'preserve')
300
+ * @returns Normalized generation string, or original if not parseable
301
+ *
302
+ * @example
303
+ * ```typescript
304
+ * normalizeGeneration('G2', 'filial') // Returns 'F2'
305
+ * normalizeGeneration('3', 'filial') // Returns 'F3'
306
+ * normalizeGeneration('F1', 'numeric') // Returns '1'
307
+ * normalizeGeneration('P', 'filial') // Returns 'P'
308
+ * ```
309
+ *
310
+ * @since 1.2.0
311
+ */
312
+ export function normalizeGeneration(generation, format = 'preserve') {
313
+ const trimmed = generation.trim().toUpperCase();
314
+ // Handle parental generation specially
315
+ if (trimmed === 'P' || trimmed === 'P1') {
316
+ return format === 'numeric' ? '0' : 'P';
317
+ }
318
+ const match = GENERATION_PARSE_PATTERN.exec(trimmed);
319
+ if (!match) {
320
+ return generation; // Return original if not parseable
321
+ }
322
+ // Extract the numeric value
323
+ let numericValue;
324
+ if (match[2] !== undefined) {
325
+ // F{n} format
326
+ numericValue = parseInt(match[2], 10);
327
+ }
328
+ else if (match[3] !== undefined) {
329
+ // G{n} format
330
+ numericValue = parseInt(match[3], 10);
331
+ }
332
+ else if (match[4] !== undefined) {
333
+ // Plain number
334
+ numericValue = parseInt(match[4], 10);
335
+ }
336
+ else {
337
+ return generation; // Shouldn't reach here
338
+ }
339
+ switch (format) {
340
+ case 'preserve':
341
+ return trimmed;
342
+ case 'filial':
343
+ return `F${numericValue}`;
344
+ case 'numeric':
345
+ return String(numericValue);
346
+ default:
347
+ return generation;
348
+ }
349
+ }
350
+ /**
351
+ * Check if a generation string is valid.
352
+ *
353
+ * @param generation - The generation string to validate
354
+ * @returns True if valid, false otherwise
355
+ *
356
+ * @since 1.2.0
357
+ */
358
+ export function isValidGeneration(generation) {
359
+ const trimmed = generation.trim().toUpperCase();
360
+ return GENERATION_PARSE_PATTERN.test(trimmed);
361
+ }
47
362
  // =============================================================================
48
363
  // TYPE GUARDS
49
364
  // =============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAkBzD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,EAAgB,CAAC;AAC1B,CAAC;AAWD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,SAAS;IACT,OAAO;IACP,WAAW;IACX,UAAU;IACV,SAAS;CACD,CAAC;AAOX;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,aAAa;IACb,cAAc;IACd,UAAU;IACV,SAAS;CACD,CAAC;AAgPX,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAqB,CAAC,CAAC;AACrF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAoB,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAQ,KAAgB,CAAC,IAAI,KAAK,QAAQ,CAC3C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -134,12 +134,14 @@ export function createSpecimenId() {
134
134
  return `wemush:${createId()}`;
135
135
  }
136
136
  /**
137
- * Validate a specimen ID format.
137
+ * Validate a specimen ID: the `wemush:` prefix followed by any non-empty suffix
138
+ * (WOLS v1.3.0). Pass `strict: true` for the CUID-style `wemush:[a-z0-9]+` check.
138
139
  *
139
140
  * @param id - The ID to validate
140
- * @returns true if the ID matches the expected format
141
+ * @param strict - Require a lowercase alphanumeric suffix
142
+ * @returns true if the ID is valid
141
143
  */
142
- export function isValidSpecimenId(id) {
143
- return /^wemush:[a-z0-9]+$/.test(id);
144
+ export function isValidSpecimenId(id, strict = false) {
145
+ return strict ? /^wemush:[a-z0-9]+$/.test(id) : id.startsWith('wemush:') && id.length > 7;
144
146
  }
145
147
  //# sourceMappingURL=cuid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cuid.js","sourceRoot":"","sources":["../../../src/utils/cuid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cuid.js","sourceRoot":"","sources":["../../../src/utils/cuid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Environment Detection Utilities
3
+ *
4
+ * This module provides runtime environment detection for selecting
5
+ * appropriate crypto implementations and other environment-specific behavior.
6
+ *
7
+ * @module utils/environment
8
+ * @since 1.2.0
9
+ */
10
+ // =============================================================================
11
+ // ENVIRONMENT DETECTION
12
+ // =============================================================================
13
+ /**
14
+ * Check if running in a server-side Node.js environment.
15
+ *
16
+ * @returns True if running in Node.js, false otherwise
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * if (isServer()) {
21
+ * // Use Node.js crypto module
22
+ * }
23
+ * ```
24
+ *
25
+ * @since 1.2.0
26
+ */
27
+ export function isServer() {
28
+ return (typeof globalThis !== 'undefined' &&
29
+ typeof globalThis.process
30
+ ?.versions?.node === 'string');
31
+ }
32
+ /**
33
+ * Check if running in a browser environment.
34
+ *
35
+ * @returns True if running in a browser, false otherwise
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * if (isBrowser()) {
40
+ * // Use Web Crypto API
41
+ * }
42
+ * ```
43
+ *
44
+ * @since 1.2.0
45
+ */
46
+ export function isBrowser() {
47
+ return (typeof globalThis !== 'undefined' &&
48
+ typeof globalThis.window !== 'undefined' &&
49
+ typeof globalThis.document !== 'undefined');
50
+ }
51
+ /**
52
+ * Check if running in a Web Worker environment.
53
+ *
54
+ * @returns True if running in a Web Worker, false otherwise
55
+ *
56
+ * @since 1.2.0
57
+ */
58
+ export function isWebWorker() {
59
+ // Check if WorkerGlobalScope exists and if self is an instance of it
60
+ // In a Web Worker, self instanceof WorkerGlobalScope is true
61
+ // In the main thread, WorkerGlobalScope doesn't exist or self is not an instance
62
+ if (typeof globalThis === 'undefined') {
63
+ return false;
64
+ }
65
+ const global = globalThis;
66
+ return (typeof global.WorkerGlobalScope !== 'undefined' &&
67
+ typeof global.self !== 'undefined' &&
68
+ global.self instanceof global.WorkerGlobalScope);
69
+ }
70
+ /**
71
+ * Check if running in Deno environment.
72
+ *
73
+ * @returns True if running in Deno, false otherwise
74
+ *
75
+ * @since 1.2.0
76
+ */
77
+ export function isDeno() {
78
+ return (typeof globalThis !== 'undefined' &&
79
+ typeof globalThis.Deno !== 'undefined');
80
+ }
81
+ /**
82
+ * Check if running in Bun environment.
83
+ *
84
+ * @returns True if running in Bun, false otherwise
85
+ *
86
+ * @since 1.2.0
87
+ */
88
+ export function isBun() {
89
+ return (typeof globalThis !== 'undefined' &&
90
+ typeof globalThis.Bun !== 'undefined');
91
+ }
92
+ /**
93
+ * Get the current runtime environment.
94
+ *
95
+ * @returns The detected runtime environment
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * const env = getRuntimeEnvironment();
100
+ * console.log(`Running in: ${env}`);
101
+ * ```
102
+ *
103
+ * @since 1.2.0
104
+ */
105
+ export function getRuntimeEnvironment() {
106
+ if (isBun())
107
+ return 'bun';
108
+ if (isDeno())
109
+ return 'deno';
110
+ if (isServer())
111
+ return 'node';
112
+ if (isWebWorker())
113
+ return 'webworker';
114
+ if (isBrowser())
115
+ return 'browser';
116
+ return 'unknown';
117
+ }
118
+ // =============================================================================
119
+ // CRYPTO SUPPORT DETECTION
120
+ // =============================================================================
121
+ /**
122
+ * Check if Web Crypto API is available.
123
+ *
124
+ * @returns True if Web Crypto API is available, false otherwise
125
+ *
126
+ * @since 1.2.0
127
+ */
128
+ export function supportsWebCrypto() {
129
+ return (typeof globalThis !== 'undefined' &&
130
+ typeof globalThis.crypto?.subtle !==
131
+ 'undefined');
132
+ }
133
+ /**
134
+ * Check if Node.js crypto module is available.
135
+ *
136
+ * Note: This performs a synchronous check and does not actually import the module.
137
+ *
138
+ * @returns True if likely running in Node.js with crypto support, false otherwise
139
+ *
140
+ * @since 1.2.0
141
+ */
142
+ export function supportsNodeCrypto() {
143
+ return isServer() || isBun();
144
+ }
145
+ /**
146
+ * Check if any cryptographic support is available.
147
+ *
148
+ * This is useful for determining if encryption/decryption features can be used.
149
+ *
150
+ * @returns True if crypto is supported, false otherwise
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * if (isCryptoSupported()) {
155
+ * const encrypted = await encryptSpecimen(specimen, { key: password });
156
+ * } else {
157
+ * console.warn('Crypto not supported in this environment');
158
+ * }
159
+ * ```
160
+ *
161
+ * @since 1.2.0
162
+ */
163
+ export function isCryptoSupported() {
164
+ return supportsWebCrypto() || supportsNodeCrypto();
165
+ }
166
+ // =============================================================================
167
+ // FEATURE DETECTION
168
+ // =============================================================================
169
+ /**
170
+ * Check if TextEncoder/TextDecoder are available.
171
+ *
172
+ * @returns True if text encoding is supported, false otherwise
173
+ *
174
+ * @since 1.2.0
175
+ */
176
+ export function supportsTextEncoding() {
177
+ return (typeof globalThis !== 'undefined' &&
178
+ typeof globalThis.TextEncoder !== 'undefined' &&
179
+ typeof globalThis.TextDecoder !== 'undefined');
180
+ }
181
+ /**
182
+ * Check if URL and URLSearchParams are available.
183
+ *
184
+ * @returns True if URL APIs are supported, false otherwise
185
+ *
186
+ * @since 1.2.0
187
+ */
188
+ export function supportsURLAPIs() {
189
+ return (typeof globalThis !== 'undefined' &&
190
+ typeof globalThis.URL !== 'undefined' &&
191
+ typeof globalThis.URLSearchParams !== 'undefined');
192
+ }
193
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/utils/environment.ts"],"names":[],"mappings":"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"}