@deallony/shared 1.2.41 → 1.2.50

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 (42) hide show
  1. package/README.md +44 -0
  2. package/dist/cjs/constants/used-product/UsedProduct.js +1 -1
  3. package/dist/cjs/dto/ad/Ad.dto.d.ts +8 -3
  4. package/dist/cjs/dto/ad/Ad.dto.js +1 -3
  5. package/dist/cjs/dto/index.d.ts +1 -0
  6. package/dist/cjs/dto/index.js +2 -1
  7. package/dist/cjs/index.d.ts +2 -1
  8. package/dist/cjs/index.js +2 -1
  9. package/dist/cjs/schema/ad/save-ad.schema.d.ts +51 -53
  10. package/dist/cjs/schema/ad/save-ad.schema.js +62 -51
  11. package/dist/cjs/schema/communication/ai-conversation.schema.d.ts +65 -0
  12. package/dist/cjs/schema/communication/ai-conversation.schema.js +43 -0
  13. package/dist/cjs/schema/communication/index.d.ts +2 -0
  14. package/dist/cjs/schema/communication/index.js +18 -0
  15. package/dist/cjs/schema/communication/support-ticket.schema.d.ts +119 -0
  16. package/dist/cjs/schema/communication/support-ticket.schema.js +35 -0
  17. package/dist/cjs/schema/index.d.ts +1 -0
  18. package/dist/cjs/schema/index.js +2 -1
  19. package/dist/cjs/types/ad/AdPromotion.d.ts +28 -0
  20. package/dist/cjs/types/index.d.ts +1 -0
  21. package/dist/cjs/types/index.js +3 -1
  22. package/dist/cjs/types/kyc/Kyc.d.ts +39 -0
  23. package/dist/cjs/types/kyc/Kyc.js +25 -0
  24. package/dist/cjs/types/kyc/index.d.ts +1 -0
  25. package/dist/cjs/types/kyc/index.js +17 -0
  26. package/dist/cjs/types/used-product/UsedProduct.d.ts +1 -1
  27. package/dist/cjs/types/used-product/UsedProduct.js +1 -1
  28. package/dist/cjs/types/user/PotentialUser.d.ts +8 -0
  29. package/dist/esm/constants/used-product/UsedProduct.js +1 -1
  30. package/dist/esm/dto/ad/Ad.dto.js +1 -3
  31. package/dist/esm/dto/index.js +1 -0
  32. package/dist/esm/index.js +1 -0
  33. package/dist/esm/schema/ad/save-ad.schema.js +63 -52
  34. package/dist/esm/schema/communication/ai-conversation.schema.js +40 -0
  35. package/dist/esm/schema/communication/index.js +2 -0
  36. package/dist/esm/schema/communication/support-ticket.schema.js +32 -0
  37. package/dist/esm/schema/index.js +1 -0
  38. package/dist/esm/types/index.js +2 -0
  39. package/dist/esm/types/kyc/Kyc.js +22 -0
  40. package/dist/esm/types/kyc/index.js +1 -0
  41. package/dist/esm/types/used-product/UsedProduct.js +1 -1
  42. package/package.json +58 -44
@@ -1,5 +1,10 @@
1
- import { z } from 'zod';
2
- export const subjectTypeSchema = z.enum(['properties', 'services', 'motors', 'used_products']);
1
+ import { z } from "zod";
2
+ export const subjectTypeSchema = z.enum([
3
+ "properties",
4
+ "services",
5
+ "motors",
6
+ "used_products",
7
+ ]);
3
8
  const adLocationSchema = z.object({
4
9
  ad_id: z.coerce.number().int().positive().optional(),
5
10
  admin_boundary_id: z.coerce.number().int().positive(),
@@ -9,6 +14,7 @@ const propertyFacilityRelationSchema = z.object({
9
14
  facility_id: z.coerce.number().int().positive(),
10
15
  distance_in_meters: z.coerce.number().int().min(0).optional(),
11
16
  });
17
+ const nullableArray = (schema) => z.preprocess((value) => (value === null ? undefined : value), schema.optional());
12
18
  const createMotorSchema = z.object({
13
19
  ad_id: z.coerce.number().int().positive().optional(),
14
20
  trim_id: z.coerce.number().nullable().optional(),
@@ -28,7 +34,10 @@ const createMotorSchema = z.object({
28
34
  seats_count: z.coerce.number().nullable().optional(),
29
35
  engine_capacity_cc: z.coerce.number().nullable().optional(),
30
36
  cylinders_count: z.coerce.number().nullable().optional(),
31
- feature_ids: z.array(z.coerce.number().int().positive()).nullable().optional(),
37
+ feature_ids: z
38
+ .array(z.coerce.number().int().positive())
39
+ .nullable()
40
+ .optional(),
32
41
  });
33
42
  const updateMotorSchema = createMotorSchema.extend({
34
43
  id: z.coerce.number().int().positive(),
@@ -38,7 +47,6 @@ const createPropertySchema = z.object({
38
47
  size_m2: z.coerce.number().min(0),
39
48
  bedrooms: z.coerce.number().int().min(0),
40
49
  offer_type_id: z.coerce.number().int().positive(),
41
- district_id: z.coerce.number().int().positive().optional(),
42
50
  property_type_id: z.coerce.number().int().positive().optional(),
43
51
  price_type_id: z.coerce.number().int().optional(),
44
52
  publisher_type_id: z.coerce.number().int().positive().optional(),
@@ -47,72 +55,77 @@ const createPropertySchema = z.object({
47
55
  parking: z.coerce.boolean().optional(),
48
56
  floor: z.coerce.number().int().min(0).optional(),
49
57
  total_floors: z.coerce.number().int().min(0).optional(),
50
- feature_ids: z.array(z.coerce.number().int().positive()).optional(),
51
- facility_ids: z.array(z.coerce.number().int().positive()).optional(),
52
- property_facilities: z.preprocess((val) => {
53
- if (!Array.isArray(val))
54
- return val;
55
- return val
56
- .filter((item) => item && item.facility_id !== null && item.facility_id !== undefined) // Keep only items with a valid facility_id
58
+ feature_ids: nullableArray(z.array(z.coerce.number().int().positive())),
59
+ facility_ids: nullableArray(z.array(z.coerce.number().int().positive())),
60
+ property_facilities: z.preprocess((value) => {
61
+ if (value === null || value === undefined)
62
+ return undefined;
63
+ if (!Array.isArray(value))
64
+ return value;
65
+ return value
66
+ .filter((item) => item && item.facility_id !== null && item.facility_id !== undefined)
57
67
  .map((item) => ({
58
68
  ...item,
59
- // If property_id is null, undefined, or <= 0, convert it to undefined so Zod drops it
60
- property_id: item.property_id === null || item.property_id === undefined || Number(item.property_id) <= 0
69
+ property_id: item.property_id === null ||
70
+ item.property_id === undefined ||
71
+ Number(item.property_id) <= 0
61
72
  ? undefined
62
73
  : item.property_id,
63
74
  }));
64
75
  }, z.array(propertyFacilityRelationSchema).optional()),
65
- // condition_id: z.coerce.number().int().min(0).optional().transform((val) => (val === 0 ? null : val)),
66
- // age_id: z.coerce.number().int().min(0).optional().transform((val) => (val === 0 ? null : val)),
67
- // property_status_id: z.coerce.number().int().min(0).optional().transform((val) => (val === 0 ? null : val)),
68
- // license_type_id: z.coerce.number().int().min(0).optional().transform((val) => (val === 0 ? null : val)),
76
+ condition_id: z.coerce
77
+ .number()
78
+ .int()
79
+ .min(0)
80
+ .optional()
81
+ .transform((value) => (value === 0 ? null : value)),
82
+ age_id: z.coerce
83
+ .number()
84
+ .int()
85
+ .min(0)
86
+ .optional()
87
+ .transform((value) => (value === 0 ? null : value)),
88
+ property_status_id: z.coerce
89
+ .number()
90
+ .int()
91
+ .min(0)
92
+ .optional()
93
+ .transform((value) => (value === 0 ? null : value)),
94
+ license_type_id: z.coerce
95
+ .number()
96
+ .int()
97
+ .min(0)
98
+ .optional()
99
+ .transform((value) => (value === 0 ? null : value)),
69
100
  });
70
101
  const updatePropertySchema = createPropertySchema.extend({
71
102
  id: z.coerce.number().int().positive(),
72
103
  });
73
104
  const createUsedProductSchema = z.object({
74
105
  ad_id: z.coerce.number().int().positive().optional(),
75
- condition_id: z.coerce.number().int().positive(),
76
- age_id: z.coerce.number().int().positive(),
106
+ condition_id: z.coerce.number().int().positive().optional().nullable(),
107
+ age_id: z.coerce.number().int().positive().optional().nullable(),
77
108
  isFree: z.coerce.boolean().optional().nullable(),
78
109
  isDeliveryAvailable: z.coerce.boolean().optional().nullable(),
79
110
  product_type_id: z.coerce.number().optional().nullable(),
80
111
  });
81
112
  const updateUsedProductSchema = z.object({
82
113
  id: z.coerce.number().int().positive(),
83
- condition_id: z.coerce.number().int().positive(),
84
- age_id: z.coerce.number().int().positive(),
114
+ condition_id: z.coerce.number().int().positive().optional().nullable(),
115
+ age_id: z.coerce.number().int().positive().optional().nullable(),
85
116
  isFree: z.coerce.boolean().optional().nullable(),
86
117
  isDeliveryAvailable: z.coerce.boolean().optional().nullable(),
87
118
  product_type_id: z.coerce.number().optional().nullable(),
88
119
  });
89
- const createServiceLocationSchema = z.object({
90
- id: z.number().optional(),
91
- service_id: z.number().optional(),
92
- city_id: z.number(),
93
- district_id: z.number().optional().nullable(),
94
- });
95
- const updateServiceLocationSchema = z.object({
96
- city_id: z.number(),
97
- // district_id: z.preprocess(
98
- // (v) => (v === null || v === '' ? undefined : v),
99
- // z.coerce.number().int().optional(),
100
- // ),
101
- });
102
- const createServiceSchema = z.object({
120
+ const baseServiceSchema = z.object({
103
121
  ad_id: z.coerce.number().int().positive().optional(),
104
122
  access_type_id: z.coerce.number().int().positive(),
105
123
  work_type_id: z.coerce.number().int().positive(),
106
124
  unit_id: z.coerce.number().int().optional().nullable(),
107
- locations: z.array(createServiceLocationSchema).optional().nullable(),
108
125
  });
109
- const updateServiceSchema = z.object({
110
- id: z.number(),
111
- ad_id: z.coerce.number().int().positive(),
112
- access_type_id: z.coerce.number().int().positive(),
113
- work_type_id: z.coerce.number().int().positive(),
114
- unit_id: z.coerce.number().int().optional().nullable(),
115
- locations: z.array(updateServiceLocationSchema),
126
+ const createServiceSchema = baseServiceSchema;
127
+ const updateServiceSchema = baseServiceSchema.extend({
128
+ id: z.coerce.number().int().positive().optional(),
116
129
  });
117
130
  const baseAdCommon = z.object({
118
131
  title: z.string().trim().optional(),
@@ -122,16 +135,13 @@ const baseAdCommon = z.object({
122
135
  price: z.coerce.number().min(0).optional().nullable(),
123
136
  currency_id: z.coerce.number().int().positive().optional().nullable(),
124
137
  negotiable: z.coerce.boolean().optional().nullable(),
125
- city_id: z.coerce.number().int().positive().optional().nullable(),
126
138
  latitude: z.coerce.number().optional().nullable(),
127
139
  longitude: z.coerce.number().optional().nullable(),
128
- // baseAdminBoundaryId: z.preprocess(
129
- // (value) => {
130
- // if (value === 0 || value === '0') return undefined;
131
- // return value;
132
- // },
133
- // z.coerce.number().optional().nullable(),
134
- // ),
140
+ baseAdminBoundaryId: z.preprocess((value) => {
141
+ if (value === 0 || value === "0")
142
+ return undefined;
143
+ return value;
144
+ }, z.coerce.number().optional().nullable()),
135
145
  media: z.array(z.any()).optional().nullable(),
136
146
  subject_type: subjectTypeSchema.optional(),
137
147
  base_price: z.coerce.number().optional().nullable(),
@@ -144,11 +154,12 @@ const baseAdCommon = z.object({
144
154
  .optional()
145
155
  .nullable(),
146
156
  selected_phone: z.string().trim().optional().nullable(),
157
+ expires_at: z.iso.datetime().optional().nullable(),
147
158
  adLocations: z.array(adLocationSchema).optional().nullable(),
148
159
  });
149
160
  export const createAdSchema = z.object({
150
161
  user_id: z.coerce.number().int().positive(),
151
- id: z.never().optional(),
162
+ id: z.null().optional(),
152
163
  ...baseAdCommon.shape,
153
164
  motor: createMotorSchema.optional().nullable(),
154
165
  property: createPropertySchema.optional().nullable(),
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ export const MarketingSubjectTypeSchema = z.enum([
3
+ 'motors',
4
+ 'properties',
5
+ 'used_products',
6
+ 'services',
7
+ ]);
8
+ export const ConversationLanguageSchema = z.enum(['ar', 'en']);
9
+ export const StartAiConversationSchema = z.object({
10
+ request_id: z.string().min(1),
11
+ potential_user_id: z.number().int().positive(),
12
+ user_id: z.number().int().positive().nullable().optional(),
13
+ phone: z.string().min(5).max(30),
14
+ language: ConversationLanguageSchema.default('ar'),
15
+ purpose: z.literal('marketing'),
16
+ subject_type: MarketingSubjectTypeSchema,
17
+ initial_message: z.string().min(1),
18
+ context: z.object({
19
+ name: z.string().nullable().optional(),
20
+ reason: z.string().min(1),
21
+ note: z.string().nullable().optional(),
22
+ previous_contact_count: z.number().int().nonnegative().default(0),
23
+ }),
24
+ });
25
+ export const ConversationEventTypeSchema = z.enum([
26
+ 'CONVERSATION_STARTED',
27
+ 'MESSAGE_RECEIVED',
28
+ 'INTERESTED',
29
+ 'NOT_INTERESTED',
30
+ 'REQUESTED_HUMAN',
31
+ 'CONVERTED',
32
+ 'OPTED_OUT',
33
+ 'CONVERSATION_CLOSED',
34
+ ]);
35
+ export const PotentialUserConversationEventSchema = z.object({
36
+ potential_user_id: z.number().int().positive(),
37
+ conversation_id: z.string().min(1),
38
+ event: ConversationEventTypeSchema,
39
+ summary: z.string().max(2000).nullable().optional(),
40
+ });
@@ -0,0 +1,2 @@
1
+ export * from './ai-conversation.schema.js';
2
+ export * from './support-ticket.schema.js';
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ export const SupportTicketStatusSchema = z.enum(['open', 'assigned', 'in_progress', 'waiting_customer', 'resolved', 'closed', 'reopened']);
3
+ export const SupportTicketPrioritySchema = z.enum(['low', 'normal', 'high', 'urgent']);
4
+ export const SupportTicketCategorySchema = z.enum(['technical_issue', 'account', 'advertisement', 'payment', 'complaint', 'other']);
5
+ export const SupportTicketCreateSchema = z.object({
6
+ title: z.string().trim().min(4).max(180),
7
+ description: z.string().trim().min(5).max(5000),
8
+ category: SupportTicketCategorySchema.default('other'),
9
+ priority: SupportTicketPrioritySchema.default('normal'),
10
+ potential_user_id: z.number().int().positive().nullable().optional(),
11
+ user_id: z.number().int().positive().nullable().optional(),
12
+ contact_phone: z.string().trim().min(6).max(30).nullable().optional(),
13
+ conversation_id: z.string().min(1).max(80).nullable().optional(),
14
+ ad_id: z.number().int().positive().nullable().optional(),
15
+ payment_id: z.number().int().positive().nullable().optional(),
16
+ });
17
+ export const SupportTicketAiCreateSchema = SupportTicketCreateSchema.extend({
18
+ conversation_id: z.string().min(1).max(80),
19
+ dedupe_key: z.string().min(8).max(180),
20
+ ai_summary: z.string().max(2000).nullable().optional(),
21
+ });
22
+ export const SupportTicketIdSchema = z.object({ id: z.number().int().positive() });
23
+ export const SupportTicketListSchema = z.object({
24
+ page: z.number().int().positive().default(1),
25
+ limit: z.number().int().min(1).max(100).default(20),
26
+ status: SupportTicketStatusSchema.optional(),
27
+ priority: SupportTicketPrioritySchema.optional(),
28
+ search: z.string().trim().max(100).optional(),
29
+ });
30
+ export const SupportTicketStatusUpdateSchema = SupportTicketIdSchema.extend({ status: SupportTicketStatusSchema });
31
+ export const SupportTicketAssignmentSchema = SupportTicketIdSchema.extend({ assigned_to: z.number().int().positive() });
32
+ export const SupportTicketReplySchema = SupportTicketIdSchema.extend({ message: z.string().trim().min(1).max(4000) });
@@ -3,3 +3,4 @@ export * as AI from './ai/index.js';
3
3
  export * as COMMON from './common/index.js';
4
4
  export * as EVENTS from './events/index.js';
5
5
  export * as PAYMENTS from './payments/index.js';
6
+ export * as COMMUNICATION from './communication/index.js';
@@ -70,6 +70,8 @@ export * as Media from "./media/Media.js";
70
70
  export * as Image from "./media/Image.js";
71
71
  export * as SocialMediaPlatform from "./media/SocialMediaPlatform.js";
72
72
  export * as SocialMediaProfile from "./media/SocialMediaProfile.js";
73
+ // KYC
74
+ export * as Kyc from "./kyc/Kyc.js";
73
75
  // integrations
74
76
  export * as Google from "./integrations/Google.js";
75
77
  // analysis
@@ -0,0 +1,22 @@
1
+ export var KycStatus;
2
+ (function (KycStatus) {
3
+ KycStatus["DRAFT"] = "DRAFT";
4
+ KycStatus["PENDING"] = "PENDING";
5
+ KycStatus["UNDER_REVIEW"] = "UNDER_REVIEW";
6
+ KycStatus["APPROVED"] = "APPROVED";
7
+ KycStatus["REJECTED"] = "REJECTED";
8
+ KycStatus["REQUIRES_RESUBMISSION"] = "REQUIRES_RESUBMISSION";
9
+ })(KycStatus || (KycStatus = {}));
10
+ export var KycDocumentType;
11
+ (function (KycDocumentType) {
12
+ KycDocumentType["NATIONAL_ID"] = "NATIONAL_ID";
13
+ KycDocumentType["PASSPORT"] = "PASSPORT";
14
+ KycDocumentType["RESIDENCE_PERMIT"] = "RESIDENCE_PERMIT";
15
+ KycDocumentType["DRIVING_LICENSE"] = "DRIVING_LICENSE";
16
+ })(KycDocumentType || (KycDocumentType = {}));
17
+ export var KycMediaType;
18
+ (function (KycMediaType) {
19
+ KycMediaType["DOCUMENT_FRONT"] = "document_front";
20
+ KycMediaType["DOCUMENT_BACK"] = "document_back";
21
+ KycMediaType["SELFIE"] = "selfie";
22
+ })(KycMediaType || (KycMediaType = {}));
@@ -0,0 +1 @@
1
+ export * from "./Kyc.js";
@@ -1,5 +1,5 @@
1
1
  export const emptyUsedProduct = {
2
- condition_id: 0,
2
+ condition_id: null,
3
3
  age_id: null,
4
4
  isFree: null,
5
5
  isDeliveryAvailable: null,
package/package.json CHANGED
@@ -1,44 +1,58 @@
1
- {
2
- "name": "@deallony/shared",
3
- "version": "1.2.41",
4
- "private": false,
5
- "main": "dist/cjs/index.js",
6
- "module": "dist/esm/index.js",
7
- "react-native": "dist/esm/index.js",
8
- "types": "dist/cjs/index.d.ts",
9
- "sideEffects": false,
10
- "exports": {
11
- ".": {
12
- "require": "./dist/cjs/index.js",
13
- "import": "./dist/esm/index.js",
14
- "types": "./dist/cjs/index.d.ts"
15
- }
16
- },
17
- "files": [
18
- "dist"
19
- ],
20
- "scripts": {
21
- "login": "npm login",
22
- "deploy": "npm run build && node ./scripts/publish.js && npm run deploy:publish",
23
- "=========": "============= UPDATE APPS LIBRARY =============",
24
- "all:update": "npm run mobile:update && npm run backend:update",
25
- "mobile:update": "cd ../app && npm install @deallony/shared@latest",
26
- "backend:update": "cd ../backend-service-marketplace && pnpm uninstall @deallony/shared && pnpm install @deallony/shared@latest",
27
- "dashboard:update": "cd ../frontend-react-aloo && node ./scripts/upgrade-dellony.js",
28
- "current": "npm view @deallony/shared version",
29
- "============================= Links with project =============================": "",
30
- "link:backend": "cd ../backend-service-marketplace && pnpm uninstall @deallony/shared && pnpm add @deallony/shared@file:../shared-deallony",
31
- "========": "============ DEFAULT ============",
32
- "build": "tsc -p tsconfig.cjs.json && tsc -p tsconfig.esm.json && node ./scripts/fix-esm-imports.mjs",
33
- "watch": "tsc -p tsconfig.cjs.json --watch",
34
- "deploy:publish": "npm publish --access public"
35
- },
36
- "dependencies": {
37
- "@deallony/shared": "^1.2.30",
38
- "zod": "^4.2.1"
39
- },
40
- "devDependencies": {
41
- "@types/node": "^25.0.3",
42
- "typescript": "^5.9.3"
43
- }
44
- }
1
+ {
2
+ "name": "@deallony/shared",
3
+ "version": "1.2.50",
4
+ "private": false,
5
+ "main": "dist/cjs/index.js",
6
+ "module": "dist/esm/index.js",
7
+ "react-native": "dist/esm/index.js",
8
+ "types": "dist/cjs/index.d.ts",
9
+ "sideEffects": false,
10
+ "exports": {
11
+ ".": {
12
+ "require": "./dist/cjs/index.js",
13
+ "import": "./dist/esm/index.js",
14
+ "types": "./dist/cjs/index.d.ts"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "deploy": "node ./scripts/publish.js npm patch",
22
+ "=========": "============= UPDATE APPS LIBRARY =============",
23
+ "all:update": "npm run mobile:update && npm run backend:update && npm run dashboard:update && npm run whatsapp:update",
24
+ "mobile:update": "cd ../app && npm install gitlab:qatayef-tech-aloo/deallony-development/shared-deallony",
25
+ "backend:update": "cd ../backend-service-marketplace && pnpm install gitlab:qatayef-tech-aloo/deallony-development/shared-deallony",
26
+ "dashboard:update": "cd ../frontend-react-aloo && pnpm install gitlab:qatayef-tech-aloo/deallony-development/shared-deallony",
27
+ "whatsapp:update": "cd ../backend-nest-whatsapp-service-aloo && pnpm install gitlab:qatayef-tech-aloo/deallony-development/shared-deallony",
28
+ "current": "node -p \"require('./package.json').version\"",
29
+ "============================= Links with project =============================": "",
30
+ "link:backend": "cd ../backend-service-marketplace && pnpm add @deallony/shared@file:../shared-deallony",
31
+ "link:dashboard": "cd ../frontend-react-aloo && pnpm add @deallony/shared@file:../shared-deallony",
32
+ "link:mobile": "cd ../app && npm install ../shared-deallony",
33
+ "========": "============ DEFAULT ============",
34
+ "build": "tsc -p tsconfig.cjs.json && tsc -p tsconfig.esm.json && node ./scripts/fix-esm-imports.mjs",
35
+ "watch": "tsc -p tsconfig.cjs.json --watch",
36
+ "deploy:patch": "node ./scripts/publish.js npm patch",
37
+ "deploy:minor": "node ./scripts/publish.js npm minor",
38
+ "deploy:major": "node ./scripts/publish.js npm major",
39
+ "deploy:dry-run": "node ./scripts/publish.js npm patch --dry-run",
40
+ "deploy:git": "node ./scripts/publish.js git patch",
41
+ "deploy:git:minor": "node ./scripts/publish.js git minor",
42
+ "deploy:git:major": "node ./scripts/publish.js git major",
43
+ "deploy:git:dry-run": "node ./scripts/publish.js git patch --dry-run",
44
+ "test:release": "node --test scripts/publish.test.js",
45
+ "prepublishOnly": "npm run build"
46
+ },
47
+ "dependencies": {
48
+ "zod": "^4.2.1"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^25.0.3",
52
+ "typescript": "^5.9.3"
53
+ },
54
+ "publishConfig": {
55
+ "registry": "https://registry.npmjs.org/",
56
+ "access": "public"
57
+ }
58
+ }