zodselect 1.0.16 → 1.0.17

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.
@@ -22,7 +22,7 @@ export type RefinedUnionSchema<T extends ZodUnion, TShape> = ZodUnion<T['options
22
22
  ] : never : never>;
23
23
  type Refinement<T extends ZodType, TIsSimple extends boolean> = TIsSimple extends true ? boolean : ((schema: T) => ZodType) | boolean | ZodType;
24
24
  export type RefineObject<T extends object, TIsSimple extends boolean> = {
25
- [K in keyof T]?: RefineType<T[K], TIsSimple>;
25
+ [K in keyof T as string extends K ? never : number extends K ? never : symbol extends K ? never : K]?: RefineType<T[K], TIsSimple>;
26
26
  };
27
27
  export type RefineSchema<T extends ZodType<object> | ZodUnion, TIsSimple extends boolean> = T extends ZodUnion ? RefineZodUnion<T> : T extends ZodType<object> ? RefineObject<z.infer<T>, TIsSimple> : never;
28
28
  type RefineType<T, TIsSimple extends boolean> = IsTuple<TuplifyUnion<Exclude<T, null | undefined>>, Refinement<Zodify<T>, TIsSimple> | RefineZodUnion<Extract<T, ZodUnion>>, Exclude<T, null | undefined> extends string ? Refinement<ApplyOptionalNullable<T, ZodString>, TIsSimple> : Exclude<T, null | undefined> extends number ? Refinement<ApplyOptionalNullable<T, ZodNumber>, TIsSimple> : Exclude<T, null | undefined> extends boolean ? Refinement<ApplyOptionalNullable<T, ZodBoolean>, TIsSimple> : Exclude<T, null | undefined> extends Date ? Refinement<ApplyOptionalNullable<T, ZodDate>, TIsSimple> : Exclude<T, null | undefined> extends Array<infer U> ? Exclude<U, null | undefined> extends object ? Refinement<Zodify<T>, TIsSimple> | RefineObject<Extract<U, object>, TIsSimple> : Refinement<Zodify<T>, TIsSimple> : Exclude<T, null | undefined> extends object ? IsJsonType<Exclude<T, null | undefined>, false, Refinement<Zodify<T>, TIsSimple> | RefineObject<Extract<T, object>, TIsSimple>, Refinement<Zodify<T>, TIsSimple>> : unknown extends Exclude<T, null | undefined> ? Refinement<Zodify<T>, TIsSimple> : never>;
@@ -273,4 +273,38 @@ describe('.refineSchema()', () => {
273
273
  assert.equal(parsed.type, 'organization');
274
274
  assert.deepEqual(parsed.accessLevels, [{ name: 'Admin' }]);
275
275
  });
276
+ it('allows selecting a nested subfield of a declared looseObject field', () => {
277
+ // Regression test for `RefineObject` collapsing a `z.looseObject`'s declared fields.
278
+ //
279
+ // A `z.looseObject` carries a catchall index signature (`[k: string]: unknown`).
280
+ // `RefineObject` maps over `keyof T`, and when `T` has an index signature `keyof T`
281
+ // collapses to `string | number`, so every declared field's value type came from the
282
+ // catchall (`unknown` -> scalar `boolean`). Declared fields could be marked `true` but
283
+ // could NOT be drilled into. The runtime was unaffected, so this only broke the
284
+ // type-check (`tsc`), not `tsx --test`.
285
+ const personName = z.object({
286
+ first: z.string().optional(),
287
+ last: z.string().optional()
288
+ });
289
+ const user = z.looseObject({
290
+ _id: z.string(),
291
+ name: personName.optional(),
292
+ username: z.string()
293
+ });
294
+ const root = z.object({
295
+ invitedBy: user
296
+ });
297
+ // Type-level assertion: drilling into `invitedBy.name.first` is valid and MUST be
298
+ // assignable to the refine shape. With the bug present this `satisfies` fails to
299
+ // compile because `invitedBy`'s declared fields collapse to an index signature with
300
+ // `boolean` values.
301
+ const select = {
302
+ invitedBy: { name: { first: true } }
303
+ };
304
+ const refined = refineSchema(root, select);
305
+ const parsed = refined.parse({
306
+ invitedBy: { name: { first: 'Alice' } }
307
+ });
308
+ assert.equal(parsed.invitedBy.name?.first, 'Alice');
309
+ });
276
310
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zodselect",
3
- "version": "1.0.16",
3
+ "version": "1.0.17",
4
4
  "description": "Type-safe selection utility built on top of Zod. Allows for strongly typed field selection, schema merging, and runtime refinement for frontend or backend use.",
5
5
  "author": "SecureDataSystems",
6
6
  "license": "MIT",