@deepintel-ltd/farmpro-contracts 1.5.8 → 1.5.9

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 (53) hide show
  1. package/dist/index.js +50 -92
  2. package/dist/routes/admin.routes.js +13 -16
  3. package/dist/routes/agent-workflows.routes.js +81 -84
  4. package/dist/routes/agents.routes.js +29 -32
  5. package/dist/routes/analytics.routes.js +11 -14
  6. package/dist/routes/auth.routes.js +55 -58
  7. package/dist/routes/categories.routes.js +23 -26
  8. package/dist/routes/documents.routes.js +67 -70
  9. package/dist/routes/equipment.routes.js +55 -58
  10. package/dist/routes/farms.routes.js +32 -35
  11. package/dist/routes/field-monitoring.routes.js +70 -73
  12. package/dist/routes/field-observations.routes.js +41 -44
  13. package/dist/routes/fields.routes.js +44 -47
  14. package/dist/routes/finance.routes.js +121 -124
  15. package/dist/routes/harvest.routes.js +46 -49
  16. package/dist/routes/health.routes.js +6 -9
  17. package/dist/routes/index.js +51 -54
  18. package/dist/routes/input-usage.routes.js +14 -17
  19. package/dist/routes/inventory.routes.js +57 -60
  20. package/dist/routes/seasonal-plans.routes.js +14 -17
  21. package/dist/routes/soil-tests.routes.js +45 -48
  22. package/dist/routes/suppliers.routes.js +70 -73
  23. package/dist/routes/tasks.routes.js +65 -68
  24. package/dist/routes/team.routes.js +57 -60
  25. package/dist/routes/users.routes.js +13 -16
  26. package/dist/routes/weather.routes.js +10 -13
  27. package/dist/schemas/admin.schemas.js +43 -46
  28. package/dist/schemas/agent-workflows.schemas.js +34 -37
  29. package/dist/schemas/agents.schemas.js +46 -49
  30. package/dist/schemas/analytics.schemas.js +51 -54
  31. package/dist/schemas/auth.schemas.js +96 -99
  32. package/dist/schemas/categories.schemas.js +27 -30
  33. package/dist/schemas/common.schemas.js +89 -95
  34. package/dist/schemas/documents.schemas.js +59 -62
  35. package/dist/schemas/equipment.schemas.js +86 -89
  36. package/dist/schemas/farms.schemas.js +40 -43
  37. package/dist/schemas/field-monitoring.schemas.js +207 -210
  38. package/dist/schemas/field-observations.schemas.js +93 -96
  39. package/dist/schemas/fields.schemas.js +82 -85
  40. package/dist/schemas/finance.schemas.js +134 -137
  41. package/dist/schemas/harvest.schemas.js +46 -49
  42. package/dist/schemas/health.schemas.js +14 -17
  43. package/dist/schemas/input-usage.schemas.js +21 -24
  44. package/dist/schemas/inventory.schemas.js +58 -61
  45. package/dist/schemas/recommendations.schemas.js +22 -25
  46. package/dist/schemas/seasonal-plans.schemas.js +21 -24
  47. package/dist/schemas/soil-tests.schemas.js +70 -73
  48. package/dist/schemas/suppliers.schemas.js +90 -93
  49. package/dist/schemas/tasks.schemas.js +93 -96
  50. package/dist/schemas/team.schemas.js +35 -38
  51. package/dist/schemas/users.schemas.js +19 -22
  52. package/dist/schemas/weather.schemas.js +32 -35
  53. package/package.json +9 -1
@@ -1,28 +1,25 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.observationStatsQuerySchema = exports.observationListQuerySchema = exports.observationListResponseSchema = exports.observationResponseSchema = exports.updateObservationActionInputSchema = exports.uploadObservationBodySchema = exports.createObservationInputSchema = exports.observationResourceSchema = exports.updateObservationActionAttributesSchema = exports.createObservationAttributesSchema = exports.observationAttributesSchema = void 0;
4
- const zod_1 = require("zod");
5
- const common_schemas_1 = require("./common.schemas");
6
- const recommendations_schemas_1 = require("./recommendations.schemas");
1
+ import { z } from 'zod';
2
+ import { timestampsSchema, createJsonApiResourceSchema, jsonApiSingleResponseSchema, jsonApiCollectionResponseSchema, } from './common.schemas';
3
+ import { recommendationSchema } from './recommendations.schemas';
7
4
  /**
8
5
  * Field Observation schemas - JSON:API compliant
9
6
  */
10
7
  // Observation attributes schema
11
- exports.observationAttributesSchema = zod_1.z.object({
12
- fieldId: zod_1.z.string().uuid().nullable(),
13
- farmId: zod_1.z.string().uuid(),
14
- uploadedBy: zod_1.z.string().uuid(),
15
- photoUrl: zod_1.z.string().url(),
16
- photoThumbnail: zod_1.z.string().url().nullable(),
17
- location: zod_1.z
8
+ export const observationAttributesSchema = z.object({
9
+ fieldId: z.string().uuid().nullable(),
10
+ farmId: z.string().uuid(),
11
+ uploadedBy: z.string().uuid(),
12
+ photoUrl: z.string().url(),
13
+ photoThumbnail: z.string().url().nullable(),
14
+ location: z
18
15
  .object({
19
- lat: zod_1.z.number().min(-90).max(90),
20
- lng: zod_1.z.number().min(-180).max(180),
21
- accuracy: zod_1.z.number().positive().optional(),
16
+ lat: z.number().min(-90).max(90),
17
+ lng: z.number().min(-180).max(180),
18
+ accuracy: z.number().positive().optional(),
22
19
  })
23
20
  .nullable(),
24
- capturedAt: zod_1.z.date(),
25
- observationType: zod_1.z.enum([
21
+ capturedAt: z.date(),
22
+ observationType: z.enum([
26
23
  'disease',
27
24
  'pest',
28
25
  'nutrient',
@@ -30,8 +27,8 @@ exports.observationAttributesSchema = zod_1.z.object({
30
27
  'general',
31
28
  'health_check',
32
29
  ]),
33
- userNotes: zod_1.z.string().nullable(),
34
- cropStageAtTime: zod_1.z
30
+ userNotes: z.string().nullable(),
31
+ cropStageAtTime: z
35
32
  .enum([
36
33
  'planted',
37
34
  'germination',
@@ -42,66 +39,66 @@ exports.observationAttributesSchema = zod_1.z.object({
42
39
  'harvested',
43
40
  ])
44
41
  .nullable(),
45
- analysisStatus: zod_1.z.enum(['pending', 'processing', 'completed', 'failed']),
46
- analysisCompletedAt: zod_1.z.date().nullable(),
47
- identifiedCrop: zod_1.z.string().nullable(),
48
- identifiedCropConfidence: zod_1.z.number().min(0).max(1).nullable(),
49
- diagnosisType: zod_1.z.string().nullable(),
50
- diagnosisConfidence: zod_1.z.number().min(0).max(1).nullable(),
51
- severity: zod_1.z.enum(['low', 'medium', 'high', 'critical']).nullable(),
52
- affectedArea: zod_1.z
42
+ analysisStatus: z.enum(['pending', 'processing', 'completed', 'failed']),
43
+ analysisCompletedAt: z.date().nullable(),
44
+ identifiedCrop: z.string().nullable(),
45
+ identifiedCropConfidence: z.number().min(0).max(1).nullable(),
46
+ diagnosisType: z.string().nullable(),
47
+ diagnosisConfidence: z.number().min(0).max(1).nullable(),
48
+ severity: z.enum(['low', 'medium', 'high', 'critical']).nullable(),
49
+ affectedArea: z
53
50
  .enum(['localized', 'widespread', 'entire_field'])
54
51
  .nullable(),
55
- healthScore: zod_1.z.number().min(0).max(100).nullable(),
56
- analysisDetails: zod_1.z
52
+ healthScore: z.number().min(0).max(100).nullable(),
53
+ analysisDetails: z
57
54
  .object({
58
- plantIdentification: zod_1.z
55
+ plantIdentification: z
59
56
  .object({
60
- scientificName: zod_1.z.string(),
61
- commonNames: zod_1.z.array(zod_1.z.string()),
62
- confidence: zod_1.z.number(),
63
- provider: zod_1.z.string(),
57
+ scientificName: z.string(),
58
+ commonNames: z.array(z.string()),
59
+ confidence: z.number(),
60
+ provider: z.string(),
64
61
  })
65
62
  .optional(),
66
- primaryIssue: zod_1.z
63
+ primaryIssue: z
67
64
  .object({
68
- name: zod_1.z.string(),
69
- category: zod_1.z.string(),
70
- confidence: zod_1.z.number(),
71
- provider: zod_1.z.string(),
72
- visualIndicators: zod_1.z.array(zod_1.z.string()),
65
+ name: z.string(),
66
+ category: z.string(),
67
+ confidence: z.number(),
68
+ provider: z.string(),
69
+ visualIndicators: z.array(z.string()),
73
70
  })
74
71
  .optional(),
75
- secondaryIssues: zod_1.z
76
- .array(zod_1.z.object({
77
- name: zod_1.z.string(),
78
- confidence: zod_1.z.number(),
79
- reasoning: zod_1.z.string(),
72
+ secondaryIssues: z
73
+ .array(z.object({
74
+ name: z.string(),
75
+ confidence: z.number(),
76
+ reasoning: z.string(),
80
77
  }))
81
78
  .optional(),
82
- environmentalFactors: zod_1.z.record(zod_1.z.string()).optional(),
83
- satelliteCorrelation: zod_1.z.record(zod_1.z.any()).optional(),
84
- historicalMatches: zod_1.z.array(zod_1.z.any()).optional(),
79
+ environmentalFactors: z.record(z.string()).optional(),
80
+ satelliteCorrelation: z.record(z.any()).optional(),
81
+ historicalMatches: z.array(z.any()).optional(),
85
82
  })
86
83
  .nullable(),
87
- recommendations: zod_1.z.array(recommendations_schemas_1.recommendationSchema).nullable(),
88
- estimatedCost: zod_1.z.number().nullable(),
89
- urgencyScore: zod_1.z.number().min(1).max(10).nullable(),
90
- similarCasesCount: zod_1.z.number().nullable(),
91
- actionStatus: zod_1.z.enum(['pending', 'in_progress', 'completed', 'dismissed']),
92
- actionTakenAt: zod_1.z.date().nullable(),
93
- actionNotes: zod_1.z.string().nullable(),
94
- generatedAlertId: zod_1.z.string().uuid().nullable(),
95
- relatedTaskId: zod_1.z.string().uuid().nullable(),
96
- analysisProvider: zod_1.z.string().nullable(),
97
- processingTime: zod_1.z.number().nullable(),
98
- modelVersion: zod_1.z.string().nullable(),
99
- phase: zod_1.z.string().nullable(),
100
- }).merge(common_schemas_1.timestampsSchema);
84
+ recommendations: z.array(recommendationSchema).nullable(),
85
+ estimatedCost: z.number().nullable(),
86
+ urgencyScore: z.number().min(1).max(10).nullable(),
87
+ similarCasesCount: z.number().nullable(),
88
+ actionStatus: z.enum(['pending', 'in_progress', 'completed', 'dismissed']),
89
+ actionTakenAt: z.date().nullable(),
90
+ actionNotes: z.string().nullable(),
91
+ generatedAlertId: z.string().uuid().nullable(),
92
+ relatedTaskId: z.string().uuid().nullable(),
93
+ analysisProvider: z.string().nullable(),
94
+ processingTime: z.number().nullable(),
95
+ modelVersion: z.string().nullable(),
96
+ phase: z.string().nullable(),
97
+ }).merge(timestampsSchema);
101
98
  // Observation attributes for creation (input)
102
- exports.createObservationAttributesSchema = zod_1.z.object({
103
- fieldId: zod_1.z.string().uuid().optional(),
104
- observationType: zod_1.z.enum([
99
+ export const createObservationAttributesSchema = z.object({
100
+ fieldId: z.string().uuid().optional(),
101
+ observationType: z.enum([
105
102
  'disease',
106
103
  'pest',
107
104
  'nutrient',
@@ -109,8 +106,8 @@ exports.createObservationAttributesSchema = zod_1.z.object({
109
106
  'general',
110
107
  'health_check',
111
108
  ]),
112
- userNotes: zod_1.z.string().max(1000).optional(),
113
- cropStageAtTime: zod_1.z
109
+ userNotes: z.string().max(1000).optional(),
110
+ cropStageAtTime: z
114
111
  .enum([
115
112
  'planted',
116
113
  'germination',
@@ -121,43 +118,43 @@ exports.createObservationAttributesSchema = zod_1.z.object({
121
118
  'harvested',
122
119
  ])
123
120
  .optional(),
124
- location: zod_1.z
121
+ location: z
125
122
  .object({
126
- lat: zod_1.z.number().min(-90).max(90),
127
- lng: zod_1.z.number().min(-180).max(180),
128
- accuracy: zod_1.z.number().positive().optional(),
123
+ lat: z.number().min(-90).max(90),
124
+ lng: z.number().min(-180).max(180),
125
+ accuracy: z.number().positive().optional(),
129
126
  })
130
127
  .optional(),
131
- capturedAt: zod_1.z.string().datetime().optional(),
128
+ capturedAt: z.string().datetime().optional(),
132
129
  });
133
130
  // Observation attributes for update (input)
134
- exports.updateObservationActionAttributesSchema = zod_1.z.object({
135
- actionStatus: zod_1.z.enum(['in_progress', 'completed', 'dismissed']),
136
- actionNotes: zod_1.z.string().max(2000).optional(),
137
- relatedTaskId: zod_1.z.string().uuid().optional(),
131
+ export const updateObservationActionAttributesSchema = z.object({
132
+ actionStatus: z.enum(['in_progress', 'completed', 'dismissed']),
133
+ actionNotes: z.string().max(2000).optional(),
134
+ relatedTaskId: z.string().uuid().optional(),
138
135
  });
139
136
  // JSON:API resource schemas
140
- exports.observationResourceSchema = (0, common_schemas_1.createJsonApiResourceSchema)('observations', exports.observationAttributesSchema);
141
- exports.createObservationInputSchema = (0, common_schemas_1.createJsonApiResourceSchema)('observations', exports.createObservationAttributesSchema);
142
- exports.uploadObservationBodySchema = exports.createObservationAttributesSchema.merge(zod_1.z.object({
143
- photo: zod_1.z.any(),
137
+ export const observationResourceSchema = createJsonApiResourceSchema('observations', observationAttributesSchema);
138
+ export const createObservationInputSchema = createJsonApiResourceSchema('observations', createObservationAttributesSchema);
139
+ export const uploadObservationBodySchema = createObservationAttributesSchema.merge(z.object({
140
+ photo: z.any(),
144
141
  }));
145
- exports.updateObservationActionInputSchema = (0, common_schemas_1.createJsonApiResourceSchema)('observations', exports.updateObservationActionAttributesSchema);
142
+ export const updateObservationActionInputSchema = createJsonApiResourceSchema('observations', updateObservationActionAttributesSchema);
146
143
  // Response schemas
147
- exports.observationResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.observationResourceSchema);
148
- exports.observationListResponseSchema = (0, common_schemas_1.jsonApiCollectionResponseSchema)(exports.observationResourceSchema);
144
+ export const observationResponseSchema = jsonApiSingleResponseSchema(observationResourceSchema);
145
+ export const observationListResponseSchema = jsonApiCollectionResponseSchema(observationResourceSchema);
149
146
  // Query schemas
150
- exports.observationListQuerySchema = zod_1.z.object({
151
- fieldId: zod_1.z.string().uuid().optional(),
152
- status: zod_1.z.enum(['pending', 'processing', 'completed', 'failed']).optional(),
153
- observationType: zod_1.z.string().optional(),
154
- severity: zod_1.z.enum(['low', 'medium', 'high', 'critical']).optional(),
155
- startDate: zod_1.z.string().datetime().optional(),
156
- endDate: zod_1.z.string().datetime().optional(),
157
- page: zod_1.z.string().default('1'),
158
- pageSize: zod_1.z.string().default('20'),
147
+ export const observationListQuerySchema = z.object({
148
+ fieldId: z.string().uuid().optional(),
149
+ status: z.enum(['pending', 'processing', 'completed', 'failed']).optional(),
150
+ observationType: z.string().optional(),
151
+ severity: z.enum(['low', 'medium', 'high', 'critical']).optional(),
152
+ startDate: z.string().datetime().optional(),
153
+ endDate: z.string().datetime().optional(),
154
+ page: z.string().default('1'),
155
+ pageSize: z.string().default('20'),
159
156
  });
160
- exports.observationStatsQuerySchema = zod_1.z.object({
161
- startDate: zod_1.z.string().datetime().optional(),
162
- endDate: zod_1.z.string().datetime().optional(),
157
+ export const observationStatsQuerySchema = z.object({
158
+ startDate: z.string().datetime().optional(),
159
+ endDate: z.string().datetime().optional(),
163
160
  });
@@ -1,125 +1,122 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fieldListResponseSchema = exports.fieldDetailResponseSchema = exports.fieldResponseSchema = exports.fieldDetailResourceSchema = exports.fieldResourceSchema = exports.updateFieldSchema = exports.createFieldSchema = exports.updateFieldAttributesSchema = exports.createFieldAttributesSchema = exports.fieldAttributesSchema = exports.cropHistoryEntrySchema = exports.historicalDataPointSchema = exports.cropStageSchema = exports.fieldStatusSchema = void 0;
4
- const zod_1 = require("zod");
5
- const common_schemas_1 = require("./common.schemas");
1
+ import { z } from 'zod';
2
+ import { geoJSONGeometrySchema, timestampsSchema, createJsonApiResourceSchema, jsonApiSingleResponseSchema, jsonApiCollectionResponseSchema } from './common.schemas';
6
3
  /**
7
4
  * Field schemas - JSON:API compliant
8
5
  */
9
6
  // Field status enum
10
- exports.fieldStatusSchema = zod_1.z.enum(['ok', 'alert', 'critical']);
7
+ export const fieldStatusSchema = z.enum(['ok', 'alert', 'critical']);
11
8
  // Crop stage enum
12
- exports.cropStageSchema = zod_1.z.enum(['planted', 'growing', 'flowering', 'mature', 'harvested']);
9
+ export const cropStageSchema = z.enum(['planted', 'growing', 'flowering', 'mature', 'harvested']);
13
10
  // Historical data point (for NDVI, moisture trends)
14
- exports.historicalDataPointSchema = zod_1.z.object({
15
- date: zod_1.z.string().datetime(),
16
- value: zod_1.z.number(),
11
+ export const historicalDataPointSchema = z.object({
12
+ date: z.string().datetime(),
13
+ value: z.number(),
17
14
  });
18
15
  // Crop history entry
19
- exports.cropHistoryEntrySchema = zod_1.z.object({
20
- id: zod_1.z.string().uuid(),
21
- season: zod_1.z.string(), // e.g., "2024-2025"
22
- crop: zod_1.z.string(),
23
- plantingDate: zod_1.z.string().datetime(),
24
- harvestDate: zod_1.z.string().datetime().nullable(),
25
- yield: zod_1.z.number().nullable(),
26
- yieldUnit: zod_1.z.string().nullable(),
16
+ export const cropHistoryEntrySchema = z.object({
17
+ id: z.string().uuid(),
18
+ season: z.string(), // e.g., "2024-2025"
19
+ crop: z.string(),
20
+ plantingDate: z.string().datetime(),
21
+ harvestDate: z.string().datetime().nullable(),
22
+ yield: z.number().nullable(),
23
+ yieldUnit: z.string().nullable(),
27
24
  });
28
25
  // Field attributes schema (for JSON:API attributes object)
29
- exports.fieldAttributesSchema = zod_1.z.object({
30
- name: zod_1.z.string().min(1).max(200),
31
- geometry: common_schemas_1.geoJSONGeometrySchema.nullable(),
32
- ndvi: zod_1.z.number().nullable(),
33
- moisture: zod_1.z.string().nullable(),
34
- status: exports.fieldStatusSchema,
35
- area: zod_1.z.string().nullable(), // Calculated from geometry, e.g., "50 Ha"
36
- crop: zod_1.z.string().nullable(),
37
- soilType: zod_1.z.string().nullable(),
26
+ export const fieldAttributesSchema = z.object({
27
+ name: z.string().min(1).max(200),
28
+ geometry: geoJSONGeometrySchema.nullable(),
29
+ ndvi: z.number().nullable(),
30
+ moisture: z.string().nullable(),
31
+ status: fieldStatusSchema,
32
+ area: z.string().nullable(), // Calculated from geometry, e.g., "50 Ha"
33
+ crop: z.string().nullable(),
34
+ soilType: z.string().nullable(),
38
35
  // Crop lifecycle
39
- currentCrop: zod_1.z.string().nullable(),
40
- plantingDate: zod_1.z.string().datetime().nullable(),
41
- expectedHarvestDate: zod_1.z.string().datetime().nullable(),
42
- cropStage: exports.cropStageSchema.nullable(),
36
+ currentCrop: z.string().nullable(),
37
+ plantingDate: z.string().datetime().nullable(),
38
+ expectedHarvestDate: z.string().datetime().nullable(),
39
+ cropStage: cropStageSchema.nullable(),
43
40
  // Historical data
44
- historicalNdvi: zod_1.z.array(exports.historicalDataPointSchema).optional(),
45
- cropHistory: zod_1.z.array(exports.cropHistoryEntrySchema).optional(),
46
- }).merge(common_schemas_1.timestampsSchema);
41
+ historicalNdvi: z.array(historicalDataPointSchema).optional(),
42
+ cropHistory: z.array(cropHistoryEntrySchema).optional(),
43
+ }).merge(timestampsSchema);
47
44
  // Field attributes for creation (input)
48
- exports.createFieldAttributesSchema = zod_1.z.object({
49
- name: zod_1.z.string().min(1).max(200),
50
- geometry: common_schemas_1.geoJSONGeometrySchema.optional(),
51
- ndvi: zod_1.z.number().min(0).max(1).optional(),
52
- moisture: zod_1.z.string().optional(),
53
- crop: zod_1.z.string().optional(),
54
- soilType: zod_1.z.string().optional(),
45
+ export const createFieldAttributesSchema = z.object({
46
+ name: z.string().min(1).max(200),
47
+ geometry: geoJSONGeometrySchema.optional(),
48
+ ndvi: z.number().min(0).max(1).optional(),
49
+ moisture: z.string().optional(),
50
+ crop: z.string().optional(),
51
+ soilType: z.string().optional(),
55
52
  // Crop lifecycle fields
56
- currentCrop: zod_1.z.string().optional(),
57
- plantingDate: zod_1.z.string().datetime().optional(),
58
- expectedHarvestDate: zod_1.z.string().datetime().optional(),
59
- cropStage: exports.cropStageSchema.optional(),
53
+ currentCrop: z.string().optional(),
54
+ plantingDate: z.string().datetime().optional(),
55
+ expectedHarvestDate: z.string().datetime().optional(),
56
+ cropStage: cropStageSchema.optional(),
60
57
  });
61
58
  // Field attributes for update (input)
62
- exports.updateFieldAttributesSchema = exports.createFieldAttributesSchema.partial();
59
+ export const updateFieldAttributesSchema = createFieldAttributesSchema.partial();
63
60
  // Create field input (JSON:API format)
64
- exports.createFieldSchema = zod_1.z.object({
65
- type: zod_1.z.literal('fields'),
66
- attributes: exports.createFieldAttributesSchema,
67
- relationships: zod_1.z.object({
68
- farm: zod_1.z.object({
69
- data: zod_1.z.object({
70
- type: zod_1.z.literal('farms'),
71
- id: zod_1.z.string().uuid(),
61
+ export const createFieldSchema = z.object({
62
+ type: z.literal('fields'),
63
+ attributes: createFieldAttributesSchema,
64
+ relationships: z.object({
65
+ farm: z.object({
66
+ data: z.object({
67
+ type: z.literal('farms'),
68
+ id: z.string().uuid(),
72
69
  }),
73
70
  }),
74
71
  }),
75
72
  });
76
73
  // Update field input (JSON:API format)
77
- exports.updateFieldSchema = zod_1.z.object({
78
- type: zod_1.z.literal('fields'),
79
- id: zod_1.z.string().uuid(),
80
- attributes: exports.updateFieldAttributesSchema,
74
+ export const updateFieldSchema = z.object({
75
+ type: z.literal('fields'),
76
+ id: z.string().uuid(),
77
+ attributes: updateFieldAttributesSchema,
81
78
  });
82
79
  // Field resource (JSON:API resource object)
83
- exports.fieldResourceSchema = (0, common_schemas_1.createJsonApiResourceSchema)('fields', exports.fieldAttributesSchema);
80
+ export const fieldResourceSchema = createJsonApiResourceSchema('fields', fieldAttributesSchema);
84
81
  // Field detail resource with relationships
85
- exports.fieldDetailResourceSchema = exports.fieldResourceSchema.extend({
86
- relationships: zod_1.z.object({
87
- farm: zod_1.z.object({
88
- data: zod_1.z.object({
89
- type: zod_1.z.literal('farms'),
90
- id: zod_1.z.string().uuid(),
82
+ export const fieldDetailResourceSchema = fieldResourceSchema.extend({
83
+ relationships: z.object({
84
+ farm: z.object({
85
+ data: z.object({
86
+ type: z.literal('farms'),
87
+ id: z.string().uuid(),
91
88
  }),
92
- links: zod_1.z.object({
93
- related: zod_1.z.string(),
89
+ links: z.object({
90
+ related: z.string(),
94
91
  }),
95
92
  }),
96
- tasks: zod_1.z.object({
97
- meta: zod_1.z.object({
98
- count: zod_1.z.number().int().nonnegative(),
93
+ tasks: z.object({
94
+ meta: z.object({
95
+ count: z.number().int().nonnegative(),
99
96
  }),
100
- links: zod_1.z.object({
101
- related: zod_1.z.string(),
97
+ links: z.object({
98
+ related: z.string(),
102
99
  }),
103
100
  }).optional(),
104
- harvests: zod_1.z.object({
105
- meta: zod_1.z.object({
106
- count: zod_1.z.number().int().nonnegative(),
101
+ harvests: z.object({
102
+ meta: z.object({
103
+ count: z.number().int().nonnegative(),
107
104
  }),
108
- links: zod_1.z.object({
109
- related: zod_1.z.string(),
105
+ links: z.object({
106
+ related: z.string(),
110
107
  }),
111
108
  }).optional(),
112
- soilTests: zod_1.z.object({
113
- meta: zod_1.z.object({
114
- count: zod_1.z.number().int().nonnegative(),
109
+ soilTests: z.object({
110
+ meta: z.object({
111
+ count: z.number().int().nonnegative(),
115
112
  }),
116
- links: zod_1.z.object({
117
- related: zod_1.z.string(),
113
+ links: z.object({
114
+ related: z.string(),
118
115
  }),
119
116
  }).optional(),
120
117
  }).optional(),
121
118
  });
122
119
  // Field responses (JSON:API format)
123
- exports.fieldResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.fieldResourceSchema);
124
- exports.fieldDetailResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.fieldDetailResourceSchema);
125
- exports.fieldListResponseSchema = (0, common_schemas_1.jsonApiCollectionResponseSchema)(exports.fieldResourceSchema);
120
+ export const fieldResponseSchema = jsonApiSingleResponseSchema(fieldResourceSchema);
121
+ export const fieldDetailResponseSchema = jsonApiSingleResponseSchema(fieldDetailResourceSchema);
122
+ export const fieldListResponseSchema = jsonApiCollectionResponseSchema(fieldResourceSchema);