@roastbook/open-coffee-schema 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +65 -2
- package/brew-methods/latest.json +312 -0
- package/brew-methods/v0.1.0.json +265 -0
- package/brew-methods/v0.2.0.json +265 -0
- package/brew-methods/v0.3.0.json +272 -0
- package/brew-methods/v0.4.0.json +312 -0
- package/coffee-places/context.latest.json +246 -0
- package/coffee-places/context.v0.1.0.json +241 -0
- package/coffee-places/context.v0.3.0.json +246 -0
- package/coffee-places/context.v0.4.0.json +246 -0
- package/coffee-places/latest.json +577 -0
- package/coffee-places/v0.1.0.json +518 -0
- package/coffee-places/v0.2.0.json +518 -0
- package/coffee-places/v0.3.0.json +577 -0
- package/coffee-places/v0.4.0.json +577 -0
- package/common/latest.json +197 -0
- package/common/v0.1.0.json +192 -0
- package/common/v0.2.0.json +197 -0
- package/common/v0.3.0.json +197 -0
- package/common/v0.4.0.json +197 -0
- package/equipment/latest.json +895 -0
- package/equipment/v0.1.0.json +1122 -0
- package/equipment/v0.2.0.json +1122 -0
- package/equipment/v0.3.0.json +895 -0
- package/equipment/v0.4.0.json +895 -0
- package/index.d.ts +1114 -0
- package/index.js +94 -0
- package/package.json +67 -4
- package/schemas.d.ts +5 -0
- package/schemas.js +3 -0
package/index.d.ts
ADDED
|
@@ -0,0 +1,1114 @@
|
|
|
1
|
+
// Generated by scripts/build-package.ts from the Open Coffee JSON Schemas. Do not edit.
|
|
2
|
+
export type CoffeePlaceMeta = DatasetMeta & {
|
|
3
|
+
country_code: CountryCode;
|
|
4
|
+
/**
|
|
5
|
+
* City slug, matching the file name.
|
|
6
|
+
*/
|
|
7
|
+
city: string;
|
|
8
|
+
/**
|
|
9
|
+
* City name in the local language.
|
|
10
|
+
*/
|
|
11
|
+
city_name?: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* ISO 3166-1 alpha-2 code in upper case.
|
|
15
|
+
*/
|
|
16
|
+
export type CountryCode = string;
|
|
17
|
+
/**
|
|
18
|
+
* One place that serves coffee. In JSON-LD it is a schema.org CafeOrCoffeeShop whose IRI is https://data.roastbook.coffee/places/<id>.
|
|
19
|
+
*/
|
|
20
|
+
export type CoffeePlace = {
|
|
21
|
+
id: OpenCoffeeId;
|
|
22
|
+
/**
|
|
23
|
+
* Kind of place, as a schema.org type. Every place is a CafeOrCoffeeShop for now; JSON-LD processors read it as the record's @type.
|
|
24
|
+
*/
|
|
25
|
+
type: "CafeOrCoffeeShop";
|
|
26
|
+
/**
|
|
27
|
+
* The name the place uses on its sign or website.
|
|
28
|
+
*/
|
|
29
|
+
name: string;
|
|
30
|
+
/**
|
|
31
|
+
* open; temporarily_closed (renovation, holiday longer than a month); closed (permanently); unverified (found but not yet confirmed to exist).
|
|
32
|
+
*/
|
|
33
|
+
status: "open" | "temporarily_closed" | "closed" | "unverified";
|
|
34
|
+
merged_into?: OpenCoffeeId;
|
|
35
|
+
opened_on?: IsoDate;
|
|
36
|
+
closed_on?: IsoDate;
|
|
37
|
+
last_verified_at?: IsoDateTime;
|
|
38
|
+
checked_at: IsoDateTime;
|
|
39
|
+
address: Address;
|
|
40
|
+
location: Location;
|
|
41
|
+
/**
|
|
42
|
+
* Opening hours in OpenStreetMap opening_hours syntax (used as a format only; no OSM data), for example "Mo-Fr 08:00-18:00; Sa,Su 09:00-17:00".
|
|
43
|
+
*/
|
|
44
|
+
opening_hours?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Short English description written only from the facts stored in this record. Never copied from the place's own texts.
|
|
47
|
+
*/
|
|
48
|
+
description?: string;
|
|
49
|
+
specialty_tier: SpecialtyTier;
|
|
50
|
+
/**
|
|
51
|
+
* Whether the place roasts coffee itself. true: roasts its own beans; false: confirmed not roasting; absent: unknown.
|
|
52
|
+
*/
|
|
53
|
+
roasts_own_beans?: boolean;
|
|
54
|
+
roasters_served?: CoffeePlaceRoasterRef[];
|
|
55
|
+
serving?: CoffeePlaceServing;
|
|
56
|
+
amenities?: CoffeePlaceAmenities;
|
|
57
|
+
food?: CoffeePlaceFood;
|
|
58
|
+
/**
|
|
59
|
+
* Whether whole beans or ground coffee are sold to take home. true: sold; false: confirmed not sold; absent: unknown.
|
|
60
|
+
*/
|
|
61
|
+
sells_beans?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Whether brewing equipment such as grinders, drippers or kettles is sold. true: sold; false: confirmed not sold; absent: unknown.
|
|
64
|
+
*/
|
|
65
|
+
sells_equipment?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Barista courses, brewing classes or public cuppings.
|
|
68
|
+
*/
|
|
69
|
+
offers_courses?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Deposit or reusable cup schemes accepted, for example recup, vytal, own_cup.
|
|
72
|
+
*/
|
|
73
|
+
reusable_cup_systems?: string[];
|
|
74
|
+
good_for?: CoffeePlaceGoodFor[];
|
|
75
|
+
awards?: CoffeePlaceAward[];
|
|
76
|
+
/**
|
|
77
|
+
* Prices we observed, each with the date and page where we saw it. Currently only the cappuccino price, as a comparable reference.
|
|
78
|
+
*/
|
|
79
|
+
prices?: {
|
|
80
|
+
cappuccino?: CoffeePlacePrice;
|
|
81
|
+
};
|
|
82
|
+
operator?: CoffeePlaceOperator;
|
|
83
|
+
links?: CoffeePlaceLinks;
|
|
84
|
+
image?: Image;
|
|
85
|
+
xref?: CoffeePlaceXref;
|
|
86
|
+
/**
|
|
87
|
+
* References to rating pages elsewhere. Rating values are never stored.
|
|
88
|
+
*/
|
|
89
|
+
external_ratings?: ExternalRef[];
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Permanent, opaque identifier. Never reused, never derived from a name, never deleted. Lowercase letters, digits, dots, dashes and underscores; starts and ends with a letter or digit.
|
|
93
|
+
*/
|
|
94
|
+
export type OpenCoffeeId = string;
|
|
95
|
+
/**
|
|
96
|
+
* Calendar date, YYYY-MM-DD.
|
|
97
|
+
*/
|
|
98
|
+
export type IsoDate = string;
|
|
99
|
+
/**
|
|
100
|
+
* RFC 3339 timestamp with time zone, for example 2026-11-05T14:00:00Z.
|
|
101
|
+
*/
|
|
102
|
+
export type IsoDateTime = string;
|
|
103
|
+
/**
|
|
104
|
+
* A: coffee is the core product; the place roasts its own beans or serves named specialty roasters and usually offers filter coffee. B: food or something else leads, but the place serves a specialty roaster. none: not a specialty place (kept in the dataset). unknown: not yet assessed.
|
|
105
|
+
*/
|
|
106
|
+
export type SpecialtyTier = "A" | "B" | "none" | "unknown";
|
|
107
|
+
/**
|
|
108
|
+
* Absolute http or https address. Letters outside ASCII, such as umlauts in the host or path, may be written as they are (an IRI, for example https://kaffee-münchen.de/über-uns). The scheme is not case-sensitive.
|
|
109
|
+
*/
|
|
110
|
+
export type HttpUrl = string;
|
|
111
|
+
/**
|
|
112
|
+
* Coffee preparation offered. true: offered; false: confirmed not offered; absent: unknown.
|
|
113
|
+
*/
|
|
114
|
+
export type CoffeePlaceServing = {
|
|
115
|
+
/**
|
|
116
|
+
* Espresso and espresso-based drinks.
|
|
117
|
+
*/
|
|
118
|
+
espresso?: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Any filter coffee.
|
|
121
|
+
*/
|
|
122
|
+
filter?: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Hand-brewed filter (V60, Kalita, Chemex and similar).
|
|
125
|
+
*/
|
|
126
|
+
pour_over?: boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Filter coffee from a batch brewer.
|
|
129
|
+
*/
|
|
130
|
+
batch_brew?: boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Coffee brewed with cold water over many hours. true: offered; false: confirmed not offered; absent: unknown.
|
|
133
|
+
*/
|
|
134
|
+
cold_brew?: boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Decaffeinated coffee. true: offered; false: confirmed not offered; absent: unknown.
|
|
137
|
+
*/
|
|
138
|
+
decaf?: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* At least one plant-based milk.
|
|
141
|
+
*/
|
|
142
|
+
plant_milk?: boolean;
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* true: available; false: confirmed not available; absent: unknown.
|
|
146
|
+
*/
|
|
147
|
+
export type CoffeePlaceAmenities = {
|
|
148
|
+
/**
|
|
149
|
+
* Wi-Fi for guests. true: available; false: confirmed not available; absent: unknown.
|
|
150
|
+
*/
|
|
151
|
+
wifi?: boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Laptops are welcome (no laptop ban, seats with sockets or tables).
|
|
154
|
+
*/
|
|
155
|
+
laptop_friendly?: boolean;
|
|
156
|
+
/**
|
|
157
|
+
* Suitable for children, for example with high chairs, space for prams or a kids' menu. true: yes; false: confirmed not suitable; absent: unknown.
|
|
158
|
+
*/
|
|
159
|
+
kids_friendly?: boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Vegan food beyond plant milk.
|
|
162
|
+
*/
|
|
163
|
+
vegan_options?: boolean;
|
|
164
|
+
/**
|
|
165
|
+
* Dogs may come inside. true: allowed; false: confirmed not allowed; absent: unknown.
|
|
166
|
+
*/
|
|
167
|
+
dogs_allowed?: boolean;
|
|
168
|
+
/**
|
|
169
|
+
* Seats outside, such as a terrace or tables on the pavement. true: available; false: confirmed none; absent: unknown.
|
|
170
|
+
*/
|
|
171
|
+
outdoor_seating?: boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Payment by debit or credit card. true: accepted; false: confirmed not accepted; absent: unknown.
|
|
174
|
+
*/
|
|
175
|
+
card_payment?: boolean;
|
|
176
|
+
/**
|
|
177
|
+
* Only cash is accepted. true: cash only; false: other payment methods are accepted; absent: unknown.
|
|
178
|
+
*/
|
|
179
|
+
cash_only?: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Step-free entrance.
|
|
182
|
+
*/
|
|
183
|
+
wheelchair_accessible?: boolean;
|
|
184
|
+
};
|
|
185
|
+
export type CoffeePlaceGoodFor =
|
|
186
|
+
| "working"
|
|
187
|
+
| "meetings"
|
|
188
|
+
| "quick_espresso"
|
|
189
|
+
| "takeaway"
|
|
190
|
+
| "brunch"
|
|
191
|
+
| "groups"
|
|
192
|
+
| "reading"
|
|
193
|
+
| "date"
|
|
194
|
+
| "coffee_nerds"
|
|
195
|
+
| "families";
|
|
196
|
+
/**
|
|
197
|
+
* ISO 4217 currency code.
|
|
198
|
+
*/
|
|
199
|
+
export type Currency = string;
|
|
200
|
+
/**
|
|
201
|
+
* espresso_machine_with_grinder is an espresso machine with a built-in grinder; filter covers paper and metal filters; accessory covers everything without a dedicated type (puck screens, distribution tools, thermometers, dosing cups).
|
|
202
|
+
*/
|
|
203
|
+
export type EquipmentType =
|
|
204
|
+
| "espresso_machine"
|
|
205
|
+
| "espresso_machine_with_grinder"
|
|
206
|
+
| "grinder"
|
|
207
|
+
| "brewer"
|
|
208
|
+
| "kettle"
|
|
209
|
+
| "scale"
|
|
210
|
+
| "tamper"
|
|
211
|
+
| "wdt"
|
|
212
|
+
| "basket"
|
|
213
|
+
| "filter"
|
|
214
|
+
| "roaster"
|
|
215
|
+
| "milk_frother"
|
|
216
|
+
| "accessory";
|
|
217
|
+
/**
|
|
218
|
+
* Descriptive grind size; extra_fine is Turkish, fine espresso, medium filter, coarse French press and cold brew.
|
|
219
|
+
*/
|
|
220
|
+
export type GrindSize = "extra_fine" | "fine" | "medium_fine" | "medium" | "medium_coarse" | "coarse" | "extra_coarse";
|
|
221
|
+
/**
|
|
222
|
+
* Where paper filter discs sit in an espresso basket. none: no paper filter; top: on top of the coffee, under the shower screen; bottom: under the coffee, at the basket floor; both: one disc on top and one at the bottom.
|
|
223
|
+
*/
|
|
224
|
+
export type PaperFilterPosition = "none" | "top" | "bottom" | "both";
|
|
225
|
+
/**
|
|
226
|
+
* How ground coffee is spread evenly in the basket before tamping. wdt: stirring with fine needles (Weiss Distribution Technique); blind_shaker: grinding into a closed cup, shaking it and tipping the coffee into the basket; distribution_tool: a spinning leveller set on the basket; stockfleth_move: sweeping the coffee level with a finger while turning the portafilter.
|
|
227
|
+
*/
|
|
228
|
+
export type DistributionMethod = "wdt" | "blind_shaker" | "distribution_tool" | "stockfleth_move";
|
|
229
|
+
/**
|
|
230
|
+
* Parameter keys shared with coffee journals such as Roastbook. brew_ratio is grams of brew water per gram of coffee (16 means 1:16); yield_ratio is grams of drink in the cup per gram of coffee (2 means a 1:2 espresso). brew_temperature_celsius is the temperature of the brew water. uses_puck_screen records whether a puck screen sat on top of the espresso puck (true or false). paper_filter_position takes a paper_filter_position value and distribution_method a distribution_method value.
|
|
231
|
+
*/
|
|
232
|
+
export type BrewParameter =
|
|
233
|
+
| "dose_g"
|
|
234
|
+
| "brew_water_g"
|
|
235
|
+
| "yield_g"
|
|
236
|
+
| "brew_ratio"
|
|
237
|
+
| "yield_ratio"
|
|
238
|
+
| "grind_setting"
|
|
239
|
+
| "brew_time_seconds"
|
|
240
|
+
| "target_time_seconds"
|
|
241
|
+
| "brew_temperature_celsius"
|
|
242
|
+
| "bloom_time_seconds"
|
|
243
|
+
| "bloom_water_g"
|
|
244
|
+
| "preinfusion_time_seconds"
|
|
245
|
+
| "preinfusion_pressure_bar"
|
|
246
|
+
| "brew_pressure_bar"
|
|
247
|
+
| "flow_rate_ml_per_second"
|
|
248
|
+
| "tamp_force_kg"
|
|
249
|
+
| "uses_puck_screen"
|
|
250
|
+
| "paper_filter_position"
|
|
251
|
+
| "distribution_method"
|
|
252
|
+
| "pour_count"
|
|
253
|
+
| "steep_time_seconds";
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* One file per city listing cafés, coffee bars and other places that serve coffee. Part of Roastbook Open Coffee.
|
|
257
|
+
*/
|
|
258
|
+
export interface CoffeePlacesDataset {
|
|
259
|
+
/**
|
|
260
|
+
* Canonical URL of the schema version this file follows.
|
|
261
|
+
*/
|
|
262
|
+
$schema: string;
|
|
263
|
+
meta: CoffeePlaceMeta;
|
|
264
|
+
places: CoffeePlace[];
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* File-level facts that are not records. The schema version is the $schema URL; the data version is the release tag.
|
|
268
|
+
*/
|
|
269
|
+
export interface DatasetMeta {
|
|
270
|
+
/**
|
|
271
|
+
* Licence of the file as an SPDX licence expression, for example MIT, CC0-1.0, CC-BY-4.0, ODbL-1.0 or "MIT OR Apache-2.0". Use identifiers from the SPDX licence list (https://spdx.org/licenses/) or LicenseRef-<name> for others.
|
|
272
|
+
*/
|
|
273
|
+
licence: string;
|
|
274
|
+
}
|
|
275
|
+
export interface Address {
|
|
276
|
+
/**
|
|
277
|
+
* Street and house number.
|
|
278
|
+
*/
|
|
279
|
+
street_address?: string;
|
|
280
|
+
/**
|
|
281
|
+
* Postal code as used locally, for example 80331.
|
|
282
|
+
*/
|
|
283
|
+
postal_code?: string;
|
|
284
|
+
/**
|
|
285
|
+
* City or town.
|
|
286
|
+
*/
|
|
287
|
+
locality?: string;
|
|
288
|
+
/**
|
|
289
|
+
* State or region.
|
|
290
|
+
*/
|
|
291
|
+
region?: string;
|
|
292
|
+
country_code: CountryCode;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* WGS 84 coordinates of the entrance or building.
|
|
296
|
+
*/
|
|
297
|
+
export interface Location {
|
|
298
|
+
/**
|
|
299
|
+
* Latitude in decimal degrees (WGS 84); positive is north of the equator, for example 48.1371.
|
|
300
|
+
*/
|
|
301
|
+
lat: number;
|
|
302
|
+
/**
|
|
303
|
+
* Longitude in decimal degrees (WGS 84); positive is east of Greenwich, for example 11.5754.
|
|
304
|
+
*/
|
|
305
|
+
lon: number;
|
|
306
|
+
}
|
|
307
|
+
export interface CoffeePlaceRoasterRef {
|
|
308
|
+
/**
|
|
309
|
+
* Name of the roastery whose coffee is served.
|
|
310
|
+
*/
|
|
311
|
+
name: string;
|
|
312
|
+
roaster_id?: OpenCoffeeId;
|
|
313
|
+
url?: HttpUrl;
|
|
314
|
+
/**
|
|
315
|
+
* The place roasts this coffee itself.
|
|
316
|
+
*/
|
|
317
|
+
own?: boolean;
|
|
318
|
+
}
|
|
319
|
+
export interface CoffeePlaceFood {
|
|
320
|
+
/**
|
|
321
|
+
* coffee_led: coffee is the main product; food_led: food or a restaurant concept leads; balanced: both matter equally.
|
|
322
|
+
*/
|
|
323
|
+
focus?: "coffee_led" | "food_led" | "balanced";
|
|
324
|
+
/**
|
|
325
|
+
* Breakfast is served. true: served; false: confirmed not served; absent: unknown.
|
|
326
|
+
*/
|
|
327
|
+
breakfast?: boolean;
|
|
328
|
+
/**
|
|
329
|
+
* Lunch dishes are served. true: served; false: confirmed not served; absent: unknown.
|
|
330
|
+
*/
|
|
331
|
+
lunch?: boolean;
|
|
332
|
+
/**
|
|
333
|
+
* Cakes or pastries are baked by the place itself. true: baked in house; false: confirmed bought in; absent: unknown.
|
|
334
|
+
*/
|
|
335
|
+
cakes_baked_in_house?: boolean;
|
|
336
|
+
}
|
|
337
|
+
export interface CoffeePlaceAward {
|
|
338
|
+
/**
|
|
339
|
+
* Name of the award or ranking, for example a national barista championship or a city guide's list.
|
|
340
|
+
*/
|
|
341
|
+
name: string;
|
|
342
|
+
/**
|
|
343
|
+
* Year the award was given, for example 2025.
|
|
344
|
+
*/
|
|
345
|
+
year?: number;
|
|
346
|
+
url?: HttpUrl;
|
|
347
|
+
}
|
|
348
|
+
export interface CoffeePlacePrice {
|
|
349
|
+
/**
|
|
350
|
+
* Price paid for one standard drink, in the currency given by currency, for example 3.9.
|
|
351
|
+
*/
|
|
352
|
+
amount: number;
|
|
353
|
+
currency: Currency;
|
|
354
|
+
observed_on: IsoDate;
|
|
355
|
+
source_url?: HttpUrl;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* The legal entity running the place, taken from its Impressum or legal notice. Only companies and other legal entities; never the name of a natural person (sole traders are omitted).
|
|
359
|
+
*/
|
|
360
|
+
export interface CoffeePlaceOperator {
|
|
361
|
+
/**
|
|
362
|
+
* Registered name of the company that runs the place, as written in its legal notice.
|
|
363
|
+
*/
|
|
364
|
+
name: string;
|
|
365
|
+
/**
|
|
366
|
+
* For example GmbH, UG (haftungsbeschränkt), KG, e.K.
|
|
367
|
+
*/
|
|
368
|
+
legal_form?: string;
|
|
369
|
+
/**
|
|
370
|
+
* Commercial register number, for example HRB 123456 (Amtsgericht München).
|
|
371
|
+
*/
|
|
372
|
+
register_id?: string;
|
|
373
|
+
}
|
|
374
|
+
export interface CoffeePlaceLinks {
|
|
375
|
+
website?: HttpUrl;
|
|
376
|
+
/**
|
|
377
|
+
* Address of the place's own Instagram profile. Write it as https://www.instagram.com/<handle>/ with the handle in lower case and no query string, for example https://www.instagram.com/example.coffee/. Posts, reels, stories and other non-profile pages are rejected.
|
|
378
|
+
*/
|
|
379
|
+
instagram?: string;
|
|
380
|
+
/**
|
|
381
|
+
* Address of the place's own Facebook page.
|
|
382
|
+
*/
|
|
383
|
+
facebook?: string;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* An openly licensed image. Each image carries its own licence, author and source.
|
|
387
|
+
*/
|
|
388
|
+
export interface Image {
|
|
389
|
+
url: HttpUrl;
|
|
390
|
+
/**
|
|
391
|
+
* SPDX identifier, for example CC-BY-4.0, CC-BY-SA-4.0 or CC0-1.0.
|
|
392
|
+
*/
|
|
393
|
+
licence: string;
|
|
394
|
+
/**
|
|
395
|
+
* Name of the photographer or creator, as the licence requires it to be credited.
|
|
396
|
+
*/
|
|
397
|
+
author: string;
|
|
398
|
+
source_url: HttpUrl;
|
|
399
|
+
/**
|
|
400
|
+
* Short caption describing what the image shows.
|
|
401
|
+
*/
|
|
402
|
+
title?: string;
|
|
403
|
+
/**
|
|
404
|
+
* Width of the image file in pixels.
|
|
405
|
+
*/
|
|
406
|
+
width?: number;
|
|
407
|
+
/**
|
|
408
|
+
* Height of the image file in pixels.
|
|
409
|
+
*/
|
|
410
|
+
height?: number;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Crosswalk to other datasets. google_place_id is the only Google data we may store.
|
|
414
|
+
*/
|
|
415
|
+
export interface CoffeePlaceXref {
|
|
416
|
+
/**
|
|
417
|
+
* Overture Maps place GERS id.
|
|
418
|
+
*/
|
|
419
|
+
overture?: string;
|
|
420
|
+
/**
|
|
421
|
+
* Foursquare Open Source Places fsq_place_id.
|
|
422
|
+
*/
|
|
423
|
+
foursquare?: string;
|
|
424
|
+
/**
|
|
425
|
+
* Wikidata item id of the place, for example Q42.
|
|
426
|
+
*/
|
|
427
|
+
wikidata?: string;
|
|
428
|
+
/**
|
|
429
|
+
* Google Maps place id, stored only so a known place can be matched. No other Google data is stored.
|
|
430
|
+
*/
|
|
431
|
+
google_place_id?: string;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* A pointer to a record in another service. Never stores the other service's values.
|
|
435
|
+
*/
|
|
436
|
+
export interface ExternalRef {
|
|
437
|
+
/**
|
|
438
|
+
* Short name of the other service, for example tripadvisor or untappd. Lowercase letters, digits, dots, dashes and underscores.
|
|
439
|
+
*/
|
|
440
|
+
source: string;
|
|
441
|
+
/**
|
|
442
|
+
* The record's identifier in the other service.
|
|
443
|
+
*/
|
|
444
|
+
id: string;
|
|
445
|
+
url?: HttpUrl;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Ways of brewing coffee (espresso, pour-over, V60, AeroPress, cold brew…), their typical parameters and what a coffee journal should record for each. Methods form a tree: a device-specific method such as v60 has the general method pour-over as parent. Part of Roastbook Open Coffee.
|
|
449
|
+
*/
|
|
450
|
+
export interface BrewMethodsDataset {
|
|
451
|
+
/**
|
|
452
|
+
* Canonical URL of the schema version this file follows.
|
|
453
|
+
*/
|
|
454
|
+
$schema: string;
|
|
455
|
+
meta: DatasetMeta1;
|
|
456
|
+
brew_methods: BrewMethod[];
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* File-level facts that are not records. The schema version is the $schema URL; the data version is the release tag.
|
|
460
|
+
*/
|
|
461
|
+
export interface DatasetMeta1 {
|
|
462
|
+
/**
|
|
463
|
+
* Licence of the file as an SPDX licence expression, for example MIT, CC0-1.0, CC-BY-4.0, ODbL-1.0 or "MIT OR Apache-2.0". Use identifiers from the SPDX licence list (https://spdx.org/licenses/) or LicenseRef-<name> for others.
|
|
464
|
+
*/
|
|
465
|
+
licence: string;
|
|
466
|
+
}
|
|
467
|
+
export interface BrewMethod {
|
|
468
|
+
id: OpenCoffeeId;
|
|
469
|
+
/**
|
|
470
|
+
* Common English name of the method, for example Pour-over or French press.
|
|
471
|
+
*/
|
|
472
|
+
name: string;
|
|
473
|
+
/**
|
|
474
|
+
* Other names in any language, e.g. Filterkaffee, drip.
|
|
475
|
+
*/
|
|
476
|
+
aliases?: string[];
|
|
477
|
+
parent?: OpenCoffeeId;
|
|
478
|
+
/**
|
|
479
|
+
* Family used for grouping: espresso (9-bar style pressure), filter (percolation through a filter), immersion (steep, then separate), pressure (non-espresso pressure such as AeroPress or moka pot), vacuum (siphon), boiling (cezve/ibrik), cold (cold water over hours).
|
|
480
|
+
*/
|
|
481
|
+
category: "espresso" | "filter" | "immersion" | "pressure" | "vacuum" | "boiling" | "cold";
|
|
482
|
+
/**
|
|
483
|
+
* Physical principle; matches equipment brewer.mechanism.
|
|
484
|
+
*/
|
|
485
|
+
extraction: "percolation" | "immersion" | "hybrid";
|
|
486
|
+
/**
|
|
487
|
+
* Short neutral explanation in our own words.
|
|
488
|
+
*/
|
|
489
|
+
description: string;
|
|
490
|
+
/**
|
|
491
|
+
* Year the method or device was invented or first sold.
|
|
492
|
+
*/
|
|
493
|
+
introduced_year?: number;
|
|
494
|
+
origin_country_code?: CountryCode;
|
|
495
|
+
/**
|
|
496
|
+
* Equipment types needed, from the equipment schema's type list.
|
|
497
|
+
*/
|
|
498
|
+
equipment_types?: EquipmentType[];
|
|
499
|
+
typical_parameters?: BrewMethodTypicalParameters;
|
|
500
|
+
/**
|
|
501
|
+
* Parameters a coffee journal should offer when logging a brew with this method.
|
|
502
|
+
*/
|
|
503
|
+
recorded_parameters?: BrewParameter[];
|
|
504
|
+
/**
|
|
505
|
+
* Drinks usually made with this method, in plain lowercase English, for example espresso, cappuccino or flat white.
|
|
506
|
+
*/
|
|
507
|
+
typical_drinks?: string[];
|
|
508
|
+
/**
|
|
509
|
+
* Identifiers of the method in other datasets and apps.
|
|
510
|
+
*/
|
|
511
|
+
xref?: {
|
|
512
|
+
/**
|
|
513
|
+
* Wikidata item id of the method, for example Q180289 for espresso.
|
|
514
|
+
*/
|
|
515
|
+
wikidata?: string;
|
|
516
|
+
/**
|
|
517
|
+
* Beanconqueror PREPARATION_TYPES key, for app imports.
|
|
518
|
+
*/
|
|
519
|
+
beanconqueror?: string;
|
|
520
|
+
};
|
|
521
|
+
image?: Image;
|
|
522
|
+
checked_at: IsoDateTime;
|
|
523
|
+
/**
|
|
524
|
+
* Filters the method can use. paper: paper filters; metal: metal mesh or perforated metal; cloth: cloth filters; none: no filter (for example cezve or cold brew in a jar).
|
|
525
|
+
*/
|
|
526
|
+
filter_types?: ("paper" | "metal" | "cloth" | "none")[];
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Common starting ranges, not rules.
|
|
530
|
+
*/
|
|
531
|
+
export interface BrewMethodTypicalParameters {
|
|
532
|
+
dose_g?: BrewMethodRange;
|
|
533
|
+
brew_ratio?: BrewMethodRange;
|
|
534
|
+
yield_ratio?: BrewMethodRange;
|
|
535
|
+
brew_temperature_celsius?: BrewMethodRange;
|
|
536
|
+
brew_time_seconds?: BrewMethodRange;
|
|
537
|
+
brew_pressure_bar?: BrewMethodRange;
|
|
538
|
+
/**
|
|
539
|
+
* @minItems 1
|
|
540
|
+
*/
|
|
541
|
+
grind_size?: GrindSize[];
|
|
542
|
+
grind_d50_microns?: BrewMethodRange;
|
|
543
|
+
/**
|
|
544
|
+
* Paper filter positions commonly used with this method.
|
|
545
|
+
*
|
|
546
|
+
* @minItems 1
|
|
547
|
+
*/
|
|
548
|
+
paper_filter_position?: PaperFilterPosition[];
|
|
549
|
+
/**
|
|
550
|
+
* Distribution methods commonly used with this method.
|
|
551
|
+
*
|
|
552
|
+
* @minItems 1
|
|
553
|
+
*/
|
|
554
|
+
distribution_method?: DistributionMethod[];
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* A starting range. When several values are given they must be ordered: min ≤ typical ≤ max. JSON Schema cannot compare two values, so this repository checks it in its examples and data repositories check it in their data.
|
|
558
|
+
*/
|
|
559
|
+
export interface BrewMethodRange {
|
|
560
|
+
/**
|
|
561
|
+
* Lowest common value, in the unit named by the parameter (for example grams for dose_g, degrees Celsius for brew_temperature_celsius).
|
|
562
|
+
*/
|
|
563
|
+
min?: number;
|
|
564
|
+
/**
|
|
565
|
+
* Highest common value, in the unit named by the parameter.
|
|
566
|
+
*/
|
|
567
|
+
max?: number;
|
|
568
|
+
/**
|
|
569
|
+
* A good starting value, in the unit named by the parameter.
|
|
570
|
+
*/
|
|
571
|
+
typical?: number;
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Coffee equipment models (machines, grinders, brewers, kettles, scales and accessories) as sold, not individual owned items. Measurements put the unit in the property name. Part of Roastbook Open Coffee; derived from the Roastbook journal gear model.
|
|
575
|
+
*/
|
|
576
|
+
export interface EquipmentCatalog {
|
|
577
|
+
/**
|
|
578
|
+
* Canonical URL of the schema version this file follows.
|
|
579
|
+
*/
|
|
580
|
+
$schema: string;
|
|
581
|
+
meta: DatasetMeta2;
|
|
582
|
+
equipment: EquipmentItem[];
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* File-level facts that are not records. The schema version is the $schema URL; the data version is the release tag.
|
|
586
|
+
*/
|
|
587
|
+
export interface DatasetMeta2 {
|
|
588
|
+
/**
|
|
589
|
+
* Licence of the file as an SPDX licence expression, for example MIT, CC0-1.0, CC-BY-4.0, ODbL-1.0 or "MIT OR Apache-2.0". Use identifiers from the SPDX licence list (https://spdx.org/licenses/) or LicenseRef-<name> for others.
|
|
590
|
+
*/
|
|
591
|
+
licence: string;
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Each details object (espresso_machine, grinder, brewer, …) is only allowed for the types it describes.
|
|
595
|
+
*/
|
|
596
|
+
export interface EquipmentItem {
|
|
597
|
+
id: OpenCoffeeId;
|
|
598
|
+
/**
|
|
599
|
+
* Full display name, e.g. Hario V60 02.
|
|
600
|
+
*/
|
|
601
|
+
name: string;
|
|
602
|
+
manufacturer: EquipmentManufacturer;
|
|
603
|
+
/**
|
|
604
|
+
* Model name without the brand, for example V60.
|
|
605
|
+
*/
|
|
606
|
+
model?: string;
|
|
607
|
+
/**
|
|
608
|
+
* Sizes or materials sold under the same model, e.g. 01 and 02, ceramic and plastic.
|
|
609
|
+
*/
|
|
610
|
+
variants?: string[];
|
|
611
|
+
type: EquipmentType;
|
|
612
|
+
/**
|
|
613
|
+
* Brew method ids from the Open Coffee brew methods dataset this equipment is made for.
|
|
614
|
+
*/
|
|
615
|
+
brew_methods?: OpenCoffeeId[];
|
|
616
|
+
/**
|
|
617
|
+
* Year the model first went on sale.
|
|
618
|
+
*/
|
|
619
|
+
released_year?: number;
|
|
620
|
+
/**
|
|
621
|
+
* Whether the maker has stopped selling the model. true: discontinued; false: still sold; absent: unknown.
|
|
622
|
+
*/
|
|
623
|
+
discontinued?: boolean;
|
|
624
|
+
links?: EquipmentLinks;
|
|
625
|
+
image?: Image;
|
|
626
|
+
xref?: EquipmentIdentifiersElsewhere;
|
|
627
|
+
espresso_machine?: EquipmentEspressoMachine;
|
|
628
|
+
grinder?: EquipmentGrinder;
|
|
629
|
+
brewer?: EquipmentBrewer;
|
|
630
|
+
kettle?: EquipmentKettle;
|
|
631
|
+
scale?: EquipmentScale;
|
|
632
|
+
tamper?: EquipmentTamper;
|
|
633
|
+
wdt?: EquipmentWdt;
|
|
634
|
+
basket?: EquipmentBasket;
|
|
635
|
+
checked_at: IsoDateTime;
|
|
636
|
+
/**
|
|
637
|
+
* Manufacturer part number.
|
|
638
|
+
*/
|
|
639
|
+
mpn?: string;
|
|
640
|
+
/**
|
|
641
|
+
* Weight of the product without packaging, in grams.
|
|
642
|
+
*/
|
|
643
|
+
weight_g?: number;
|
|
644
|
+
/**
|
|
645
|
+
* Outside size of the product in millimetres.
|
|
646
|
+
*/
|
|
647
|
+
dimensions_mm?: {
|
|
648
|
+
/**
|
|
649
|
+
* Width in millimetres, seen from the front.
|
|
650
|
+
*/
|
|
651
|
+
width?: number;
|
|
652
|
+
/**
|
|
653
|
+
* Depth in millimetres, from front to back.
|
|
654
|
+
*/
|
|
655
|
+
depth?: number;
|
|
656
|
+
/**
|
|
657
|
+
* Height in millimetres.
|
|
658
|
+
*/
|
|
659
|
+
height?: number;
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
export interface EquipmentManufacturer {
|
|
663
|
+
/**
|
|
664
|
+
* Brand or company name as printed on the product, for example Hario.
|
|
665
|
+
*/
|
|
666
|
+
name: string;
|
|
667
|
+
manufacturer_id?: OpenCoffeeId;
|
|
668
|
+
country_code?: CountryCode;
|
|
669
|
+
website?: HttpUrl;
|
|
670
|
+
}
|
|
671
|
+
export interface EquipmentLinks {
|
|
672
|
+
product?: HttpUrl;
|
|
673
|
+
manual?: HttpUrl;
|
|
674
|
+
}
|
|
675
|
+
export interface EquipmentIdentifiersElsewhere {
|
|
676
|
+
/**
|
|
677
|
+
* Wikidata item id of the model or product line, for example Q1234567.
|
|
678
|
+
*/
|
|
679
|
+
wikidata?: string;
|
|
680
|
+
/**
|
|
681
|
+
* Barcode numbers (GTIN, EAN or UPC; 8 to 14 digits) printed on the packaging, one per variant.
|
|
682
|
+
*/
|
|
683
|
+
gtin?: string[];
|
|
684
|
+
/**
|
|
685
|
+
* Google Product Taxonomy id (Wikidata P11302).
|
|
686
|
+
*/
|
|
687
|
+
google_product_category?: number;
|
|
688
|
+
/**
|
|
689
|
+
* GS1 Global Product Classification brick code (Wikidata P8957).
|
|
690
|
+
*/
|
|
691
|
+
gs1_gpc_brick?: string;
|
|
692
|
+
}
|
|
693
|
+
export interface EquipmentEspressoMachine {
|
|
694
|
+
/**
|
|
695
|
+
* How the machine heats water. single_boiler: one boiler for brewing and steam, used in turn; heat_exchanger: one steam boiler that heats brew water passing through a pipe inside it; dual_boiler: separate brew and steam boilers; multi_boiler: more than two boilers, for example one per group; single_thermoblock and dual_thermoblock: water heated on the fly in one or two thermoblocks; hybrid: a boiler combined with a thermoblock; manual: no heater, you pour in hot water.
|
|
696
|
+
*/
|
|
697
|
+
heating_architecture?:
|
|
698
|
+
| "single_boiler"
|
|
699
|
+
| "heat_exchanger"
|
|
700
|
+
| "dual_boiler"
|
|
701
|
+
| "multi_boiler"
|
|
702
|
+
| "single_thermoblock"
|
|
703
|
+
| "dual_thermoblock"
|
|
704
|
+
| "hybrid"
|
|
705
|
+
| "manual"
|
|
706
|
+
| "other";
|
|
707
|
+
/**
|
|
708
|
+
* How brew temperature is set. none: no control; fixed: set at the factory; adjustable: the user can change it (for example with a PID); programmable: can change during the shot or follow profiles.
|
|
709
|
+
*/
|
|
710
|
+
temperature_control?: "none" | "fixed" | "adjustable" | "programmable";
|
|
711
|
+
/**
|
|
712
|
+
* How brew pressure is set. fixed: set by the factory; adjustable_opv: the over-pressure valve can be adjusted; manual: controlled by hand, for example with a lever; programmable: follows set pressure profiles.
|
|
713
|
+
*/
|
|
714
|
+
pressure_control?: "fixed" | "adjustable_opv" | "manual" | "programmable";
|
|
715
|
+
/**
|
|
716
|
+
* Whether water flow during the shot can be controlled. none: no control; manual: by hand, for example a needle valve paddle; programmable: follows set profiles.
|
|
717
|
+
*/
|
|
718
|
+
flow_control?: "none" | "manual" | "programmable";
|
|
719
|
+
/**
|
|
720
|
+
* Wetting the coffee at low pressure before full pressure. none: no preinfusion; supported: possible by hand or by technique; fixed: built in with a fixed duration; adjustable: duration or pressure can be set; programmable: part of a programmable profile.
|
|
721
|
+
*/
|
|
722
|
+
preinfusion_control?: "none" | "supported" | "fixed" | "adjustable" | "programmable";
|
|
723
|
+
/**
|
|
724
|
+
* How milk steam is produced. none: no steam wand; shared_heater: the same heater as for brewing, so the machine switches between modes; dedicated_heater: a separate boiler or thermoblock for steam.
|
|
725
|
+
*/
|
|
726
|
+
steam_system?: "none" | "shared_heater" | "dedicated_heater";
|
|
727
|
+
/**
|
|
728
|
+
* Whether you can pull a shot and steam milk at the same time. true: possible; false: confirmed not possible; absent: unknown.
|
|
729
|
+
*/
|
|
730
|
+
simultaneous_brew_and_steam?: boolean;
|
|
731
|
+
/**
|
|
732
|
+
* How pressure is made. vibration: small vibratory pump; rotary: quieter rotary vane pump; gear: gear pump, often used for flow profiling; peristaltic: squeezed-tube pump; manual: lever or hand pump, no motor.
|
|
733
|
+
*/
|
|
734
|
+
pump_type?: "vibration" | "rotary" | "gear" | "peristaltic" | "manual" | "other";
|
|
735
|
+
/**
|
|
736
|
+
* Where water comes from. reservoir: a tank you fill; plumbed: connected to the mains water supply.
|
|
737
|
+
*
|
|
738
|
+
* @minItems 1
|
|
739
|
+
*/
|
|
740
|
+
water_source_modes?: ("reservoir" | "plumbed")[];
|
|
741
|
+
/**
|
|
742
|
+
* How a shot can be stopped. manual: by the user; weight: automatically at a target weight with a scale; time: after a set time; volume: after a set volume (volumetric dosing).
|
|
743
|
+
*/
|
|
744
|
+
shot_stop_modes?: ("manual" | "weight" | "time" | "volume")[];
|
|
745
|
+
/**
|
|
746
|
+
* Number of brew groups (where portafilters lock in), for example 1 for most home machines.
|
|
747
|
+
*/
|
|
748
|
+
group_count?: number;
|
|
749
|
+
/**
|
|
750
|
+
* Inner diameter of the portafilter basket in millimetres, for example 58.
|
|
751
|
+
*/
|
|
752
|
+
portafilter_diameter_mm?: number;
|
|
753
|
+
/**
|
|
754
|
+
* Lowest brew pressure the machine can deliver, in bar.
|
|
755
|
+
*/
|
|
756
|
+
brew_pressure_min_bar?: number;
|
|
757
|
+
/**
|
|
758
|
+
* Highest brew pressure the machine can deliver, in bar.
|
|
759
|
+
*/
|
|
760
|
+
brew_pressure_max_bar?: number;
|
|
761
|
+
/**
|
|
762
|
+
* Lowest brew water temperature that can be set, in degrees Celsius.
|
|
763
|
+
*/
|
|
764
|
+
brew_temperature_min_celsius?: number;
|
|
765
|
+
/**
|
|
766
|
+
* Highest brew water temperature that can be set, in degrees Celsius.
|
|
767
|
+
*/
|
|
768
|
+
brew_temperature_max_celsius?: number;
|
|
769
|
+
/**
|
|
770
|
+
* Size of the water tank in millilitres.
|
|
771
|
+
*/
|
|
772
|
+
reservoir_capacity_ml?: number;
|
|
773
|
+
/**
|
|
774
|
+
* Rated electrical power in watts.
|
|
775
|
+
*/
|
|
776
|
+
power_w?: number;
|
|
777
|
+
/**
|
|
778
|
+
* Type of brew group. e61: the classic heated E61 group; saturated: group filled with boiler water and kept at its temperature; semi_saturated: group attached to the boiler but not fully filled; lever: piston group driven by a lever; integrated: group built into a thermoblock or the machine body; other: anything else.
|
|
779
|
+
*/
|
|
780
|
+
group_type?: "e61" | "saturated" | "semi_saturated" | "lever" | "integrated" | "other";
|
|
781
|
+
/**
|
|
782
|
+
* Number of boilers, 0 for thermoblock or manual machines.
|
|
783
|
+
*/
|
|
784
|
+
boiler_count?: number;
|
|
785
|
+
/**
|
|
786
|
+
* Wireless or wired connections for apps or updates: bluetooth, wifi or usb.
|
|
787
|
+
*/
|
|
788
|
+
connectivity?: ("bluetooth" | "wifi" | "usb")[];
|
|
789
|
+
}
|
|
790
|
+
export interface EquipmentGrinder {
|
|
791
|
+
/**
|
|
792
|
+
* Type of cutting parts. conical: cone-shaped burrs; flat: two flat discs; ghost: flat burrs in a design without a burr carrier contact, sold as "ghost burrs"; roller: industrial-style roller mill; blade: spinning blade that chops rather than grinds; other: anything else.
|
|
793
|
+
*/
|
|
794
|
+
burr_mechanism?: "conical" | "flat" | "ghost" | "roller" | "blade" | "other";
|
|
795
|
+
/**
|
|
796
|
+
* Diameter of the burrs in millimetres, for example 64 for many flat-burr grinders.
|
|
797
|
+
*/
|
|
798
|
+
burr_diameter_mm?: number;
|
|
799
|
+
/**
|
|
800
|
+
* What the burrs are made of. steel: hardened steel; ceramic: ceramic burrs; titanium_coated: steel with a titanium or similar hard coating; other: anything else.
|
|
801
|
+
*/
|
|
802
|
+
burr_material?: "steel" | "ceramic" | "titanium_coated" | "other";
|
|
803
|
+
/**
|
|
804
|
+
* How grind size is changed. fixed: cannot be changed; stepped: clicks between set positions; stepless: any position in between.
|
|
805
|
+
*/
|
|
806
|
+
adjustment_type?: "fixed" | "stepped" | "stepless";
|
|
807
|
+
/**
|
|
808
|
+
* How the dial reads, so journals can store settings.
|
|
809
|
+
*/
|
|
810
|
+
grind_setting_format?: "whole_number" | "decimal" | "string";
|
|
811
|
+
/**
|
|
812
|
+
* Lowest number on the grind dial, as printed by the maker.
|
|
813
|
+
*/
|
|
814
|
+
grind_setting_min?: number;
|
|
815
|
+
/**
|
|
816
|
+
* Highest number on the grind dial, as printed by the maker.
|
|
817
|
+
*/
|
|
818
|
+
grind_setting_max?: number;
|
|
819
|
+
/**
|
|
820
|
+
* Brew styles the grinder can grind for, as stated by the maker: espresso, filter or turkish (extra fine).
|
|
821
|
+
*
|
|
822
|
+
* @minItems 1
|
|
823
|
+
*/
|
|
824
|
+
brew_range?: ("espresso" | "filter" | "turkish")[];
|
|
825
|
+
/**
|
|
826
|
+
* How beans go in. single_dose: weighed dose for each brew; hopper: a container holding beans for many brews; both: works either way.
|
|
827
|
+
*/
|
|
828
|
+
bean_feed?: "single_dose" | "hopper" | "both";
|
|
829
|
+
/**
|
|
830
|
+
* How the amount of ground coffee is controlled. manual: the user stops grinding; time: grinds for a set time; weight: stops at a target weight with a built-in scale.
|
|
831
|
+
*/
|
|
832
|
+
dose_control_modes?: ("manual" | "time" | "weight")[];
|
|
833
|
+
/**
|
|
834
|
+
* manual: turned by hand; electric: driven by a motor.
|
|
835
|
+
*/
|
|
836
|
+
drive?: "manual" | "electric";
|
|
837
|
+
/**
|
|
838
|
+
* Rated motor power in watts.
|
|
839
|
+
*/
|
|
840
|
+
motor_power_w?: number;
|
|
841
|
+
/**
|
|
842
|
+
* Smallest step between settings on a stepped dial.
|
|
843
|
+
*/
|
|
844
|
+
grind_setting_step?: number;
|
|
845
|
+
/**
|
|
846
|
+
* Burr gap change per setting step, as stated by the maker or measured.
|
|
847
|
+
*/
|
|
848
|
+
microns_per_step?: number;
|
|
849
|
+
/**
|
|
850
|
+
* Ground coffee left inside the grinder after grinding, in grams, as measured or stated by the maker.
|
|
851
|
+
*/
|
|
852
|
+
retention_g?: number;
|
|
853
|
+
/**
|
|
854
|
+
* Lowest motor speed in revolutions per minute.
|
|
855
|
+
*/
|
|
856
|
+
rpm_min?: number;
|
|
857
|
+
/**
|
|
858
|
+
* Highest motor speed in revolutions per minute. Equal to rpm_min for fixed-speed grinders.
|
|
859
|
+
*/
|
|
860
|
+
rpm_max?: number;
|
|
861
|
+
}
|
|
862
|
+
export interface EquipmentBrewer {
|
|
863
|
+
/**
|
|
864
|
+
* How water and coffee meet; matches brew method categories.
|
|
865
|
+
*/
|
|
866
|
+
mechanism?: "percolation" | "immersion" | "hybrid" | "press" | "vacuum" | "boiling" | "other";
|
|
867
|
+
/**
|
|
868
|
+
* Largest amount of brewed coffee it holds or makes at once, in millilitres.
|
|
869
|
+
*/
|
|
870
|
+
capacity_ml?: number;
|
|
871
|
+
/**
|
|
872
|
+
* Nominal number of cups the maker states.
|
|
873
|
+
*/
|
|
874
|
+
cup_capacity?: number;
|
|
875
|
+
/**
|
|
876
|
+
* What the brewer is made of; list every material sold under this model, such as ceramic and plastic.
|
|
877
|
+
*/
|
|
878
|
+
material?: (
|
|
879
|
+
| "ceramic"
|
|
880
|
+
| "glass"
|
|
881
|
+
| "plastic"
|
|
882
|
+
| "stainless_steel"
|
|
883
|
+
| "copper"
|
|
884
|
+
| "aluminium"
|
|
885
|
+
| "porcelain"
|
|
886
|
+
| "wood"
|
|
887
|
+
| "silicone"
|
|
888
|
+
| "other"
|
|
889
|
+
)[];
|
|
890
|
+
/**
|
|
891
|
+
* Filter shape or size, e.g. cone_02, flat_185, chemex_6cup, aeropress_round, metal_mesh.
|
|
892
|
+
*/
|
|
893
|
+
filter_format?: string;
|
|
894
|
+
/**
|
|
895
|
+
* Shape of the filter it uses. cone: pointed cone; flat_bottom: flat base, for example wave filters; basket: basket-shaped paper filter used in drip machines; disc: round disc, as in AeroPress; none: no separate filter.
|
|
896
|
+
*/
|
|
897
|
+
filter_shape?: "cone" | "flat_bottom" | "basket" | "disc" | "none";
|
|
898
|
+
/**
|
|
899
|
+
* How fast water drains. fixed: set by the design; manual_valve: a valve or switch you open and close; programmable: controlled by the machine.
|
|
900
|
+
*/
|
|
901
|
+
flow_control?: "fixed" | "manual_valve" | "programmable";
|
|
902
|
+
/**
|
|
903
|
+
* manual: you pour or press by hand; electric: a machine heats and pours the water; stovetop: heated on a hob, such as a moka pot.
|
|
904
|
+
*/
|
|
905
|
+
drive?: "manual" | "electric" | "stovetop";
|
|
906
|
+
}
|
|
907
|
+
export interface EquipmentKettle {
|
|
908
|
+
/**
|
|
909
|
+
* Largest amount of water it holds, in millilitres.
|
|
910
|
+
*/
|
|
911
|
+
capacity_ml?: number;
|
|
912
|
+
/**
|
|
913
|
+
* gooseneck: thin curved spout for a slow, precise pour; standard: ordinary spout; other: anything else.
|
|
914
|
+
*/
|
|
915
|
+
spout_type?: "gooseneck" | "standard" | "other";
|
|
916
|
+
/**
|
|
917
|
+
* none: just boils; fixed: a few preset temperatures; adjustable: any temperature in a range can be set.
|
|
918
|
+
*/
|
|
919
|
+
temperature_control?: "none" | "fixed" | "adjustable";
|
|
920
|
+
/**
|
|
921
|
+
* Lowest temperature that can be set, in degrees Celsius.
|
|
922
|
+
*/
|
|
923
|
+
temperature_min_celsius?: number;
|
|
924
|
+
/**
|
|
925
|
+
* Highest temperature that can be set, in degrees Celsius.
|
|
926
|
+
*/
|
|
927
|
+
temperature_max_celsius?: number;
|
|
928
|
+
/**
|
|
929
|
+
* Whether the kettle can keep water at the set temperature. true: can hold; false: confirmed cannot hold; absent: unknown.
|
|
930
|
+
*/
|
|
931
|
+
supports_temperature_hold?: boolean;
|
|
932
|
+
/**
|
|
933
|
+
* electric: has its own heating base; stovetop: heated on a hob; induction_compatible: stovetop kettle that also works on induction hobs; other: anything else.
|
|
934
|
+
*/
|
|
935
|
+
heat_source?: "electric" | "stovetop" | "induction_compatible" | "other";
|
|
936
|
+
}
|
|
937
|
+
export interface EquipmentScale {
|
|
938
|
+
/**
|
|
939
|
+
* Smallest weight step the display shows, in grams, for example 0.1.
|
|
940
|
+
*/
|
|
941
|
+
resolution_g?: number;
|
|
942
|
+
/**
|
|
943
|
+
* Largest weight the scale can measure, in grams.
|
|
944
|
+
*/
|
|
945
|
+
capacity_g?: number;
|
|
946
|
+
/**
|
|
947
|
+
* Built-in timer. true: has one; false: confirmed none; absent: unknown.
|
|
948
|
+
*/
|
|
949
|
+
has_timer?: boolean;
|
|
950
|
+
/**
|
|
951
|
+
* Sets itself to zero when a cup or brewer is put on. true: supported; false: confirmed not supported; absent: unknown.
|
|
952
|
+
*/
|
|
953
|
+
supports_auto_tare?: boolean;
|
|
954
|
+
/**
|
|
955
|
+
* Starts the timer by itself when liquid starts to flow or water is poured. true: supported; false: confirmed not supported; absent: unknown.
|
|
956
|
+
*/
|
|
957
|
+
supports_auto_timer?: boolean;
|
|
958
|
+
/**
|
|
959
|
+
* Shows how fast weight changes, in grams per second. true: shown; false: confirmed not shown; absent: unknown.
|
|
960
|
+
*/
|
|
961
|
+
has_flow_rate_display?: boolean;
|
|
962
|
+
/**
|
|
963
|
+
* Wireless or wired connections to apps or machines: bluetooth, wifi or usb.
|
|
964
|
+
*/
|
|
965
|
+
connectivity?: ("bluetooth" | "wifi" | "usb")[];
|
|
966
|
+
}
|
|
967
|
+
export interface EquipmentTamper {
|
|
968
|
+
/**
|
|
969
|
+
* Diameter of the tamper base in millimetres, for example 58.
|
|
970
|
+
*/
|
|
971
|
+
diameter_mm?: number;
|
|
972
|
+
/**
|
|
973
|
+
* none: the user decides how hard to press; fixed: a spring gives a set force; adjustable: the spring force can be set.
|
|
974
|
+
*/
|
|
975
|
+
force_control?: "none" | "fixed" | "adjustable";
|
|
976
|
+
/**
|
|
977
|
+
* Shape of the pressing surface. flat; convex: slightly curved outward; rippled: grooved surface; other: anything else.
|
|
978
|
+
*/
|
|
979
|
+
base_shape?: "flat" | "convex" | "rippled" | "other";
|
|
980
|
+
/**
|
|
981
|
+
* Whether the tamper sits on the basket rim so it always presses level. true: self-levelling; false: confirmed not self-levelling; absent: unknown.
|
|
982
|
+
*/
|
|
983
|
+
self_leveling?: boolean;
|
|
984
|
+
}
|
|
985
|
+
export interface EquipmentWdt {
|
|
986
|
+
/**
|
|
987
|
+
* Thickness of each needle in millimetres, for example 0.3.
|
|
988
|
+
*/
|
|
989
|
+
needle_diameter_mm?: number;
|
|
990
|
+
/**
|
|
991
|
+
* Number of needles.
|
|
992
|
+
*/
|
|
993
|
+
needle_count?: number;
|
|
994
|
+
/**
|
|
995
|
+
* Whether you can limit how deep the needles reach. none: no limit; fixed: set depth; adjustable: depth can be set.
|
|
996
|
+
*/
|
|
997
|
+
depth_control?: "none" | "fixed" | "adjustable";
|
|
998
|
+
}
|
|
999
|
+
export interface EquipmentBasket {
|
|
1000
|
+
/**
|
|
1001
|
+
* single, double or triple: the shot size the basket is made for; other: anything else.
|
|
1002
|
+
*/
|
|
1003
|
+
kind?: "single" | "double" | "triple" | "other";
|
|
1004
|
+
/**
|
|
1005
|
+
* Diameter of the basket in millimetres, for example 58.
|
|
1006
|
+
*/
|
|
1007
|
+
diameter_mm?: number;
|
|
1008
|
+
/**
|
|
1009
|
+
* Dose of ground coffee the basket is designed for, in grams.
|
|
1010
|
+
*/
|
|
1011
|
+
nominal_dose_g?: number;
|
|
1012
|
+
/**
|
|
1013
|
+
* Smallest recommended dose in grams.
|
|
1014
|
+
*/
|
|
1015
|
+
dose_min_g?: number;
|
|
1016
|
+
/**
|
|
1017
|
+
* Largest recommended dose in grams.
|
|
1018
|
+
*/
|
|
1019
|
+
dose_max_g?: number;
|
|
1020
|
+
/**
|
|
1021
|
+
* A pressurised basket has a single small exit hole that builds pressure even with a coarse grind. true: pressurised; false: standard unpressurised basket; absent: unknown.
|
|
1022
|
+
*/
|
|
1023
|
+
pressurized?: boolean;
|
|
1024
|
+
/**
|
|
1025
|
+
* A precision basket has tightly controlled hole sizes, sold for consistent extraction. true: precision basket; false: ordinary basket; absent: unknown.
|
|
1026
|
+
*/
|
|
1027
|
+
precision?: boolean;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
export declare const SCHEMA_IDS: {
|
|
1031
|
+
"coffee-places": {
|
|
1032
|
+
"latest": "https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.4.0.json",
|
|
1033
|
+
"versions": {
|
|
1034
|
+
"0.1.0": "https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.1.0.json",
|
|
1035
|
+
"0.2.0": "https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.2.0.json",
|
|
1036
|
+
"0.3.0": "https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.3.0.json",
|
|
1037
|
+
"0.4.0": "https://schema.roastbook.coffee/coffee-places/coffee-places.schema.v0.4.0.json"
|
|
1038
|
+
}
|
|
1039
|
+
},
|
|
1040
|
+
"brew-methods": {
|
|
1041
|
+
"latest": "https://schema.roastbook.coffee/brew-methods/brew-methods.schema.v0.4.0.json",
|
|
1042
|
+
"versions": {
|
|
1043
|
+
"0.1.0": "https://schema.roastbook.coffee/brew-methods/brew-methods.schema.v0.1.0.json",
|
|
1044
|
+
"0.2.0": "https://schema.roastbook.coffee/brew-methods/brew-methods.schema.v0.2.0.json",
|
|
1045
|
+
"0.3.0": "https://schema.roastbook.coffee/brew-methods/brew-methods.schema.v0.3.0.json",
|
|
1046
|
+
"0.4.0": "https://schema.roastbook.coffee/brew-methods/brew-methods.schema.v0.4.0.json"
|
|
1047
|
+
}
|
|
1048
|
+
},
|
|
1049
|
+
"equipment": {
|
|
1050
|
+
"latest": "https://schema.roastbook.coffee/equipment/equipment.schema.v0.4.0.json",
|
|
1051
|
+
"versions": {
|
|
1052
|
+
"0.1.0": "https://schema.roastbook.coffee/equipment/equipment.schema.v0.1.0.json",
|
|
1053
|
+
"0.2.0": "https://schema.roastbook.coffee/equipment/equipment.schema.v0.2.0.json",
|
|
1054
|
+
"0.3.0": "https://schema.roastbook.coffee/equipment/equipment.schema.v0.3.0.json",
|
|
1055
|
+
"0.4.0": "https://schema.roastbook.coffee/equipment/equipment.schema.v0.4.0.json"
|
|
1056
|
+
}
|
|
1057
|
+
},
|
|
1058
|
+
"common": {
|
|
1059
|
+
"latest": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json",
|
|
1060
|
+
"versions": {
|
|
1061
|
+
"0.1.0": "https://schema.roastbook.coffee/common/common.schema.v0.1.0.json",
|
|
1062
|
+
"0.2.0": "https://schema.roastbook.coffee/common/common.schema.v0.2.0.json",
|
|
1063
|
+
"0.3.0": "https://schema.roastbook.coffee/common/common.schema.v0.3.0.json",
|
|
1064
|
+
"0.4.0": "https://schema.roastbook.coffee/common/common.schema.v0.4.0.json"
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
};
|
|
1068
|
+
export declare const BREW_METHOD_CATEGORY_VALUES: readonly ["espresso", "filter", "immersion", "pressure", "vacuum", "boiling", "cold"];
|
|
1069
|
+
export declare const BREW_METHOD_EXTRACTION_VALUES: readonly ["percolation", "immersion", "hybrid"];
|
|
1070
|
+
export declare const BREW_METHOD_FILTER_TYPES_VALUES: readonly ["paper", "metal", "cloth", "none"];
|
|
1071
|
+
export declare const BREW_PARAMETER_VALUES: readonly ["dose_g", "brew_water_g", "yield_g", "brew_ratio", "yield_ratio", "grind_setting", "brew_time_seconds", "target_time_seconds", "brew_temperature_celsius", "bloom_time_seconds", "bloom_water_g", "preinfusion_time_seconds", "preinfusion_pressure_bar", "brew_pressure_bar", "flow_rate_ml_per_second", "tamp_force_kg", "uses_puck_screen", "paper_filter_position", "distribution_method", "pour_count", "steep_time_seconds"];
|
|
1072
|
+
export declare const COFFEE_PLACE_FOOD_FOCUS_VALUES: readonly ["coffee_led", "food_led", "balanced"];
|
|
1073
|
+
export declare const COFFEE_PLACE_GOOD_FOR_VALUES: readonly ["working", "meetings", "quick_espresso", "takeaway", "brunch", "groups", "reading", "date", "coffee_nerds", "families"];
|
|
1074
|
+
export declare const COFFEE_PLACE_STATUS_VALUES: readonly ["open", "temporarily_closed", "closed", "unverified"];
|
|
1075
|
+
export declare const COFFEE_PLACE_TYPE_VALUES: readonly ["CafeOrCoffeeShop"];
|
|
1076
|
+
export declare const DISTRIBUTION_METHOD_VALUES: readonly ["wdt", "blind_shaker", "distribution_tool", "stockfleth_move"];
|
|
1077
|
+
export declare const EQUIPMENT_BASKET_KIND_VALUES: readonly ["single", "double", "triple", "other"];
|
|
1078
|
+
export declare const EQUIPMENT_BREWER_DRIVE_VALUES: readonly ["manual", "electric", "stovetop"];
|
|
1079
|
+
export declare const EQUIPMENT_BREWER_FILTER_SHAPE_VALUES: readonly ["cone", "flat_bottom", "basket", "disc", "none"];
|
|
1080
|
+
export declare const EQUIPMENT_BREWER_FLOW_CONTROL_VALUES: readonly ["fixed", "manual_valve", "programmable"];
|
|
1081
|
+
export declare const EQUIPMENT_BREWER_MATERIAL_VALUES: readonly ["ceramic", "glass", "plastic", "stainless_steel", "copper", "aluminium", "porcelain", "wood", "silicone", "other"];
|
|
1082
|
+
export declare const EQUIPMENT_BREWER_MECHANISM_VALUES: readonly ["percolation", "immersion", "hybrid", "press", "vacuum", "boiling", "other"];
|
|
1083
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_CONNECTIVITY_VALUES: readonly ["bluetooth", "wifi", "usb"];
|
|
1084
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_FLOW_CONTROL_VALUES: readonly ["none", "manual", "programmable"];
|
|
1085
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_GROUP_TYPE_VALUES: readonly ["e61", "saturated", "semi_saturated", "lever", "integrated", "other"];
|
|
1086
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_HEATING_ARCHITECTURE_VALUES: readonly ["single_boiler", "heat_exchanger", "dual_boiler", "multi_boiler", "single_thermoblock", "dual_thermoblock", "hybrid", "manual", "other"];
|
|
1087
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_PREINFUSION_CONTROL_VALUES: readonly ["none", "supported", "fixed", "adjustable", "programmable"];
|
|
1088
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_PRESSURE_CONTROL_VALUES: readonly ["fixed", "adjustable_opv", "manual", "programmable"];
|
|
1089
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_PUMP_TYPE_VALUES: readonly ["vibration", "rotary", "gear", "peristaltic", "manual", "other"];
|
|
1090
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_SHOT_STOP_MODES_VALUES: readonly ["manual", "weight", "time", "volume"];
|
|
1091
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_STEAM_SYSTEM_VALUES: readonly ["none", "shared_heater", "dedicated_heater"];
|
|
1092
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_TEMPERATURE_CONTROL_VALUES: readonly ["none", "fixed", "adjustable", "programmable"];
|
|
1093
|
+
export declare const EQUIPMENT_ESPRESSO_MACHINE_WATER_SOURCE_MODES_VALUES: readonly ["reservoir", "plumbed"];
|
|
1094
|
+
export declare const EQUIPMENT_GRINDER_ADJUSTMENT_TYPE_VALUES: readonly ["fixed", "stepped", "stepless"];
|
|
1095
|
+
export declare const EQUIPMENT_GRINDER_BEAN_FEED_VALUES: readonly ["single_dose", "hopper", "both"];
|
|
1096
|
+
export declare const EQUIPMENT_GRINDER_BREW_RANGE_VALUES: readonly ["espresso", "filter", "turkish"];
|
|
1097
|
+
export declare const EQUIPMENT_GRINDER_BURR_MATERIAL_VALUES: readonly ["steel", "ceramic", "titanium_coated", "other"];
|
|
1098
|
+
export declare const EQUIPMENT_GRINDER_BURR_MECHANISM_VALUES: readonly ["conical", "flat", "ghost", "roller", "blade", "other"];
|
|
1099
|
+
export declare const EQUIPMENT_GRINDER_DOSE_CONTROL_MODES_VALUES: readonly ["manual", "time", "weight"];
|
|
1100
|
+
export declare const EQUIPMENT_GRINDER_DRIVE_VALUES: readonly ["manual", "electric"];
|
|
1101
|
+
export declare const EQUIPMENT_GRINDER_GRIND_SETTING_FORMAT_VALUES: readonly ["whole_number", "decimal", "string"];
|
|
1102
|
+
export declare const EQUIPMENT_KETTLE_HEAT_SOURCE_VALUES: readonly ["electric", "stovetop", "induction_compatible", "other"];
|
|
1103
|
+
export declare const EQUIPMENT_KETTLE_SPOUT_TYPE_VALUES: readonly ["gooseneck", "standard", "other"];
|
|
1104
|
+
export declare const EQUIPMENT_KETTLE_TEMPERATURE_CONTROL_VALUES: readonly ["none", "fixed", "adjustable"];
|
|
1105
|
+
export declare const EQUIPMENT_SCALE_CONNECTIVITY_VALUES: readonly ["bluetooth", "wifi", "usb"];
|
|
1106
|
+
export declare const EQUIPMENT_TAMPER_BASE_SHAPE_VALUES: readonly ["flat", "convex", "rippled", "other"];
|
|
1107
|
+
export declare const EQUIPMENT_TAMPER_FORCE_CONTROL_VALUES: readonly ["none", "fixed", "adjustable"];
|
|
1108
|
+
export declare const EQUIPMENT_TYPE_VALUES: readonly ["espresso_machine", "espresso_machine_with_grinder", "grinder", "brewer", "kettle", "scale", "tamper", "wdt", "basket", "filter", "roaster", "milk_frother", "accessory"];
|
|
1109
|
+
export declare const EQUIPMENT_WDT_DEPTH_CONTROL_VALUES: readonly ["none", "fixed", "adjustable"];
|
|
1110
|
+
export declare const GRIND_SIZE_VALUES: readonly ["extra_fine", "fine", "medium_fine", "medium", "medium_coarse", "coarse", "extra_coarse"];
|
|
1111
|
+
export declare const PAPER_FILTER_POSITION_VALUES: readonly ["none", "top", "bottom", "both"];
|
|
1112
|
+
export declare const SPECIALTY_TIER_VALUES: readonly ["A", "B", "none", "unknown"];
|
|
1113
|
+
/** Validator for the "iri" format used by URL fields, which ajv-formats lacks: ajv.addFormat("iri", isIri). */
|
|
1114
|
+
export declare function isIri(value: unknown): boolean;
|