/ utils / permissions / PermissionUpdateSchema.ts
PermissionUpdateSchema.ts
 1  /**
 2   * Zod schemas for permission updates.
 3   *
 4   * This file is intentionally kept minimal with no complex dependencies
 5   * so it can be safely imported by src/types/hooks.ts without creating
 6   * circular dependencies.
 7   */
 8  import z from 'zod/v4'
 9  // Types extracted to src/types/permissions.ts to break import cycles
10  import type {
11    PermissionUpdate,
12    PermissionUpdateDestination,
13  } from '../../types/permissions.js'
14  import { lazySchema } from '../lazySchema.js'
15  import { externalPermissionModeSchema } from './PermissionMode.js'
16  import {
17    permissionBehaviorSchema,
18    permissionRuleValueSchema,
19  } from './PermissionRule.js'
20  
21  // Re-export for backwards compatibility
22  export type { PermissionUpdate, PermissionUpdateDestination }
23  
24  /**
25   * PermissionUpdateDestination is where a new permission rule should be saved to.
26   */
27  export const permissionUpdateDestinationSchema = lazySchema(() =>
28    z.enum([
29      // User settings (global)
30      'userSettings',
31      // Project settings (shared per-directory)
32      'projectSettings',
33      // Local settings (gitignored)
34      'localSettings',
35      // In-memory for the current session only
36      'session',
37      // From the command line arguments
38      'cliArg',
39    ]),
40  )
41  
42  export const permissionUpdateSchema = lazySchema(() =>
43    z.discriminatedUnion('type', [
44      z.object({
45        type: z.literal('addRules'),
46        rules: z.array(permissionRuleValueSchema()),
47        behavior: permissionBehaviorSchema(),
48        destination: permissionUpdateDestinationSchema(),
49      }),
50      z.object({
51        type: z.literal('replaceRules'),
52        rules: z.array(permissionRuleValueSchema()),
53        behavior: permissionBehaviorSchema(),
54        destination: permissionUpdateDestinationSchema(),
55      }),
56      z.object({
57        type: z.literal('removeRules'),
58        rules: z.array(permissionRuleValueSchema()),
59        behavior: permissionBehaviorSchema(),
60        destination: permissionUpdateDestinationSchema(),
61      }),
62      z.object({
63        type: z.literal('setMode'),
64        mode: externalPermissionModeSchema(),
65        destination: permissionUpdateDestinationSchema(),
66      }),
67      z.object({
68        type: z.literal('addDirectories'),
69        directories: z.array(z.string()),
70        destination: permissionUpdateDestinationSchema(),
71      }),
72      z.object({
73        type: z.literal('removeDirectories'),
74        directories: z.array(z.string()),
75        destination: permissionUpdateDestinationSchema(),
76      }),
77    ]),
78  )