@purveyors/cli 0.1.0 → 0.3.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.
Files changed (86) hide show
  1. package/README.md +23 -23
  2. package/dist/commands/auth.js +4 -4
  3. package/dist/commands/auth.js.map +1 -1
  4. package/dist/commands/catalog.d.ts +5 -57
  5. package/dist/commands/catalog.d.ts.map +1 -1
  6. package/dist/commands/catalog.js +15 -82
  7. package/dist/commands/catalog.js.map +1 -1
  8. package/dist/commands/inventory.d.ts +3 -26
  9. package/dist/commands/inventory.d.ts.map +1 -1
  10. package/dist/commands/inventory.js +53 -153
  11. package/dist/commands/inventory.js.map +1 -1
  12. package/dist/commands/roast.d.ts +3 -42
  13. package/dist/commands/roast.d.ts.map +1 -1
  14. package/dist/commands/roast.js +144 -131
  15. package/dist/commands/roast.js.map +1 -1
  16. package/dist/commands/sales.d.ts +3 -11
  17. package/dist/commands/sales.d.ts.map +1 -1
  18. package/dist/commands/sales.js +35 -114
  19. package/dist/commands/sales.js.map +1 -1
  20. package/dist/commands/tasting.d.ts +5 -39
  21. package/dist/commands/tasting.d.ts.map +1 -1
  22. package/dist/commands/tasting.js +21 -111
  23. package/dist/commands/tasting.js.map +1 -1
  24. package/dist/index.js +23 -23
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/artisan/db.d.ts +37 -0
  27. package/dist/lib/artisan/db.d.ts.map +1 -0
  28. package/dist/lib/artisan/db.js +51 -0
  29. package/dist/lib/artisan/db.js.map +1 -0
  30. package/dist/lib/artisan/import.d.ts +16 -0
  31. package/dist/lib/artisan/import.d.ts.map +1 -0
  32. package/dist/lib/artisan/import.js +447 -0
  33. package/dist/lib/artisan/import.js.map +1 -0
  34. package/dist/lib/artisan/index.d.ts +9 -0
  35. package/dist/lib/artisan/index.d.ts.map +1 -0
  36. package/dist/lib/artisan/index.js +7 -0
  37. package/dist/lib/artisan/index.js.map +1 -0
  38. package/dist/lib/artisan/parser.d.ts +19 -0
  39. package/dist/lib/artisan/parser.d.ts.map +1 -0
  40. package/dist/lib/artisan/parser.js +376 -0
  41. package/dist/lib/artisan/parser.js.map +1 -0
  42. package/dist/lib/artisan/temperature.d.ts +52 -0
  43. package/dist/lib/artisan/temperature.d.ts.map +1 -0
  44. package/dist/lib/artisan/temperature.js +101 -0
  45. package/dist/lib/artisan/temperature.js.map +1 -0
  46. package/dist/lib/artisan/types.d.ts +195 -0
  47. package/dist/lib/artisan/types.d.ts.map +1 -0
  48. package/dist/lib/artisan/types.js +35 -0
  49. package/dist/lib/artisan/types.js.map +1 -0
  50. package/dist/lib/artisan/validator.d.ts +14 -0
  51. package/dist/lib/artisan/validator.d.ts.map +1 -0
  52. package/dist/lib/artisan/validator.js +228 -0
  53. package/dist/lib/artisan/validator.js.map +1 -0
  54. package/dist/lib/catalog.d.ts +87 -0
  55. package/dist/lib/catalog.d.ts.map +1 -0
  56. package/dist/lib/catalog.js +111 -0
  57. package/dist/lib/catalog.js.map +1 -0
  58. package/dist/lib/config.d.ts +1 -0
  59. package/dist/lib/config.d.ts.map +1 -1
  60. package/dist/lib/config.js +20 -2
  61. package/dist/lib/config.js.map +1 -1
  62. package/dist/lib/errors.js +2 -2
  63. package/dist/lib/errors.js.map +1 -1
  64. package/dist/lib/index.d.ts +6 -0
  65. package/dist/lib/index.d.ts.map +1 -0
  66. package/dist/lib/index.js +11 -0
  67. package/dist/lib/index.js.map +1 -0
  68. package/dist/lib/inventory.d.ts +80 -0
  69. package/dist/lib/inventory.d.ts.map +1 -0
  70. package/dist/lib/inventory.js +205 -0
  71. package/dist/lib/inventory.js.map +1 -0
  72. package/dist/lib/roast.d.ts +127 -0
  73. package/dist/lib/roast.d.ts.map +1 -0
  74. package/dist/lib/roast.js +284 -0
  75. package/dist/lib/roast.js.map +1 -0
  76. package/dist/lib/sales.d.ts +53 -0
  77. package/dist/lib/sales.d.ts.map +1 -0
  78. package/dist/lib/sales.js +155 -0
  79. package/dist/lib/sales.js.map +1 -0
  80. package/dist/lib/supabase.js +2 -2
  81. package/dist/lib/supabase.js.map +1 -1
  82. package/dist/lib/tasting.d.ts +76 -0
  83. package/dist/lib/tasting.d.ts.map +1 -0
  84. package/dist/lib/tasting.js +136 -0
  85. package/dist/lib/tasting.js.map +1 -0
  86. package/package.json +24 -13
@@ -0,0 +1,51 @@
1
+ // ── Constants ─────────────────────────────────────────────────────────────────
2
+ export const BATCH_SIZE = 100;
3
+ // ── Functions ─────────────────────────────────────────────────────────────────
4
+ /**
5
+ * Clear existing roast data scoped to artisan_import source.
6
+ * Deletes temperature rows by data_source and event rows by category.
7
+ */
8
+ export async function clearRoastData(supabase, roastId, source) {
9
+ await supabase
10
+ .from('roast_temperatures')
11
+ .delete()
12
+ .eq('roast_id', roastId)
13
+ .eq('data_source', source);
14
+ if (source === 'artisan_import') {
15
+ await supabase
16
+ .from('roast_events')
17
+ .delete()
18
+ .eq('roast_id', roastId)
19
+ .in('category', ['milestone', 'control', 'machine']);
20
+ }
21
+ else {
22
+ await supabase.from('roast_events').delete().eq('roast_id', roastId);
23
+ }
24
+ }
25
+ /**
26
+ * Batch-insert temperature rows into roast_temperatures.
27
+ */
28
+ export async function insertTemperatures(supabase, entries) {
29
+ for (let i = 0; i < entries.length; i += BATCH_SIZE) {
30
+ const batch = entries.slice(i, i + BATCH_SIZE);
31
+ const { error } = await supabase.from('roast_temperatures').insert(batch);
32
+ if (error) {
33
+ console.error('Error inserting temperature batch:', error);
34
+ throw error;
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * Batch-insert event rows into roast_events.
40
+ */
41
+ export async function insertEvents(supabase, entries) {
42
+ for (let i = 0; i < entries.length; i += BATCH_SIZE) {
43
+ const batch = entries.slice(i, i + BATCH_SIZE);
44
+ const { error } = await supabase.from('roast_events').insert(batch);
45
+ if (error) {
46
+ console.error('Error inserting event batch:', error);
47
+ throw error;
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/lib/artisan/db.ts"],"names":[],"mappings":"AA2BA,iFAAiF;AAEjF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAE9B,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAwB,EACxB,OAAe,EACf,MAAiC;IAEjC,MAAM,QAAQ;SACX,IAAI,CAAC,oBAAoB,CAAC;SAC1B,MAAM,EAAE;SACR,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;SACvB,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAE7B,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAChC,MAAM,QAAQ;aACX,IAAI,CAAC,cAAc,CAAC;aACpB,MAAM,EAAE;aACR,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;aACvB,EAAE,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAwB,EACxB,OAAyB;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAwB,EAAE,OAAmB;IAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { SupabaseClient } from '@supabase/supabase-js';
2
+ import type { ArtisanRoastData, MilestoneData, ProcessedRoastData } from './types.js';
3
+ export interface ArtisanImportResult {
4
+ success: boolean;
5
+ message: string;
6
+ milestones: MilestoneData;
7
+ phases: ProcessedRoastData['phases'];
8
+ total_time: number;
9
+ temperature_unit: 'F' | 'C';
10
+ milestone_events: number;
11
+ control_events: number;
12
+ }
13
+ export declare function parseArtisanFile(fileContent: string, fileName: string): Promise<ArtisanRoastData>;
14
+ export declare function transformArtisanData(parsedData: ArtisanRoastData, roastId: number): ProcessedRoastData;
15
+ export declare function importArtisanData(supabase: SupabaseClient, roastId: number, userId: string, fileContent: string, fileName: string, fileSize?: number): Promise<ArtisanImportResult>;
16
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/lib/artisan/import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMtF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,CAAC;IAC1B,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,GAAG,GAAG,GAAG,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAGD,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CA8B3B;AAqCD,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,MAAM,GACd,kBAAkB,CAkRpB;AAGD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CA2J9B"}
@@ -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"}