wetherspoons-api 0.0.2 → 0.0.4

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/README.md ADDED
@@ -0,0 +1,245 @@
1
+ # Wetherspoons API
2
+
3
+ A TypeScript package for accessing JD Wetherspoon's venue and menu data, including drink information with pricing and alcohol unit calculations.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/wetherspoons-api.svg)](https://www.npmjs.com/package/wetherspoons-api)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ npm install wetherspoons-api
12
+ ```
13
+
14
+ ## Features
15
+
16
+ - 🏪 Fetch all Wetherspoons venues
17
+ - 📍 Get detailed venue information
18
+ - 🍺 Access venue menus and drinks
19
+ - 💰 Calculate price per unit (PPU) for alcoholic beverages
20
+ - ✅ Type-safe with TypeScript and Zod validation
21
+ - 🔄 Automatic handling of different portion sizes
22
+
23
+ ## Usage
24
+
25
+ ### Get All Venues
26
+
27
+ ```typescript
28
+ import { venues } from 'wetherspoons-api';
29
+
30
+ const allVenues = await venues();
31
+ console.log(allVenues);
32
+ // [
33
+ // {
34
+ // franchise: 'lloyds',
35
+ // id: 123,
36
+ // isClosed: false,
37
+ // name: 'The Moon Under Water',
38
+ // venueRef: 456
39
+ // },
40
+ // ...
41
+ // ]
42
+ ```
43
+
44
+ ### Get Venue Details
45
+
46
+ ```typescript
47
+ import { venues, getVenue } from 'wetherspoons-api';
48
+
49
+ const allVenues = await venues();
50
+ const venue = allVenues[0];
51
+ const details = await getVenue(venue);
52
+
53
+ console.log(details);
54
+ // {
55
+ // canPlaceOrder: true,
56
+ // franchise: 'lloyds',
57
+ // id: 123,
58
+ // name: 'The Moon Under Water',
59
+ // salesAreas: [{ id: 789 }],
60
+ // venueCanOrder: true,
61
+ // venueRef: 456
62
+ // }
63
+ ```
64
+
65
+ ### Get Drinks with Price Analysis
66
+
67
+ ```typescript
68
+ import { venues, getDrinksFromHighLevelVenue } from 'wetherspoons-api';
69
+
70
+ const allVenues = await venues();
71
+ const venue = allVenues[0];
72
+ const drinks = await getDrinksFromHighLevelVenue(venue);
73
+
74
+ console.log(drinks);
75
+ // [
76
+ // {
77
+ // name: 'Ruddles Best',
78
+ // units: 2.27,
79
+ // productId: 12345,
80
+ // price: 249, // in pence
81
+ // ppu: 109.69 // price per unit in pence
82
+ // },
83
+ // ...
84
+ // ]
85
+ // Sorted by best value (lowest price per unit first)
86
+ ```
87
+
88
+ Alternatively, if you already have detailed venue information:
89
+
90
+ ```typescript
91
+ import { venues, getVenue, getDrinksFromDetailedVenue } from 'wetherspoons-api';
92
+
93
+ const allVenues = await venues();
94
+ const venue = allVenues[0];
95
+ const detailedVenue = await getVenue(venue);
96
+ const drinks = await getDrinksFromDetailedVenue(detailedVenue);
97
+ ```
98
+
99
+ ### Get Menus
100
+
101
+ ```typescript
102
+ import { venues, getVenue, getMenus, getMenu } from 'wetherspoons-api';
103
+
104
+ const allVenues = await venues();
105
+ const venue = allVenues[0];
106
+ const details = await getVenue(venue);
107
+
108
+ // Get all menus for a sales area
109
+ const menus = await getMenus({
110
+ venue: details,
111
+ salesAreaId: details.salesAreas[0].id
112
+ });
113
+
114
+ // Get detailed menu information
115
+ const drinksMenu = menus.find(m => m.name === 'Drinks');
116
+ if (drinksMenu) {
117
+ const detailedMenu = await getMenu(drinksMenu);
118
+ console.log(detailedMenu.data.categories);
119
+ }
120
+ ```
121
+
122
+ ## API Reference
123
+
124
+ ### Functions
125
+
126
+ #### `venues(): Promise<HighLevelVenue[]>`
127
+ Fetches all Wetherspoons venues.
128
+
129
+ **Returns:** Array of venue objects with basic information.
130
+
131
+ #### `getVenue(venue: HighLevelVenue): Promise<DetailedVenue>`
132
+ Gets detailed information about a specific venue.
133
+
134
+ **Parameters:**
135
+ - `venue`: A venue object from [`venues()`](src/index.ts:28)
136
+
137
+ **Returns:** Detailed venue information including sales areas and ordering capabilities.
138
+
139
+ #### `getMenus({ venue, salesAreaId }): Promise<HighLevelMenu[]>`
140
+ Fetches all menus for a specific sales area in a venue.
141
+
142
+ **Parameters:**
143
+ - `venue`: A detailed venue object from [`getVenue()`](src/index.ts:49)
144
+ - `salesAreaId`: The ID of the sales area
145
+
146
+ **Returns:** Array of menu objects.
147
+
148
+ #### `getMenu(highLevelMenu: HighLevelMenu): Promise<DetailedMenu>`
149
+ Gets detailed menu information including all products and categories.
150
+
151
+ **Parameters:**
152
+ - `highLevelMenu`: A menu object from [`getMenus()`](src/index.ts:66)
153
+
154
+ **Returns:** Detailed menu with categories, item groups, and products.
155
+
156
+ #### `getDrinksFromHighLevelVenue(highLevelVenue: HighLevelVenue): Promise<Drink[]>`
157
+ Fetches all drinks from a venue's drinks menu, calculates alcohol units and price per unit, then sorts by best value. This is a convenience function that internally calls [`getVenue()`](src/index.ts:49) and [`getDrinksFromDetailedVenue()`](src/index.ts:151).
158
+
159
+ **Parameters:**
160
+ - `highLevelVenue`: A venue object from [`venues()`](src/index.ts:28)
161
+
162
+ **Returns:** Array of drinks sorted by price per unit (best value first).
163
+
164
+ #### `getDrinksFromDetailedVenue(detailedVenue: DetailedVenue): Promise<Drink[]>`
165
+ Fetches all drinks from a detailed venue's drinks menu, calculates alcohol units and price per unit, then sorts by best value. Use this function when you already have detailed venue information to avoid an extra API call.
166
+
167
+ **Parameters:**
168
+ - `detailedVenue`: A detailed venue object from [`getVenue()`](src/index.ts:49)
169
+
170
+ **Returns:** Array of drinks sorted by price per unit (best value first). Returns an empty array if the venue has no sales areas or no drinks menu.
171
+
172
+ ### Types
173
+
174
+ #### `HighLevelVenue`
175
+ ```typescript
176
+ {
177
+ franchise: string;
178
+ id: number;
179
+ isClosed: boolean;
180
+ name: string;
181
+ venueRef: number;
182
+ }
183
+ ```
184
+
185
+ #### `DetailedVenue`
186
+ ```typescript
187
+ {
188
+ canPlaceOrder: boolean;
189
+ franchise: string;
190
+ id: number;
191
+ isClosed?: boolean;
192
+ name: string;
193
+ salesAreas: Array<{ id: number }>;
194
+ venueCanOrder: boolean;
195
+ venueRef: string | number;
196
+ }
197
+ ```
198
+
199
+ #### `Drink`
200
+ ```typescript
201
+ {
202
+ name: string;
203
+ units: number; // Alcohol units
204
+ productId: number;
205
+ price: number; // Price in pence
206
+ ppu: number; // Price per unit in pence
207
+ }
208
+ ```
209
+
210
+ ## How It Works
211
+
212
+ The package:
213
+ 1. Connects to the JD Wetherspoon API
214
+ 2. Validates all responses using Zod schemas for type safety
215
+ 3. Calculates alcohol units based on ABV and volume information
216
+ 4. Determines the best value portion size for each drink
217
+ 5. Sorts drinks by price per unit to help find the best deals
218
+
219
+ ## Development
220
+
221
+ ```bash
222
+ # Install dependencies
223
+ npm install
224
+
225
+ # Build the package
226
+ npm run build
227
+
228
+ # Lint code
229
+ npm run lint
230
+
231
+ # Fix linting issues
232
+ npm run lint:fix
233
+ ```
234
+
235
+ ## License
236
+
237
+ MIT © [Joss Bird](https://github.com/slack2450)
238
+
239
+ ## Contributing
240
+
241
+ Contributions are welcome! Please feel free to submit a Pull Request.
242
+
243
+ ## Issues
244
+
245
+ Report bugs and feature requests at [https://github.com/slack2450/wetherspoons-api/issues](https://github.com/slack2450/wetherspoons-api/issues)
@@ -111,6 +111,7 @@ export interface Drink {
111
111
  price: number;
112
112
  ppu: number;
113
113
  }
114
- export declare function getDrinks(highLevelVenue: HighLevelVenue): Promise<Drink[]>;
114
+ export declare function getDrinksFromHighLevelVenue(highLevelVenue: HighLevelVenue): Promise<Drink[]>;
115
+ export declare function getDrinksFromDetailedVenue(detailedVenue: DetailedVenue): Promise<Drink[]>;
115
116
  export {};
116
117
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,eAAO,MAAM,oBAAoB;;;;;;iBAM/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,wBAAsB,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAIxD;AAED,QAAA,MAAM,mBAAmB;;;;;;;;;;;iBAWvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAsB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAI5E;AAED,eAAO,MAAM,mBAAmB;;;;;;;iBAO9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAsB,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAI9H;AAED,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;iBAqB7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2BtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,wBAAsB,OAAO,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAIjF;AAMD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAsB,2BAA2B,CAAC,cAAc,EAAE,cAAc,oBAG/E;AAED,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CA6G/F"}
@@ -110,8 +110,11 @@ export async function getMenu(highLevelMenu) {
110
110
  function strengthAndVolumeToUnits(strength, volume) {
111
111
  return (strength * volume) / 1000;
112
112
  }
113
- export async function getDrinks(highLevelVenue) {
113
+ export async function getDrinksFromHighLevelVenue(highLevelVenue) {
114
114
  const detailedVenue = await getVenue(highLevelVenue);
115
+ return await getDrinksFromDetailedVenue(detailedVenue);
116
+ }
117
+ export async function getDrinksFromDetailedVenue(detailedVenue) {
115
118
  const salesArea = detailedVenue.salesAreas[0];
116
119
  if (!salesArea)
117
120
  return [];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "wetherspoons-api",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "A simple package to get data from the JD Wetherspoons API",
5
5
  "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
6
7
  "type": "module",
8
+ "files": [
9
+ "dist"
10
+ ],
7
11
  "scripts": {
8
12
  "build": "tsc",
9
13
  "lint": "eslint .",
@@ -1,37 +0,0 @@
1
- name: Publish to npm
2
-
3
- on:
4
- release:
5
- types: [created]
6
-
7
- permissions:
8
- contents: read
9
- id-token: write
10
-
11
- jobs:
12
- build:
13
- runs-on: ubuntu-latest
14
- environment: Production
15
- steps:
16
- - name: Checkout code
17
- uses: actions/checkout@v5
18
-
19
- - name: Setup Node.js
20
- uses: actions/setup-node@v4
21
- with:
22
- node-version: '20'
23
- registry-url: 'https://registry.npmjs.org'
24
-
25
- - name: Install dependencies
26
- run: npm ci
27
-
28
- - name: Run linter
29
- run: npm run lint
30
-
31
- - name: Build
32
- run: npm run build
33
-
34
- - name: Publish to npm
35
- run: npm publish --provenance --access public
36
- env:
37
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -1,3 +0,0 @@
1
- declare const _default: import("@eslint/core", { with: { "resolution-mode": "require" } }).ConfigObject<import("@eslint/core", { with: { "resolution-mode": "require" } }).RulesConfig>[];
2
- export default _default;
3
- //# sourceMappingURL=eslint.config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eslint.config.d.ts","sourceRoot":"","sources":["../eslint.config.ts"],"names":[],"mappings":";AAMA,wBAaG"}
@@ -1,20 +0,0 @@
1
- import js from '@eslint/js';
2
- import globals from 'globals';
3
- import tseslint from 'typescript-eslint';
4
- import { defineConfig } from 'eslint/config';
5
- import stylistic from '@stylistic/eslint-plugin';
6
- export default defineConfig([
7
- {
8
- ignores: ['dist/**', 'node_modules/**'],
9
- },
10
- { files: ['**/*.{js,mjs,cjs,ts,mts,cts}'], plugins: { js, '@stylistic': stylistic }, extends: ['js/recommended'], languageOptions: { globals: { ...globals.browser, ...globals.node } } },
11
- tseslint.configs.recommended,
12
- stylistic.configs['recommended'],
13
- {
14
- rules: {
15
- '@stylistic/semi': ['error', 'always'],
16
- '@stylistic/brace-style': ['error', '1tbs'],
17
- },
18
- },
19
- ]);
20
- //# sourceMappingURL=eslint.config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eslint.config.js","sourceRoot":"","sources":["../eslint.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,SAAS,MAAM,0BAA0B,CAAC;AAEjD,eAAe,YAAY,CAAC;IAC1B;QACE,OAAO,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC;KACxC;IACD,EAAE,KAAK,EAAE,CAAC,8BAA8B,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE;IACzL,QAAQ,CAAC,OAAO,CAAC,WAAW;IAC5B,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;IAChC;QACE,KAAK,EAAE;YACL,iBAAiB,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;YACtC,wBAAwB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;SAC5C;KACF;CACF,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,eAAO,MAAM,oBAAoB;;;;;;iBAM/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,wBAAsB,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAIxD;AAED,QAAA,MAAM,mBAAmB;;;;;;;;;;;iBAWvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAsB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAI5E;AAED,eAAO,MAAM,mBAAmB;;;;;;;iBAO9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAsB,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAI9H;AAED,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;iBAqB7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2BtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,wBAAsB,OAAO,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAIjF;AAMD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAsB,SAAS,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CA+GhF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/eslint.config.ts DELETED
@@ -1,20 +0,0 @@
1
- import js from '@eslint/js';
2
- import globals from 'globals';
3
- import tseslint from 'typescript-eslint';
4
- import { defineConfig } from 'eslint/config';
5
- import stylistic from '@stylistic/eslint-plugin';
6
-
7
- export default defineConfig([
8
- {
9
- ignores: ['dist/**', 'node_modules/**'],
10
- },
11
- { files: ['**/*.{js,mjs,cjs,ts,mts,cts}'], plugins: { js, '@stylistic': stylistic }, extends: ['js/recommended'], languageOptions: { globals: { ...globals.browser, ...globals.node } } },
12
- tseslint.configs.recommended,
13
- stylistic.configs['recommended'],
14
- {
15
- rules: {
16
- '@stylistic/semi': ['error', 'always'],
17
- '@stylistic/brace-style': ['error', '1tbs'],
18
- },
19
- },
20
- ]);
package/src/index.ts DELETED
@@ -1,257 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- const API_ENDPOINT = 'https://ca.jdw-apps.net/api/v0.1';
4
- const API_HEADERS = {
5
- Authorization: 'Bearer 1|SFS9MMnn5deflq0BMcUTSijwSMBB4mc7NSG2rOhqb2765466',
6
- };
7
-
8
- async function request(path: string): Promise<unknown> {
9
- const response = await fetch(`${API_ENDPOINT}${path}`,
10
- {
11
- headers: API_HEADERS,
12
- },
13
- );
14
- const json = await response.json();
15
- return json;
16
- }
17
-
18
- export const highLevelVenueSchema = z.object({
19
- franchise: z.string(),
20
- id: z.number(),
21
- isClosed: z.boolean(),
22
- name: z.string(),
23
- venueRef: z.number(),
24
- });
25
-
26
- export type HighLevelVenue = z.infer<typeof highLevelVenueSchema>;
27
-
28
- export async function venues(): Promise<HighLevelVenue[]> {
29
- const response = await request('/venues');
30
- const venues = z.object({ data: z.array(highLevelVenueSchema) }).parse(response);
31
- return venues.data;
32
- }
33
-
34
- const detailedVenueSchema = z.object({
35
- canPlaceOrder: z.boolean(),
36
- franchise: z.string(),
37
- id: z.number(),
38
- isClosed: z.boolean().optional(),
39
- name: z.string(),
40
- salesAreas: z.array(z.object({
41
- id: z.number(),
42
- })),
43
- venueCanOrder: z.boolean(),
44
- venueRef: z.union([z.string(), z.number()]),
45
- });
46
-
47
- export type DetailedVenue = z.infer<typeof detailedVenueSchema>;
48
-
49
- export async function getVenue(venue: HighLevelVenue): Promise<DetailedVenue> {
50
- const response = await request(`/venues/${venue.venueRef}`);
51
- const venueDetails = z.object({ data: detailedVenueSchema }).parse(response);
52
- return venueDetails.data;
53
- }
54
-
55
- export const highLevelMenuSchema = z.object({
56
- canOrder: z.boolean(),
57
- franchise: z.string(),
58
- id: z.number(),
59
- name: z.string(),
60
- salesAreaId: z.number(),
61
- venueRef: z.number(),
62
- });
63
-
64
- export type HighLevelMenu = z.infer<typeof highLevelMenuSchema>;
65
-
66
- export async function getMenus({ venue, salesAreaId }: { venue: DetailedVenue, salesAreaId: number }): Promise<HighLevelMenu[]> {
67
- const response = await request(`/${venue.franchise}/venues/${venue.venueRef}/sales-areas/${salesAreaId}/menus`);
68
- const menus = z.object({ data: z.array(highLevelMenuSchema) }).parse(response);
69
- return menus.data;
70
- }
71
-
72
- const detailedMenuProductSchema = z.object({
73
- id: z.number(),
74
- isOutOfStock: z.boolean(),
75
- itemType: z.literal('product'),
76
- name: z.string(),
77
- description: z.string(),
78
- options: z.object({
79
- portion: z.object({
80
- options: z.array(z.object({
81
- label: z.string(),
82
- value: z.object({
83
- price: z.object({
84
- currency: z.string(),
85
- discount: z.number(),
86
- initialValue: z.number(),
87
- value: z.number(),
88
- }),
89
- }),
90
- })),
91
- }),
92
- }),
93
- });
94
-
95
- export type DetailedMenuProduct = z.infer<typeof detailedMenuProductSchema>;
96
-
97
- const detailedMenuSchema = z.object({
98
- data: z.object({
99
- canOrder: z.boolean(),
100
- categories: z.array(z.object({
101
- itemGroups: z.array(z.object({
102
- items: z.array(z.union([
103
- z.object({
104
- itemType: z.literal('text'),
105
- text: z.string(),
106
- }),
107
- z.object({
108
- itemType: z.literal('divider'),
109
- }),
110
- z.object({
111
- itemType: z.literal('ale'),
112
- }),
113
- detailedMenuProductSchema,
114
- ])),
115
- name: z.string().nullable(),
116
- })),
117
- name: z.string(),
118
- })),
119
- franchise: z.string(),
120
- id: z.number(),
121
- salesAreaId: z.number(),
122
- venueRef: z.number(),
123
- }),
124
- });
125
-
126
- export type DetailedMenu = z.infer<typeof detailedMenuSchema>;
127
-
128
- export async function getMenu(highLevelMenu: HighLevelMenu): Promise<DetailedMenu> {
129
- const response = await request(`/${highLevelMenu.franchise}/venues/${highLevelMenu.venueRef}/sales-areas/${highLevelMenu.salesAreaId}/menus/${highLevelMenu.id}`);
130
- const detailedMenu = detailedMenuSchema.parse(response);
131
- return detailedMenu;
132
- }
133
-
134
- function strengthAndVolumeToUnits(strength: number, volume: number) {
135
- return (strength * volume) / 1000;
136
- }
137
-
138
- export interface Drink {
139
- name: string
140
- units: number
141
- productId: number
142
- price: number
143
- ppu: number
144
- }
145
-
146
- export async function getDrinks(highLevelVenue: HighLevelVenue): Promise<Drink[]> {
147
- const detailedVenue = await getVenue(highLevelVenue);
148
-
149
- const salesArea = detailedVenue.salesAreas[0];
150
-
151
- if (!salesArea) return [];
152
-
153
- const menus = await getMenus({ venue: detailedVenue, salesAreaId: salesArea.id });
154
-
155
- let drinksMenu;
156
- for (const menu of menus) {
157
- if (menu.name === 'Drinks') {
158
- drinksMenu = menu;
159
- break;
160
- }
161
- }
162
-
163
- if (!drinksMenu) return [];
164
- const res = await getMenu(drinksMenu);
165
-
166
- // Convert menu to flat array of drinks
167
- const hash_map = new Map<number, DetailedMenuProduct>();
168
-
169
- for (const categories of res.data.categories) {
170
- for (const itemGroup of categories.itemGroups) {
171
- for (const item of itemGroup.items) {
172
- if (item.itemType == 'product') {
173
- // Skip out of stock
174
- if (item.isOutOfStock) {
175
- continue;
176
- }
177
- hash_map.set(item.id, item);
178
- }
179
- }
180
- }
181
- }
182
-
183
- const drinks: Drink[] = [];
184
-
185
- for (const product of hash_map.values()) {
186
- const strengthMatches = product.description.match(/(\d?\d?\.?\d?\d%)\s?ABV/);
187
- const volumeDescriptionMatches = product.description.match(/(\d?\d\d)ml/);
188
-
189
- let strength;
190
- if (strengthMatches) {
191
- strength = parseFloat(strengthMatches[0]);
192
- }
193
-
194
- let volumeDescription;
195
- if (volumeDescriptionMatches) {
196
- volumeDescription = parseFloat(volumeDescriptionMatches[0]);
197
- }
198
-
199
- let bestPortion;
200
- let bestPPU = Infinity;
201
- let bestUnits = 0;
202
-
203
- for (const portion of product.options.portion.options) {
204
- let units;
205
-
206
- const volumeMatches = portion.label.match(/(\d?\d\d)ml/);
207
-
208
- let volume;
209
- if (volumeMatches && volumeMatches[1])
210
- volume = parseFloat(volumeMatches[1]);
211
-
212
- const unitsMatches = portion.label.match(/(\d?\.?\d?\d) unit/);
213
- if (unitsMatches && unitsMatches[1])
214
- units = parseFloat(unitsMatches[1]);
215
-
216
- if (portion.label === 'Pint' && strength) {
217
- units = strengthAndVolumeToUnits(strength, 568);
218
- } else if (['Half pint', 'Half Pint', 'Half'].includes(portion.label) && typeof strength !== 'undefined') {
219
- units = strengthAndVolumeToUnits(strength, 284);
220
- } else if (typeof strength !== 'undefined' && volume) {
221
- units = strengthAndVolumeToUnits(strength, volume);
222
- } else if (typeof strength !== 'undefined' && volumeDescription) {
223
- units = strengthAndVolumeToUnits(strength, volumeDescription);
224
- } else if (typeof strength !== 'undefined' && portion.label === 'Single') {
225
- units = strengthAndVolumeToUnits(strength, 25);
226
- } else if (typeof strength !== 'undefined' && portion.label === 'Double') {
227
- units = strengthAndVolumeToUnits(strength, 50);
228
- }
229
-
230
- if (typeof units !== 'undefined') {
231
- const ppu = portion.value.price.value / units;
232
-
233
- if (ppu < bestPPU) {
234
- bestPPU = ppu;
235
- bestPortion = portion;
236
- bestUnits = units;
237
- }
238
- }
239
- }
240
-
241
- if (typeof bestPortion !== 'undefined') {
242
- drinks.push({
243
- name: product.name,
244
- units: bestUnits,
245
- ppu: bestPPU,
246
- productId: product.id,
247
- price: bestPortion?.value.price.value,
248
- });
249
- }
250
- }
251
-
252
- drinks.sort((a, b) => {
253
- return a.ppu - b.ppu;
254
- });
255
-
256
- return drinks;
257
- }
package/tsconfig.json DELETED
@@ -1,43 +0,0 @@
1
- {
2
- // Visit https://aka.ms/tsconfig to read more about this file
3
- "compilerOptions": {
4
- // File Layout
5
- "outDir": "./dist",
6
-
7
- // Environment Settings
8
- // See also https://aka.ms/tsconfig/module
9
- "module": "node20",
10
- "target": "es2024",
11
- "types": [],
12
- // For nodejs:
13
- // "lib": ["esnext"],
14
- // "types": ["node"],
15
- // and npm install -D @types/node
16
-
17
- // Other Outputs
18
- "sourceMap": true,
19
- "declaration": true,
20
- "declarationMap": true,
21
-
22
- // Stricter Typechecking Options
23
- "noUncheckedIndexedAccess": true,
24
- "exactOptionalPropertyTypes": true,
25
-
26
- // Style Options
27
- // "noImplicitReturns": true,
28
- // "noImplicitOverride": true,
29
- // "noUnusedLocals": true,
30
- // "noUnusedParameters": true,
31
- // "noFallthroughCasesInSwitch": true,
32
- // "noPropertyAccessFromIndexSignature": true,
33
-
34
- // Recommended Options
35
- "strict": true,
36
- "jsx": "react-jsx",
37
- "verbatimModuleSyntax": true,
38
- "isolatedModules": true,
39
- "noUncheckedSideEffectImports": true,
40
- "moduleDetection": "force",
41
- "skipLibCheck": true,
42
- }
43
- }