@clipboard-health/contract-core 1.6.10 → 1.6.11

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/README.md CHANGED
@@ -19,6 +19,20 @@ npm install @clipboard-health/contract-core
19
19
 
20
20
  ### Zod schemas
21
21
 
22
+ #### Enum validation helpers
23
+
24
+ This package provides four enum validation helpers to cover different use cases:
25
+
26
+ **Fallback validation (with coalescing):**
27
+
28
+ - `requiredEnumWithFallback(values, fallback)` - Invalid values are coerced to the fallback value. `undefined` fails validation.
29
+ - `optionalEnumWithFallback(values, fallback)` - Invalid values are coerced to the fallback value. `undefined` passes through as `undefined`.
30
+
31
+ **Strict validation (no fallback):**
32
+
33
+ - `requiredEnum(values)` - Wraps `z.enum()` for required strict validation. Invalid values fail validation.
34
+ - `optionalEnum(values)` - Wraps `z.enum()` for optional strict validation. Invalid values fail validation, but `undefined` is allowed.
35
+
22
36
  <embedex source="packages/contract-core/examples/schemas.ts">
23
37
 
24
38
  ```ts
@@ -26,7 +40,9 @@ import {
26
40
  apiErrors,
27
41
  booleanString,
28
42
  nonEmptyString,
43
+ optionalEnum,
29
44
  optionalEnumWithFallback,
45
+ requiredEnum,
30
46
  requiredEnumWithFallback,
31
47
  uuid,
32
48
  } from "@clipboard-health/contract-core";
@@ -119,6 +135,55 @@ console.log(extraStatus);
119
135
  const undefinedStatus = optionalStatusEnumSchema.parse(undefined);
120
136
  // => undefined
121
137
  console.log(undefinedStatus);
138
+
139
+ // Strict enum examples (no fallback behavior)
140
+ // Use these when invalid values should fail validation rather than being coerced.
141
+ // Ideal for user types, authentication, and critical business logic.
142
+
143
+ /* -- required strict -- */
144
+ const requiredUserTypeSchema = requiredEnum(["admin", "worker", "facility"]);
145
+ // type RequiredUserType = "admin" | "worker" | "facility"
146
+ type RequiredUserType = z.infer<typeof requiredUserTypeSchema>;
147
+
148
+ const adminUser: RequiredUserType = requiredUserTypeSchema.parse("admin");
149
+ // => "admin"
150
+ console.log(adminUser);
151
+
152
+ try {
153
+ requiredUserTypeSchema.parse("invalid");
154
+ } catch (error) {
155
+ logError(error);
156
+ // => Invalid enum value. Expected 'admin' | 'worker' | 'facility', received 'invalid'
157
+ }
158
+
159
+ try {
160
+ // eslint-disable-next-line unicorn/no-useless-undefined
161
+ requiredUserTypeSchema.parse(undefined);
162
+ } catch (error) {
163
+ logError(error);
164
+ // => Required
165
+ }
166
+
167
+ /* -- optional strict -- */
168
+ const optionalUserTypeSchema = optionalEnum(["admin", "worker", "facility"]);
169
+ // type OptionalUserType = "admin" | "worker" | "facility" | undefined
170
+ type OptionalUserType = z.infer<typeof optionalUserTypeSchema>;
171
+
172
+ const workerUser: OptionalUserType = optionalUserTypeSchema.parse("worker");
173
+ // => "worker"
174
+ console.log(workerUser);
175
+
176
+ // eslint-disable-next-line unicorn/no-useless-undefined
177
+ const noUserType = optionalUserTypeSchema.parse(undefined);
178
+ // => undefined
179
+ console.log(noUserType);
180
+
181
+ try {
182
+ optionalUserTypeSchema.parse("invalid");
183
+ } catch (error) {
184
+ logError(error);
185
+ // => Invalid enum value. Expected 'admin' | 'worker' | 'facility', received 'invalid'
186
+ }
122
187
  ```
123
188
 
124
189
  </embedex>
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@clipboard-health/contract-core",
3
3
  "description": "Shared Zod schemas for Clipboard's contracts.",
4
- "version": "1.6.10",
4
+ "version": "1.6.11",
5
5
  "bugs": "https://github.com/ClipboardHealth/core-utils/issues",
6
6
  "dependencies": {
7
7
  "tslib": "2.8.1"
8
8
  },
9
9
  "devDependencies": {
10
- "@clipboard-health/testing-core": "1.6.10",
10
+ "@clipboard-health/testing-core": "1.6.11",
11
11
  "zod": "3.25.76"
12
12
  },
13
13
  "keywords": [
@@ -5,4 +5,6 @@ export declare function enumWithFallback<const V extends EnumValues, const F ext
5
5
  }): z.ZodEffects<z.ZodOptional<z.ZodEnum<V>>, V[number] | undefined, unknown>;
6
6
  export declare const optionalEnumWithFallback: <const V extends EnumValues, const F extends V[number]>(values: V, fallback: F) => z.ZodEffects<z.ZodOptional<z.ZodEnum<V>>, V[number] | undefined, unknown>;
7
7
  export declare const requiredEnumWithFallback: <const V extends EnumValues, const F extends V[number]>(values: V, fallback: F) => z.ZodEffects<z.ZodEnum<V>, V[number], unknown>;
8
+ export declare function requiredEnum<const V extends EnumValues>(values: V): z.ZodEnum<V>;
9
+ export declare function optionalEnum<const V extends EnumValues>(values: V): z.ZodOptional<z.ZodEnum<V>>;
8
10
  export {};
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.requiredEnumWithFallback = exports.optionalEnumWithFallback = void 0;
4
4
  exports.enumWithFallback = enumWithFallback;
5
+ exports.requiredEnum = requiredEnum;
6
+ exports.optionalEnum = optionalEnum;
5
7
  const zod_1 = require("zod");
6
8
  function enumWithFallback(values, fallback, options = {}) {
7
9
  const Enum = zod_1.z.enum(values);
@@ -18,4 +20,10 @@ const optionalEnumWithFallback = (values, fallback) => enumWithFallback(values,
18
20
  exports.optionalEnumWithFallback = optionalEnumWithFallback;
19
21
  const requiredEnumWithFallback = (values, fallback) => enumWithFallback(values, fallback, { optional: false });
20
22
  exports.requiredEnumWithFallback = requiredEnumWithFallback;
23
+ function requiredEnum(values) {
24
+ return zod_1.z.enum(values);
25
+ }
26
+ function optionalEnum(values) {
27
+ return zod_1.z.enum(values).optional();
28
+ }
21
29
  //# sourceMappingURL=enum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../../../../../packages/contract-core/src/lib/schemas/enum.ts"],"names":[],"mappings":";;;AAwBA,4CAeC;AAvCD,6BAAwB;AAwBxB,SAAgB,gBAAgB,CAC9B,MAAS,EACT,QAAW,EACX,UAAkC,EAAE;IAEpC,MAAM,IAAI,GAAG,OAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjD,OAAO,OAAC,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,CAAC,EAAE,MAAM,CAAC,CAAC;AACb,CAAC;AAEM,MAAM,wBAAwB,GAAG,CACtC,MAAS,EACT,QAAW,EACX,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAH/C,QAAA,wBAAwB,4BAGuB;AAErD,MAAM,wBAAwB,GAAG,CACtC,MAAS,EACT,QAAW,EACX,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAHhD,QAAA,wBAAwB,4BAGwB"}
1
+ {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../../../../../packages/contract-core/src/lib/schemas/enum.ts"],"names":[],"mappings":";;;AAwBA,4CAeC;AAYD,oCAEC;AAED,oCAEC;AAzDD,6BAAwB;AAwBxB,SAAgB,gBAAgB,CAC9B,MAAS,EACT,QAAW,EACX,UAAkC,EAAE;IAEpC,MAAM,IAAI,GAAG,OAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjD,OAAO,OAAC,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,CAAC,EAAE,MAAM,CAAC,CAAC;AACb,CAAC;AAEM,MAAM,wBAAwB,GAAG,CACtC,MAAS,EACT,QAAW,EACX,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAH/C,QAAA,wBAAwB,4BAGuB;AAErD,MAAM,wBAAwB,GAAG,CACtC,MAAS,EACT,QAAW,EACX,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAHhD,QAAA,wBAAwB,4BAGwB;AAE7D,SAAgB,YAAY,CAA6B,MAAS;IAChE,OAAO,OAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,YAAY,CAA6B,MAAS;IAChE,OAAO,OAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AACnC,CAAC"}