@zappie/sdk 0.1.1 → 0.1.2
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/CHANGELOG.md +6 -0
- package/dist/cart/errors.js +13 -0
- package/dist/cart/errors.js.map +7 -0
- package/dist/cart/index.js +768 -0
- package/dist/cart/index.js.map +7 -0
- package/dist/cart/item.js +12 -1
- package/dist/cart/item.js.map +7 -1
- package/dist/cart/preview.js +32 -0
- package/dist/cart/preview.js.map +7 -0
- package/dist/cart/price.js +25 -0
- package/dist/cart/price.js.map +7 -0
- package/dist/cart/quote-client.js +76 -0
- package/dist/cart/quote-client.js.map +7 -0
- package/dist/cart/quote-response.js +178 -0
- package/dist/cart/quote-response.js.map +7 -0
- package/dist/cart/reconcile.js +108 -0
- package/dist/cart/reconcile.js.map +7 -0
- package/dist/cart/source-menu.js +21 -0
- package/dist/cart/source-menu.js.map +7 -0
- package/dist/cart/storage.js +174 -0
- package/dist/cart/storage.js.map +7 -0
- package/dist/cart/types.js +1 -0
- package/dist/cart/types.js.map +7 -0
- package/dist/cart/validate.js +265 -0
- package/dist/cart/validate.js.map +7 -0
- package/dist/cart/wire.js +42 -0
- package/dist/cart/wire.js.map +7 -0
- package/dist/cart/working-set.js +80 -0
- package/dist/cart/working-set.js.map +7 -0
- package/dist/checkout/client.js +102 -0
- package/dist/checkout/client.js.map +7 -0
- package/dist/checkout/error.js +21 -0
- package/dist/checkout/error.js.map +7 -0
- package/dist/checkout/index.js +13 -1
- package/dist/checkout/index.js.map +7 -1
- package/dist/checkout/readiness.js +36 -0
- package/dist/checkout/readiness.js.map +7 -0
- package/dist/checkout/sdk.js +9 -0
- package/dist/checkout/sdk.js.map +7 -0
- package/dist/checkout/session.js +58 -0
- package/dist/checkout/session.js.map +7 -0
- package/dist/checkout/types.js +1 -0
- package/dist/checkout/types.js.map +7 -0
- package/dist/client.js +253 -0
- package/dist/client.js.map +7 -0
- package/dist/config/index.js +13 -1
- package/dist/config/index.js.map +7 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +7 -0
- package/dist/customer/client.js +149 -0
- package/dist/customer/client.js.map +7 -0
- package/dist/customer/error.js +20 -0
- package/dist/customer/error.js.map +7 -0
- package/dist/customer/index.js +8 -3
- package/dist/customer/index.js.map +7 -1
- package/dist/customer/navigation.js +45 -0
- package/dist/customer/navigation.js.map +7 -0
- package/dist/customer/react.js +67 -2
- package/dist/customer/react.js.map +7 -1
- package/dist/customer/request.js +37 -0
- package/dist/customer/request.js.map +7 -0
- package/dist/customer/sdk.js +6 -0
- package/dist/customer/sdk.js.map +7 -0
- package/dist/customer/types.js +1 -0
- package/dist/customer/types.js.map +7 -0
- package/dist/customer/watch-order.js +80 -0
- package/dist/customer/watch-order.js.map +7 -0
- package/dist/debug.js +78 -1
- package/dist/debug.js.map +7 -1
- package/dist/errors.js +69 -0
- package/dist/errors.js.map +7 -0
- package/dist/index.js +29 -1
- package/dist/index.js.map +7 -1
- package/dist/internal/abort.js +29 -0
- package/dist/internal/abort.js.map +7 -0
- package/dist/internal/cache.js +142 -0
- package/dist/internal/cache.js.map +7 -0
- package/dist/internal/customer-http.js +74 -0
- package/dist/internal/customer-http.js.map +7 -0
- package/dist/internal/digest.js +15 -0
- package/dist/internal/digest.js.map +7 -0
- package/dist/internal/emitter.js +27 -0
- package/dist/internal/emitter.js.map +7 -0
- package/dist/internal/money-math.js +30 -0
- package/dist/internal/money-math.js.map +7 -0
- package/dist/internal.js +9 -1
- package/dist/internal.js.map +7 -1
- package/dist/models.js +1 -0
- package/dist/models.js.map +7 -0
- package/dist/money.js +58 -0
- package/dist/money.js.map +7 -0
- package/dist/persist/catalogue.js +206 -2
- package/dist/persist/catalogue.js.map +7 -1
- package/dist/places/client.js +97 -0
- package/dist/places/client.js.map +7 -0
- package/dist/places/error.js +20 -0
- package/dist/places/error.js.map +7 -0
- package/dist/places/index.js +8 -1
- package/dist/places/index.js.map +7 -1
- package/dist/places/request.js +40 -0
- package/dist/places/request.js.map +7 -0
- package/dist/places/sdk.js +10 -0
- package/dist/places/sdk.js.map +7 -0
- package/dist/places/search.js +80 -0
- package/dist/places/search.js.map +7 -0
- package/dist/places/types.js +1 -0
- package/dist/places/types.js.map +7 -0
- package/dist/react/cart.js +30 -0
- package/dist/react/cart.js.map +7 -0
- package/dist/react/hooks.js +91 -0
- package/dist/react/hooks.js.map +7 -0
- package/dist/react/index.js +18 -1
- package/dist/react/index.js.map +7 -1
- package/dist/react/provider.js +34 -0
- package/dist/react/provider.js.map +7 -0
- package/dist/server/index.js +32 -2
- package/dist/server/index.js.map +7 -1
- package/dist/server/storefront-url/build-v1.js +75 -0
- package/dist/server/storefront-url/build-v1.js.map +7 -0
- package/dist/server/storefront-url/build-v2.js +79 -0
- package/dist/server/storefront-url/build-v2.js.map +7 -0
- package/dist/server/storefront-url/build.js +19 -0
- package/dist/server/storefront-url/build.js.map +7 -0
- package/dist/server/storefront-url/contract.js +25 -0
- package/dist/server/storefront-url/contract.js.map +7 -0
- package/dist/server/storefront-url/index.js +16 -0
- package/dist/server/storefront-url/index.js.map +7 -0
- package/dist/server/storefront-url/installation.js +58 -0
- package/dist/server/storefront-url/installation.js.map +7 -0
- package/dist/server/storefront-url/params.js +72 -0
- package/dist/server/storefront-url/params.js.map +7 -0
- package/dist/server/storefront-url/parse-v1.js +135 -0
- package/dist/server/storefront-url/parse-v1.js.map +7 -0
- package/dist/server/storefront-url/parse-v2.js +139 -0
- package/dist/server/storefront-url/parse-v2.js.map +7 -0
- package/dist/server/storefront-url/parse.js +9 -0
- package/dist/server/storefront-url/parse.js.map +7 -0
- package/dist/server/storefront-url/redirect.js +30 -0
- package/dist/server/storefront-url/redirect.js.map +7 -0
- package/dist/server/storefront-url/sign-in.js +17 -0
- package/dist/server/storefront-url/sign-in.js.map +7 -0
- package/dist/server/storefront-url/types.js +55 -0
- package/dist/server/storefront-url/types.js.map +7 -0
- package/dist/server/storefront-url/url.js +61 -0
- package/dist/server/storefront-url/url.js.map +7 -0
- package/dist/server/webhook.js +96 -0
- package/dist/server/webhook.js.map +7 -0
- package/dist/site-config/helpers.js +59 -0
- package/dist/site-config/helpers.js.map +7 -0
- package/dist/site-config/sections.js +105 -0
- package/dist/site-config/sections.js.map +7 -0
- package/dist/site-config/types.js +31 -0
- package/dist/site-config/types.js.map +7 -0
- package/dist/site-config/validate.js +165 -0
- package/dist/site-config/validate.js.map +7 -0
- package/dist/template/index.js +46 -3
- package/dist/template/index.js.map +7 -1
- package/dist/template/react.js +81 -2
- package/dist/template/react.js.map +7 -1
- package/dist/testing/index.js +451 -2
- package/dist/testing/index.js.map +7 -1
- package/dist/transport/category-page.js +21 -2
- package/dist/transport/category-page.js.map +7 -1
- package/dist/transport/mappers.js +326 -0
- package/dist/transport/mappers.js.map +7 -0
- package/dist/transport/rest.js +313 -0
- package/dist/transport/rest.js.map +7 -0
- package/dist/transport/search.js +32 -2
- package/dist/transport/search.js.map +7 -1
- package/dist/transport/selected-menu.js +79 -2
- package/dist/transport/selected-menu.js.map +7 -1
- package/dist/transport/store.js +120 -2
- package/dist/transport/store.js.map +7 -1
- package/dist/transport/types.js +1 -0
- package/dist/transport/types.js.map +7 -0
- package/dist/url/index.js +16 -2
- package/dist/url/index.js.map +7 -1
- package/dist/visits/index.js +62 -1
- package/dist/visits/index.js.map +7 -1
- package/dist/visits/page-views.js +103 -0
- package/dist/visits/page-views.js.map +7 -0
- package/package.json +3 -3
- package/dist/cart/quote.js +0 -1
- package/dist/cart/quote.js.map +0 -1
- package/dist/chunk-I55A5QXJ.js +0 -2
- package/dist/chunk-I55A5QXJ.js.map +0 -1
- package/dist/chunk-LFBQICYU.js +0 -2
- package/dist/chunk-LFBQICYU.js.map +0 -1
package/dist/testing/index.js
CHANGED
|
@@ -1,2 +1,451 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// src/testing/index.ts
|
|
2
|
+
import { estimateUnitPrice } from "../cart/price.js";
|
|
3
|
+
import { validateLine } from "../cart/validate.js";
|
|
4
|
+
import { createZappie } from "../client.js";
|
|
5
|
+
import { ZappieError } from "../errors.js";
|
|
6
|
+
import { delay, throwIfAborted } from "../internal/abort.js";
|
|
7
|
+
import { multiplyMoney } from "../internal/money-math.js";
|
|
8
|
+
import { money } from "../money.js";
|
|
9
|
+
import { VERSION } from "../index.js";
|
|
10
|
+
function createMockZappie(input, opts = {}) {
|
|
11
|
+
const fixtures2 = structuredClone(input);
|
|
12
|
+
const before = async (method, ctx) => {
|
|
13
|
+
throwIfAborted(ctx.signal);
|
|
14
|
+
if (opts.latencyMs) {
|
|
15
|
+
await delay(opts.latencyMs, ctx.signal);
|
|
16
|
+
}
|
|
17
|
+
const code = opts.failWith?.[method];
|
|
18
|
+
if (code) {
|
|
19
|
+
throw new ZappieError(code, `Mock ${method} failure`);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const menu2 = (id) => {
|
|
23
|
+
const value = fixtures2.menus[id];
|
|
24
|
+
if (!value) {
|
|
25
|
+
throw new ZappieError("branch_not_found", "No fixture for this branch");
|
|
26
|
+
}
|
|
27
|
+
return structuredClone(value);
|
|
28
|
+
};
|
|
29
|
+
const transport = {
|
|
30
|
+
async quote(ctx, body) {
|
|
31
|
+
await before("quote", ctx);
|
|
32
|
+
const value = menu2(body.branch_id);
|
|
33
|
+
const branch = fixtures2.store.branches.find(
|
|
34
|
+
(b) => b.id === body.branch_id
|
|
35
|
+
);
|
|
36
|
+
const issues = [];
|
|
37
|
+
const lines = body.lines.map((line) => {
|
|
38
|
+
const item = value.items[line.item_id];
|
|
39
|
+
const input2 = {
|
|
40
|
+
itemId: line.item_id,
|
|
41
|
+
...line.menu_id !== void 0 ? { menuId: line.menu_id } : {},
|
|
42
|
+
quantity: line.quantity,
|
|
43
|
+
choices: line.options.map((c) => ({
|
|
44
|
+
groupId: c.group_id,
|
|
45
|
+
choiceId: c.choice_id,
|
|
46
|
+
quantity: c.quantity
|
|
47
|
+
})),
|
|
48
|
+
inputs: line.inputs,
|
|
49
|
+
...line.variant_id ? { variantId: line.variant_id } : {}
|
|
50
|
+
};
|
|
51
|
+
const invalid = validateLine(item, input2, { menu: value, branch });
|
|
52
|
+
issues.push(
|
|
53
|
+
...invalid.map((i) => ({
|
|
54
|
+
code: i.code,
|
|
55
|
+
severity: i.severity,
|
|
56
|
+
message: i.message,
|
|
57
|
+
line_id: line.line_id,
|
|
58
|
+
...i.groupId ? { group_id: i.groupId } : {},
|
|
59
|
+
fixes: []
|
|
60
|
+
}))
|
|
61
|
+
);
|
|
62
|
+
const price = item && !invalid.length ? estimateUnitPrice(item, input2) : money(0, fixtures2.store.currency);
|
|
63
|
+
return {
|
|
64
|
+
line_id: line.line_id,
|
|
65
|
+
unit_price: {
|
|
66
|
+
amount_minor: price.amountMinor,
|
|
67
|
+
currency: price.currency
|
|
68
|
+
},
|
|
69
|
+
line_total: {
|
|
70
|
+
amount_minor: multiplyMoney(price, line.quantity).amountMinor,
|
|
71
|
+
currency: price.currency
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
const subtotal = {
|
|
76
|
+
amount_minor: lines.reduce((n, l) => n + l.line_total.amount_minor, 0),
|
|
77
|
+
currency: fixtures2.store.currency
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
branch_id: body.branch_id,
|
|
81
|
+
lines,
|
|
82
|
+
subtotal,
|
|
83
|
+
total: subtotal,
|
|
84
|
+
charges: [],
|
|
85
|
+
discounts: [],
|
|
86
|
+
issues,
|
|
87
|
+
can_checkout: !issues.some((issue) => issue.severity === "blocking"),
|
|
88
|
+
checkout: issues.some((issue) => issue.severity === "blocking") ? { ready: false, reason: "issues" } : { ready: true },
|
|
89
|
+
menu_version: value.version,
|
|
90
|
+
expires_at: new Date(Date.now() + 3e5).toISOString()
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
async getStore(ctx) {
|
|
94
|
+
await before("getStore", ctx);
|
|
95
|
+
return structuredClone(fixtures2.store);
|
|
96
|
+
},
|
|
97
|
+
async getMenu(ctx) {
|
|
98
|
+
await before("getMenu", ctx);
|
|
99
|
+
const value = menu2(ctx.branchId);
|
|
100
|
+
return ctx.ifNoneMatch === value.version ? { notModified: true } : { menu: value, etag: value.version };
|
|
101
|
+
},
|
|
102
|
+
async getMenuVersion(ctx) {
|
|
103
|
+
await before("getMenuVersion", ctx);
|
|
104
|
+
const value = menu2(ctx.branchId);
|
|
105
|
+
return { version: value.version, availabilityHash: value.version };
|
|
106
|
+
},
|
|
107
|
+
async getItem(ctx) {
|
|
108
|
+
await before("getItem", ctx);
|
|
109
|
+
const value = menu2(ctx.branchId).items[ctx.itemId];
|
|
110
|
+
if (!value) {
|
|
111
|
+
throw new ZappieError("item_not_found", "Item not found");
|
|
112
|
+
}
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
return createZappie({
|
|
117
|
+
store: fixtures2.store.slug,
|
|
118
|
+
key: "pk_test_fixture",
|
|
119
|
+
transport
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
var fulfilment = {
|
|
123
|
+
pickup: true,
|
|
124
|
+
delivery: true,
|
|
125
|
+
dineIn: false,
|
|
126
|
+
scheduling: false
|
|
127
|
+
};
|
|
128
|
+
var store = {
|
|
129
|
+
id: "biz_fixture",
|
|
130
|
+
slug: "default-store",
|
|
131
|
+
name: "Default storefront",
|
|
132
|
+
currency: "NGN",
|
|
133
|
+
timezone: "Africa/Lagos",
|
|
134
|
+
brand: {},
|
|
135
|
+
fulfilment,
|
|
136
|
+
paymentMethods: ["card"],
|
|
137
|
+
branches: [
|
|
138
|
+
{
|
|
139
|
+
id: "br_fixture",
|
|
140
|
+
slug: "main",
|
|
141
|
+
name: "Main",
|
|
142
|
+
openingTimes: [{ day: 1, opens: "08:00", closes: "22:00" }],
|
|
143
|
+
isOpen: true,
|
|
144
|
+
fulfilment
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
};
|
|
148
|
+
var menu = {
|
|
149
|
+
id: "menu_fixture",
|
|
150
|
+
branchId: "br_fixture",
|
|
151
|
+
name: "Menu",
|
|
152
|
+
version: "fixture-v1",
|
|
153
|
+
categories: [{ id: "cat_fixture", name: "Food", itemIds: ["item_fixture"] }],
|
|
154
|
+
items: {
|
|
155
|
+
item_fixture: {
|
|
156
|
+
id: "item_fixture",
|
|
157
|
+
name: "Lunch",
|
|
158
|
+
images: [],
|
|
159
|
+
price: money(65e4, "NGN"),
|
|
160
|
+
isAvailable: true,
|
|
161
|
+
quantity: { min: 1, step: 1 },
|
|
162
|
+
variants: [
|
|
163
|
+
{
|
|
164
|
+
id: "variant_fixture",
|
|
165
|
+
attributeChoices: {},
|
|
166
|
+
price: money(65e4, "NGN"),
|
|
167
|
+
isAvailable: true
|
|
168
|
+
}
|
|
169
|
+
],
|
|
170
|
+
optionGroups: [],
|
|
171
|
+
tags: []
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
var ngn = (amountMinor) => money(amountMinor, "NGN");
|
|
176
|
+
var templateStore = {
|
|
177
|
+
id: "biz_template",
|
|
178
|
+
slug: "default-template",
|
|
179
|
+
name: "Default template",
|
|
180
|
+
description: "A public storefront fixture for template authors.",
|
|
181
|
+
templateSettings: {
|
|
182
|
+
accent: "#175c3a",
|
|
183
|
+
headerPhoto: "https://example.com/default-template-cover.png"
|
|
184
|
+
},
|
|
185
|
+
currency: "NGN",
|
|
186
|
+
timezone: "Africa/Lagos",
|
|
187
|
+
brand: {
|
|
188
|
+
logoUrl: "https://example.com/default-template-logo.png",
|
|
189
|
+
coverImageUrl: "https://example.com/default-template-cover.png"
|
|
190
|
+
},
|
|
191
|
+
fulfilment: { pickup: true, delivery: true, dineIn: true, scheduling: true },
|
|
192
|
+
paymentMethods: ["card", "bank_transfer", "wallet"],
|
|
193
|
+
branches: [
|
|
194
|
+
{
|
|
195
|
+
id: "br_template_main",
|
|
196
|
+
slug: "main",
|
|
197
|
+
name: "Main",
|
|
198
|
+
timezone: "Africa/Lagos",
|
|
199
|
+
address: "1 Example Street, Lagos",
|
|
200
|
+
phone: "+234 800 000 0000",
|
|
201
|
+
pickupAddress: {
|
|
202
|
+
placeId: "place_template_main",
|
|
203
|
+
coordinates: { lat: 6.5244, lng: 3.3792 }
|
|
204
|
+
},
|
|
205
|
+
socialLinks: [
|
|
206
|
+
{ type: "INSTAGRAM", url: "https://instagram.com/default-template" },
|
|
207
|
+
{ type: "WEBSITE", url: "https://example.com" }
|
|
208
|
+
],
|
|
209
|
+
openingTimes: [1, 2, 3, 4, 5].map((day) => ({
|
|
210
|
+
day,
|
|
211
|
+
opens: "08:00",
|
|
212
|
+
closes: "22:00"
|
|
213
|
+
})),
|
|
214
|
+
isOpen: true,
|
|
215
|
+
isDefault: true,
|
|
216
|
+
fulfilment: {
|
|
217
|
+
pickup: true,
|
|
218
|
+
delivery: true,
|
|
219
|
+
dineIn: true,
|
|
220
|
+
scheduling: true
|
|
221
|
+
},
|
|
222
|
+
minimumOrder: ngn(2e5)
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
id: "br_template_island",
|
|
226
|
+
slug: "island",
|
|
227
|
+
name: "Island",
|
|
228
|
+
timezone: "Africa/Lagos",
|
|
229
|
+
openingTimes: [{ day: 6, opens: "10:00", closes: "18:00" }],
|
|
230
|
+
specialHours: [{ date: "2026-12-25", closed: true }],
|
|
231
|
+
isOpen: false,
|
|
232
|
+
closedUntil: "2026-12-26T10:00:00+01:00",
|
|
233
|
+
fulfilment: {
|
|
234
|
+
pickup: false,
|
|
235
|
+
delivery: true,
|
|
236
|
+
dineIn: false,
|
|
237
|
+
scheduling: false
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
};
|
|
242
|
+
var templateMenu = {
|
|
243
|
+
id: "menu_template",
|
|
244
|
+
branchId: "br_template_main",
|
|
245
|
+
name: "All day",
|
|
246
|
+
version: "template-v1",
|
|
247
|
+
categories: [
|
|
248
|
+
{
|
|
249
|
+
id: "cat_popular",
|
|
250
|
+
name: "Popular",
|
|
251
|
+
itemIds: ["item_jollof", "item_zobo"]
|
|
252
|
+
},
|
|
253
|
+
{ id: "cat_mains", name: "Mains", itemIds: ["item_jollof"] },
|
|
254
|
+
{
|
|
255
|
+
id: "cat_drinks",
|
|
256
|
+
name: "Drinks and desserts",
|
|
257
|
+
itemIds: ["item_zobo", "item_cake"]
|
|
258
|
+
}
|
|
259
|
+
],
|
|
260
|
+
items: {
|
|
261
|
+
item_jollof: {
|
|
262
|
+
id: "item_jollof",
|
|
263
|
+
name: "Jollof rice",
|
|
264
|
+
description: "Smoky party jollof.",
|
|
265
|
+
images: [],
|
|
266
|
+
price: ngn(45e4),
|
|
267
|
+
isAvailable: true,
|
|
268
|
+
quantity: { min: 1, max: 10, step: 1 },
|
|
269
|
+
variants: [
|
|
270
|
+
{
|
|
271
|
+
id: "variant_jollof",
|
|
272
|
+
attributeChoices: {},
|
|
273
|
+
price: ngn(45e4),
|
|
274
|
+
isAvailable: true
|
|
275
|
+
}
|
|
276
|
+
],
|
|
277
|
+
optionGroups: [
|
|
278
|
+
{
|
|
279
|
+
id: "grp_protein",
|
|
280
|
+
name: "Protein",
|
|
281
|
+
kind: "select",
|
|
282
|
+
required: true,
|
|
283
|
+
selection: { min: 1, max: 1 },
|
|
284
|
+
isAttribute: false,
|
|
285
|
+
choices: [
|
|
286
|
+
{
|
|
287
|
+
id: "opt_chicken",
|
|
288
|
+
name: "Chicken",
|
|
289
|
+
price: ngn(0),
|
|
290
|
+
isAvailable: true
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
id: "opt_beef",
|
|
294
|
+
name: "Beef",
|
|
295
|
+
price: ngn(5e4),
|
|
296
|
+
isAvailable: true
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
id: "opt_fish",
|
|
300
|
+
name: "Fish",
|
|
301
|
+
price: ngn(8e4),
|
|
302
|
+
isAvailable: false
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
id: "grp_sauce",
|
|
308
|
+
name: "Sauce",
|
|
309
|
+
helpText: "Required with chicken.",
|
|
310
|
+
kind: "select",
|
|
311
|
+
required: false,
|
|
312
|
+
selection: { min: 0, max: 1 },
|
|
313
|
+
isAttribute: false,
|
|
314
|
+
choices: [
|
|
315
|
+
{
|
|
316
|
+
id: "opt_pepper",
|
|
317
|
+
name: "Pepper sauce",
|
|
318
|
+
price: ngn(0),
|
|
319
|
+
isAvailable: true
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
id: "opt_stew",
|
|
323
|
+
name: "Stew",
|
|
324
|
+
price: ngn(2e4),
|
|
325
|
+
isAvailable: true
|
|
326
|
+
}
|
|
327
|
+
],
|
|
328
|
+
conditions: [
|
|
329
|
+
{
|
|
330
|
+
groupId: "grp_protein",
|
|
331
|
+
choiceIds: ["opt_chicken"],
|
|
332
|
+
match: "any",
|
|
333
|
+
setRequired: true,
|
|
334
|
+
setMin: 1
|
|
335
|
+
}
|
|
336
|
+
]
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
id: "grp_extras",
|
|
340
|
+
name: "Extras",
|
|
341
|
+
kind: "select",
|
|
342
|
+
required: false,
|
|
343
|
+
selection: { min: 0, max: 3 },
|
|
344
|
+
isAttribute: false,
|
|
345
|
+
choices: [
|
|
346
|
+
{
|
|
347
|
+
id: "opt_plantain",
|
|
348
|
+
name: "Plantain",
|
|
349
|
+
price: ngn(3e4),
|
|
350
|
+
isAvailable: true,
|
|
351
|
+
quantity: { min: 1, max: 3 }
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
id: "opt_egg",
|
|
355
|
+
name: "Boiled egg",
|
|
356
|
+
price: ngn(15e3),
|
|
357
|
+
isAvailable: true
|
|
358
|
+
}
|
|
359
|
+
]
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
id: "grp_note",
|
|
363
|
+
name: "Note for the kitchen",
|
|
364
|
+
kind: "text",
|
|
365
|
+
required: false,
|
|
366
|
+
selection: { min: 0 },
|
|
367
|
+
isAttribute: false,
|
|
368
|
+
choices: [],
|
|
369
|
+
input: { maxLength: 140, placeholder: "No onions, please" }
|
|
370
|
+
}
|
|
371
|
+
],
|
|
372
|
+
tags: ["popular"]
|
|
373
|
+
},
|
|
374
|
+
item_zobo: {
|
|
375
|
+
id: "item_zobo",
|
|
376
|
+
name: "Zobo",
|
|
377
|
+
images: [],
|
|
378
|
+
price: ngn(12e4),
|
|
379
|
+
isAvailable: true,
|
|
380
|
+
quantity: { min: 1, step: 1 },
|
|
381
|
+
variants: [
|
|
382
|
+
{
|
|
383
|
+
id: "variant_zobo_small",
|
|
384
|
+
attributeChoices: { grp_size: "opt_small" },
|
|
385
|
+
price: ngn(12e4),
|
|
386
|
+
isAvailable: true
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
id: "variant_zobo_large",
|
|
390
|
+
attributeChoices: { grp_size: "opt_large" },
|
|
391
|
+
price: ngn(2e5),
|
|
392
|
+
isAvailable: false
|
|
393
|
+
}
|
|
394
|
+
],
|
|
395
|
+
optionGroups: [
|
|
396
|
+
{
|
|
397
|
+
id: "grp_size",
|
|
398
|
+
name: "Size",
|
|
399
|
+
kind: "select",
|
|
400
|
+
required: true,
|
|
401
|
+
selection: { min: 1, max: 1 },
|
|
402
|
+
isAttribute: true,
|
|
403
|
+
choices: [
|
|
404
|
+
{
|
|
405
|
+
id: "opt_small",
|
|
406
|
+
name: "Small",
|
|
407
|
+
price: ngn(0),
|
|
408
|
+
isAvailable: true
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
id: "opt_large",
|
|
412
|
+
name: "Large",
|
|
413
|
+
price: ngn(0),
|
|
414
|
+
isAvailable: false
|
|
415
|
+
}
|
|
416
|
+
]
|
|
417
|
+
}
|
|
418
|
+
],
|
|
419
|
+
tags: []
|
|
420
|
+
},
|
|
421
|
+
item_cake: {
|
|
422
|
+
id: "item_cake",
|
|
423
|
+
name: "Chocolate cake",
|
|
424
|
+
images: [],
|
|
425
|
+
price: ngn(35e4),
|
|
426
|
+
compareAtPrice: ngn(4e5),
|
|
427
|
+
isAvailable: false,
|
|
428
|
+
quantity: { min: 1, step: 1 },
|
|
429
|
+
variants: [
|
|
430
|
+
{
|
|
431
|
+
id: "variant_cake",
|
|
432
|
+
attributeChoices: {},
|
|
433
|
+
price: ngn(35e4),
|
|
434
|
+
isAvailable: false
|
|
435
|
+
}
|
|
436
|
+
],
|
|
437
|
+
optionGroups: [],
|
|
438
|
+
tags: []
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
var fixtures = {
|
|
443
|
+
minimal: { store, menu },
|
|
444
|
+
defaultTemplate: { store: templateStore, menu: templateMenu }
|
|
445
|
+
};
|
|
446
|
+
export {
|
|
447
|
+
VERSION,
|
|
448
|
+
createMockZappie,
|
|
449
|
+
fixtures
|
|
450
|
+
};
|
|
451
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/testing/index.ts"],"names":["createMockZappie","input","opts","fixtures","before","method","ctx","throwIfAborted","delay","code","ZappieError","menu","id","value","transport","body","branch","b","issues","lines","line","item","c","invalid","validateLine","i","price","estimateUnitPrice","money","multiplyMoney","subtotal","n","issue","createZappie","fulfilment","store","ngn","amountMinor","templateStore","day","templateMenu"],"mappings":"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","file":"index.js","sourcesContent":["import { estimateUnitPrice } from \"../cart/price\";\nimport type { WireQuote } from \"../cart/types\";\nimport { validateLine } from \"../cart/validate\";\nimport { createZappie } from \"../client\";\nimport type { ZappieErrorCode } from \"../errors\";\nimport { ZappieError } from \"../errors\";\nimport { delay, throwIfAborted } from \"../internal/abort\";\nimport { multiplyMoney } from \"../internal/money-math\";\nimport type { Menu, Store } from \"../models\";\nimport { money } from \"../money\";\nimport type { RequestCtx, Transport } from \"../transport/types\";\nexport { VERSION } from \"../index\";\n/** Store and branch menus supplied to the deterministic mock transport. */\nexport type MockFixtures = { store: Store; menus: Record<string, Menu> };\n/** Mock timing and per-operation failures. */\nexport type MockOptions = {\n latencyMs?: number;\n failWith?: Partial<Record<keyof Transport, ZappieErrorCode>>;\n};\n/** Create an isolated in-memory SDK client without making network requests. */\nexport function createMockZappie(input: MockFixtures, opts: MockOptions = {}) {\n const fixtures = structuredClone(input);\n const before = async (method: keyof Transport, ctx: RequestCtx) => {\n throwIfAborted(ctx.signal);\n if (opts.latencyMs) {\n await delay(opts.latencyMs, ctx.signal);\n }\n const code = opts.failWith?.[method];\n if (code) {\n throw new ZappieError(code, `Mock ${method} failure`);\n }\n };\n const menu = (id: string) => {\n const value = fixtures.menus[id];\n if (!value) {\n throw new ZappieError(\"branch_not_found\", \"No fixture for this branch\");\n }\n return structuredClone(value);\n };\n const transport: Transport = {\n async quote(ctx, body): Promise<WireQuote> {\n await before(\"quote\", ctx);\n const value = menu(body.branch_id);\n const branch = fixtures.store.branches.find(\n (b) => b.id === body.branch_id,\n )!;\n const issues: WireQuote[\"issues\"] = [];\n const lines = body.lines.map((line) => {\n const item = value.items[line.item_id];\n const input = {\n itemId: line.item_id,\n ...(line.menu_id !== undefined ? { menuId: line.menu_id } : {}),\n quantity: line.quantity,\n choices: line.options.map((c) => ({\n groupId: c.group_id,\n choiceId: c.choice_id,\n quantity: c.quantity,\n })),\n inputs: line.inputs,\n ...(line.variant_id ? { variantId: line.variant_id } : {}),\n };\n const invalid = validateLine(item, input, { menu: value, branch });\n issues.push(\n ...invalid.map((i) => ({\n code: i.code,\n severity: i.severity,\n message: i.message,\n line_id: line.line_id,\n ...(i.groupId ? { group_id: i.groupId } : {}),\n fixes: [],\n })),\n );\n const price =\n item && !invalid.length\n ? estimateUnitPrice(item, input)\n : money(0, fixtures.store.currency);\n return {\n line_id: line.line_id,\n unit_price: {\n amount_minor: price.amountMinor,\n currency: price.currency,\n },\n line_total: {\n amount_minor: multiplyMoney(price, line.quantity).amountMinor,\n currency: price.currency,\n },\n };\n });\n const subtotal = {\n amount_minor: lines.reduce((n, l) => n + l.line_total.amount_minor, 0),\n currency: fixtures.store.currency,\n };\n return {\n branch_id: body.branch_id,\n lines,\n subtotal,\n total: subtotal,\n charges: [],\n discounts: [],\n issues,\n can_checkout: !issues.some((issue) => issue.severity === \"blocking\"),\n checkout: issues.some((issue) => issue.severity === \"blocking\")\n ? { ready: false, reason: \"issues\" }\n : { ready: true },\n menu_version: value.version,\n expires_at: new Date(Date.now() + 300_000).toISOString(),\n };\n },\n async getStore(ctx) {\n await before(\"getStore\", ctx);\n return structuredClone(fixtures.store);\n },\n async getMenu(ctx) {\n await before(\"getMenu\", ctx);\n const value = menu(ctx.branchId);\n return ctx.ifNoneMatch === value.version\n ? { notModified: true }\n : { menu: value, etag: value.version };\n },\n async getMenuVersion(ctx) {\n await before(\"getMenuVersion\", ctx);\n const value = menu(ctx.branchId);\n return { version: value.version, availabilityHash: value.version };\n },\n async getItem(ctx) {\n await before(\"getItem\", ctx);\n const value = menu(ctx.branchId).items[ctx.itemId];\n if (!value) {\n throw new ZappieError(\"item_not_found\", \"Item not found\");\n }\n return value;\n },\n };\n return createZappie({\n store: fixtures.store.slug,\n key: \"pk_test_fixture\",\n transport,\n });\n}\nconst fulfilment = {\n pickup: true,\n delivery: true,\n dineIn: false,\n scheduling: false,\n};\nconst store: Store = {\n id: \"biz_fixture\",\n slug: \"default-store\",\n name: \"Default storefront\",\n currency: \"NGN\",\n timezone: \"Africa/Lagos\",\n brand: {},\n fulfilment,\n paymentMethods: [\"card\"],\n branches: [\n {\n id: \"br_fixture\",\n slug: \"main\",\n name: \"Main\",\n openingTimes: [{ day: 1, opens: \"08:00\", closes: \"22:00\" }],\n isOpen: true,\n fulfilment,\n },\n ],\n};\nconst menu: Menu = {\n id: \"menu_fixture\",\n branchId: \"br_fixture\",\n name: \"Menu\",\n version: \"fixture-v1\",\n categories: [{ id: \"cat_fixture\", name: \"Food\", itemIds: [\"item_fixture\"] }],\n items: {\n item_fixture: {\n id: \"item_fixture\",\n name: \"Lunch\",\n images: [],\n price: money(650000, \"NGN\"),\n isAvailable: true,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_fixture\",\n attributeChoices: {},\n price: money(650000, \"NGN\"),\n isAvailable: true,\n },\n ],\n optionGroups: [],\n tags: [],\n },\n },\n};\nconst ngn = (amountMinor: number) => money(amountMinor, \"NGN\");\nconst templateStore: Store = {\n id: \"biz_template\",\n slug: \"default-template\",\n name: \"Default template\",\n description: \"A public storefront fixture for template authors.\",\n templateSettings: {\n accent: \"#175c3a\",\n headerPhoto: \"https://example.com/default-template-cover.png\",\n },\n currency: \"NGN\",\n timezone: \"Africa/Lagos\",\n brand: {\n logoUrl: \"https://example.com/default-template-logo.png\",\n coverImageUrl: \"https://example.com/default-template-cover.png\",\n },\n fulfilment: { pickup: true, delivery: true, dineIn: true, scheduling: true },\n paymentMethods: [\"card\", \"bank_transfer\", \"wallet\"],\n branches: [\n {\n id: \"br_template_main\",\n slug: \"main\",\n name: \"Main\",\n timezone: \"Africa/Lagos\",\n address: \"1 Example Street, Lagos\",\n phone: \"+234 800 000 0000\",\n pickupAddress: {\n placeId: \"place_template_main\",\n coordinates: { lat: 6.5244, lng: 3.3792 },\n },\n socialLinks: [\n { type: \"INSTAGRAM\", url: \"https://instagram.com/default-template\" },\n { type: \"WEBSITE\", url: \"https://example.com\" },\n ],\n openingTimes: [1, 2, 3, 4, 5].map((day) => ({\n day: day as 1 | 2 | 3 | 4 | 5,\n opens: \"08:00\",\n closes: \"22:00\",\n })),\n isOpen: true,\n isDefault: true,\n fulfilment: {\n pickup: true,\n delivery: true,\n dineIn: true,\n scheduling: true,\n },\n minimumOrder: ngn(200000),\n },\n {\n id: \"br_template_island\",\n slug: \"island\",\n name: \"Island\",\n timezone: \"Africa/Lagos\",\n openingTimes: [{ day: 6, opens: \"10:00\", closes: \"18:00\" }],\n specialHours: [{ date: \"2026-12-25\", closed: true }],\n isOpen: false,\n closedUntil: \"2026-12-26T10:00:00+01:00\",\n fulfilment: {\n pickup: false,\n delivery: true,\n dineIn: false,\n scheduling: false,\n },\n },\n ],\n};\nconst templateMenu: Menu = {\n id: \"menu_template\",\n branchId: \"br_template_main\",\n name: \"All day\",\n version: \"template-v1\",\n categories: [\n {\n id: \"cat_popular\",\n name: \"Popular\",\n itemIds: [\"item_jollof\", \"item_zobo\"],\n },\n { id: \"cat_mains\", name: \"Mains\", itemIds: [\"item_jollof\"] },\n {\n id: \"cat_drinks\",\n name: \"Drinks and desserts\",\n itemIds: [\"item_zobo\", \"item_cake\"],\n },\n ],\n items: {\n item_jollof: {\n id: \"item_jollof\",\n name: \"Jollof rice\",\n description: \"Smoky party jollof.\",\n images: [],\n price: ngn(450000),\n isAvailable: true,\n quantity: { min: 1, max: 10, step: 1 },\n variants: [\n {\n id: \"variant_jollof\",\n attributeChoices: {},\n price: ngn(450000),\n isAvailable: true,\n },\n ],\n optionGroups: [\n {\n id: \"grp_protein\",\n name: \"Protein\",\n kind: \"select\",\n required: true,\n selection: { min: 1, max: 1 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_chicken\",\n name: \"Chicken\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_beef\",\n name: \"Beef\",\n price: ngn(50000),\n isAvailable: true,\n },\n {\n id: \"opt_fish\",\n name: \"Fish\",\n price: ngn(80000),\n isAvailable: false,\n },\n ],\n },\n {\n id: \"grp_sauce\",\n name: \"Sauce\",\n helpText: \"Required with chicken.\",\n kind: \"select\",\n required: false,\n selection: { min: 0, max: 1 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_pepper\",\n name: \"Pepper sauce\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_stew\",\n name: \"Stew\",\n price: ngn(20000),\n isAvailable: true,\n },\n ],\n conditions: [\n {\n groupId: \"grp_protein\",\n choiceIds: [\"opt_chicken\"],\n match: \"any\",\n setRequired: true,\n setMin: 1,\n },\n ],\n },\n {\n id: \"grp_extras\",\n name: \"Extras\",\n kind: \"select\",\n required: false,\n selection: { min: 0, max: 3 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_plantain\",\n name: \"Plantain\",\n price: ngn(30000),\n isAvailable: true,\n quantity: { min: 1, max: 3 },\n },\n {\n id: \"opt_egg\",\n name: \"Boiled egg\",\n price: ngn(15000),\n isAvailable: true,\n },\n ],\n },\n {\n id: \"grp_note\",\n name: \"Note for the kitchen\",\n kind: \"text\",\n required: false,\n selection: { min: 0 },\n isAttribute: false,\n choices: [],\n input: { maxLength: 140, placeholder: \"No onions, please\" },\n },\n ],\n tags: [\"popular\"],\n },\n item_zobo: {\n id: \"item_zobo\",\n name: \"Zobo\",\n images: [],\n price: ngn(120000),\n isAvailable: true,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_zobo_small\",\n attributeChoices: { grp_size: \"opt_small\" },\n price: ngn(120000),\n isAvailable: true,\n },\n {\n id: \"variant_zobo_large\",\n attributeChoices: { grp_size: \"opt_large\" },\n price: ngn(200000),\n isAvailable: false,\n },\n ],\n optionGroups: [\n {\n id: \"grp_size\",\n name: \"Size\",\n kind: \"select\",\n required: true,\n selection: { min: 1, max: 1 },\n isAttribute: true,\n choices: [\n {\n id: \"opt_small\",\n name: \"Small\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_large\",\n name: \"Large\",\n price: ngn(0),\n isAvailable: false,\n },\n ],\n },\n ],\n tags: [],\n },\n item_cake: {\n id: \"item_cake\",\n name: \"Chocolate cake\",\n images: [],\n price: ngn(350000),\n compareAtPrice: ngn(400000),\n isAvailable: false,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_cake\",\n attributeChoices: {},\n price: ngn(350000),\n isAvailable: false,\n },\n ],\n optionGroups: [],\n tags: [],\n },\n },\n};\n/**\n * Sample data with no merchant IDs or photos. `minimal` has one plain item.\n * `defaultTemplate` covers several branches, shared category membership, required and\n * conditional options, per-choice quantities, text input and attribute variants.\n */\nexport const fixtures = {\n minimal: { store, menu },\n defaultTemplate: { store: templateStore, menu: templateMenu },\n};\n"]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/testing/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { estimateUnitPrice } from \"../cart/price\";\nimport type { WireQuote } from \"../cart/types\";\nimport { validateLine } from \"../cart/validate\";\nimport { createZappie } from \"../client\";\nimport type { ZappieErrorCode } from \"../errors\";\nimport { ZappieError } from \"../errors\";\nimport { delay, throwIfAborted } from \"../internal/abort\";\nimport { multiplyMoney } from \"../internal/money-math\";\nimport type { Menu, Store } from \"../models\";\nimport { money } from \"../money\";\nimport type { RequestCtx, Transport } from \"../transport/types\";\nexport { VERSION } from \"../index\";\n/** Store and branch menus supplied to the deterministic mock transport. */\nexport type MockFixtures = { store: Store; menus: Record<string, Menu> };\n/** Mock timing and per-operation failures. */\nexport type MockOptions = {\n latencyMs?: number;\n failWith?: Partial<Record<keyof Transport, ZappieErrorCode>>;\n};\n/** Create an isolated in-memory SDK client without making network requests. */\nexport function createMockZappie(input: MockFixtures, opts: MockOptions = {}) {\n const fixtures = structuredClone(input);\n const before = async (method: keyof Transport, ctx: RequestCtx) => {\n throwIfAborted(ctx.signal);\n if (opts.latencyMs) {\n await delay(opts.latencyMs, ctx.signal);\n }\n const code = opts.failWith?.[method];\n if (code) {\n throw new ZappieError(code, `Mock ${method} failure`);\n }\n };\n const menu = (id: string) => {\n const value = fixtures.menus[id];\n if (!value) {\n throw new ZappieError(\"branch_not_found\", \"No fixture for this branch\");\n }\n return structuredClone(value);\n };\n const transport: Transport = {\n async quote(ctx, body): Promise<WireQuote> {\n await before(\"quote\", ctx);\n const value = menu(body.branch_id);\n const branch = fixtures.store.branches.find(\n (b) => b.id === body.branch_id,\n )!;\n const issues: WireQuote[\"issues\"] = [];\n const lines = body.lines.map((line) => {\n const item = value.items[line.item_id];\n const input = {\n itemId: line.item_id,\n ...(line.menu_id !== undefined ? { menuId: line.menu_id } : {}),\n quantity: line.quantity,\n choices: line.options.map((c) => ({\n groupId: c.group_id,\n choiceId: c.choice_id,\n quantity: c.quantity,\n })),\n inputs: line.inputs,\n ...(line.variant_id ? { variantId: line.variant_id } : {}),\n };\n const invalid = validateLine(item, input, { menu: value, branch });\n issues.push(\n ...invalid.map((i) => ({\n code: i.code,\n severity: i.severity,\n message: i.message,\n line_id: line.line_id,\n ...(i.groupId ? { group_id: i.groupId } : {}),\n fixes: [],\n })),\n );\n const price =\n item && !invalid.length\n ? estimateUnitPrice(item, input)\n : money(0, fixtures.store.currency);\n return {\n line_id: line.line_id,\n unit_price: {\n amount_minor: price.amountMinor,\n currency: price.currency,\n },\n line_total: {\n amount_minor: multiplyMoney(price, line.quantity).amountMinor,\n currency: price.currency,\n },\n };\n });\n const subtotal = {\n amount_minor: lines.reduce((n, l) => n + l.line_total.amount_minor, 0),\n currency: fixtures.store.currency,\n };\n return {\n branch_id: body.branch_id,\n lines,\n subtotal,\n total: subtotal,\n charges: [],\n discounts: [],\n issues,\n can_checkout: !issues.some((issue) => issue.severity === \"blocking\"),\n checkout: issues.some((issue) => issue.severity === \"blocking\")\n ? { ready: false, reason: \"issues\" }\n : { ready: true },\n menu_version: value.version,\n expires_at: new Date(Date.now() + 300_000).toISOString(),\n };\n },\n async getStore(ctx) {\n await before(\"getStore\", ctx);\n return structuredClone(fixtures.store);\n },\n async getMenu(ctx) {\n await before(\"getMenu\", ctx);\n const value = menu(ctx.branchId);\n return ctx.ifNoneMatch === value.version\n ? { notModified: true }\n : { menu: value, etag: value.version };\n },\n async getMenuVersion(ctx) {\n await before(\"getMenuVersion\", ctx);\n const value = menu(ctx.branchId);\n return { version: value.version, availabilityHash: value.version };\n },\n async getItem(ctx) {\n await before(\"getItem\", ctx);\n const value = menu(ctx.branchId).items[ctx.itemId];\n if (!value) {\n throw new ZappieError(\"item_not_found\", \"Item not found\");\n }\n return value;\n },\n };\n return createZappie({\n store: fixtures.store.slug,\n key: \"pk_test_fixture\",\n transport,\n });\n}\nconst fulfilment = {\n pickup: true,\n delivery: true,\n dineIn: false,\n scheduling: false,\n};\nconst store: Store = {\n id: \"biz_fixture\",\n slug: \"default-store\",\n name: \"Default storefront\",\n currency: \"NGN\",\n timezone: \"Africa/Lagos\",\n brand: {},\n fulfilment,\n paymentMethods: [\"card\"],\n branches: [\n {\n id: \"br_fixture\",\n slug: \"main\",\n name: \"Main\",\n openingTimes: [{ day: 1, opens: \"08:00\", closes: \"22:00\" }],\n isOpen: true,\n fulfilment,\n },\n ],\n};\nconst menu: Menu = {\n id: \"menu_fixture\",\n branchId: \"br_fixture\",\n name: \"Menu\",\n version: \"fixture-v1\",\n categories: [{ id: \"cat_fixture\", name: \"Food\", itemIds: [\"item_fixture\"] }],\n items: {\n item_fixture: {\n id: \"item_fixture\",\n name: \"Lunch\",\n images: [],\n price: money(650000, \"NGN\"),\n isAvailable: true,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_fixture\",\n attributeChoices: {},\n price: money(650000, \"NGN\"),\n isAvailable: true,\n },\n ],\n optionGroups: [],\n tags: [],\n },\n },\n};\nconst ngn = (amountMinor: number) => money(amountMinor, \"NGN\");\nconst templateStore: Store = {\n id: \"biz_template\",\n slug: \"default-template\",\n name: \"Default template\",\n description: \"A public storefront fixture for template authors.\",\n templateSettings: {\n accent: \"#175c3a\",\n headerPhoto: \"https://example.com/default-template-cover.png\",\n },\n currency: \"NGN\",\n timezone: \"Africa/Lagos\",\n brand: {\n logoUrl: \"https://example.com/default-template-logo.png\",\n coverImageUrl: \"https://example.com/default-template-cover.png\",\n },\n fulfilment: { pickup: true, delivery: true, dineIn: true, scheduling: true },\n paymentMethods: [\"card\", \"bank_transfer\", \"wallet\"],\n branches: [\n {\n id: \"br_template_main\",\n slug: \"main\",\n name: \"Main\",\n timezone: \"Africa/Lagos\",\n address: \"1 Example Street, Lagos\",\n phone: \"+234 800 000 0000\",\n pickupAddress: {\n placeId: \"place_template_main\",\n coordinates: { lat: 6.5244, lng: 3.3792 },\n },\n socialLinks: [\n { type: \"INSTAGRAM\", url: \"https://instagram.com/default-template\" },\n { type: \"WEBSITE\", url: \"https://example.com\" },\n ],\n openingTimes: [1, 2, 3, 4, 5].map((day) => ({\n day: day as 1 | 2 | 3 | 4 | 5,\n opens: \"08:00\",\n closes: \"22:00\",\n })),\n isOpen: true,\n isDefault: true,\n fulfilment: {\n pickup: true,\n delivery: true,\n dineIn: true,\n scheduling: true,\n },\n minimumOrder: ngn(200000),\n },\n {\n id: \"br_template_island\",\n slug: \"island\",\n name: \"Island\",\n timezone: \"Africa/Lagos\",\n openingTimes: [{ day: 6, opens: \"10:00\", closes: \"18:00\" }],\n specialHours: [{ date: \"2026-12-25\", closed: true }],\n isOpen: false,\n closedUntil: \"2026-12-26T10:00:00+01:00\",\n fulfilment: {\n pickup: false,\n delivery: true,\n dineIn: false,\n scheduling: false,\n },\n },\n ],\n};\nconst templateMenu: Menu = {\n id: \"menu_template\",\n branchId: \"br_template_main\",\n name: \"All day\",\n version: \"template-v1\",\n categories: [\n {\n id: \"cat_popular\",\n name: \"Popular\",\n itemIds: [\"item_jollof\", \"item_zobo\"],\n },\n { id: \"cat_mains\", name: \"Mains\", itemIds: [\"item_jollof\"] },\n {\n id: \"cat_drinks\",\n name: \"Drinks and desserts\",\n itemIds: [\"item_zobo\", \"item_cake\"],\n },\n ],\n items: {\n item_jollof: {\n id: \"item_jollof\",\n name: \"Jollof rice\",\n description: \"Smoky party jollof.\",\n images: [],\n price: ngn(450000),\n isAvailable: true,\n quantity: { min: 1, max: 10, step: 1 },\n variants: [\n {\n id: \"variant_jollof\",\n attributeChoices: {},\n price: ngn(450000),\n isAvailable: true,\n },\n ],\n optionGroups: [\n {\n id: \"grp_protein\",\n name: \"Protein\",\n kind: \"select\",\n required: true,\n selection: { min: 1, max: 1 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_chicken\",\n name: \"Chicken\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_beef\",\n name: \"Beef\",\n price: ngn(50000),\n isAvailable: true,\n },\n {\n id: \"opt_fish\",\n name: \"Fish\",\n price: ngn(80000),\n isAvailable: false,\n },\n ],\n },\n {\n id: \"grp_sauce\",\n name: \"Sauce\",\n helpText: \"Required with chicken.\",\n kind: \"select\",\n required: false,\n selection: { min: 0, max: 1 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_pepper\",\n name: \"Pepper sauce\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_stew\",\n name: \"Stew\",\n price: ngn(20000),\n isAvailable: true,\n },\n ],\n conditions: [\n {\n groupId: \"grp_protein\",\n choiceIds: [\"opt_chicken\"],\n match: \"any\",\n setRequired: true,\n setMin: 1,\n },\n ],\n },\n {\n id: \"grp_extras\",\n name: \"Extras\",\n kind: \"select\",\n required: false,\n selection: { min: 0, max: 3 },\n isAttribute: false,\n choices: [\n {\n id: \"opt_plantain\",\n name: \"Plantain\",\n price: ngn(30000),\n isAvailable: true,\n quantity: { min: 1, max: 3 },\n },\n {\n id: \"opt_egg\",\n name: \"Boiled egg\",\n price: ngn(15000),\n isAvailable: true,\n },\n ],\n },\n {\n id: \"grp_note\",\n name: \"Note for the kitchen\",\n kind: \"text\",\n required: false,\n selection: { min: 0 },\n isAttribute: false,\n choices: [],\n input: { maxLength: 140, placeholder: \"No onions, please\" },\n },\n ],\n tags: [\"popular\"],\n },\n item_zobo: {\n id: \"item_zobo\",\n name: \"Zobo\",\n images: [],\n price: ngn(120000),\n isAvailable: true,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_zobo_small\",\n attributeChoices: { grp_size: \"opt_small\" },\n price: ngn(120000),\n isAvailable: true,\n },\n {\n id: \"variant_zobo_large\",\n attributeChoices: { grp_size: \"opt_large\" },\n price: ngn(200000),\n isAvailable: false,\n },\n ],\n optionGroups: [\n {\n id: \"grp_size\",\n name: \"Size\",\n kind: \"select\",\n required: true,\n selection: { min: 1, max: 1 },\n isAttribute: true,\n choices: [\n {\n id: \"opt_small\",\n name: \"Small\",\n price: ngn(0),\n isAvailable: true,\n },\n {\n id: \"opt_large\",\n name: \"Large\",\n price: ngn(0),\n isAvailable: false,\n },\n ],\n },\n ],\n tags: [],\n },\n item_cake: {\n id: \"item_cake\",\n name: \"Chocolate cake\",\n images: [],\n price: ngn(350000),\n compareAtPrice: ngn(400000),\n isAvailable: false,\n quantity: { min: 1, step: 1 },\n variants: [\n {\n id: \"variant_cake\",\n attributeChoices: {},\n price: ngn(350000),\n isAvailable: false,\n },\n ],\n optionGroups: [],\n tags: [],\n },\n },\n};\n/**\n * Sample data with no merchant IDs or photos. `minimal` has one plain item.\n * `defaultTemplate` covers several branches, shared category membership, required and\n * conditional options, per-choice quantities, text input and attribute variants.\n */\nexport const fixtures = {\n minimal: { store, menu },\n defaultTemplate: { store: templateStore, menu: templateMenu },\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fixtures", "menu", "input"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// src/transport/category-page.ts
|
|
2
|
+
function categoryPage(raw, ctx, mapMenu, invalid) {
|
|
3
|
+
const menu = mapMenu(raw, ctx.branchId);
|
|
4
|
+
if (raw.next_cursor != null && (typeof raw.next_cursor !== "string" || !raw.next_cursor || raw.next_cursor === ctx.cursor) || menu.categories.some((c) => c.id !== ctx.categoryId) || Object.keys(menu.items).some(
|
|
5
|
+
(id) => !menu.categories.some((c) => c.itemIds.includes(id))
|
|
6
|
+
) || !menu.menus?.some(
|
|
7
|
+
(m) => m.id === ctx.menuId && m.categoryIds.includes(ctx.categoryId)
|
|
8
|
+
)) {
|
|
9
|
+
throw invalid();
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
menu: { ...menu, completeness: "partial" },
|
|
13
|
+
menuId: ctx.menuId,
|
|
14
|
+
categoryId: ctx.categoryId,
|
|
15
|
+
...typeof raw.next_cursor === "string" && raw.next_cursor ? { nextCursor: raw.next_cursor } : {}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
categoryPage
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=category-page.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/transport/category-page.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CategoryPage, Menu } from \"../models\";\n\n/**\n * Validates and maps one category page. Only progressive catalogues read\n * pages, so this loads on the first `menu.page()` call and stays out of the\n * core bundle, like the quote client (PRD 03 \u00A74). The mapper and error come\n * in as arguments: importing them would split the core's shared code into a\n * separate chunk, which costs the core more than this module saves.\n */\nexport function categoryPage(\n raw: Record<string, unknown>,\n ctx: {\n branchId: string;\n menuId: string;\n categoryId: string;\n cursor?: string;\n },\n mapMenu: (value: unknown, branchId: string) => Menu,\n invalid: () => Error,\n): CategoryPage {\n const menu = mapMenu(raw, ctx.branchId);\n if (\n (raw.next_cursor != null &&\n (typeof raw.next_cursor !== \"string\" ||\n !raw.next_cursor ||\n raw.next_cursor === ctx.cursor)) ||\n menu.categories.some((c) => c.id !== ctx.categoryId) ||\n Object.keys(menu.items).some(\n (id) => !menu.categories.some((c) => c.itemIds.includes(id)),\n ) ||\n !menu.menus?.some(\n (m) => m.id === ctx.menuId && m.categoryIds.includes(ctx.categoryId),\n )\n ) {\n throw invalid();\n }\n return {\n menu: { ...menu, completeness: \"partial\" },\n menuId: ctx.menuId,\n categoryId: ctx.categoryId,\n ...(typeof raw.next_cursor === \"string\" && raw.next_cursor\n ? { nextCursor: raw.next_cursor }\n : {}),\n };\n}\n"],
|
|
5
|
+
"mappings": ";AASO,SAAS,aACd,KACA,KAMA,SACA,SACc;AACd,QAAM,OAAO,QAAQ,KAAK,IAAI,QAAQ;AACtC,MACG,IAAI,eAAe,SACjB,OAAO,IAAI,gBAAgB,YAC1B,CAAC,IAAI,eACL,IAAI,gBAAgB,IAAI,WAC5B,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,UAAU,KACnD,OAAO,KAAK,KAAK,KAAK,EAAE;AAAA,IACtB,CAAC,OAAO,CAAC,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,EAC7D,KACA,CAAC,KAAK,OAAO;AAAA,IACX,CAAC,MAAM,EAAE,OAAO,IAAI,UAAU,EAAE,YAAY,SAAS,IAAI,UAAU;AAAA,EACrE,GACA;AACA,UAAM,QAAQ;AAAA,EAChB;AACA,SAAO;AAAA,IACL,MAAM,EAAE,GAAG,MAAM,cAAc,UAAU;AAAA,IACzC,QAAQ,IAAI;AAAA,IACZ,YAAY,IAAI;AAAA,IAChB,GAAI,OAAO,IAAI,gBAAgB,YAAY,IAAI,cAC3C,EAAE,YAAY,IAAI,YAAY,IAC9B,CAAC;AAAA,EACP;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|