@purveyors/cli 0.2.1 → 0.4.0
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.
- package/dist/commands/catalog.d.ts +4 -56
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +14 -81
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +82 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/inventory.d.ts +2 -25
- package/dist/commands/inventory.d.ts.map +1 -1
- package/dist/commands/inventory.js +109 -149
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/roast.d.ts +2 -41
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +445 -126
- package/dist/commands/roast.js.map +1 -1
- package/dist/commands/sales.d.ts +2 -10
- package/dist/commands/sales.d.ts.map +1 -1
- package/dist/commands/sales.js +100 -112
- package/dist/commands/sales.js.map +1 -1
- package/dist/commands/tasting.d.ts +4 -38
- package/dist/commands/tasting.d.ts.map +1 -1
- package/dist/commands/tasting.js +93 -116
- package/dist/commands/tasting.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/ai.d.ts +36 -0
- package/dist/lib/ai.d.ts.map +1 -0
- package/dist/lib/ai.js +38 -0
- package/dist/lib/ai.js.map +1 -0
- package/dist/lib/artisan/db.d.ts +37 -0
- package/dist/lib/artisan/db.d.ts.map +1 -0
- package/dist/lib/artisan/db.js +51 -0
- package/dist/lib/artisan/db.js.map +1 -0
- package/dist/lib/artisan/import.d.ts +16 -0
- package/dist/lib/artisan/import.d.ts.map +1 -0
- package/dist/lib/artisan/import.js +447 -0
- package/dist/lib/artisan/import.js.map +1 -0
- package/dist/lib/artisan/index.d.ts +9 -0
- package/dist/lib/artisan/index.d.ts.map +1 -0
- package/dist/lib/artisan/index.js +7 -0
- package/dist/lib/artisan/index.js.map +1 -0
- package/dist/lib/artisan/parser.d.ts +19 -0
- package/dist/lib/artisan/parser.d.ts.map +1 -0
- package/dist/lib/artisan/parser.js +376 -0
- package/dist/lib/artisan/parser.js.map +1 -0
- package/dist/lib/artisan/temperature.d.ts +52 -0
- package/dist/lib/artisan/temperature.d.ts.map +1 -0
- package/dist/lib/artisan/temperature.js +101 -0
- package/dist/lib/artisan/temperature.js.map +1 -0
- package/dist/lib/artisan/types.d.ts +195 -0
- package/dist/lib/artisan/types.d.ts.map +1 -0
- package/dist/lib/artisan/types.js +35 -0
- package/dist/lib/artisan/types.js.map +1 -0
- package/dist/lib/artisan/validator.d.ts +14 -0
- package/dist/lib/artisan/validator.d.ts.map +1 -0
- package/dist/lib/artisan/validator.js +228 -0
- package/dist/lib/artisan/validator.js.map +1 -0
- package/dist/lib/catalog.d.ts +87 -0
- package/dist/lib/catalog.d.ts.map +1 -0
- package/dist/lib/catalog.js +111 -0
- package/dist/lib/catalog.js.map +1 -0
- package/dist/lib/config.d.ts +26 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +59 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/interactive/forms.d.ts +33 -0
- package/dist/lib/interactive/forms.d.ts.map +1 -0
- package/dist/lib/interactive/forms.js +139 -0
- package/dist/lib/interactive/forms.js.map +1 -0
- package/dist/lib/interactive/watch.d.ts +66 -0
- package/dist/lib/interactive/watch.d.ts.map +1 -0
- package/dist/lib/interactive/watch.js +494 -0
- package/dist/lib/interactive/watch.js.map +1 -0
- package/dist/lib/inventory.d.ts +80 -0
- package/dist/lib/inventory.d.ts.map +1 -0
- package/dist/lib/inventory.js +205 -0
- package/dist/lib/inventory.js.map +1 -0
- package/dist/lib/roast.d.ts +127 -0
- package/dist/lib/roast.d.ts.map +1 -0
- package/dist/lib/roast.js +284 -0
- package/dist/lib/roast.js.map +1 -0
- package/dist/lib/sales.d.ts +53 -0
- package/dist/lib/sales.d.ts.map +1 -0
- package/dist/lib/sales.js +155 -0
- package/dist/lib/sales.js.map +1 -0
- package/dist/lib/tasting.d.ts +76 -0
- package/dist/lib/tasting.d.ts.map +1 -0
- package/dist/lib/tasting.js +136 -0
- package/dist/lib/tasting.js.map +1 -0
- package/package.json +15 -2
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
export interface ArtisanRoastData {
|
|
2
|
+
recording_version?: string;
|
|
3
|
+
recording_revision?: string;
|
|
4
|
+
recording_build?: string;
|
|
5
|
+
version?: string;
|
|
6
|
+
revision?: string;
|
|
7
|
+
build?: string;
|
|
8
|
+
artisan_os?: string;
|
|
9
|
+
artisan_os_version?: string;
|
|
10
|
+
artisan_os_arch?: string;
|
|
11
|
+
title: string;
|
|
12
|
+
roastertype: string;
|
|
13
|
+
roastersize?: number;
|
|
14
|
+
temperature_unit: 'F' | 'C';
|
|
15
|
+
mode: 'F' | 'C';
|
|
16
|
+
roastdate?: string;
|
|
17
|
+
roasttime?: string;
|
|
18
|
+
roast_uuid?: string;
|
|
19
|
+
xmin?: number;
|
|
20
|
+
xmax?: number;
|
|
21
|
+
ymin?: number;
|
|
22
|
+
ymax?: number;
|
|
23
|
+
zmin?: number;
|
|
24
|
+
zmax?: number;
|
|
25
|
+
computed?: {
|
|
26
|
+
TP_time?: number;
|
|
27
|
+
TP_BT?: number;
|
|
28
|
+
dry_phase_ror?: number;
|
|
29
|
+
mid_phase_ror?: number;
|
|
30
|
+
finish_phase_ror?: number;
|
|
31
|
+
total_ror?: number;
|
|
32
|
+
AUC?: number;
|
|
33
|
+
dry_phase_delta_temp?: number;
|
|
34
|
+
CHARGE_BT?: number;
|
|
35
|
+
DRY_BT?: number;
|
|
36
|
+
DROP_BT?: number;
|
|
37
|
+
COOL_BT?: number;
|
|
38
|
+
DRY_time?: number;
|
|
39
|
+
DROP_time?: number;
|
|
40
|
+
COOL_time?: number;
|
|
41
|
+
};
|
|
42
|
+
timex: number[];
|
|
43
|
+
temp1: number[];
|
|
44
|
+
temp2: number[];
|
|
45
|
+
timeindex: number[];
|
|
46
|
+
weight: [number, number, string];
|
|
47
|
+
defects_weight?: number;
|
|
48
|
+
volume?: [number, number, string];
|
|
49
|
+
density?: [number, string, number, string];
|
|
50
|
+
density_roasted?: [number, string, number, string];
|
|
51
|
+
roasterheating?: number;
|
|
52
|
+
machinesetup?: string;
|
|
53
|
+
drumspeed?: string;
|
|
54
|
+
operator?: string;
|
|
55
|
+
organization?: string;
|
|
56
|
+
flavors?: number[];
|
|
57
|
+
flavors_total_correction?: number;
|
|
58
|
+
flavorlabels?: string[];
|
|
59
|
+
beans?: string;
|
|
60
|
+
roastingnotes?: string;
|
|
61
|
+
cuppingnotes?: string;
|
|
62
|
+
heavyFC?: boolean;
|
|
63
|
+
lowFC?: boolean;
|
|
64
|
+
lightCut?: boolean;
|
|
65
|
+
darkCut?: boolean;
|
|
66
|
+
drops?: boolean;
|
|
67
|
+
oily?: boolean;
|
|
68
|
+
uneven?: boolean;
|
|
69
|
+
tipping?: boolean;
|
|
70
|
+
scorching?: boolean;
|
|
71
|
+
underdeveloped?: boolean;
|
|
72
|
+
extradevices?: number[];
|
|
73
|
+
extraname1?: string[];
|
|
74
|
+
extraname2?: string[];
|
|
75
|
+
extratimex?: number[][];
|
|
76
|
+
extratemp1?: number[][];
|
|
77
|
+
extratemp2?: number[][];
|
|
78
|
+
etypes?: string[];
|
|
79
|
+
specialevents?: number[];
|
|
80
|
+
specialeventstype?: number[];
|
|
81
|
+
specialeventsvalue?: number[];
|
|
82
|
+
specialeventsStrings?: string[];
|
|
83
|
+
locale?: string;
|
|
84
|
+
viewerMode?: boolean;
|
|
85
|
+
}
|
|
86
|
+
export interface MilestoneData {
|
|
87
|
+
charge?: number;
|
|
88
|
+
dry_end?: number;
|
|
89
|
+
fc_start?: number;
|
|
90
|
+
fc_end?: number;
|
|
91
|
+
sc_start?: number;
|
|
92
|
+
sc_end?: number;
|
|
93
|
+
drop?: number;
|
|
94
|
+
cool?: number;
|
|
95
|
+
}
|
|
96
|
+
export interface ProcessedTemperaturePoint {
|
|
97
|
+
time_seconds: number;
|
|
98
|
+
bean_temp: number | null;
|
|
99
|
+
environmental_temp: number | null;
|
|
100
|
+
fan_setting?: number | null;
|
|
101
|
+
heat_setting?: number | null;
|
|
102
|
+
}
|
|
103
|
+
export interface ProcessedRoastData {
|
|
104
|
+
profileData: {
|
|
105
|
+
roaster_type: string;
|
|
106
|
+
roaster_size: number;
|
|
107
|
+
temperature_unit: 'F' | 'C';
|
|
108
|
+
roast_notes?: string;
|
|
109
|
+
roast_uuid?: string;
|
|
110
|
+
data_source: 'artisan_import';
|
|
111
|
+
};
|
|
112
|
+
temperatureData: Array<{
|
|
113
|
+
roast_id: number;
|
|
114
|
+
time_seconds: number;
|
|
115
|
+
bean_temp: number | null;
|
|
116
|
+
environmental_temp: number | null;
|
|
117
|
+
ambient_temp: number | null;
|
|
118
|
+
data_source: 'artisan_import';
|
|
119
|
+
}>;
|
|
120
|
+
milestones: MilestoneData;
|
|
121
|
+
phases: {
|
|
122
|
+
drying_percent: number;
|
|
123
|
+
maillard_percent: number;
|
|
124
|
+
development_percent: number;
|
|
125
|
+
total_time_seconds: number;
|
|
126
|
+
};
|
|
127
|
+
milestoneEvents: Array<{
|
|
128
|
+
roast_id: number;
|
|
129
|
+
time_seconds: number;
|
|
130
|
+
event_type: number;
|
|
131
|
+
event_value: string | null;
|
|
132
|
+
event_string: string;
|
|
133
|
+
category: string;
|
|
134
|
+
subcategory: string;
|
|
135
|
+
user_generated: boolean;
|
|
136
|
+
automatic: boolean;
|
|
137
|
+
notes?: string;
|
|
138
|
+
}>;
|
|
139
|
+
controlEvents: Array<{
|
|
140
|
+
roast_id: number;
|
|
141
|
+
time_seconds: number;
|
|
142
|
+
event_type: number;
|
|
143
|
+
event_value: string;
|
|
144
|
+
event_string: string;
|
|
145
|
+
category: string;
|
|
146
|
+
subcategory: string;
|
|
147
|
+
user_generated: boolean;
|
|
148
|
+
automatic: boolean;
|
|
149
|
+
notes?: string;
|
|
150
|
+
}>;
|
|
151
|
+
computed: {
|
|
152
|
+
tp_time: number | null;
|
|
153
|
+
tp_temp: number | null;
|
|
154
|
+
dry_phase_ror: number | null;
|
|
155
|
+
mid_phase_ror: number | null;
|
|
156
|
+
finish_phase_ror: number | null;
|
|
157
|
+
total_ror: number | null;
|
|
158
|
+
auc: number | null;
|
|
159
|
+
dry_phase_delta_temp: number | null;
|
|
160
|
+
charge_temp_computed: number | null;
|
|
161
|
+
dry_end_temp_computed: number | null;
|
|
162
|
+
drop_temp_computed: number | null;
|
|
163
|
+
cool_temp_computed: number | null;
|
|
164
|
+
dry_end_time_computed: number | null;
|
|
165
|
+
drop_time_computed: number | null;
|
|
166
|
+
cool_time_computed: number | null;
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
export interface ValidationResult {
|
|
170
|
+
valid: boolean;
|
|
171
|
+
errors: string[];
|
|
172
|
+
warnings?: string[];
|
|
173
|
+
}
|
|
174
|
+
export declare function isArtisanRoastData(data: unknown): data is ArtisanRoastData;
|
|
175
|
+
export declare const MILESTONE_NAMES: {
|
|
176
|
+
readonly 0: "CHARGE";
|
|
177
|
+
readonly 1: "DRY_END";
|
|
178
|
+
readonly 2: "FC_START";
|
|
179
|
+
readonly 3: "FC_END";
|
|
180
|
+
readonly 4: "SC_START";
|
|
181
|
+
readonly 5: "SC_END";
|
|
182
|
+
readonly 6: "DROP";
|
|
183
|
+
readonly 7: "COOL";
|
|
184
|
+
};
|
|
185
|
+
export declare const MILESTONE_LABELS: {
|
|
186
|
+
readonly charge: "Charge";
|
|
187
|
+
readonly dry_end: "Dry End";
|
|
188
|
+
readonly fc_start: "First Crack Start";
|
|
189
|
+
readonly fc_end: "First Crack End";
|
|
190
|
+
readonly sc_start: "Second Crack Start";
|
|
191
|
+
readonly sc_end: "Second Crack End";
|
|
192
|
+
readonly drop: "Drop";
|
|
193
|
+
readonly cool: "Cool";
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/artisan/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Type guard for Artisan data
|
|
2
|
+
export function isArtisanRoastData(data) {
|
|
3
|
+
if (typeof data !== 'object' || data === null) {
|
|
4
|
+
return false;
|
|
5
|
+
}
|
|
6
|
+
const d = data;
|
|
7
|
+
return (Array.isArray(d.timex) &&
|
|
8
|
+
Array.isArray(d.temp1) &&
|
|
9
|
+
Array.isArray(d.temp2) &&
|
|
10
|
+
Array.isArray(d.timeindex) &&
|
|
11
|
+
typeof d.title === 'string' &&
|
|
12
|
+
(d.mode === 'F' || d.mode === 'C'));
|
|
13
|
+
}
|
|
14
|
+
// Milestone names mapping
|
|
15
|
+
export const MILESTONE_NAMES = {
|
|
16
|
+
0: 'CHARGE',
|
|
17
|
+
1: 'DRY_END',
|
|
18
|
+
2: 'FC_START',
|
|
19
|
+
3: 'FC_END',
|
|
20
|
+
4: 'SC_START',
|
|
21
|
+
5: 'SC_END',
|
|
22
|
+
6: 'DROP',
|
|
23
|
+
7: 'COOL',
|
|
24
|
+
};
|
|
25
|
+
export const MILESTONE_LABELS = {
|
|
26
|
+
charge: 'Charge',
|
|
27
|
+
dry_end: 'Dry End',
|
|
28
|
+
fc_start: 'First Crack Start',
|
|
29
|
+
fc_end: 'First Crack End',
|
|
30
|
+
sc_start: 'Second Crack Start',
|
|
31
|
+
sc_end: 'Second Crack End',
|
|
32
|
+
drop: 'Drop',
|
|
33
|
+
cool: 'Cool',
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/artisan/types.ts"],"names":[],"mappings":"AAmOA,8BAA8B;AAC9B,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACtB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACtB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACtB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1B,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,0BAA0B;AAC1B,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,mBAAmB;IAC7B,MAAM,EAAE,iBAAiB;IACzB,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,kBAAkB;IAC1B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ValidationResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Comprehensive validation for Artisan .alog.json files
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateArtisanData(inputData: unknown): ValidationResult;
|
|
6
|
+
/**
|
|
7
|
+
* Quick validation for file upload (lighter check)
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateArtisanFileStructure(inputData: unknown): ValidationResult;
|
|
10
|
+
/**
|
|
11
|
+
* Validate processed data before database insertion
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateProcessedData(processedData: object): ValidationResult;
|
|
14
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/lib/artisan/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,CAwNxE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,CAkBjF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,CAmB7E"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { isValidTemperatureUnit } from './temperature.js';
|
|
2
|
+
/**
|
|
3
|
+
* Comprehensive validation for Artisan .alog.json files
|
|
4
|
+
*/
|
|
5
|
+
export function validateArtisanData(inputData) {
|
|
6
|
+
const errors = [];
|
|
7
|
+
const warnings = [];
|
|
8
|
+
const data = inputData;
|
|
9
|
+
// Basic structure validation
|
|
10
|
+
if (!data || typeof data !== 'object') {
|
|
11
|
+
errors.push('Invalid file format: Expected JSON object');
|
|
12
|
+
return { valid: false, errors, warnings };
|
|
13
|
+
}
|
|
14
|
+
// Required time series arrays
|
|
15
|
+
if (!data.timex || !Array.isArray(data.timex)) {
|
|
16
|
+
errors.push('Missing or invalid time data (timex array)');
|
|
17
|
+
}
|
|
18
|
+
else if (data.timex.length === 0) {
|
|
19
|
+
errors.push('Empty time data array');
|
|
20
|
+
}
|
|
21
|
+
if (!data.temp1 || !Array.isArray(data.temp1)) {
|
|
22
|
+
errors.push('Missing or invalid bean temperature data (temp1 array)');
|
|
23
|
+
}
|
|
24
|
+
else if (data.temp1.length === 0) {
|
|
25
|
+
errors.push('Empty bean temperature data array');
|
|
26
|
+
}
|
|
27
|
+
if (!data.temp2 || !Array.isArray(data.temp2)) {
|
|
28
|
+
errors.push('Missing or invalid environmental temperature data (temp2 array)');
|
|
29
|
+
}
|
|
30
|
+
else if (data.temp2.length === 0) {
|
|
31
|
+
errors.push('Empty environmental temperature data array');
|
|
32
|
+
}
|
|
33
|
+
// Array length consistency
|
|
34
|
+
if (data.timex && data.temp1 && data.temp2) {
|
|
35
|
+
const timex = data.timex;
|
|
36
|
+
const temp1 = data.temp1;
|
|
37
|
+
const temp2 = data.temp2;
|
|
38
|
+
const timeLength = timex.length;
|
|
39
|
+
const temp1Length = temp1.length;
|
|
40
|
+
const temp2Length = temp2.length;
|
|
41
|
+
if (timeLength !== temp1Length) {
|
|
42
|
+
errors.push(`Time and bean temperature data length mismatch (${timeLength} vs ${temp1Length})`);
|
|
43
|
+
}
|
|
44
|
+
if (timeLength !== temp2Length) {
|
|
45
|
+
errors.push(`Time and environmental temperature data length mismatch (${timeLength} vs ${temp2Length})`);
|
|
46
|
+
}
|
|
47
|
+
// Reasonable data size check
|
|
48
|
+
if (timeLength > 10000) {
|
|
49
|
+
warnings.push(`Large dataset detected (${timeLength} points). Import may take longer.`);
|
|
50
|
+
}
|
|
51
|
+
if (timeLength < 10) {
|
|
52
|
+
warnings.push(`Small dataset detected (${timeLength} points). Verify this is a complete roast.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Milestone data validation
|
|
56
|
+
if (!data.timeindex || !Array.isArray(data.timeindex)) {
|
|
57
|
+
errors.push('Missing or invalid milestone data (timeindex array)');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
if (data.timeindex.length !== 8) {
|
|
61
|
+
warnings.push(`Unexpected milestone array length (${data.timeindex.length}, expected 8)`);
|
|
62
|
+
}
|
|
63
|
+
// Validate milestone indices are within time array bounds
|
|
64
|
+
if (data.timex && Array.isArray(data.timex)) {
|
|
65
|
+
const timex = data.timex;
|
|
66
|
+
const maxIndex = timex.length - 1;
|
|
67
|
+
data.timeindex.forEach((index, i) => {
|
|
68
|
+
if (index > 0 && index > maxIndex) {
|
|
69
|
+
errors.push(`Milestone index ${i} (${index}) exceeds time data length (${maxIndex})`);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Check for reasonable milestone progression
|
|
74
|
+
const nonZeroMilestones = data.timeindex.filter((idx) => idx > 0);
|
|
75
|
+
if (nonZeroMilestones.length > 1) {
|
|
76
|
+
for (let i = 1; i < nonZeroMilestones.length; i++) {
|
|
77
|
+
if (nonZeroMilestones[i] <= nonZeroMilestones[i - 1]) {
|
|
78
|
+
warnings.push('Milestone events may not be in chronological order');
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Temperature unit validation
|
|
85
|
+
if (!data.mode || !isValidTemperatureUnit(data.mode)) {
|
|
86
|
+
warnings.push('Missing or invalid temperature unit (mode). Defaulting to Fahrenheit.');
|
|
87
|
+
}
|
|
88
|
+
// Metadata validation
|
|
89
|
+
if (!data.title || typeof data.title !== 'string' || data.title.trim() === '') {
|
|
90
|
+
warnings.push('Missing or empty roast title');
|
|
91
|
+
}
|
|
92
|
+
if (!data.roastertype || typeof data.roastertype !== 'string') {
|
|
93
|
+
warnings.push('Missing roaster type information');
|
|
94
|
+
}
|
|
95
|
+
// Weight data validation
|
|
96
|
+
if (data.weight) {
|
|
97
|
+
if (!Array.isArray(data.weight) || data.weight.length !== 3) {
|
|
98
|
+
warnings.push('Invalid weight data format (expected [input, output, unit])');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const [input, output, unit] = data.weight;
|
|
102
|
+
if (typeof input !== 'number' || input <= 0) {
|
|
103
|
+
warnings.push('Invalid input weight value');
|
|
104
|
+
}
|
|
105
|
+
if (typeof output !== 'number' || output <= 0) {
|
|
106
|
+
warnings.push('Invalid output weight value');
|
|
107
|
+
}
|
|
108
|
+
if (typeof unit !== 'string') {
|
|
109
|
+
warnings.push('Invalid weight unit');
|
|
110
|
+
}
|
|
111
|
+
if (typeof input === 'number' && typeof output === 'number' && output > input) {
|
|
112
|
+
warnings.push('Output weight exceeds input weight (possible data error)');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
warnings.push('Missing weight data');
|
|
118
|
+
}
|
|
119
|
+
// Temperature data reasonableness checks
|
|
120
|
+
if (data.temp1 && Array.isArray(data.temp1)) {
|
|
121
|
+
const beanTemps = data.temp1.filter((t) => typeof t === 'number' && !isNaN(t));
|
|
122
|
+
if (beanTemps.length > 0) {
|
|
123
|
+
const minBT = Math.min(...beanTemps);
|
|
124
|
+
const maxBT = Math.max(...beanTemps);
|
|
125
|
+
// Check for reasonable temperature ranges
|
|
126
|
+
const unit = data.mode || 'F';
|
|
127
|
+
if (unit === 'F') {
|
|
128
|
+
if (minBT < 100 || maxBT > 600) {
|
|
129
|
+
warnings.push(`Bean temperatures outside typical range (${minBT}°F - ${maxBT}°F)`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
if (minBT < 38 || maxBT > 315) {
|
|
134
|
+
warnings.push(`Bean temperatures outside typical range (${minBT}°C - ${maxBT}°C)`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (data.temp2 && Array.isArray(data.temp2)) {
|
|
140
|
+
const envTemps = data.temp2.filter((t) => typeof t === 'number' && !isNaN(t));
|
|
141
|
+
if (envTemps.length > 0) {
|
|
142
|
+
const minET = Math.min(...envTemps);
|
|
143
|
+
const maxET = Math.max(...envTemps);
|
|
144
|
+
// Environmental temp should generally be higher than bean temp
|
|
145
|
+
const unit = data.mode || 'F';
|
|
146
|
+
if (unit === 'F') {
|
|
147
|
+
if (minET < 200 || maxET > 800) {
|
|
148
|
+
warnings.push(`Environmental temperatures outside typical range (${minET}°F - ${maxET}°F)`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
if (minET < 93 || maxET > 427) {
|
|
153
|
+
warnings.push(`Environmental temperatures outside typical range (${minET}°C - ${maxET}°C)`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Time data validation
|
|
159
|
+
if (data.timex && Array.isArray(data.timex)) {
|
|
160
|
+
const times = data.timex.filter((t) => typeof t === 'number' && !isNaN(t));
|
|
161
|
+
if (times.length > 0) {
|
|
162
|
+
const minTime = Math.min(...times);
|
|
163
|
+
const maxTime = Math.max(...times);
|
|
164
|
+
const duration = maxTime - minTime;
|
|
165
|
+
if (minTime < 0) {
|
|
166
|
+
warnings.push('Negative time values detected');
|
|
167
|
+
}
|
|
168
|
+
if (duration < 60) {
|
|
169
|
+
warnings.push(`Very short roast duration (${duration.toFixed(1)} seconds)`);
|
|
170
|
+
}
|
|
171
|
+
if (duration > 3600) {
|
|
172
|
+
warnings.push(`Very long roast duration (${duration.toFixed(1)} seconds)`);
|
|
173
|
+
}
|
|
174
|
+
// Check for time sequence consistency
|
|
175
|
+
for (let i = 1; i < times.length; i++) {
|
|
176
|
+
if (times[i] < times[i - 1]) {
|
|
177
|
+
warnings.push('Time sequence is not monotonically increasing');
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
valid: errors.length === 0,
|
|
185
|
+
errors,
|
|
186
|
+
warnings,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Quick validation for file upload (lighter check)
|
|
191
|
+
*/
|
|
192
|
+
export function validateArtisanFileStructure(inputData) {
|
|
193
|
+
const errors = [];
|
|
194
|
+
const data = inputData;
|
|
195
|
+
if (!data || typeof data !== 'object') {
|
|
196
|
+
errors.push('Invalid JSON structure');
|
|
197
|
+
return { valid: false, errors };
|
|
198
|
+
}
|
|
199
|
+
// Essential field check
|
|
200
|
+
const requiredFields = ['timex', 'temp1', 'temp2', 'timeindex'];
|
|
201
|
+
for (const field of requiredFields) {
|
|
202
|
+
if (!Array.isArray(data[field])) {
|
|
203
|
+
errors.push(`Missing required field: ${field}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return { valid: errors.length === 0, errors };
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Validate processed data before database insertion
|
|
210
|
+
*/
|
|
211
|
+
export function validateProcessedData(processedData) {
|
|
212
|
+
const data = processedData;
|
|
213
|
+
const errors = [];
|
|
214
|
+
if (!data.profileData) {
|
|
215
|
+
errors.push('Missing profile data');
|
|
216
|
+
}
|
|
217
|
+
if (!data.temperatureData || !Array.isArray(data.temperatureData)) {
|
|
218
|
+
errors.push('Missing or invalid temperature points');
|
|
219
|
+
}
|
|
220
|
+
else if (data.temperatureData.length === 0) {
|
|
221
|
+
errors.push('No temperature points to insert');
|
|
222
|
+
}
|
|
223
|
+
if (!data.milestones) {
|
|
224
|
+
errors.push('Missing milestone data');
|
|
225
|
+
}
|
|
226
|
+
return { valid: errors.length === 0, errors };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/artisan/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAkB;IACpD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,SAAoC,CAAC;IAElD,6BAA6B;IAC7B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC5D,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACxE,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IACjF,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC5D,CAAC;IAED,2BAA2B;IAC3B,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAkB,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAkB,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAkB,CAAC;QAEtC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;QACjC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;QAEjC,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CACT,mDAAmD,UAAU,OAAO,WAAW,GAAG,CACnF,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CACT,4DAA4D,UAAU,OAAO,WAAW,GAAG,CAC5F,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,IAAI,UAAU,GAAG,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,2BAA2B,UAAU,mCAAmC,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,UAAU,GAAG,EAAE,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CACX,2BAA2B,UAAU,4CAA4C,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,MAAM,eAAe,CAAC,CAAC;QAC5F,CAAC;QAED,0DAA0D;QAC1D,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAkB,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,SAAsB,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,CAAS,EAAE,EAAE;gBAChE,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,KAAK,+BAA+B,QAAQ,GAAG,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,6CAA6C;QAC7C,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC1E,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClD,IAAI,iBAAiB,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACrD,QAAQ,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;oBACpE,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACzF,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9E,QAAQ,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACpD,CAAC;IAED,yBAAyB;IACzB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;gBAC9E,QAAQ,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACvC,CAAC;IAED,yCAAyC;IACzC,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CACjC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACvC,CAAC;QACd,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;YAErC,0CAA0C;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;YAC9B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;oBAC/B,QAAQ,CAAC,IAAI,CAAC,4CAA4C,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;oBAC9B,QAAQ,CAAC,IAAI,CAAC,4CAA4C,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAChC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACvC,CAAC;QACd,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YAEpC,+DAA+D;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;YAC9B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;oBAC/B,QAAQ,CAAC,IAAI,CACX,qDAAqD,KAAK,QAAQ,KAAK,KAAK,CAC7E,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;oBAC9B,QAAQ,CAAC,IAAI,CACX,qDAAqD,KAAK,QAAQ,KAAK,KAAK,CAC7E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAa,CAAC;QAChG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;YAEnC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACjD,CAAC;YAED,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,8BAA8B,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC9E,CAAC;YAED,IAAI,QAAQ,GAAG,IAAI,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC7E,CAAC;YAED,sCAAsC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;oBAC/D,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,SAAkB;IAC7D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,SAAoC,CAAC;IAElD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,wBAAwB;IACxB,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IACzD,MAAM,IAAI,GAAG,aAAwC,CAAC;IACtD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;SAAM,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
3
|
+
export interface CatalogItem {
|
|
4
|
+
id: number;
|
|
5
|
+
name: string | null;
|
|
6
|
+
source: string | null;
|
|
7
|
+
continent: string | null;
|
|
8
|
+
country: string | null;
|
|
9
|
+
region: string | null;
|
|
10
|
+
processing: string | null;
|
|
11
|
+
drying_method: string | null;
|
|
12
|
+
cultivar_detail: string | null;
|
|
13
|
+
grade: string | null;
|
|
14
|
+
appearance: string | null;
|
|
15
|
+
type: string | null;
|
|
16
|
+
description_short: string | null;
|
|
17
|
+
description_long: string | null;
|
|
18
|
+
farm_notes: string | null;
|
|
19
|
+
cupping_notes: string | null;
|
|
20
|
+
ai_description: string | null;
|
|
21
|
+
roast_recs: string | null;
|
|
22
|
+
cost_lb: number | null;
|
|
23
|
+
lot_size: string | null;
|
|
24
|
+
bag_size: string | null;
|
|
25
|
+
score_value: number | null;
|
|
26
|
+
stocked: boolean | null;
|
|
27
|
+
stocked_date: string | null;
|
|
28
|
+
unstocked_date: string | null;
|
|
29
|
+
arrival_date: string | null;
|
|
30
|
+
last_updated: string | null;
|
|
31
|
+
public_coffee: boolean | null;
|
|
32
|
+
wholesale: boolean | null;
|
|
33
|
+
price_tiers: Array<{
|
|
34
|
+
min_lbs: number;
|
|
35
|
+
price: number;
|
|
36
|
+
}> | null;
|
|
37
|
+
}
|
|
38
|
+
export interface CatalogStats {
|
|
39
|
+
total: number;
|
|
40
|
+
stocked: number;
|
|
41
|
+
byOrigin: Record<string, number>;
|
|
42
|
+
avgPricePerLb: number | null;
|
|
43
|
+
priceRange: {
|
|
44
|
+
min: number | null;
|
|
45
|
+
max: number | null;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export declare const searchCatalogSchema: z.ZodObject<{
|
|
49
|
+
origin: z.ZodOptional<z.ZodString>;
|
|
50
|
+
process: z.ZodOptional<z.ZodString>;
|
|
51
|
+
priceMin: z.ZodOptional<z.ZodNumber>;
|
|
52
|
+
priceMax: z.ZodOptional<z.ZodNumber>;
|
|
53
|
+
flavor: z.ZodOptional<z.ZodString>;
|
|
54
|
+
stocked: z.ZodOptional<z.ZodBoolean>;
|
|
55
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
export type SearchCatalogInput = z.input<typeof searchCatalogSchema>;
|
|
58
|
+
export declare const getCatalogSchema: z.ZodObject<{
|
|
59
|
+
id: z.ZodNumber;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
export type GetCatalogInput = z.input<typeof getCatalogSchema>;
|
|
62
|
+
export declare const getCatalogStatsSchema: z.ZodObject<{}, z.core.$strip>;
|
|
63
|
+
export type GetCatalogStatsInput = z.input<typeof getCatalogStatsSchema>;
|
|
64
|
+
/**
|
|
65
|
+
* Strip PostgREST special characters from user-supplied filter values.
|
|
66
|
+
* Prevents injection into .or() filter strings where values are interpolated directly.
|
|
67
|
+
* Removes: ( ) , . * % that have meaning in PostgREST filter syntax.
|
|
68
|
+
*/
|
|
69
|
+
export declare function sanitizeFilterValue(value: string): string;
|
|
70
|
+
/**
|
|
71
|
+
* Aggregate stats from an array of catalog items.
|
|
72
|
+
* Pure function — no I/O, safe to unit test.
|
|
73
|
+
*/
|
|
74
|
+
export declare function computeCatalogStats(items: CatalogItem[]): CatalogStats;
|
|
75
|
+
/**
|
|
76
|
+
* Search the coffee catalog with optional filters.
|
|
77
|
+
*/
|
|
78
|
+
export declare function searchCatalog(supabase: SupabaseClient, opts: SearchCatalogInput): Promise<CatalogItem[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Fetch a single catalog item by ID.
|
|
81
|
+
*/
|
|
82
|
+
export declare function getCatalog(supabase: SupabaseClient, id: number): Promise<CatalogItem>;
|
|
83
|
+
/**
|
|
84
|
+
* Fetch aggregate statistics for the coffee catalog.
|
|
85
|
+
*/
|
|
86
|
+
export declare function getCatalogStats(supabase: SupabaseClient): Promise<CatalogStats>;
|
|
87
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/lib/catalog.ts"],"names":[],"mappings":"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"}
|