@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,447 @@
|
|
|
1
|
+
import { validateArtisanData, validateProcessedData } from './validator.js';
|
|
2
|
+
import { normalizeArtisanTemperatures, artisanModeToUnit } from './temperature.js';
|
|
3
|
+
import { processAlogFile } from './parser.js';
|
|
4
|
+
import { clearRoastData, insertTemperatures, insertEvents } from './db.js';
|
|
5
|
+
// Parse Artisan .alog or .alog.json data
|
|
6
|
+
export async function parseArtisanFile(fileContent, fileName) {
|
|
7
|
+
try {
|
|
8
|
+
let data;
|
|
9
|
+
if (fileName.toLowerCase().endsWith('.alog')) {
|
|
10
|
+
// Parse Python literal syntax (.alog file)
|
|
11
|
+
data = processAlogFile(fileContent);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
// Parse standard JSON (.alog.json file)
|
|
15
|
+
data = JSON.parse(fileContent);
|
|
16
|
+
}
|
|
17
|
+
// Validate the basic structure
|
|
18
|
+
const validation = validateArtisanData(data);
|
|
19
|
+
if (!validation.valid) {
|
|
20
|
+
throw new Error(`Invalid Artisan file: ${validation.errors.join(', ')}`);
|
|
21
|
+
}
|
|
22
|
+
// Map 'mode' to 'temperature_unit' for consistency
|
|
23
|
+
data.temperature_unit = artisanModeToUnit(data.mode);
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof Error) {
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
throw new Error('Failed to parse Artisan file');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Extract milestone events from Artisan timeindex array
|
|
34
|
+
function extractMilestones(artisanData) {
|
|
35
|
+
const milestones = {};
|
|
36
|
+
const { timex, timeindex } = artisanData;
|
|
37
|
+
// timeindex maps: [CHARGE, DRY_END, FC_START, FC_END, SC_START, SC_END, DROP, COOL]
|
|
38
|
+
if (timeindex[0] > 0 && timeindex[0] < timex.length) {
|
|
39
|
+
milestones.charge = timex[timeindex[0]];
|
|
40
|
+
}
|
|
41
|
+
if (timeindex[1] > 0 && timeindex[1] < timex.length) {
|
|
42
|
+
milestones.dry_end = timex[timeindex[1]];
|
|
43
|
+
}
|
|
44
|
+
if (timeindex[2] > 0 && timeindex[2] < timex.length) {
|
|
45
|
+
milestones.fc_start = timex[timeindex[2]];
|
|
46
|
+
}
|
|
47
|
+
if (timeindex[3] > 0 && timeindex[3] < timex.length) {
|
|
48
|
+
milestones.fc_end = timex[timeindex[3]];
|
|
49
|
+
}
|
|
50
|
+
if (timeindex[4] > 0 && timeindex[4] < timex.length) {
|
|
51
|
+
milestones.sc_start = timex[timeindex[4]];
|
|
52
|
+
}
|
|
53
|
+
if (timeindex[5] > 0 && timeindex[5] < timex.length) {
|
|
54
|
+
milestones.sc_end = timex[timeindex[5]];
|
|
55
|
+
}
|
|
56
|
+
if (timeindex[6] > 0 && timeindex[6] < timex.length) {
|
|
57
|
+
milestones.drop = timex[timeindex[6]];
|
|
58
|
+
}
|
|
59
|
+
if (timeindex[7] > 0 && timeindex[7] < timex.length) {
|
|
60
|
+
milestones.cool = timex[timeindex[7]];
|
|
61
|
+
}
|
|
62
|
+
return milestones;
|
|
63
|
+
}
|
|
64
|
+
// Transform parsed Artisan data into database format
|
|
65
|
+
export function transformArtisanData(parsedData, roastId) {
|
|
66
|
+
const { timex, temp1, temp2, extratemp1, extratemp2 } = parsedData;
|
|
67
|
+
// Extract milestones
|
|
68
|
+
const milestones = extractMilestones(parsedData);
|
|
69
|
+
// Extract computed data from Artisan
|
|
70
|
+
const computedData = parsedData.computed || {};
|
|
71
|
+
// Normalize temperatures to Fahrenheit for consistency
|
|
72
|
+
const { beanTemps, envTemps } = normalizeArtisanTemperatures(temp1, temp2, parsedData.temperature_unit, 'F' // Store everything in Fahrenheit
|
|
73
|
+
);
|
|
74
|
+
// Extract control device data from extra devices with proper etypes mapping
|
|
75
|
+
const extraDeviceData = [];
|
|
76
|
+
// Map extratemp1 channels to their corresponding etype names
|
|
77
|
+
if (extratemp1 && parsedData.extraname1) {
|
|
78
|
+
extratemp1.forEach((channelData, channelIndex) => {
|
|
79
|
+
if (channelData && channelData.length > 0 && parsedData.extraname1) {
|
|
80
|
+
const deviceName = parsedData.extraname1[channelIndex];
|
|
81
|
+
// Map device names to etypes if available
|
|
82
|
+
let etypeName = deviceName;
|
|
83
|
+
if (parsedData.etypes && parsedData.etypes.length > channelIndex) {
|
|
84
|
+
const etype = parsedData.etypes[channelIndex];
|
|
85
|
+
if (etype && etype !== '--') {
|
|
86
|
+
etypeName = etype.toLowerCase();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
extraDeviceData.push({
|
|
90
|
+
name: etypeName,
|
|
91
|
+
data: channelData,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Map extratemp2 channels to their corresponding etype names
|
|
97
|
+
if (extratemp2 && parsedData.extraname2) {
|
|
98
|
+
extratemp2.forEach((channelData, channelIndex) => {
|
|
99
|
+
if (channelData && channelData.length > 0 && parsedData.extraname2) {
|
|
100
|
+
const deviceName = parsedData.extraname2[channelIndex];
|
|
101
|
+
// Map device names to etypes if available, offset by extratemp1 length
|
|
102
|
+
let etypeName = deviceName;
|
|
103
|
+
const etypeIndex = channelIndex + (parsedData.extratemp1?.length || 0);
|
|
104
|
+
if (parsedData.etypes && parsedData.etypes.length > etypeIndex) {
|
|
105
|
+
const etype = parsedData.etypes[etypeIndex];
|
|
106
|
+
if (etype && etype !== '--') {
|
|
107
|
+
etypeName = etype.toLowerCase();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
extraDeviceData.push({
|
|
111
|
+
name: etypeName,
|
|
112
|
+
data: channelData,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Process special events if extra temp arrays are empty (fallback for newer Artisan files)
|
|
118
|
+
const specialEvents = [];
|
|
119
|
+
if (extraDeviceData.length === 0 && parsedData.specialevents && parsedData.specialeventsStrings) {
|
|
120
|
+
parsedData.specialevents.forEach((eventIndex, index) => {
|
|
121
|
+
const eventType = parsedData.specialeventstype?.[index];
|
|
122
|
+
const valueString = parsedData.specialeventsStrings?.[index];
|
|
123
|
+
// Resolve special event index -> absolute time in seconds
|
|
124
|
+
let timeSeconds;
|
|
125
|
+
if (typeof eventIndex === 'number' &&
|
|
126
|
+
Number.isFinite(eventIndex) &&
|
|
127
|
+
eventIndex >= 0 &&
|
|
128
|
+
eventIndex < timex.length &&
|
|
129
|
+
typeof timex[eventIndex] === 'number' &&
|
|
130
|
+
Number.isFinite(timex[eventIndex])) {
|
|
131
|
+
timeSeconds = timex[eventIndex];
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.warn(`Skipping special event with invalid index: index=${eventIndex}, timex.length=${timex.length}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Process ALL events that have non-empty string values (keep "0" as valid)
|
|
138
|
+
if (valueString && valueString !== '' && eventType !== undefined) {
|
|
139
|
+
// Direct device mapping using etypes array
|
|
140
|
+
const deviceName = parsedData.etypes?.[eventType];
|
|
141
|
+
if (deviceName && deviceName !== '--') {
|
|
142
|
+
specialEvents.push({
|
|
143
|
+
time: timeSeconds,
|
|
144
|
+
name: deviceName.toLowerCase(), // "air", "burner", "drum", "damper"
|
|
145
|
+
value: valueString,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Create temperature data for roast_temperatures table
|
|
152
|
+
const temperatureData = [];
|
|
153
|
+
// Add temperature data points (sample to avoid overwhelming database)
|
|
154
|
+
const sampleRate = Math.max(1, Math.floor(timex.length / 1000)); // Limit to ~1000 points
|
|
155
|
+
timex.forEach((timeSeconds, index) => {
|
|
156
|
+
// Include every Nth point, or points with significant temperature changes
|
|
157
|
+
if (index % sampleRate === 0 ||
|
|
158
|
+
(index > 0 && Math.abs((beanTemps[index] || 0) - (beanTemps[index - 1] || 0)) > 5)) {
|
|
159
|
+
temperatureData.push({
|
|
160
|
+
roast_id: roastId,
|
|
161
|
+
time_seconds: timeSeconds,
|
|
162
|
+
bean_temp: beanTemps[index] ?? null,
|
|
163
|
+
environmental_temp: envTemps[index] ?? null,
|
|
164
|
+
ambient_temp: null, // Artisan doesn't typically have ambient temp
|
|
165
|
+
data_source: 'artisan_import',
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// Calculate phase percentages
|
|
170
|
+
const chargeTime = milestones.charge || 0;
|
|
171
|
+
const dropTime = milestones.drop || timex[timex.length - 1];
|
|
172
|
+
const totalTime = dropTime - chargeTime;
|
|
173
|
+
let dryingPercent = 0;
|
|
174
|
+
let maillardPercent = 0;
|
|
175
|
+
let developmentPercent = 0;
|
|
176
|
+
if (totalTime > 0) {
|
|
177
|
+
if (milestones.dry_end && milestones.dry_end > chargeTime) {
|
|
178
|
+
dryingPercent = ((milestones.dry_end - chargeTime) / totalTime) * 100;
|
|
179
|
+
}
|
|
180
|
+
if (milestones.fc_start && milestones.dry_end && milestones.fc_start > milestones.dry_end) {
|
|
181
|
+
maillardPercent = ((milestones.fc_start - milestones.dry_end) / totalTime) * 100;
|
|
182
|
+
}
|
|
183
|
+
if (milestones.fc_start && dropTime > milestones.fc_start) {
|
|
184
|
+
developmentPercent = ((dropTime - milestones.fc_start) / totalTime) * 100;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Prepare profile data for roast_profiles table (matching schema columns)
|
|
188
|
+
const profileData = {
|
|
189
|
+
roaster_type: parsedData.roastertype || 'Unknown',
|
|
190
|
+
roaster_size: parsedData.roastersize || 0,
|
|
191
|
+
temperature_unit: 'F', // Always store as Fahrenheit after conversion
|
|
192
|
+
roast_notes: `Imported from Artisan\nRoaster: ${parsedData.roastertype || 'Unknown'}\nOriginal temp unit: ${parsedData.mode}\nWeight unit: ${parsedData.weight?.[2] || 'g'}` +
|
|
193
|
+
(parsedData.roastingnotes ? `\n\nNotes: ${parsedData.roastingnotes}` : ''),
|
|
194
|
+
roast_uuid: crypto.randomUUID(), // Generate a unique identifier
|
|
195
|
+
data_source: 'artisan_import',
|
|
196
|
+
};
|
|
197
|
+
// Create milestone events for roast_events table
|
|
198
|
+
const milestoneEvents = [];
|
|
199
|
+
Object.entries(milestones).forEach(([eventName, timeSeconds]) => {
|
|
200
|
+
if (timeSeconds && timeSeconds > 0) {
|
|
201
|
+
milestoneEvents.push({
|
|
202
|
+
roast_id: roastId,
|
|
203
|
+
time_seconds: timeSeconds,
|
|
204
|
+
event_type: 10, // Milestone event type
|
|
205
|
+
event_value: null, // Milestone events have NULL values
|
|
206
|
+
event_string: eventName, // 'charge', 'dry_end', 'fc_start', etc.
|
|
207
|
+
category: 'milestone',
|
|
208
|
+
subcategory: 'roast_phase',
|
|
209
|
+
user_generated: false,
|
|
210
|
+
automatic: true,
|
|
211
|
+
notes: `Imported from Artisan: ${eventName.replace('_', ' ')}`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
// Add turning point milestone if available from computed data
|
|
216
|
+
if (computedData.TP_time && computedData.TP_time > 0) {
|
|
217
|
+
milestoneEvents.push({
|
|
218
|
+
roast_id: roastId,
|
|
219
|
+
time_seconds: computedData.TP_time,
|
|
220
|
+
event_type: 10, // Milestone event type
|
|
221
|
+
event_value: null, // Milestone events have NULL values
|
|
222
|
+
event_string: 'turning_point', // TP milestone
|
|
223
|
+
category: 'milestone',
|
|
224
|
+
subcategory: 'roast_phase',
|
|
225
|
+
user_generated: false,
|
|
226
|
+
automatic: true,
|
|
227
|
+
notes: `Imported from Artisan: turning point at ${computedData.TP_time}s, ${computedData.TP_BT}°F`,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// Create control events for all extra devices using actual etypes names
|
|
231
|
+
const controlEvents = [];
|
|
232
|
+
// Process extratemp device data if available
|
|
233
|
+
timex.forEach((timeSeconds, index) => {
|
|
234
|
+
// Sample control events to avoid overwhelming database
|
|
235
|
+
if (index % sampleRate === 0) {
|
|
236
|
+
extraDeviceData.forEach((device) => {
|
|
237
|
+
const value = device.data[index];
|
|
238
|
+
if (value !== null && value !== undefined && value !== 0) {
|
|
239
|
+
controlEvents.push({
|
|
240
|
+
roast_id: roastId,
|
|
241
|
+
time_seconds: timeSeconds,
|
|
242
|
+
event_type: 1, // Control event type
|
|
243
|
+
event_value: value.toString(),
|
|
244
|
+
event_string: device.name, // Use actual etype name from Artisan
|
|
245
|
+
category: 'control',
|
|
246
|
+
subcategory: 'machine_setting',
|
|
247
|
+
user_generated: false,
|
|
248
|
+
automatic: true,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
// Add special events as control events if extratemp data was empty
|
|
255
|
+
specialEvents.forEach((event) => {
|
|
256
|
+
controlEvents.push({
|
|
257
|
+
roast_id: roastId,
|
|
258
|
+
time_seconds: event.time,
|
|
259
|
+
event_type: 1, // Control event type
|
|
260
|
+
event_value: event.value,
|
|
261
|
+
event_string: event.name, // Use mapped etype name (air, drum, damper, burner)
|
|
262
|
+
category: 'control',
|
|
263
|
+
subcategory: 'machine_setting',
|
|
264
|
+
user_generated: false,
|
|
265
|
+
automatic: true,
|
|
266
|
+
notes: `Imported from Artisan special events: ${event.name} set to ${event.value}`,
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
// Note: roast_phases table no longer exists in normalized schema
|
|
270
|
+
// Phase percentages are now stored directly in roast_profiles table
|
|
271
|
+
return {
|
|
272
|
+
profileData,
|
|
273
|
+
temperatureData: temperatureData.sort((a, b) => a.time_seconds - b.time_seconds),
|
|
274
|
+
milestones,
|
|
275
|
+
phases: {
|
|
276
|
+
drying_percent: dryingPercent,
|
|
277
|
+
maillard_percent: maillardPercent,
|
|
278
|
+
development_percent: developmentPercent,
|
|
279
|
+
total_time_seconds: totalTime,
|
|
280
|
+
},
|
|
281
|
+
computed: {
|
|
282
|
+
// Turning point data
|
|
283
|
+
tp_time: computedData.TP_time ?? null,
|
|
284
|
+
tp_temp: computedData.TP_BT ?? null,
|
|
285
|
+
// Rate of rise metrics
|
|
286
|
+
dry_phase_ror: computedData.dry_phase_ror ?? null,
|
|
287
|
+
mid_phase_ror: computedData.mid_phase_ror ?? null,
|
|
288
|
+
finish_phase_ror: computedData.finish_phase_ror ?? null,
|
|
289
|
+
total_ror: computedData.total_ror ?? null,
|
|
290
|
+
// Advanced metrics
|
|
291
|
+
auc: computedData.AUC ?? null,
|
|
292
|
+
dry_phase_delta_temp: computedData.dry_phase_delta_temp ?? null,
|
|
293
|
+
// Temperature mappings to existing columns (use computed when available)
|
|
294
|
+
charge_temp_computed: computedData.CHARGE_BT ?? null,
|
|
295
|
+
dry_end_temp_computed: computedData.DRY_BT ?? null,
|
|
296
|
+
drop_temp_computed: computedData.DROP_BT ?? null,
|
|
297
|
+
cool_temp_computed: computedData.COOL_BT ?? null,
|
|
298
|
+
// Time mappings to existing columns
|
|
299
|
+
dry_end_time_computed: computedData.DRY_time ?? null,
|
|
300
|
+
drop_time_computed: computedData.DROP_time ?? null,
|
|
301
|
+
cool_time_computed: computedData.COOL_time ?? null,
|
|
302
|
+
},
|
|
303
|
+
milestoneEvents,
|
|
304
|
+
controlEvents,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
// Full import: parse, transform, persist to DB, update profile
|
|
308
|
+
export async function importArtisanData(supabase, roastId, userId, fileContent, fileName, fileSize // original file.size in bytes; falls back to content length if not provided
|
|
309
|
+
) {
|
|
310
|
+
// Verify ownership and get existing roast profile data
|
|
311
|
+
const { data: profile } = (await supabase
|
|
312
|
+
.from('roast_profiles')
|
|
313
|
+
.select('user, coffee_name, batch_name')
|
|
314
|
+
.eq('roast_id', roastId)
|
|
315
|
+
.single());
|
|
316
|
+
if (!profile || profile.user !== userId) {
|
|
317
|
+
throw new Error('Unauthorized');
|
|
318
|
+
}
|
|
319
|
+
// Parse file content
|
|
320
|
+
const artisanData = await parseArtisanFile(fileContent, fileName);
|
|
321
|
+
// Transform to database format
|
|
322
|
+
const processedData = transformArtisanData(artisanData, roastId);
|
|
323
|
+
// Validate processed data
|
|
324
|
+
const validation = validateProcessedData(processedData);
|
|
325
|
+
if (!validation.valid) {
|
|
326
|
+
throw new Error(`Data processing failed: ${validation.errors.join(', ')}`);
|
|
327
|
+
}
|
|
328
|
+
// Update roast profile metadata (preserve original coffee_name + add chart ranges)
|
|
329
|
+
const { error: updateError } = await supabase
|
|
330
|
+
.from('roast_profiles')
|
|
331
|
+
.update({
|
|
332
|
+
// Keep original coffee_name and batch_name
|
|
333
|
+
coffee_name: profile.coffee_name, // Preserve original coffee
|
|
334
|
+
batch_name: profile.batch_name, // Preserve original batch name without modification
|
|
335
|
+
roaster_type: artisanData.roastertype || 'Unknown',
|
|
336
|
+
roaster_size: artisanData.roastersize || 0,
|
|
337
|
+
temperature_unit: 'F', // Always store as Fahrenheit
|
|
338
|
+
// Chart display settings from Artisan
|
|
339
|
+
chart_x_min: artisanData.xmin ?? null,
|
|
340
|
+
chart_x_max: artisanData.xmax ?? null,
|
|
341
|
+
chart_y_min: artisanData.ymin ?? null,
|
|
342
|
+
chart_y_max: artisanData.ymax ?? null,
|
|
343
|
+
chart_z_min: artisanData.zmin ?? null,
|
|
344
|
+
chart_z_max: artisanData.zmax ?? null,
|
|
345
|
+
// Milestone data for quick access (use computed when available)
|
|
346
|
+
charge_time: processedData.milestones.charge ?? null,
|
|
347
|
+
dry_end_time: (processedData.computed.dry_end_time_computed || processedData.milestones.dry_end) ?? null,
|
|
348
|
+
fc_start_time: processedData.milestones.fc_start ?? null,
|
|
349
|
+
fc_end_time: processedData.milestones.fc_end ?? null,
|
|
350
|
+
sc_start_time: processedData.milestones.sc_start ?? null,
|
|
351
|
+
drop_time: (processedData.computed.drop_time_computed || processedData.milestones.drop) ?? null,
|
|
352
|
+
cool_time: (processedData.computed.cool_time_computed || processedData.milestones.cool) ?? null,
|
|
353
|
+
// Milestone temperatures (use computed when available)
|
|
354
|
+
charge_temp: processedData.computed.charge_temp_computed ?? null,
|
|
355
|
+
dry_end_temp: processedData.computed.dry_end_temp_computed ?? null,
|
|
356
|
+
drop_temp: processedData.computed.drop_temp_computed ?? null,
|
|
357
|
+
cool_temp: processedData.computed.cool_temp_computed ?? null,
|
|
358
|
+
// Phase calculations
|
|
359
|
+
dry_percent: processedData.phases.drying_percent ?? null,
|
|
360
|
+
maillard_percent: processedData.phases.maillard_percent ?? null,
|
|
361
|
+
development_percent: processedData.phases.development_percent ?? null,
|
|
362
|
+
total_roast_time: processedData.phases.total_time_seconds ?? null,
|
|
363
|
+
// New computed data fields
|
|
364
|
+
tp_time: processedData.computed.tp_time ?? null,
|
|
365
|
+
tp_temp: processedData.computed.tp_temp ?? null,
|
|
366
|
+
dry_phase_ror: processedData.computed.dry_phase_ror ?? null,
|
|
367
|
+
mid_phase_ror: processedData.computed.mid_phase_ror ?? null,
|
|
368
|
+
finish_phase_ror: processedData.computed.finish_phase_ror ?? null,
|
|
369
|
+
total_ror: processedData.computed.total_ror ?? null,
|
|
370
|
+
auc: processedData.computed.auc ?? null,
|
|
371
|
+
dry_phase_delta_temp: processedData.computed.dry_phase_delta_temp ?? null,
|
|
372
|
+
roast_uuid: processedData.profileData.roast_uuid,
|
|
373
|
+
data_source: 'artisan_import',
|
|
374
|
+
})
|
|
375
|
+
.eq('roast_id', roastId);
|
|
376
|
+
if (updateError) {
|
|
377
|
+
console.error('Error updating roast profile:', updateError);
|
|
378
|
+
throw updateError;
|
|
379
|
+
}
|
|
380
|
+
// Write data: clear old → insert new.
|
|
381
|
+
// If inserts fail, the cleared data is gone — Supabase doesn't support multi-table
|
|
382
|
+
// transactions over the REST API. To minimize the corruption window, we clear only
|
|
383
|
+
// after fully preparing the new data (already done above), and we attempt to surface
|
|
384
|
+
// partial failure clearly so callers can retry.
|
|
385
|
+
const allEvents = [...processedData.milestoneEvents, ...processedData.controlEvents];
|
|
386
|
+
// 1. Clear existing imported data for this roast
|
|
387
|
+
await clearRoastData(supabase, roastId, 'artisan_import');
|
|
388
|
+
// 2. Insert temperature data
|
|
389
|
+
try {
|
|
390
|
+
await insertTemperatures(supabase, processedData.temperatureData);
|
|
391
|
+
}
|
|
392
|
+
catch (tempError) {
|
|
393
|
+
// Temps failed — roast profile is updated but has no temperature data.
|
|
394
|
+
// Log and rethrow; caller should surface this as a retriable error.
|
|
395
|
+
console.error(`Temperature insert failed for roast ${roastId}:`, tempError);
|
|
396
|
+
throw new Error(`Import partially failed: roast profile was updated but temperature data could not be saved. ` +
|
|
397
|
+
`Re-running the import will restore the data. Original error: ${tempError instanceof Error ? tempError.message : String(tempError)}`);
|
|
398
|
+
}
|
|
399
|
+
// 3. Insert milestone + control events
|
|
400
|
+
if (allEvents.length > 0) {
|
|
401
|
+
try {
|
|
402
|
+
await insertEvents(supabase, allEvents);
|
|
403
|
+
}
|
|
404
|
+
catch (eventError) {
|
|
405
|
+
// Events failed — temps are saved, events are not. Non-fatal: temps are the core data.
|
|
406
|
+
console.error(`Event insert failed for roast ${roastId}:`, eventError);
|
|
407
|
+
// Continue — return a partial success result below
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
// Create import log entry
|
|
411
|
+
const { error: logError } = await supabase.from('artisan_import_log').insert({
|
|
412
|
+
user_id: userId,
|
|
413
|
+
roast_id: roastId,
|
|
414
|
+
filename: fileName,
|
|
415
|
+
file_size: fileSize ?? fileContent.length,
|
|
416
|
+
artisan_version: artisanData.version || 'Unknown',
|
|
417
|
+
total_data_points: processedData.temperatureData.length,
|
|
418
|
+
processing_status: 'success',
|
|
419
|
+
processing_messages: [
|
|
420
|
+
`Imported ${processedData.temperatureData.length} temperature points`,
|
|
421
|
+
`Created ${processedData.milestoneEvents.length} milestone events`,
|
|
422
|
+
`Generated ${processedData.controlEvents.length} control events`,
|
|
423
|
+
],
|
|
424
|
+
original_data: JSON.stringify({
|
|
425
|
+
title: artisanData.title,
|
|
426
|
+
roaster: artisanData.roastertype,
|
|
427
|
+
weight: artisanData.weight,
|
|
428
|
+
temperature_unit: artisanData.mode,
|
|
429
|
+
timeindex: artisanData.timeindex,
|
|
430
|
+
}),
|
|
431
|
+
});
|
|
432
|
+
if (logError) {
|
|
433
|
+
console.error('Error creating import log:', logError);
|
|
434
|
+
// Non-critical, continue
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
success: true,
|
|
438
|
+
message: `Successfully imported ${processedData.temperatureData.length} data points from ${fileName}`,
|
|
439
|
+
milestones: processedData.milestones,
|
|
440
|
+
phases: processedData.phases,
|
|
441
|
+
total_time: processedData.phases.total_time_seconds,
|
|
442
|
+
temperature_unit: 'F',
|
|
443
|
+
milestone_events: processedData.milestoneEvents.length,
|
|
444
|
+
control_events: processedData.controlEvents.length,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/lib/artisan/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { parseArtisanFile, transformArtisanData, importArtisanData } from './import.js';
|
|
2
|
+
export type { ArtisanImportResult } from './import.js';
|
|
3
|
+
export { parseAlogFile } from './parser.js';
|
|
4
|
+
export { validateArtisanData, validateProcessedData } from './validator.js';
|
|
5
|
+
export { convertTemperature, normalizeArtisanTemperatures, artisanModeToUnit, type TemperatureUnit, } from './temperature.js';
|
|
6
|
+
export type { ArtisanRoastData, MilestoneData, ProcessedRoastData, ProcessedTemperaturePoint, ValidationResult, } from './types.js';
|
|
7
|
+
export { clearRoastData, insertTemperatures, insertEvents } from './db.js';
|
|
8
|
+
export type { TemperatureRow, EventRow } from './db.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/artisan/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,iBAAiB,EACjB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Public API
|
|
2
|
+
export { parseArtisanFile, transformArtisanData, importArtisanData } from './import.js';
|
|
3
|
+
export { parseAlogFile } from './parser.js'; // renamed from processAlogFile
|
|
4
|
+
export { validateArtisanData, validateProcessedData } from './validator.js';
|
|
5
|
+
export { convertTemperature, normalizeArtisanTemperatures, artisanModeToUnit, } from './temperature.js';
|
|
6
|
+
export { clearRoastData, insertTemperatures, insertEvents } from './db.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/artisan/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC,CAAC,+BAA+B;AAC5E,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for Artisan .alog files which use Python literal syntax
|
|
3
|
+
* Converts Python literals to JSON format for processing
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseAlogFile(alogContent: string): unknown;
|
|
6
|
+
/**
|
|
7
|
+
* Validate that a file is likely an Artisan .alog file
|
|
8
|
+
*/
|
|
9
|
+
export declare function isValidAlogFile(content: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Clean up common .alog file formatting issues
|
|
12
|
+
*/
|
|
13
|
+
export declare function preprocessAlogContent(content: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Main entry point for .alog file processing (formerly processAlogFile).
|
|
16
|
+
* Preprocesses, validates, and parses Artisan .alog files.
|
|
17
|
+
*/
|
|
18
|
+
export declare function processAlogFile(fileContent: string): unknown;
|
|
19
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/lib/artisan/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAoE1D;AA+OD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAgCxD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAW7D;AAwED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CA4B5D"}
|