PermissionUpdateSchema.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. // Re-export for backwards compatibility
  21. export type { PermissionUpdate, PermissionUpdateDestination }
  22. /**
  23. * PermissionUpdateDestination is where a new permission rule should be saved to.
  24. */
  25. export const permissionUpdateDestinationSchema = lazySchema(() =>
  26. z.enum([
  27. // User settings (global)
  28. 'userSettings',
  29. // Project settings (shared per-directory)
  30. 'projectSettings',
  31. // Local settings (gitignored)
  32. 'localSettings',
  33. // In-memory for the current session only
  34. 'session',
  35. // From the command line arguments
  36. 'cliArg',
  37. ]),
  38. )
  39. export const permissionUpdateSchema = lazySchema(() =>
  40. z.discriminatedUnion('type', [
  41. z.object({
  42. type: z.literal('addRules'),
  43. rules: z.array(permissionRuleValueSchema()),
  44. behavior: permissionBehaviorSchema(),
  45. destination: permissionUpdateDestinationSchema(),
  46. }),
  47. z.object({
  48. type: z.literal('replaceRules'),
  49. rules: z.array(permissionRuleValueSchema()),
  50. behavior: permissionBehaviorSchema(),
  51. destination: permissionUpdateDestinationSchema(),
  52. }),
  53. z.object({
  54. type: z.literal('removeRules'),
  55. rules: z.array(permissionRuleValueSchema()),
  56. behavior: permissionBehaviorSchema(),
  57. destination: permissionUpdateDestinationSchema(),
  58. }),
  59. z.object({
  60. type: z.literal('setMode'),
  61. mode: externalPermissionModeSchema(),
  62. destination: permissionUpdateDestinationSchema(),
  63. }),
  64. z.object({
  65. type: z.literal('addDirectories'),
  66. directories: z.array(z.string()),
  67. destination: permissionUpdateDestinationSchema(),
  68. }),
  69. z.object({
  70. type: z.literal('removeDirectories'),
  71. directories: z.array(z.string()),
  72. destination: permissionUpdateDestinationSchema(),
  73. }),
  74. ]),
  75. )