@wemush/wols 0.1.0 → 1.2.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.
- package/dist/cjs/compact-url.js +64 -0
- package/dist/cjs/compact-url.js.map +1 -1
- package/dist/cjs/crypto/decrypt.js +16 -5
- package/dist/cjs/crypto/decrypt.js.map +1 -1
- package/dist/cjs/crypto/encrypt.js +111 -9
- package/dist/cjs/crypto/encrypt.js.map +1 -1
- package/dist/cjs/index.js +53 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/parser.js +3 -0
- package/dist/cjs/parser.js.map +1 -1
- package/dist/cjs/specimen.js +14 -1
- package/dist/cjs/specimen.js.map +1 -1
- package/dist/cjs/types.js +267 -3
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/environment.js +206 -0
- package/dist/cjs/utils/environment.js.map +1 -0
- package/dist/cjs/utils/migration.js +248 -0
- package/dist/cjs/utils/migration.js.map +1 -0
- package/dist/cjs/validator.js +62 -9
- package/dist/cjs/validator.js.map +1 -1
- package/dist/esm/compact-url.js +62 -0
- package/dist/esm/compact-url.js.map +1 -1
- package/dist/esm/crypto/decrypt.js +16 -5
- package/dist/esm/crypto/decrypt.js.map +1 -1
- package/dist/esm/crypto/encrypt.js +111 -9
- package/dist/esm/crypto/encrypt.js.map +1 -1
- package/dist/esm/index.js +21 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/parser.js +3 -0
- package/dist/esm/parser.js.map +1 -1
- package/dist/esm/specimen.js +15 -2
- package/dist/esm/specimen.js.map +1 -1
- package/dist/esm/types.js +258 -2
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/environment.js +193 -0
- package/dist/esm/utils/environment.js.map +1 -0
- package/dist/esm/utils/migration.js +237 -0
- package/dist/esm/utils/migration.js.map +1 -0
- package/dist/esm/validator.js +62 -9
- package/dist/esm/validator.js.map +1 -1
- package/dist/types/compact-url.d.ts +46 -0
- package/dist/types/compact-url.d.ts.map +1 -1
- package/dist/types/crypto/decrypt.d.ts +6 -0
- package/dist/types/crypto/decrypt.d.ts.map +1 -1
- package/dist/types/crypto/encrypt.d.ts +56 -1
- package/dist/types/crypto/encrypt.d.ts.map +1 -1
- package/dist/types/index.d.ts +10 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/parser.d.ts.map +1 -1
- package/dist/types/specimen.d.ts.map +1 -1
- package/dist/types/types.d.ts +246 -5
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/environment.d.ts +137 -0
- package/dist/types/utils/environment.d.ts.map +1 -0
- package/dist/types/utils/migration.d.ts +162 -0
- package/dist/types/utils/migration.d.ts.map +1 -0
- package/dist/types/validator.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/cjs/compact-url.js
CHANGED
|
@@ -17,6 +17,8 @@ exports.getCodeFromSpecies = getCodeFromSpecies;
|
|
|
17
17
|
exports.registerSpeciesCode = registerSpeciesCode;
|
|
18
18
|
exports.toCompactUrl = toCompactUrl;
|
|
19
19
|
exports.parseCompactUrl = parseCompactUrl;
|
|
20
|
+
exports.parseCompactUrlOrThrow = parseCompactUrlOrThrow;
|
|
21
|
+
exports.parseCompactUrlOrNull = parseCompactUrlOrNull;
|
|
20
22
|
const errors_js_1 = require("./errors.js");
|
|
21
23
|
/**
|
|
22
24
|
* Standard species codes from the WOLS specification
|
|
@@ -269,4 +271,66 @@ function parseCompactUrl(url) {
|
|
|
269
271
|
data: result,
|
|
270
272
|
};
|
|
271
273
|
}
|
|
274
|
+
// =============================================================================
|
|
275
|
+
// CONVENIENCE METHODS (v1.2.0)
|
|
276
|
+
// =============================================================================
|
|
277
|
+
/**
|
|
278
|
+
* Parse a compact URL, throwing an error on failure.
|
|
279
|
+
*
|
|
280
|
+
* This is a convenience wrapper around parseCompactUrl() for cases
|
|
281
|
+
* where you prefer exceptions over result types.
|
|
282
|
+
*
|
|
283
|
+
* @param url - Compact URL to parse (wemush://v1/...)
|
|
284
|
+
* @returns SpecimenRef on success
|
|
285
|
+
* @throws WolsParseError on parse failure
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* ```typescript
|
|
289
|
+
* try {
|
|
290
|
+
* const ref = parseCompactUrlOrThrow('wemush://v1/clx1a2b3c4?s=POSTR');
|
|
291
|
+
* console.log(ref.species); // "Pleurotus ostreatus"
|
|
292
|
+
* } catch (err) {
|
|
293
|
+
* console.error('Failed to parse:', err.message);
|
|
294
|
+
* }
|
|
295
|
+
* ```
|
|
296
|
+
*
|
|
297
|
+
* @since 1.2.0
|
|
298
|
+
*/
|
|
299
|
+
function parseCompactUrlOrThrow(url) {
|
|
300
|
+
const result = parseCompactUrl(url);
|
|
301
|
+
if (!result.success) {
|
|
302
|
+
throw result.error;
|
|
303
|
+
}
|
|
304
|
+
return result.data;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Parse a compact URL, returning null on failure.
|
|
308
|
+
*
|
|
309
|
+
* This is a convenience wrapper around parseCompactUrl() for cases
|
|
310
|
+
* where you want to handle failures with nullish coalescing.
|
|
311
|
+
*
|
|
312
|
+
* @param url - Compact URL to parse (wemush://v1/...)
|
|
313
|
+
* @returns SpecimenRef on success, null on failure
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* const ref = parseCompactUrlOrNull('wemush://v1/clx1a2b3c4?s=POSTR');
|
|
318
|
+
* if (ref !== null) {
|
|
319
|
+
* console.log(ref.species);
|
|
320
|
+
* }
|
|
321
|
+
*
|
|
322
|
+
* // Or with nullish coalescing:
|
|
323
|
+
* const species = parseCompactUrlOrNull(url)?.species ?? 'Unknown';
|
|
324
|
+
* ```
|
|
325
|
+
*
|
|
326
|
+
* @since 1.2.0
|
|
327
|
+
*/
|
|
328
|
+
function parseCompactUrlOrNull(url) {
|
|
329
|
+
// Guard against null/undefined/non-string input to prevent runtime errors
|
|
330
|
+
if (url === null || url === undefined || typeof url !== 'string') {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
const result = parseCompactUrl(url);
|
|
334
|
+
return result.success ? result.data : null;
|
|
335
|
+
}
|
|
272
336
|
//# sourceMappingURL=compact-url.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact-url.js","sourceRoot":"","sources":["../../src/compact-url.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AA6CH,gDAEC;AAcD,gDAEC;AAgBD,kDASC;AAyBD,oCAsDC;AAqBD,0CA6GC;
|
|
1
|
+
{"version":3,"file":"compact-url.js","sourceRoot":"","sources":["../../src/compact-url.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
* Provides AES-256-GCM decryption for encrypted specimens using Web Crypto API.
|
|
6
6
|
* Supports both password-based (PBKDF2) and raw CryptoKey decryption.
|
|
7
7
|
*
|
|
8
|
+
* ## Self-Describing Payloads
|
|
9
|
+
*
|
|
10
|
+
* Encrypted specimens from v1.2.0+ include `iterations` in the payload, enabling
|
|
11
|
+
* automatic key derivation without caller needing to know encryption parameters.
|
|
12
|
+
* For payloads without `iterations` (pre-1.2.0), the default of 100,000 is used.
|
|
13
|
+
*
|
|
8
14
|
* @module crypto/decrypt
|
|
9
15
|
*/
|
|
10
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -16,8 +22,8 @@ const parser_js_1 = require("../parser.js");
|
|
|
16
22
|
// =============================================================================
|
|
17
23
|
/** Salt for PBKDF2 key derivation (must match encrypt.ts) */
|
|
18
24
|
const PBKDF2_SALT = new TextEncoder().encode('@wemush/wols/crypto/v1');
|
|
19
|
-
/**
|
|
20
|
-
const
|
|
25
|
+
/** Default PBKDF2 iterations for backward compatibility with pre-1.2.0 payloads */
|
|
26
|
+
const DEFAULT_PBKDF2_ITERATIONS = 100_000;
|
|
21
27
|
// =============================================================================
|
|
22
28
|
// UTILITY FUNCTIONS
|
|
23
29
|
// =============================================================================
|
|
@@ -41,8 +47,11 @@ function fromBase64Url(base64url) {
|
|
|
41
47
|
}
|
|
42
48
|
/**
|
|
43
49
|
* Derive a CryptoKey from a password using PBKDF2
|
|
50
|
+
*
|
|
51
|
+
* @param password - The password string
|
|
52
|
+
* @param iterations - PBKDF2 iteration count (from payload or default)
|
|
44
53
|
*/
|
|
45
|
-
async function deriveKey(password) {
|
|
54
|
+
async function deriveKey(password, iterations) {
|
|
46
55
|
const encoder = new TextEncoder();
|
|
47
56
|
const passwordBytes = encoder.encode(password);
|
|
48
57
|
// Import password as key material
|
|
@@ -53,7 +62,7 @@ async function deriveKey(password) {
|
|
|
53
62
|
return crypto.subtle.deriveKey({
|
|
54
63
|
name: 'PBKDF2',
|
|
55
64
|
salt: PBKDF2_SALT,
|
|
56
|
-
iterations
|
|
65
|
+
iterations,
|
|
57
66
|
hash: 'SHA-256',
|
|
58
67
|
}, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['decrypt']);
|
|
59
68
|
}
|
|
@@ -100,8 +109,10 @@ async function decryptSpecimen(encrypted, options) {
|
|
|
100
109
|
};
|
|
101
110
|
}
|
|
102
111
|
try {
|
|
112
|
+
// Get iteration count from payload (self-describing) or use default for backward compat
|
|
113
|
+
const iterations = encrypted.iterations ?? DEFAULT_PBKDF2_ITERATIONS;
|
|
103
114
|
// Get or derive the decryption key
|
|
104
|
-
const cryptoKey = typeof key === 'string' ? await deriveKey(key) : key;
|
|
115
|
+
const cryptoKey = typeof key === 'string' ? await deriveKey(key, iterations) : key;
|
|
105
116
|
// Decode payload and IV from base64url
|
|
106
117
|
const ciphertext = fromBase64Url(encrypted.payload);
|
|
107
118
|
const ivBuffer = fromBase64Url(encrypted.iv);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../../src/crypto/decrypt.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../../src/crypto/decrypt.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,54 @@
|
|
|
5
5
|
* Provides AES-256-GCM encryption for specimens using Web Crypto API.
|
|
6
6
|
* Supports both password-based (PBKDF2) and raw CryptoKey encryption.
|
|
7
7
|
*
|
|
8
|
+
* ## Security Model
|
|
9
|
+
*
|
|
10
|
+
* This module implements a **deterministic key derivation** model optimized for:
|
|
11
|
+
* - Cross-environment compatibility (browser + Node.js)
|
|
12
|
+
* - Offline decryption (no external key storage needed)
|
|
13
|
+
* - Self-describing payloads (iterations stored in output)
|
|
14
|
+
*
|
|
15
|
+
* ### Password vs CryptoKey
|
|
16
|
+
*
|
|
17
|
+
* | Input Type | Use Case | Security Level |
|
|
18
|
+
* |------------|----------|----------------|
|
|
19
|
+
* | `string` (password) | Simple sharing, QR codes | Good (depends on password strength) |
|
|
20
|
+
* | `CryptoKey` | Server-side, key management systems | Best (full control over key material) |
|
|
21
|
+
*
|
|
22
|
+
* ### Security Considerations
|
|
23
|
+
*
|
|
24
|
+
* 1. **Fixed Salt**: The PBKDF2 salt is fixed per crypto version. This is intentional
|
|
25
|
+
* for deterministic cross-environment key derivation. Password strength is critical.
|
|
26
|
+
*
|
|
27
|
+
* 2. **Iteration Count**: Default 100,000 iterations. Can be increased via `iterations`
|
|
28
|
+
* option for higher security (at cost of performance).
|
|
29
|
+
*
|
|
30
|
+
* 3. **Random IV**: Each encryption uses a cryptographically random 96-bit IV,
|
|
31
|
+
* ensuring identical plaintexts produce different ciphertexts.
|
|
32
|
+
*
|
|
33
|
+
* 4. **Authenticated Encryption**: AES-256-GCM provides both confidentiality and
|
|
34
|
+
* integrity - tampered ciphertext will fail decryption.
|
|
35
|
+
*
|
|
36
|
+
* ## Future Specification Updates (v1.2.1+)
|
|
37
|
+
*
|
|
38
|
+
* TODO(wols-spec): The following enhancements should be documented in the upstream
|
|
39
|
+
* WOLS specification (wemush/open-standard/SPECIFICATION.md) in a future release:
|
|
40
|
+
*
|
|
41
|
+
* 1. **EncryptedSpecimen schema**: Define the `cryptoVersion` and `iterations` fields
|
|
42
|
+
* in the encrypted payload format section.
|
|
43
|
+
*
|
|
44
|
+
* 2. **Configurable iterations**: Document the `iterations` option in EncryptionOptions
|
|
45
|
+
* with recommended ranges (100k-600k) and minimum floor (10k).
|
|
46
|
+
*
|
|
47
|
+
* 3. **Self-describing payloads**: Explain that v1.2.0+ payloads include derivation
|
|
48
|
+
* parameters for forward-compatible decryption.
|
|
49
|
+
*
|
|
50
|
+
* 4. **Security guidance**: Add a security considerations section covering:
|
|
51
|
+
* - Fixed salt tradeoffs (determinism vs uniqueness)
|
|
52
|
+
* - Password strength requirements
|
|
53
|
+
* - When to use CryptoKey vs password
|
|
54
|
+
* - Optional random salt for high-security scenarios (future v2)
|
|
55
|
+
*
|
|
8
56
|
* @module crypto/encrypt
|
|
9
57
|
*/
|
|
10
58
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -14,10 +62,36 @@ const specimen_js_1 = require("../specimen.js");
|
|
|
14
62
|
// =============================================================================
|
|
15
63
|
// CONSTANTS
|
|
16
64
|
// =============================================================================
|
|
17
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* Salt for PBKDF2 key derivation.
|
|
67
|
+
*
|
|
68
|
+
* DESIGN DECISION: This salt is intentionally fixed (not random) for deterministic
|
|
69
|
+
* key derivation. This allows:
|
|
70
|
+
*
|
|
71
|
+
* 1. **Cross-environment compatibility**: Same password produces same key in
|
|
72
|
+
* browser (Web Crypto API) and server (Node.js crypto), enabling encrypted
|
|
73
|
+
* specimens to be decrypted in either environment.
|
|
74
|
+
*
|
|
75
|
+
* 2. **Offline decryption**: No need to store/transmit the salt alongside the
|
|
76
|
+
* encrypted payload - the salt is known from the library version.
|
|
77
|
+
*
|
|
78
|
+
* 3. **Version-aware migration**: The salt includes a version identifier
|
|
79
|
+
* (@wemush/wols/crypto/v1) allowing future versions to use different salts
|
|
80
|
+
* while maintaining backward compatibility for decryption.
|
|
81
|
+
*
|
|
82
|
+
* SECURITY NOTE: The fixed salt means password security depends entirely on
|
|
83
|
+
* password strength. Users should use strong, unique passwords. For maximum
|
|
84
|
+
* security, use a CryptoKey directly instead of a password string.
|
|
85
|
+
*
|
|
86
|
+
* @internal
|
|
87
|
+
*/
|
|
18
88
|
const PBKDF2_SALT = new TextEncoder().encode('@wemush/wols/crypto/v1');
|
|
19
|
-
/**
|
|
20
|
-
const
|
|
89
|
+
/** Default number of PBKDF2 iterations */
|
|
90
|
+
const DEFAULT_PBKDF2_ITERATIONS = 100_000;
|
|
91
|
+
/** Minimum allowed PBKDF2 iterations (security floor) */
|
|
92
|
+
const MIN_PBKDF2_ITERATIONS = 10_000;
|
|
93
|
+
/** Current crypto schema version */
|
|
94
|
+
const CRYPTO_VERSION = 'v1';
|
|
21
95
|
/** IV length in bytes (96 bits = 12 bytes recommended for GCM) */
|
|
22
96
|
const IV_LENGTH = 12;
|
|
23
97
|
// =============================================================================
|
|
@@ -34,10 +108,21 @@ function toBase64Url(buffer) {
|
|
|
34
108
|
}
|
|
35
109
|
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
36
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Validate and normalize iteration count
|
|
113
|
+
* @throws Error if iterations below minimum
|
|
114
|
+
*/
|
|
115
|
+
function validateIterations(iterations) {
|
|
116
|
+
const count = iterations ?? DEFAULT_PBKDF2_ITERATIONS;
|
|
117
|
+
if (count < MIN_PBKDF2_ITERATIONS) {
|
|
118
|
+
throw new Error(`PBKDF2 iterations must be at least ${MIN_PBKDF2_ITERATIONS}, got ${count}`);
|
|
119
|
+
}
|
|
120
|
+
return count;
|
|
121
|
+
}
|
|
37
122
|
/**
|
|
38
123
|
* Derive a CryptoKey from a password using PBKDF2
|
|
39
124
|
*/
|
|
40
|
-
async function deriveKey(password) {
|
|
125
|
+
async function deriveKey(password, iterations) {
|
|
41
126
|
const encoder = new TextEncoder();
|
|
42
127
|
const passwordBytes = encoder.encode(password);
|
|
43
128
|
// Import password as key material
|
|
@@ -48,7 +133,7 @@ async function deriveKey(password) {
|
|
|
48
133
|
return crypto.subtle.deriveKey({
|
|
49
134
|
name: 'PBKDF2',
|
|
50
135
|
salt: PBKDF2_SALT,
|
|
51
|
-
iterations
|
|
136
|
+
iterations,
|
|
52
137
|
hash: 'SHA-256',
|
|
53
138
|
}, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt']);
|
|
54
139
|
}
|
|
@@ -75,10 +160,17 @@ function generateIV() {
|
|
|
75
160
|
* ```typescript
|
|
76
161
|
* import { encryptSpecimen } from '@wemush/wols/crypto';
|
|
77
162
|
*
|
|
163
|
+
* // Basic encryption with default iterations (100k)
|
|
78
164
|
* const encrypted = await encryptSpecimen(specimen, {
|
|
79
165
|
* key: 'my-secret-password',
|
|
80
166
|
* });
|
|
81
|
-
*
|
|
167
|
+
*
|
|
168
|
+
* // Higher security with custom iterations
|
|
169
|
+
* const secureEncrypted = await encryptSpecimen(specimen, {
|
|
170
|
+
* key: 'my-secret-password',
|
|
171
|
+
* iterations: 300_000,
|
|
172
|
+
* });
|
|
173
|
+
* // Returns: { encrypted: true, payload: "...", iv: "...", algorithm: "AES-256-GCM", cryptoVersion: "v1", iterations: 300000 }
|
|
82
174
|
* ```
|
|
83
175
|
*/
|
|
84
176
|
async function encryptSpecimen(specimen, options) {
|
|
@@ -87,8 +179,12 @@ async function encryptSpecimen(specimen, options) {
|
|
|
87
179
|
if (fields !== undefined && fields.length > 0) {
|
|
88
180
|
return encryptPartial(specimen, options);
|
|
89
181
|
}
|
|
182
|
+
// Validate and get iteration count
|
|
183
|
+
const iterations = validateIterations(options.iterations);
|
|
90
184
|
// Get or derive the encryption key
|
|
91
|
-
|
|
185
|
+
// When key is a CryptoKey, iterations is still recorded for documentation
|
|
186
|
+
// but not used (key is already derived)
|
|
187
|
+
const cryptoKey = typeof key === 'string' ? await deriveKey(key, iterations) : key;
|
|
92
188
|
// Serialize the specimen to JSON
|
|
93
189
|
const plaintext = (0, specimen_js_1.serializeSpecimen)(specimen);
|
|
94
190
|
const plaintextBytes = new TextEncoder().encode(plaintext);
|
|
@@ -96,12 +192,14 @@ async function encryptSpecimen(specimen, options) {
|
|
|
96
192
|
const { iv, ivBuffer } = generateIV();
|
|
97
193
|
// Encrypt
|
|
98
194
|
const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, cryptoKey, plaintextBytes);
|
|
99
|
-
// Return encrypted specimen
|
|
195
|
+
// Return encrypted specimen with version and iterations for self-describing decryption
|
|
100
196
|
return {
|
|
101
197
|
encrypted: true,
|
|
102
198
|
payload: toBase64Url(ciphertext),
|
|
103
199
|
iv: toBase64Url(ivBuffer),
|
|
104
200
|
algorithm: 'AES-256-GCM',
|
|
201
|
+
cryptoVersion: CRYPTO_VERSION,
|
|
202
|
+
iterations,
|
|
105
203
|
};
|
|
106
204
|
}
|
|
107
205
|
/**
|
|
@@ -111,8 +209,10 @@ async function encryptSpecimen(specimen, options) {
|
|
|
111
209
|
*/
|
|
112
210
|
async function encryptPartial(specimen, options) {
|
|
113
211
|
const { key, fields = [] } = options;
|
|
212
|
+
// Validate and get iteration count
|
|
213
|
+
const iterations = validateIterations(options.iterations);
|
|
114
214
|
// Get or derive the encryption key
|
|
115
|
-
const cryptoKey = typeof key === 'string' ? await deriveKey(key) : key;
|
|
215
|
+
const cryptoKey = typeof key === 'string' ? await deriveKey(key, iterations) : key;
|
|
116
216
|
// Clone the specimen
|
|
117
217
|
const result = { ...specimen };
|
|
118
218
|
// Encrypt each specified field
|
|
@@ -128,6 +228,8 @@ async function encryptPartial(specimen, options) {
|
|
|
128
228
|
payload: toBase64Url(ciphertext),
|
|
129
229
|
iv: toBase64Url(ivBuffer),
|
|
130
230
|
algorithm: 'AES-256-GCM',
|
|
231
|
+
cryptoVersion: CRYPTO_VERSION,
|
|
232
|
+
iterations,
|
|
131
233
|
};
|
|
132
234
|
}
|
|
133
235
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../../src/crypto/encrypt.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../../src/crypto/encrypt.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* @version 1.1.0
|
|
11
11
|
*/
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.isQRAvailableSync = exports.isQRAvailable = exports.toQRCodeSVG = exports.toQRCodeDataURL = exports.toQRCode = exports.decryptSpecimen = exports.isEncrypted = exports.encryptSpecimen = exports.registerSpeciesCode = exports.getCodeFromSpecies = exports.getSpeciesFromCode = exports.SPECIES_CODES = exports.parseCompactUrl = exports.toCompactUrl = exports.parseSpecimen = exports.validateSpecimen = exports.serializeSpecimen = exports.createSpecimen = exports.WolsEncryptionError = exports.WolsValidationError = exports.WolsParseError = exports.WolsError = exports.WolsErrorCode = exports.GROWTH_STAGES = exports.SPECIMEN_TYPES = exports.isStrain = exports.isGrowthStage = exports.isSpecimenType = exports.asSpecimenId = exports.WOLS_CONTEXT = exports.WOLS_VERSION = void 0;
|
|
13
|
+
exports.supportsNodeCrypto = exports.supportsWebCrypto = exports.getRuntimeEnvironment = exports.isBun = exports.isDeno = exports.isWebWorker = exports.isBrowser = exports.isServer = exports.isQRAvailableSync = exports.isQRAvailable = exports.toQRCodeSVG = exports.toQRCodeDataURL = exports.toQRCode = exports.decryptSpecimen = exports.isEncrypted = exports.encryptSpecimen = exports.registerSpeciesCode = exports.getCodeFromSpecies = exports.getSpeciesFromCode = exports.SPECIES_CODES = exports.parseCompactUrlOrNull = exports.parseCompactUrlOrThrow = exports.parseCompactUrl = exports.toCompactUrl = exports.parseSpecimen = exports.validateSpecimen = exports.serializeSpecimen = exports.createSpecimen = exports.WolsEncryptionError = exports.WolsValidationError = exports.WolsParseError = exports.WolsError = exports.WolsErrorCode = exports.isValidGeneration = exports.normalizeGeneration = exports.registerPlatformType = exports.mapFromWolsType = exports.mapToWolsType = exports.WOLS_TO_PLATFORM_MAP = exports.getTypeAliases = exports.resolveTypeAlias = exports.registerTypeAlias = exports.GROWTH_STAGES = exports.SPECIMEN_TYPES = exports.isStrain = exports.isGrowthStage = exports.isSpecimenType = exports.asSpecimenId = exports.WOLS_CONTEXT = exports.WOLS_VERSION = void 0;
|
|
14
|
+
exports.clearMigrations = exports.getMigrations = exports.migrate = exports.canMigrate = exports.registerMigration = exports.getCurrentVersion = exports.isNewer = exports.isOutdated = exports.compareVersions = exports.supportsURLAPIs = exports.supportsTextEncoding = exports.isCryptoSupported = void 0;
|
|
14
15
|
// =============================================================================
|
|
15
16
|
// Constants
|
|
16
17
|
// =============================================================================
|
|
@@ -28,6 +29,27 @@ Object.defineProperty(exports, "isStrain", { enumerable: true, get: function ()
|
|
|
28
29
|
Object.defineProperty(exports, "SPECIMEN_TYPES", { enumerable: true, get: function () { return types_js_2.SPECIMEN_TYPES; } });
|
|
29
30
|
Object.defineProperty(exports, "GROWTH_STAGES", { enumerable: true, get: function () { return types_js_2.GROWTH_STAGES; } });
|
|
30
31
|
// =============================================================================
|
|
32
|
+
// Type Alias System (v1.2.0)
|
|
33
|
+
// =============================================================================
|
|
34
|
+
var types_js_3 = require("./types.js");
|
|
35
|
+
Object.defineProperty(exports, "registerTypeAlias", { enumerable: true, get: function () { return types_js_3.registerTypeAlias; } });
|
|
36
|
+
Object.defineProperty(exports, "resolveTypeAlias", { enumerable: true, get: function () { return types_js_3.resolveTypeAlias; } });
|
|
37
|
+
Object.defineProperty(exports, "getTypeAliases", { enumerable: true, get: function () { return types_js_3.getTypeAliases; } });
|
|
38
|
+
// =============================================================================
|
|
39
|
+
// Type Mapping System (v1.2.0)
|
|
40
|
+
// =============================================================================
|
|
41
|
+
var types_js_4 = require("./types.js");
|
|
42
|
+
Object.defineProperty(exports, "WOLS_TO_PLATFORM_MAP", { enumerable: true, get: function () { return types_js_4.WOLS_TO_PLATFORM_MAP; } });
|
|
43
|
+
Object.defineProperty(exports, "mapToWolsType", { enumerable: true, get: function () { return types_js_4.mapToWolsType; } });
|
|
44
|
+
Object.defineProperty(exports, "mapFromWolsType", { enumerable: true, get: function () { return types_js_4.mapFromWolsType; } });
|
|
45
|
+
Object.defineProperty(exports, "registerPlatformType", { enumerable: true, get: function () { return types_js_4.registerPlatformType; } });
|
|
46
|
+
// =============================================================================
|
|
47
|
+
// Generation Format System (v1.2.0)
|
|
48
|
+
// =============================================================================
|
|
49
|
+
var types_js_5 = require("./types.js");
|
|
50
|
+
Object.defineProperty(exports, "normalizeGeneration", { enumerable: true, get: function () { return types_js_5.normalizeGeneration; } });
|
|
51
|
+
Object.defineProperty(exports, "isValidGeneration", { enumerable: true, get: function () { return types_js_5.isValidGeneration; } });
|
|
52
|
+
// =============================================================================
|
|
31
53
|
// Errors
|
|
32
54
|
// =============================================================================
|
|
33
55
|
var errors_js_1 = require("./errors.js");
|
|
@@ -58,6 +80,8 @@ Object.defineProperty(exports, "parseSpecimen", { enumerable: true, get: functio
|
|
|
58
80
|
var compact_url_js_1 = require("./compact-url.js");
|
|
59
81
|
Object.defineProperty(exports, "toCompactUrl", { enumerable: true, get: function () { return compact_url_js_1.toCompactUrl; } });
|
|
60
82
|
Object.defineProperty(exports, "parseCompactUrl", { enumerable: true, get: function () { return compact_url_js_1.parseCompactUrl; } });
|
|
83
|
+
Object.defineProperty(exports, "parseCompactUrlOrThrow", { enumerable: true, get: function () { return compact_url_js_1.parseCompactUrlOrThrow; } });
|
|
84
|
+
Object.defineProperty(exports, "parseCompactUrlOrNull", { enumerable: true, get: function () { return compact_url_js_1.parseCompactUrlOrNull; } });
|
|
61
85
|
Object.defineProperty(exports, "SPECIES_CODES", { enumerable: true, get: function () { return compact_url_js_1.SPECIES_CODES; } });
|
|
62
86
|
Object.defineProperty(exports, "getSpeciesFromCode", { enumerable: true, get: function () { return compact_url_js_1.getSpeciesFromCode; } });
|
|
63
87
|
Object.defineProperty(exports, "getCodeFromSpecies", { enumerable: true, get: function () { return compact_url_js_1.getCodeFromSpecies; } });
|
|
@@ -78,4 +102,32 @@ Object.defineProperty(exports, "toQRCodeDataURL", { enumerable: true, get: funct
|
|
|
78
102
|
Object.defineProperty(exports, "toQRCodeSVG", { enumerable: true, get: function () { return index_js_2.toQRCodeSVG; } });
|
|
79
103
|
Object.defineProperty(exports, "isQRAvailable", { enumerable: true, get: function () { return index_js_2.isQRAvailable; } });
|
|
80
104
|
Object.defineProperty(exports, "isQRAvailableSync", { enumerable: true, get: function () { return index_js_2.isQRAvailableSync; } });
|
|
105
|
+
// =============================================================================
|
|
106
|
+
// Environment Detection (v1.2.0)
|
|
107
|
+
// =============================================================================
|
|
108
|
+
var environment_js_1 = require("./utils/environment.js");
|
|
109
|
+
Object.defineProperty(exports, "isServer", { enumerable: true, get: function () { return environment_js_1.isServer; } });
|
|
110
|
+
Object.defineProperty(exports, "isBrowser", { enumerable: true, get: function () { return environment_js_1.isBrowser; } });
|
|
111
|
+
Object.defineProperty(exports, "isWebWorker", { enumerable: true, get: function () { return environment_js_1.isWebWorker; } });
|
|
112
|
+
Object.defineProperty(exports, "isDeno", { enumerable: true, get: function () { return environment_js_1.isDeno; } });
|
|
113
|
+
Object.defineProperty(exports, "isBun", { enumerable: true, get: function () { return environment_js_1.isBun; } });
|
|
114
|
+
Object.defineProperty(exports, "getRuntimeEnvironment", { enumerable: true, get: function () { return environment_js_1.getRuntimeEnvironment; } });
|
|
115
|
+
Object.defineProperty(exports, "supportsWebCrypto", { enumerable: true, get: function () { return environment_js_1.supportsWebCrypto; } });
|
|
116
|
+
Object.defineProperty(exports, "supportsNodeCrypto", { enumerable: true, get: function () { return environment_js_1.supportsNodeCrypto; } });
|
|
117
|
+
Object.defineProperty(exports, "isCryptoSupported", { enumerable: true, get: function () { return environment_js_1.isCryptoSupported; } });
|
|
118
|
+
Object.defineProperty(exports, "supportsTextEncoding", { enumerable: true, get: function () { return environment_js_1.supportsTextEncoding; } });
|
|
119
|
+
Object.defineProperty(exports, "supportsURLAPIs", { enumerable: true, get: function () { return environment_js_1.supportsURLAPIs; } });
|
|
120
|
+
// =============================================================================
|
|
121
|
+
// Migration Utilities (v1.2.0)
|
|
122
|
+
// =============================================================================
|
|
123
|
+
var migration_js_1 = require("./utils/migration.js");
|
|
124
|
+
Object.defineProperty(exports, "compareVersions", { enumerable: true, get: function () { return migration_js_1.compareVersions; } });
|
|
125
|
+
Object.defineProperty(exports, "isOutdated", { enumerable: true, get: function () { return migration_js_1.isOutdated; } });
|
|
126
|
+
Object.defineProperty(exports, "isNewer", { enumerable: true, get: function () { return migration_js_1.isNewer; } });
|
|
127
|
+
Object.defineProperty(exports, "getCurrentVersion", { enumerable: true, get: function () { return migration_js_1.getCurrentVersion; } });
|
|
128
|
+
Object.defineProperty(exports, "registerMigration", { enumerable: true, get: function () { return migration_js_1.registerMigration; } });
|
|
129
|
+
Object.defineProperty(exports, "canMigrate", { enumerable: true, get: function () { return migration_js_1.canMigrate; } });
|
|
130
|
+
Object.defineProperty(exports, "migrate", { enumerable: true, get: function () { return migration_js_1.migrate; } });
|
|
131
|
+
Object.defineProperty(exports, "getMigrations", { enumerable: true, get: function () { return migration_js_1.getMigrations; } });
|
|
132
|
+
Object.defineProperty(exports, "clearMigrations", { enumerable: true, get: function () { return migration_js_1.clearMigrations; } });
|
|
81
133
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/parser.js
CHANGED
|
@@ -140,6 +140,9 @@ function parseSpecimen(json) {
|
|
|
140
140
|
if (data['signature'] !== undefined) {
|
|
141
141
|
specimen.signature = data['signature'];
|
|
142
142
|
}
|
|
143
|
+
if (data['_meta'] !== undefined) {
|
|
144
|
+
specimen._meta = data['_meta'];
|
|
145
|
+
}
|
|
143
146
|
return {
|
|
144
147
|
success: true,
|
|
145
148
|
data: specimen,
|
package/dist/cjs/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/specimen.js
CHANGED
|
@@ -73,13 +73,20 @@ function expandStrain(strain) {
|
|
|
73
73
|
function createSpecimen(input) {
|
|
74
74
|
const id = (0, types_js_1.asSpecimenId)((0, cuid_js_1.createSpecimenId)());
|
|
75
75
|
const strain = expandStrain(input.strain);
|
|
76
|
+
// Resolve type alias to canonical WOLS type (e.g., 'LIQUID_CULTURE' -> 'CULTURE')
|
|
77
|
+
const resolvedType = (0, types_js_1.resolveTypeAlias)(input.type);
|
|
78
|
+
if (!(0, types_js_1.isSpecimenType)(resolvedType)) {
|
|
79
|
+
throw new Error(`Invalid specimen type: '${input.type}'. ` +
|
|
80
|
+
`Must be one of: CULTURE, SPAWN, SUBSTRATE, FRUITING, HARVEST ` +
|
|
81
|
+
`(or a registered alias).`);
|
|
82
|
+
}
|
|
76
83
|
// Build specimen with required fields
|
|
77
84
|
const specimen = {
|
|
78
85
|
'@context': types_js_1.WOLS_CONTEXT,
|
|
79
86
|
'@type': 'Specimen',
|
|
80
87
|
id,
|
|
81
88
|
version: types_js_1.WOLS_VERSION,
|
|
82
|
-
type:
|
|
89
|
+
type: resolvedType,
|
|
83
90
|
species: input.species,
|
|
84
91
|
};
|
|
85
92
|
// Add optional fields only if defined
|
|
@@ -101,6 +108,9 @@ function createSpecimen(input) {
|
|
|
101
108
|
if (input.custom !== undefined) {
|
|
102
109
|
specimen.custom = input.custom;
|
|
103
110
|
}
|
|
111
|
+
if (input._meta !== undefined) {
|
|
112
|
+
specimen._meta = input._meta;
|
|
113
|
+
}
|
|
104
114
|
return specimen;
|
|
105
115
|
}
|
|
106
116
|
/**
|
|
@@ -158,6 +168,9 @@ function serializeSpecimen(specimen) {
|
|
|
158
168
|
if (specimen.signature !== undefined) {
|
|
159
169
|
ordered['signature'] = specimen.signature;
|
|
160
170
|
}
|
|
171
|
+
if (specimen._meta !== undefined) {
|
|
172
|
+
ordered['_meta'] = specimen._meta;
|
|
173
|
+
}
|
|
161
174
|
return JSON.stringify(ordered);
|
|
162
175
|
}
|
|
163
176
|
//# sourceMappingURL=specimen.js.map
|
package/dist/cjs/specimen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specimen.js","sourceRoot":"","sources":["../../src/specimen.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;
|
|
1
|
+
{"version":3,"file":"specimen.js","sourceRoot":"","sources":["../../src/specimen.ts"],"names":[],"mappings":"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"}
|