@wemush/wols 0.1.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 (87) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +294 -0
  3. package/dist/cjs/compact-url.js +272 -0
  4. package/dist/cjs/compact-url.js.map +1 -0
  5. package/dist/cjs/crypto/decrypt.js +125 -0
  6. package/dist/cjs/crypto/decrypt.js.map +1 -0
  7. package/dist/cjs/crypto/encrypt.js +151 -0
  8. package/dist/cjs/crypto/encrypt.js.map +1 -0
  9. package/dist/cjs/crypto/index.js +16 -0
  10. package/dist/cjs/crypto/index.js.map +1 -0
  11. package/dist/cjs/errors.js +188 -0
  12. package/dist/cjs/errors.js.map +1 -0
  13. package/dist/cjs/index.js +81 -0
  14. package/dist/cjs/index.js.map +1 -0
  15. package/dist/cjs/parser.js +148 -0
  16. package/dist/cjs/parser.js.map +1 -0
  17. package/dist/cjs/qr/generate.js +275 -0
  18. package/dist/cjs/qr/generate.js.map +1 -0
  19. package/dist/cjs/qr/index.js +18 -0
  20. package/dist/cjs/qr/index.js.map +1 -0
  21. package/dist/cjs/specimen.js +163 -0
  22. package/dist/cjs/specimen.js.map +1 -0
  23. package/dist/cjs/types.js +78 -0
  24. package/dist/cjs/types.js.map +1 -0
  25. package/dist/cjs/utils/cuid.js +150 -0
  26. package/dist/cjs/utils/cuid.js.map +1 -0
  27. package/dist/cjs/utils/iso8601.js +131 -0
  28. package/dist/cjs/utils/iso8601.js.map +1 -0
  29. package/dist/cjs/validator.js +307 -0
  30. package/dist/cjs/validator.js.map +1 -0
  31. package/dist/esm/compact-url.js +264 -0
  32. package/dist/esm/compact-url.js.map +1 -0
  33. package/dist/esm/crypto/decrypt.js +122 -0
  34. package/dist/esm/crypto/decrypt.js.map +1 -0
  35. package/dist/esm/crypto/encrypt.js +147 -0
  36. package/dist/esm/crypto/encrypt.js.map +1 -0
  37. package/dist/esm/crypto/index.js +10 -0
  38. package/dist/esm/crypto/index.js.map +1 -0
  39. package/dist/esm/errors.js +178 -0
  40. package/dist/esm/errors.js.map +1 -0
  41. package/dist/esm/index.js +47 -0
  42. package/dist/esm/index.js.map +1 -0
  43. package/dist/esm/parser.js +145 -0
  44. package/dist/esm/parser.js.map +1 -0
  45. package/dist/esm/qr/generate.js +235 -0
  46. package/dist/esm/qr/generate.js.map +1 -0
  47. package/dist/esm/qr/index.js +10 -0
  48. package/dist/esm/qr/index.js.map +1 -0
  49. package/dist/esm/specimen.js +159 -0
  50. package/dist/esm/specimen.js.map +1 -0
  51. package/dist/esm/types.js +71 -0
  52. package/dist/esm/types.js.map +1 -0
  53. package/dist/esm/utils/cuid.js +145 -0
  54. package/dist/esm/utils/cuid.js.map +1 -0
  55. package/dist/esm/utils/iso8601.js +122 -0
  56. package/dist/esm/utils/iso8601.js.map +1 -0
  57. package/dist/esm/validator.js +304 -0
  58. package/dist/esm/validator.js.map +1 -0
  59. package/dist/types/compact-url.d.ts +104 -0
  60. package/dist/types/compact-url.d.ts.map +1 -0
  61. package/dist/types/crypto/decrypt.d.ts +33 -0
  62. package/dist/types/crypto/decrypt.d.ts.map +1 -0
  63. package/dist/types/crypto/encrypt.d.ts +32 -0
  64. package/dist/types/crypto/encrypt.d.ts.map +1 -0
  65. package/dist/types/crypto/index.d.ts +10 -0
  66. package/dist/types/crypto/index.d.ts.map +1 -0
  67. package/dist/types/errors.d.ts +103 -0
  68. package/dist/types/errors.d.ts.map +1 -0
  69. package/dist/types/index.d.ts +21 -0
  70. package/dist/types/index.d.ts.map +1 -0
  71. package/dist/types/parser.d.ts +30 -0
  72. package/dist/types/parser.d.ts.map +1 -0
  73. package/dist/types/qr/generate.d.ts +62 -0
  74. package/dist/types/qr/generate.d.ts.map +1 -0
  75. package/dist/types/qr/index.d.ts +10 -0
  76. package/dist/types/qr/index.d.ts.map +1 -0
  77. package/dist/types/specimen.d.ts +71 -0
  78. package/dist/types/specimen.d.ts.map +1 -0
  79. package/dist/types/types.d.ts +269 -0
  80. package/dist/types/types.d.ts.map +1 -0
  81. package/dist/types/utils/cuid.d.ts +44 -0
  82. package/dist/types/utils/cuid.d.ts.map +1 -0
  83. package/dist/types/utils/iso8601.d.ts +79 -0
  84. package/dist/types/utils/iso8601.d.ts.map +1 -0
  85. package/dist/types/validator.d.ts +25 -0
  86. package/dist/types/validator.d.ts.map +1 -0
  87. package/package.json +95 -0
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * WOLS Error Types
4
+ *
5
+ * This module defines all error classes and error codes
6
+ * used by the WOLS TypeScript library.
7
+ *
8
+ * @module errors
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.WolsEncryptionError = exports.WolsValidationError = exports.WolsParseError = exports.WolsError = exports.WolsErrorCode = void 0;
12
+ exports.requiredFieldError = requiredFieldError;
13
+ exports.invalidFormatError = invalidFormatError;
14
+ exports.parseErrorFromException = parseErrorFromException;
15
+ // =============================================================================
16
+ // ERROR CODES
17
+ // =============================================================================
18
+ /**
19
+ * WOLS error codes (stable, for programmatic handling).
20
+ */
21
+ var WolsErrorCode;
22
+ (function (WolsErrorCode) {
23
+ /** General parse error */
24
+ WolsErrorCode["PARSE_ERROR"] = "WOLS_PARSE_ERROR";
25
+ /** Invalid JSON syntax */
26
+ WolsErrorCode["INVALID_JSON"] = "WOLS_INVALID_JSON";
27
+ /** Not a valid WOLS format */
28
+ WolsErrorCode["INVALID_FORMAT"] = "WOLS_INVALID_FORMAT";
29
+ /** Missing or invalid @context field */
30
+ WolsErrorCode["INVALID_CONTEXT"] = "WOLS_INVALID_CONTEXT";
31
+ /** Missing or invalid @type field */
32
+ WolsErrorCode["INVALID_TYPE"] = "WOLS_INVALID_TYPE";
33
+ /** ID doesn't match wemush:[a-z0-9]+ pattern */
34
+ WolsErrorCode["INVALID_ID_FORMAT"] = "WOLS_INVALID_ID_FORMAT";
35
+ /** Version not valid semver */
36
+ WolsErrorCode["INVALID_VERSION"] = "WOLS_INVALID_VERSION";
37
+ /** Type not in SpecimenType enum */
38
+ WolsErrorCode["INVALID_SPECIMEN_TYPE"] = "WOLS_INVALID_SPECIMEN_TYPE";
39
+ /** Required field is missing */
40
+ WolsErrorCode["REQUIRED_FIELD"] = "WOLS_REQUIRED_FIELD";
41
+ /** Date not in ISO 8601 format */
42
+ WolsErrorCode["INVALID_DATE_FORMAT"] = "WOLS_INVALID_DATE_FORMAT";
43
+ /** Strain generation format is invalid */
44
+ WolsErrorCode["INVALID_GENERATION"] = "WOLS_INVALID_GENERATION";
45
+ /** Invalid compact URL format */
46
+ WolsErrorCode["INVALID_URL"] = "WOLS_INVALID_URL";
47
+ /** Encryption operation failed */
48
+ WolsErrorCode["ENCRYPTION_ERROR"] = "WOLS_ENCRYPTION_ERROR";
49
+ /** Decryption operation failed */
50
+ WolsErrorCode["DECRYPTION_ERROR"] = "WOLS_DECRYPTION_ERROR";
51
+ /** Invalid encryption key */
52
+ WolsErrorCode["INVALID_KEY"] = "WOLS_INVALID_KEY";
53
+ /** Payload exceeds QR code capacity */
54
+ WolsErrorCode["SIZE_EXCEEDED"] = "WOLS_SIZE_EXCEEDED";
55
+ /** Unknown or unspecified error */
56
+ WolsErrorCode["UNKNOWN_ERROR"] = "WOLS_UNKNOWN_ERROR";
57
+ })(WolsErrorCode || (exports.WolsErrorCode = WolsErrorCode = {}));
58
+ // =============================================================================
59
+ // ERROR CLASSES
60
+ // =============================================================================
61
+ /**
62
+ * Base WOLS error class.
63
+ * All WOLS-specific errors extend this class.
64
+ */
65
+ class WolsError extends Error {
66
+ /** Error code for programmatic handling */
67
+ code;
68
+ /** Additional error details */
69
+ details;
70
+ constructor(code, message, details) {
71
+ super(message);
72
+ this.name = 'WolsError';
73
+ this.code = code;
74
+ this.details = details ?? undefined;
75
+ // Maintains proper stack trace for where error was thrown (V8 engines)
76
+ if (Error.captureStackTrace) {
77
+ Error.captureStackTrace(this, WolsError);
78
+ }
79
+ }
80
+ /**
81
+ * Convert error to JSON for serialization.
82
+ */
83
+ toJSON() {
84
+ return {
85
+ name: this.name,
86
+ code: this.code,
87
+ message: this.message,
88
+ details: this.details,
89
+ };
90
+ }
91
+ }
92
+ exports.WolsError = WolsError;
93
+ /**
94
+ * Parse error (JSON/format issues).
95
+ * Thrown when parsing JSON or WOLS data fails.
96
+ */
97
+ class WolsParseError extends WolsError {
98
+ /** Character position in the input where error occurred */
99
+ position;
100
+ constructor(code, message, details) {
101
+ super(code, message, details);
102
+ this.name = 'WolsParseError';
103
+ this.position = details?.position ?? undefined;
104
+ if (Error.captureStackTrace) {
105
+ Error.captureStackTrace(this, WolsParseError);
106
+ }
107
+ }
108
+ }
109
+ exports.WolsParseError = WolsParseError;
110
+ /**
111
+ * Validation error (schema violations).
112
+ * Thrown when specimen data fails validation.
113
+ */
114
+ class WolsValidationError extends WolsError {
115
+ /** Array of validation errors */
116
+ errors;
117
+ constructor(message, errors) {
118
+ super(WolsErrorCode.INVALID_FORMAT, message, { errors });
119
+ this.name = 'WolsValidationError';
120
+ this.errors = errors;
121
+ if (Error.captureStackTrace) {
122
+ Error.captureStackTrace(this, WolsValidationError);
123
+ }
124
+ }
125
+ }
126
+ exports.WolsValidationError = WolsValidationError;
127
+ /**
128
+ * Encryption/decryption error.
129
+ * Thrown when crypto operations fail.
130
+ */
131
+ class WolsEncryptionError extends WolsError {
132
+ constructor(code, message, details) {
133
+ super(code, message, details);
134
+ this.name = 'WolsEncryptionError';
135
+ if (Error.captureStackTrace) {
136
+ Error.captureStackTrace(this, WolsEncryptionError);
137
+ }
138
+ }
139
+ }
140
+ exports.WolsEncryptionError = WolsEncryptionError;
141
+ // =============================================================================
142
+ // ERROR FACTORY FUNCTIONS
143
+ // =============================================================================
144
+ /**
145
+ * Create a required field error.
146
+ */
147
+ function requiredFieldError(field, path = field) {
148
+ return new WolsValidationError(`Required field '${field}' is missing`, [
149
+ {
150
+ path,
151
+ code: WolsErrorCode.REQUIRED_FIELD,
152
+ message: `Field '${field}' is required`,
153
+ },
154
+ ]);
155
+ }
156
+ /**
157
+ * Create an invalid format error.
158
+ */
159
+ function invalidFormatError(field, expected, path = field) {
160
+ return new WolsValidationError(`Invalid format for '${field}': expected ${expected}`, [
161
+ {
162
+ path,
163
+ code: WolsErrorCode.INVALID_FORMAT,
164
+ message: `Expected ${expected}`,
165
+ },
166
+ ]);
167
+ }
168
+ /**
169
+ * Create a parse error from a caught exception.
170
+ */
171
+ function parseErrorFromException(error, _input) {
172
+ if (error instanceof SyntaxError) {
173
+ // Extract position from JSON.parse error message
174
+ const match = /position (\d+)/i.exec(error.message);
175
+ const position = match?.[1] ? parseInt(match[1], 10) : undefined;
176
+ const details = { originalError: error.message };
177
+ if (position !== undefined) {
178
+ details['position'] = position;
179
+ }
180
+ return new WolsParseError(WolsErrorCode.INVALID_JSON, error.message, details);
181
+ }
182
+ if (error instanceof WolsParseError) {
183
+ return error;
184
+ }
185
+ const message = error instanceof Error ? error.message : String(error);
186
+ return new WolsParseError(WolsErrorCode.PARSE_ERROR, message);
187
+ }
188
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAuJH,gDAQC;AAKD,gDAYC;AAKD,0DAoBC;AArMD,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF;;GAEG;AACH,IAAY,aAmCX;AAnCD,WAAY,aAAa;IACvB,0BAA0B;IAC1B,iDAAgC,CAAA;IAChC,0BAA0B;IAC1B,mDAAkC,CAAA;IAClC,8BAA8B;IAC9B,uDAAsC,CAAA;IACtC,wCAAwC;IACxC,yDAAwC,CAAA;IACxC,qCAAqC;IACrC,mDAAkC,CAAA;IAClC,gDAAgD;IAChD,6DAA4C,CAAA;IAC5C,+BAA+B;IAC/B,yDAAwC,CAAA;IACxC,oCAAoC;IACpC,qEAAoD,CAAA;IACpD,gCAAgC;IAChC,uDAAsC,CAAA;IACtC,kCAAkC;IAClC,iEAAgD,CAAA;IAChD,0CAA0C;IAC1C,+DAA8C,CAAA;IAC9C,iCAAiC;IACjC,iDAAgC,CAAA;IAChC,kCAAkC;IAClC,2DAA0C,CAAA;IAC1C,kCAAkC;IAClC,2DAA0C,CAAA;IAC1C,6BAA6B;IAC7B,iDAAgC,CAAA;IAChC,uCAAuC;IACvC,qDAAoC,CAAA;IACpC,mCAAmC;IACnC,qDAAoC,CAAA;AACtC,CAAC,EAnCW,aAAa,6BAAb,aAAa,QAmCxB;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;GAGG;AACH,MAAa,SAAU,SAAQ,KAAK;IAClC,2CAA2C;IAClC,IAAI,CAAgB;IAC7B,+BAA+B;IACtB,OAAO,CAAsC;IAEtD,YAAY,IAAmB,EAAE,OAAe,EAAE,OAAiC;QACjF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,SAAS,CAAC;QAEpC,uEAAuE;QACvE,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;CACF;AA7BD,8BA6BC;AAED;;;GAGG;AACH,MAAa,cAAe,SAAQ,SAAS;IAC3C,2DAA2D;IAClD,QAAQ,CAAqB;IAEtC,YACE,IAAmB,EACnB,OAAe,EACf,OAAyD;QAEzD,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;QAE/C,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF;AAjBD,wCAiBC;AAED;;;GAGG;AACH,MAAa,mBAAoB,SAAQ,SAAS;IAChD,iCAAiC;IACxB,MAAM,CAAoB;IAEnC,YAAY,OAAe,EAAE,MAAyB;QACpD,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF;AAbD,kDAaC;AAED;;;GAGG;AACH,MAAa,mBAAoB,SAAQ,SAAS;IAChD,YAAY,IAAmB,EAAE,OAAe,EAAE,OAAiC;QACjF,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAElC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF;AATD,kDASC;AAED,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAa,EAAE,OAAe,KAAK;IACpE,OAAO,IAAI,mBAAmB,CAAC,mBAAmB,KAAK,cAAc,EAAE;QACrE;YACE,IAAI;YACJ,IAAI,EAAE,aAAa,CAAC,cAAc;YAClC,OAAO,EAAE,UAAU,KAAK,eAAe;SACxC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,KAAa,EACb,QAAgB,EAChB,OAAe,KAAK;IAEpB,OAAO,IAAI,mBAAmB,CAAC,uBAAuB,KAAK,eAAe,QAAQ,EAAE,EAAE;QACpF;YACE,IAAI;YACJ,IAAI,EAAE,aAAa,CAAC,cAAc;YAClC,OAAO,EAAE,YAAY,QAAQ,EAAE;SAChC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,KAAc,EAAE,MAAe;IACrE,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,iDAAiD;QACjD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjE,MAAM,OAAO,GAA4B,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,cAAc,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,IAAI,cAAc,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * @wemush/wols - Official WOLS TypeScript Library
4
+ *
5
+ * WeMush Open Labeling Standard (WOLS) v1.1.0 implementation
6
+ * for biological specimen labeling and traceability.
7
+ *
8
+ * @packageDocumentation
9
+ * @module @wemush/wols
10
+ * @version 1.1.0
11
+ */
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;
14
+ // =============================================================================
15
+ // Constants
16
+ // =============================================================================
17
+ var types_js_1 = require("./types.js");
18
+ Object.defineProperty(exports, "WOLS_VERSION", { enumerable: true, get: function () { return types_js_1.WOLS_VERSION; } });
19
+ Object.defineProperty(exports, "WOLS_CONTEXT", { enumerable: true, get: function () { return types_js_1.WOLS_CONTEXT; } });
20
+ // =============================================================================
21
+ // Type utilities
22
+ // =============================================================================
23
+ var types_js_2 = require("./types.js");
24
+ Object.defineProperty(exports, "asSpecimenId", { enumerable: true, get: function () { return types_js_2.asSpecimenId; } });
25
+ Object.defineProperty(exports, "isSpecimenType", { enumerable: true, get: function () { return types_js_2.isSpecimenType; } });
26
+ Object.defineProperty(exports, "isGrowthStage", { enumerable: true, get: function () { return types_js_2.isGrowthStage; } });
27
+ Object.defineProperty(exports, "isStrain", { enumerable: true, get: function () { return types_js_2.isStrain; } });
28
+ Object.defineProperty(exports, "SPECIMEN_TYPES", { enumerable: true, get: function () { return types_js_2.SPECIMEN_TYPES; } });
29
+ Object.defineProperty(exports, "GROWTH_STAGES", { enumerable: true, get: function () { return types_js_2.GROWTH_STAGES; } });
30
+ // =============================================================================
31
+ // Errors
32
+ // =============================================================================
33
+ var errors_js_1 = require("./errors.js");
34
+ Object.defineProperty(exports, "WolsErrorCode", { enumerable: true, get: function () { return errors_js_1.WolsErrorCode; } });
35
+ Object.defineProperty(exports, "WolsError", { enumerable: true, get: function () { return errors_js_1.WolsError; } });
36
+ Object.defineProperty(exports, "WolsParseError", { enumerable: true, get: function () { return errors_js_1.WolsParseError; } });
37
+ Object.defineProperty(exports, "WolsValidationError", { enumerable: true, get: function () { return errors_js_1.WolsValidationError; } });
38
+ Object.defineProperty(exports, "WolsEncryptionError", { enumerable: true, get: function () { return errors_js_1.WolsEncryptionError; } });
39
+ // =============================================================================
40
+ // Core Functions - Specimen
41
+ // =============================================================================
42
+ var specimen_js_1 = require("./specimen.js");
43
+ Object.defineProperty(exports, "createSpecimen", { enumerable: true, get: function () { return specimen_js_1.createSpecimen; } });
44
+ Object.defineProperty(exports, "serializeSpecimen", { enumerable: true, get: function () { return specimen_js_1.serializeSpecimen; } });
45
+ // =============================================================================
46
+ // Core Functions - Validation
47
+ // =============================================================================
48
+ var validator_js_1 = require("./validator.js");
49
+ Object.defineProperty(exports, "validateSpecimen", { enumerable: true, get: function () { return validator_js_1.validateSpecimen; } });
50
+ // =============================================================================
51
+ // Core Functions - Parser
52
+ // =============================================================================
53
+ var parser_js_1 = require("./parser.js");
54
+ Object.defineProperty(exports, "parseSpecimen", { enumerable: true, get: function () { return parser_js_1.parseSpecimen; } });
55
+ // =============================================================================
56
+ // Core Functions - Compact URL
57
+ // =============================================================================
58
+ var compact_url_js_1 = require("./compact-url.js");
59
+ Object.defineProperty(exports, "toCompactUrl", { enumerable: true, get: function () { return compact_url_js_1.toCompactUrl; } });
60
+ Object.defineProperty(exports, "parseCompactUrl", { enumerable: true, get: function () { return compact_url_js_1.parseCompactUrl; } });
61
+ Object.defineProperty(exports, "SPECIES_CODES", { enumerable: true, get: function () { return compact_url_js_1.SPECIES_CODES; } });
62
+ Object.defineProperty(exports, "getSpeciesFromCode", { enumerable: true, get: function () { return compact_url_js_1.getSpeciesFromCode; } });
63
+ Object.defineProperty(exports, "getCodeFromSpecies", { enumerable: true, get: function () { return compact_url_js_1.getCodeFromSpecies; } });
64
+ Object.defineProperty(exports, "registerSpeciesCode", { enumerable: true, get: function () { return compact_url_js_1.registerSpeciesCode; } });
65
+ // =============================================================================
66
+ // Core Functions - Encryption
67
+ // =============================================================================
68
+ var index_js_1 = require("./crypto/index.js");
69
+ Object.defineProperty(exports, "encryptSpecimen", { enumerable: true, get: function () { return index_js_1.encryptSpecimen; } });
70
+ Object.defineProperty(exports, "isEncrypted", { enumerable: true, get: function () { return index_js_1.isEncrypted; } });
71
+ Object.defineProperty(exports, "decryptSpecimen", { enumerable: true, get: function () { return index_js_1.decryptSpecimen; } });
72
+ // =============================================================================
73
+ // Core Functions - QR Code Generation
74
+ // =============================================================================
75
+ var index_js_2 = require("./qr/index.js");
76
+ Object.defineProperty(exports, "toQRCode", { enumerable: true, get: function () { return index_js_2.toQRCode; } });
77
+ Object.defineProperty(exports, "toQRCodeDataURL", { enumerable: true, get: function () { return index_js_2.toQRCodeDataURL; } });
78
+ Object.defineProperty(exports, "toQRCodeSVG", { enumerable: true, get: function () { return index_js_2.toQRCodeSVG; } });
79
+ Object.defineProperty(exports, "isQRAvailable", { enumerable: true, get: function () { return index_js_2.isQRAvailable; } });
80
+ Object.defineProperty(exports, "isQRAvailableSync", { enumerable: true, get: function () { return index_js_2.isQRAvailableSync; } });
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAChF,uCAAwD;AAA/C,wGAAA,YAAY,OAAA;AAAE,wGAAA,YAAY,OAAA;AAoCnC,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,uCAOoB;AANlB,wGAAA,YAAY,OAAA;AACZ,0GAAA,cAAc,OAAA;AACd,yGAAA,aAAa,OAAA;AACb,oGAAA,QAAQ,OAAA;AACR,0GAAA,cAAc,OAAA;AACd,yGAAA,aAAa,OAAA;AAGf,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAChF,yCAMqB;AALnB,0GAAA,aAAa,OAAA;AACb,sGAAA,SAAS,OAAA;AACT,2GAAA,cAAc,OAAA;AACd,gHAAA,mBAAmB,OAAA;AACnB,gHAAA,mBAAmB,OAAA;AAGrB,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAChF,6CAAkE;AAAzD,6GAAA,cAAc,OAAA;AAAE,gHAAA,iBAAiB,OAAA;AAE1C,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAChF,+CAAkD;AAAzC,gHAAA,gBAAgB,OAAA;AAEzB,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAChF,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AAEtB,gFAAgF;AAChF,+BAA+B;AAC/B,gFAAgF;AAChF,mDAO0B;AANxB,8GAAA,YAAY,OAAA;AACZ,iHAAA,eAAe,OAAA;AACf,+GAAA,aAAa,OAAA;AACb,oHAAA,kBAAkB,OAAA;AAClB,oHAAA,kBAAkB,OAAA;AAClB,qHAAA,mBAAmB,OAAA;AAGrB,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAChF,8CAAkF;AAAzE,2GAAA,eAAe,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,2GAAA,eAAe,OAAA;AAEtD,gFAAgF;AAChF,sCAAsC;AACtC,gFAAgF;AAChF,0CAMuB;AALrB,oGAAA,QAAQ,OAAA;AACR,2GAAA,eAAe,OAAA;AACf,uGAAA,WAAW,OAAA;AACX,yGAAA,aAAa,OAAA;AACb,6GAAA,iBAAiB,OAAA"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * WOLS Specimen Parser
4
+ *
5
+ * This module provides parsing functionality for WOLS specimen JSON.
6
+ *
7
+ * @module parser
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parseSpecimen = parseSpecimen;
11
+ const errors_js_1 = require("./errors.js");
12
+ const types_js_1 = require("./types.js");
13
+ const validator_js_1 = require("./validator.js");
14
+ // =============================================================================
15
+ // HELPER FUNCTIONS
16
+ // =============================================================================
17
+ /**
18
+ * Check if a value is a plain object.
19
+ */
20
+ function isPlainObject(value) {
21
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
22
+ }
23
+ /**
24
+ * Get the first validation error code from a ValidationResult.
25
+ */
26
+ function getFirstErrorCode(errors) {
27
+ if (errors.length === 0) {
28
+ return errors_js_1.WolsErrorCode.INVALID_FORMAT;
29
+ }
30
+ const firstError = errors[0];
31
+ if (!firstError) {
32
+ return errors_js_1.WolsErrorCode.INVALID_FORMAT;
33
+ }
34
+ const code = firstError.code;
35
+ // Map string codes to WolsErrorCode enum
36
+ if (Object.values(errors_js_1.WolsErrorCode).includes(code)) {
37
+ return code;
38
+ }
39
+ return errors_js_1.WolsErrorCode.INVALID_FORMAT;
40
+ }
41
+ // =============================================================================
42
+ // MAIN PARSE FUNCTION
43
+ // =============================================================================
44
+ /**
45
+ * Parse a JSON string into a validated Specimen object.
46
+ *
47
+ * This function performs both JSON parsing and WOLS validation.
48
+ * If the JSON is invalid or the parsed object doesn't conform to WOLS,
49
+ * it returns a failure result with a detailed error.
50
+ *
51
+ * @param json - The JSON string to parse
52
+ * @returns ParseResult with either the parsed Specimen or an error
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const result = parseSpecimen('{"@context": "https://wemush.com/wols/v1", ...}');
57
+ * if (result.success) {
58
+ * console.log('Specimen ID:', result.data.id);
59
+ * } else {
60
+ * console.error('Parse error:', result.error.message);
61
+ * }
62
+ * ```
63
+ */
64
+ function parseSpecimen(json) {
65
+ // Step 1: Parse JSON
66
+ let parsed;
67
+ try {
68
+ parsed = JSON.parse(json);
69
+ }
70
+ catch (err) {
71
+ return {
72
+ success: false,
73
+ error: (0, errors_js_1.parseErrorFromException)(err, json),
74
+ };
75
+ }
76
+ // Step 2: Verify it's an object
77
+ if (!isPlainObject(parsed)) {
78
+ return {
79
+ success: false,
80
+ error: new errors_js_1.WolsParseError(errors_js_1.WolsErrorCode.INVALID_FORMAT, 'Specimen must be a JSON object', {
81
+ receivedType: parsed === null ? 'null' : typeof parsed,
82
+ }),
83
+ };
84
+ }
85
+ // Step 3: Validate against WOLS schema
86
+ const validation = (0, validator_js_1.validateSpecimen)(parsed);
87
+ if (!validation.valid) {
88
+ // Get the most specific error code
89
+ const errorCode = getFirstErrorCode(validation.errors);
90
+ const firstError = validation.errors[0];
91
+ // Create appropriate error
92
+ const errorMessage = validation.errors.map(e => `${e.path}: ${e.message}`).join('; ');
93
+ if (validation.errors.length === 1 && firstError) {
94
+ return {
95
+ success: false,
96
+ error: new errors_js_1.WolsParseError(errorCode, firstError.message, {
97
+ path: firstError.path,
98
+ }),
99
+ };
100
+ }
101
+ return {
102
+ success: false,
103
+ error: new errors_js_1.WolsValidationError(`Validation failed: ${errorMessage}`, validation.errors),
104
+ };
105
+ }
106
+ // Step 4: Cast to Specimen type (validation guarantees the shape)
107
+ const data = parsed;
108
+ const specimen = {
109
+ '@context': types_js_1.WOLS_CONTEXT,
110
+ '@type': 'Specimen',
111
+ id: (0, types_js_1.asSpecimenId)(data['id']),
112
+ version: data['version'],
113
+ type: data['type'],
114
+ species: data['species'],
115
+ };
116
+ // Copy optional fields if present
117
+ const strainValue = data['strain'];
118
+ if (strainValue !== undefined && strainValue !== null) {
119
+ specimen.strain = strainValue;
120
+ }
121
+ const stageValue = data['stage'];
122
+ if (stageValue !== undefined && stageValue !== null) {
123
+ specimen.stage = stageValue;
124
+ }
125
+ if (data['created'] !== undefined) {
126
+ specimen.created = data['created'];
127
+ }
128
+ if (data['batch'] !== undefined) {
129
+ specimen.batch = data['batch'];
130
+ }
131
+ if (data['organization'] !== undefined) {
132
+ specimen.organization = data['organization'];
133
+ }
134
+ if (data['creator'] !== undefined) {
135
+ specimen.creator = data['creator'];
136
+ }
137
+ if (data['custom'] !== undefined) {
138
+ specimen.custom = data['custom'];
139
+ }
140
+ if (data['signature'] !== undefined) {
141
+ specimen.signature = data['signature'];
142
+ }
143
+ return {
144
+ success: true,
145
+ data: specimen,
146
+ };
147
+ }
148
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}