@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/esm/types.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.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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"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Migration Utilities
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for comparing WOLS versions and
|
|
5
|
+
* migrating specimens between versions.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/migration
|
|
8
|
+
* @since 1.2.0
|
|
9
|
+
*/
|
|
10
|
+
import { WOLS_VERSION } from '../types.js';
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// INTERNAL STATE
|
|
13
|
+
// =============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Registered migration handlers.
|
|
16
|
+
*/
|
|
17
|
+
const MIGRATION_REGISTRY = [];
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// VERSION UTILITIES
|
|
20
|
+
// =============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Parse a semantic version string into components.
|
|
23
|
+
*
|
|
24
|
+
* @param version - Semantic version string (e.g., "1.2.0")
|
|
25
|
+
* @returns Array of [major, minor, patch] or null if invalid
|
|
26
|
+
*/
|
|
27
|
+
function parseVersion(version) {
|
|
28
|
+
const match = /^(\d+)\.(\d+)\.(\d+)/.exec(version);
|
|
29
|
+
if (!match)
|
|
30
|
+
return null;
|
|
31
|
+
const major = parseInt(match[1], 10);
|
|
32
|
+
const minor = parseInt(match[2], 10);
|
|
33
|
+
const patch = parseInt(match[3], 10);
|
|
34
|
+
return [major, minor, patch];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Compare two semantic versions.
|
|
38
|
+
*
|
|
39
|
+
* @param a - First version string
|
|
40
|
+
* @param b - Second version string
|
|
41
|
+
* @returns -1 if a < b, 0 if a === b, 1 if a > b
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* compareVersions('1.0.0', '1.1.0') // Returns -1
|
|
46
|
+
* compareVersions('1.1.0', '1.1.0') // Returns 0
|
|
47
|
+
* compareVersions('2.0.0', '1.9.0') // Returns 1
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @since 1.2.0
|
|
51
|
+
*/
|
|
52
|
+
export function compareVersions(a, b) {
|
|
53
|
+
const parsedA = parseVersion(a);
|
|
54
|
+
const parsedB = parseVersion(b);
|
|
55
|
+
if (!parsedA || !parsedB) {
|
|
56
|
+
// Fallback to string comparison for invalid versions
|
|
57
|
+
if (a < b)
|
|
58
|
+
return -1;
|
|
59
|
+
if (a > b)
|
|
60
|
+
return 1;
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
const [majorA, minorA, patchA] = parsedA;
|
|
64
|
+
const [majorB, minorB, patchB] = parsedB;
|
|
65
|
+
if (majorA !== majorB)
|
|
66
|
+
return majorA < majorB ? -1 : 1;
|
|
67
|
+
if (minorA !== minorB)
|
|
68
|
+
return minorA < minorB ? -1 : 1;
|
|
69
|
+
if (patchA !== patchB)
|
|
70
|
+
return patchA < patchB ? -1 : 1;
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a specimen is using an outdated WOLS version.
|
|
75
|
+
*
|
|
76
|
+
* @param specimen - Specimen object or version string
|
|
77
|
+
* @returns True if the specimen version is older than current library version
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* isOutdated(specimen) // True if specimen.version < WOLS_VERSION
|
|
82
|
+
* isOutdated('1.0.0') // True (older than current)
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @since 1.2.0
|
|
86
|
+
*/
|
|
87
|
+
export function isOutdated(specimen) {
|
|
88
|
+
const version = typeof specimen === 'string' ? specimen : specimen.version;
|
|
89
|
+
return compareVersions(version, WOLS_VERSION) < 0;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if a specimen is using a newer WOLS version than this library.
|
|
93
|
+
*
|
|
94
|
+
* This can happen when specimens are created by a newer library version.
|
|
95
|
+
*
|
|
96
|
+
* @param specimen - Specimen object or version string
|
|
97
|
+
* @returns True if the specimen version is newer than current library version
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* isNewer(specimen) // True if specimen.version > WOLS_VERSION
|
|
102
|
+
* isNewer('2.0.0') // True if library is 1.x
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @since 1.2.0
|
|
106
|
+
*/
|
|
107
|
+
export function isNewer(specimen) {
|
|
108
|
+
const version = typeof specimen === 'string' ? specimen : specimen.version;
|
|
109
|
+
return compareVersions(version, WOLS_VERSION) > 0;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the current library WOLS version.
|
|
113
|
+
*
|
|
114
|
+
* @returns The WOLS version this library implements
|
|
115
|
+
*
|
|
116
|
+
* @since 1.2.0
|
|
117
|
+
*/
|
|
118
|
+
export function getCurrentVersion() {
|
|
119
|
+
return WOLS_VERSION;
|
|
120
|
+
}
|
|
121
|
+
// =============================================================================
|
|
122
|
+
// MIGRATION REGISTRATION
|
|
123
|
+
// =============================================================================
|
|
124
|
+
/**
|
|
125
|
+
* Register a migration handler for upgrading specimens between versions.
|
|
126
|
+
*
|
|
127
|
+
* Migrations are applied in order from oldest to newest when calling `migrate()`.
|
|
128
|
+
*
|
|
129
|
+
* @param from - Source version (e.g., "1.0.0")
|
|
130
|
+
* @param to - Target version (e.g., "1.1.0")
|
|
131
|
+
* @param handler - Function to transform the specimen
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* registerMigration('1.0.0', '1.1.0', (specimen) => {
|
|
136
|
+
* // Add new required field with default value
|
|
137
|
+
* return { ...specimen, newField: 'default' };
|
|
138
|
+
* });
|
|
139
|
+
* ```
|
|
140
|
+
*
|
|
141
|
+
* @since 1.2.0
|
|
142
|
+
*/
|
|
143
|
+
export function registerMigration(from, to, handler) {
|
|
144
|
+
MIGRATION_REGISTRY.push({ from, to, handler });
|
|
145
|
+
// Keep migrations sorted by source version
|
|
146
|
+
MIGRATION_REGISTRY.sort((a, b) => compareVersions(a.from, b.from));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if a specimen can be migrated to the current version.
|
|
150
|
+
*
|
|
151
|
+
* @param specimen - Specimen to check
|
|
152
|
+
* @returns True if migration path exists, false otherwise
|
|
153
|
+
*
|
|
154
|
+
* @since 1.2.0
|
|
155
|
+
*/
|
|
156
|
+
export function canMigrate(specimen) {
|
|
157
|
+
if (!isOutdated(specimen)) {
|
|
158
|
+
return false; // Already current or newer
|
|
159
|
+
}
|
|
160
|
+
// Check if we have a migration path
|
|
161
|
+
let currentVersion = specimen.version;
|
|
162
|
+
while (compareVersions(currentVersion, WOLS_VERSION) < 0) {
|
|
163
|
+
const migration = MIGRATION_REGISTRY.find(m => m.from === currentVersion);
|
|
164
|
+
if (!migration) {
|
|
165
|
+
return false; // No migration from this version
|
|
166
|
+
}
|
|
167
|
+
currentVersion = migration.to;
|
|
168
|
+
}
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Migrate a specimen to the current WOLS version.
|
|
173
|
+
*
|
|
174
|
+
* Applies all registered migrations in order from the specimen's version
|
|
175
|
+
* to the current library version.
|
|
176
|
+
*
|
|
177
|
+
* @param specimen - Specimen to migrate
|
|
178
|
+
* @returns Migrated specimen with updated version
|
|
179
|
+
* @throws Error if no migration path exists
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const oldSpecimen = parseSpecimen(oldJson);
|
|
184
|
+
* if (isOutdated(oldSpecimen)) {
|
|
185
|
+
* const updated = migrate(oldSpecimen);
|
|
186
|
+
* console.log('Migrated to:', updated.version);
|
|
187
|
+
* }
|
|
188
|
+
* ```
|
|
189
|
+
*
|
|
190
|
+
* @since 1.2.0
|
|
191
|
+
*/
|
|
192
|
+
export function migrate(specimen) {
|
|
193
|
+
if (!isOutdated(specimen)) {
|
|
194
|
+
return specimen; // Already current or newer
|
|
195
|
+
}
|
|
196
|
+
let current = specimen;
|
|
197
|
+
let currentVersion = specimen.version;
|
|
198
|
+
while (compareVersions(currentVersion, WOLS_VERSION) < 0) {
|
|
199
|
+
const migration = MIGRATION_REGISTRY.find(m => m.from === currentVersion);
|
|
200
|
+
if (!migration) {
|
|
201
|
+
throw new Error(`No migration path from version ${currentVersion} to ${WOLS_VERSION}. ` +
|
|
202
|
+
`Register a migration using registerMigration().`);
|
|
203
|
+
}
|
|
204
|
+
current = migration.handler(current);
|
|
205
|
+
currentVersion = migration.to;
|
|
206
|
+
}
|
|
207
|
+
// Ensure version is updated and consistent with the migration chain
|
|
208
|
+
if (currentVersion !== WOLS_VERSION) {
|
|
209
|
+
throw new Error(`Migration ended at version ${currentVersion}, but expected ${WOLS_VERSION}. ` +
|
|
210
|
+
`Check the registered migrations for incorrect target versions.`);
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
...current,
|
|
214
|
+
version: currentVersion,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get all registered migrations.
|
|
219
|
+
*
|
|
220
|
+
* @returns Array of migration definitions
|
|
221
|
+
*
|
|
222
|
+
* @since 1.2.0
|
|
223
|
+
*/
|
|
224
|
+
export function getMigrations() {
|
|
225
|
+
return MIGRATION_REGISTRY;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Clear all registered migrations.
|
|
229
|
+
*
|
|
230
|
+
* Primarily useful for testing.
|
|
231
|
+
*
|
|
232
|
+
* @since 1.2.0
|
|
233
|
+
*/
|
|
234
|
+
export function clearMigrations() {
|
|
235
|
+
MIGRATION_REGISTRY.length = 0;
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../../src/utils/migration.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/validator.js
CHANGED
|
@@ -12,17 +12,26 @@ import { isValidISO8601 } from './utils/iso8601.js';
|
|
|
12
12
|
// VALIDATION PATTERNS
|
|
13
13
|
// =============================================================================
|
|
14
14
|
/**
|
|
15
|
-
* Pattern for valid specimen ID: wemush:[a-z0-9]+
|
|
15
|
+
* Pattern for valid specimen ID (strict mode): wemush:[a-z0-9]+
|
|
16
16
|
*/
|
|
17
|
-
const
|
|
17
|
+
const SPECIMEN_ID_PATTERN_STRICT = /^wemush:[a-z0-9]+$/;
|
|
18
|
+
/**
|
|
19
|
+
* Pattern for valid specimen ID with ULID suffix.
|
|
20
|
+
* ULID: 26 characters from Crockford's Base32 alphabet (excluding I, L, O, U).
|
|
21
|
+
*/
|
|
22
|
+
const SPECIMEN_ID_PATTERN_ULID = /^wemush:[0-9A-HJKMNP-TV-Z]{26}$/i;
|
|
23
|
+
/**
|
|
24
|
+
* Pattern for valid specimen ID with UUID v4 suffix.
|
|
25
|
+
*/
|
|
26
|
+
const SPECIMEN_ID_PATTERN_UUID = /^wemush:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
18
27
|
/**
|
|
19
28
|
* Pattern for valid semver version: major.minor.patch
|
|
20
29
|
*/
|
|
21
30
|
const SEMVER_PATTERN = /^\d+\.\d+\.\d+$/;
|
|
22
31
|
/**
|
|
23
|
-
* Pattern for valid strain generation: P, F1, F2, F3,
|
|
32
|
+
* Pattern for valid strain generation: P, F1, F2, F3, G1, G2, or numeric (v1.2.0).
|
|
24
33
|
*/
|
|
25
|
-
const GENERATION_PATTERN = /^(P|F\d+)$/;
|
|
34
|
+
const GENERATION_PATTERN = /^(P|F\d+|G\d+|\d+)$/;
|
|
26
35
|
/**
|
|
27
36
|
* Known WOLS specimen fields (for unknown field detection).
|
|
28
37
|
*/
|
|
@@ -41,6 +50,7 @@ const KNOWN_FIELDS = new Set([
|
|
|
41
50
|
'creator',
|
|
42
51
|
'custom',
|
|
43
52
|
'signature',
|
|
53
|
+
'_meta', // v1.2.0: Implementation metadata namespace
|
|
44
54
|
]);
|
|
45
55
|
// =============================================================================
|
|
46
56
|
// HELPER FUNCTIONS
|
|
@@ -101,9 +111,16 @@ function validateType(value, errors, _options) {
|
|
|
101
111
|
}
|
|
102
112
|
}
|
|
103
113
|
/**
|
|
104
|
-
* Validate id field.
|
|
114
|
+
* Validate id field with flexible ID format support (v1.2.0).
|
|
115
|
+
*
|
|
116
|
+
* Supports multiple ID validation modes:
|
|
117
|
+
* - 'strict': wemush:[a-z0-9]+ (default, backwards compatible)
|
|
118
|
+
* - 'ulid': wemush:{ULID}
|
|
119
|
+
* - 'uuid': wemush:{UUID-v4}
|
|
120
|
+
* - 'any': wemush:{non-empty-string}
|
|
121
|
+
* - Custom validator function
|
|
105
122
|
*/
|
|
106
|
-
function validateId(value, errors,
|
|
123
|
+
function validateId(value, errors, options) {
|
|
107
124
|
if (value === undefined || value === null) {
|
|
108
125
|
errors.push(error('id', WolsErrorCode.REQUIRED_FIELD, 'id is required'));
|
|
109
126
|
return;
|
|
@@ -112,8 +129,43 @@ function validateId(value, errors, _options) {
|
|
|
112
129
|
errors.push(error('id', WolsErrorCode.INVALID_ID_FORMAT, 'id must be a string'));
|
|
113
130
|
return;
|
|
114
131
|
}
|
|
115
|
-
|
|
116
|
-
|
|
132
|
+
// Custom validator takes precedence
|
|
133
|
+
if (options.customIdValidator) {
|
|
134
|
+
if (!options.customIdValidator(value)) {
|
|
135
|
+
errors.push(error('id', WolsErrorCode.INVALID_ID_FORMAT, `id failed custom validation: '${value}'`));
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Check wemush: prefix requirement (all modes require this)
|
|
140
|
+
if (!value.startsWith('wemush:')) {
|
|
141
|
+
errors.push(error('id', WolsErrorCode.INVALID_ID_FORMAT, `id must start with 'wemush:', got '${value}'`));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Get ID mode (default: 'strict' for backwards compatibility)
|
|
145
|
+
const mode = options.idMode ?? 'strict';
|
|
146
|
+
switch (mode) {
|
|
147
|
+
case 'strict':
|
|
148
|
+
if (!SPECIMEN_ID_PATTERN_STRICT.test(value)) {
|
|
149
|
+
errors.push(error('id', WolsErrorCode.INVALID_ID_FORMAT, `id must match pattern 'wemush:[a-z0-9]+', got '${value}'`));
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case 'ulid':
|
|
153
|
+
if (!SPECIMEN_ID_PATTERN_ULID.test(value)) {
|
|
154
|
+
errors.push(error('id', WolsErrorCode.INVALID_ID_FORMAT, `id must be a valid ULID after 'wemush:' prefix, got '${value}'`));
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
case 'uuid':
|
|
158
|
+
if (!SPECIMEN_ID_PATTERN_UUID.test(value)) {
|
|
159
|
+
errors.push(error('id', WolsErrorCode.INVALID_ID_FORMAT, `id must be a valid UUID after 'wemush:' prefix, got '${value}'`));
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
case 'any':
|
|
163
|
+
// Just check for non-empty suffix after wemush:
|
|
164
|
+
if (value.length <= 7) {
|
|
165
|
+
// 'wemush:'.length = 7
|
|
166
|
+
errors.push(error('id', WolsErrorCode.INVALID_ID_FORMAT, `id suffix cannot be empty after 'wemush:'`));
|
|
167
|
+
}
|
|
168
|
+
break;
|
|
117
169
|
}
|
|
118
170
|
}
|
|
119
171
|
/**
|
|
@@ -265,8 +317,9 @@ function checkUnknownFields(specimen, warnings, options) {
|
|
|
265
317
|
export function validateSpecimen(specimen, options = {}) {
|
|
266
318
|
const errors = [];
|
|
267
319
|
const warnings = [];
|
|
268
|
-
// Default options
|
|
320
|
+
// Default options - spread to include all optional properties
|
|
269
321
|
const opts = {
|
|
322
|
+
...options,
|
|
270
323
|
allowUnknownFields: options.allowUnknownFields ?? false,
|
|
271
324
|
level: options.level ?? 'strict',
|
|
272
325
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/validator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,cAAc,EAOd,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -101,4 +101,50 @@ export declare function toCompactUrl(specimen: Specimen): string;
|
|
|
101
101
|
* ```
|
|
102
102
|
*/
|
|
103
103
|
export declare function parseCompactUrl(url: string): ParseResult<SpecimenRef>;
|
|
104
|
+
/**
|
|
105
|
+
* Parse a compact URL, throwing an error on failure.
|
|
106
|
+
*
|
|
107
|
+
* This is a convenience wrapper around parseCompactUrl() for cases
|
|
108
|
+
* where you prefer exceptions over result types.
|
|
109
|
+
*
|
|
110
|
+
* @param url - Compact URL to parse (wemush://v1/...)
|
|
111
|
+
* @returns SpecimenRef on success
|
|
112
|
+
* @throws WolsParseError on parse failure
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* try {
|
|
117
|
+
* const ref = parseCompactUrlOrThrow('wemush://v1/clx1a2b3c4?s=POSTR');
|
|
118
|
+
* console.log(ref.species); // "Pleurotus ostreatus"
|
|
119
|
+
* } catch (err) {
|
|
120
|
+
* console.error('Failed to parse:', err.message);
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
*
|
|
124
|
+
* @since 1.2.0
|
|
125
|
+
*/
|
|
126
|
+
export declare function parseCompactUrlOrThrow(url: string): SpecimenRef;
|
|
127
|
+
/**
|
|
128
|
+
* Parse a compact URL, returning null on failure.
|
|
129
|
+
*
|
|
130
|
+
* This is a convenience wrapper around parseCompactUrl() for cases
|
|
131
|
+
* where you want to handle failures with nullish coalescing.
|
|
132
|
+
*
|
|
133
|
+
* @param url - Compact URL to parse (wemush://v1/...)
|
|
134
|
+
* @returns SpecimenRef on success, null on failure
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* const ref = parseCompactUrlOrNull('wemush://v1/clx1a2b3c4?s=POSTR');
|
|
139
|
+
* if (ref !== null) {
|
|
140
|
+
* console.log(ref.species);
|
|
141
|
+
* }
|
|
142
|
+
*
|
|
143
|
+
* // Or with nullish coalescing:
|
|
144
|
+
* const species = parseCompactUrlOrNull(url)?.species ?? 'Unknown';
|
|
145
|
+
* ```
|
|
146
|
+
*
|
|
147
|
+
* @since 1.2.0
|
|
148
|
+
*/
|
|
149
|
+
export declare function parseCompactUrlOrNull(url: string): SpecimenRef | null;
|
|
104
150
|
//# sourceMappingURL=compact-url.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact-url.d.ts","sourceRoot":"","sources":["../../src/compact-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAA6B,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhG;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWhD,CAAC;AAYF;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEtE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASvE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAsDvD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CA6GrE"}
|
|
1
|
+
{"version":3,"file":"compact-url.d.ts","sourceRoot":"","sources":["../../src/compact-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAA6B,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhG;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWhD,CAAC;AAYF;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEtE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASvE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAsDvD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CA6GrE;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAM/D;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAOrE"}
|