@curless/shopify-storefront 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/card-contract.test.d.ts +2 -0
- package/dist/__tests__/card-contract.test.d.ts.map +1 -0
- package/dist/__tests__/card-contract.test.js +22 -0
- package/dist/__tests__/card-contract.test.js.map +1 -0
- package/dist/__tests__/catalog-registry.test.d.ts +2 -0
- package/dist/__tests__/catalog-registry.test.d.ts.map +1 -0
- package/dist/__tests__/catalog-registry.test.js +109 -0
- package/dist/__tests__/catalog-registry.test.js.map +1 -0
- package/dist/__tests__/challenge.test.d.ts +2 -0
- package/dist/__tests__/challenge.test.d.ts.map +1 -0
- package/dist/__tests__/challenge.test.js +46 -0
- package/dist/__tests__/challenge.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +123 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/connection-state.test.d.ts +2 -0
- package/dist/__tests__/connection-state.test.d.ts.map +1 -0
- package/dist/__tests__/connection-state.test.js +40 -0
- package/dist/__tests__/connection-state.test.js.map +1 -0
- package/dist/__tests__/multi-token-store.test.d.ts +2 -0
- package/dist/__tests__/multi-token-store.test.d.ts.map +1 -0
- package/dist/__tests__/multi-token-store.test.js +89 -0
- package/dist/__tests__/multi-token-store.test.js.map +1 -0
- package/dist/__tests__/oauth.test.d.ts +2 -0
- package/dist/__tests__/oauth.test.d.ts.map +1 -0
- package/dist/__tests__/oauth.test.js +112 -0
- package/dist/__tests__/oauth.test.js.map +1 -0
- package/dist/__tests__/output-schema.test.d.ts +2 -0
- package/dist/__tests__/output-schema.test.d.ts.map +1 -0
- package/dist/__tests__/output-schema.test.js +112 -0
- package/dist/__tests__/output-schema.test.js.map +1 -0
- package/dist/__tests__/ping.test.d.ts +2 -0
- package/dist/__tests__/ping.test.d.ts.map +1 -0
- package/dist/__tests__/ping.test.js +22 -0
- package/dist/__tests__/ping.test.js.map +1 -0
- package/dist/__tests__/rate-limit.test.d.ts +2 -0
- package/dist/__tests__/rate-limit.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limit.test.js +46 -0
- package/dist/__tests__/rate-limit.test.js.map +1 -0
- package/dist/__tests__/stock.test.d.ts +2 -0
- package/dist/__tests__/stock.test.d.ts.map +1 -0
- package/dist/__tests__/stock.test.js +109 -0
- package/dist/__tests__/stock.test.js.map +1 -0
- package/dist/__tests__/tenant.test.d.ts +2 -0
- package/dist/__tests__/tenant.test.d.ts.map +1 -0
- package/dist/__tests__/tenant.test.js +105 -0
- package/dist/__tests__/tenant.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +2 -0
- package/dist/__tests__/tools.test.d.ts.map +1 -0
- package/dist/__tests__/tools.test.js +543 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/__tests__/upstream-cap.test.d.ts +2 -0
- package/dist/__tests__/upstream-cap.test.d.ts.map +1 -0
- package/dist/__tests__/upstream-cap.test.js +78 -0
- package/dist/__tests__/upstream-cap.test.js.map +1 -0
- package/dist/__tests__/webhooks.test.d.ts +2 -0
- package/dist/__tests__/webhooks.test.d.ts.map +1 -0
- package/dist/__tests__/webhooks.test.js +88 -0
- package/dist/__tests__/webhooks.test.js.map +1 -0
- package/dist/card.generated.d.ts +2 -0
- package/dist/card.generated.d.ts.map +1 -0
- package/dist/card.generated.js +6 -0
- package/dist/card.generated.js.map +1 -0
- package/dist/catalog-registry.d.ts +44 -0
- package/dist/catalog-registry.d.ts.map +1 -0
- package/dist/catalog-registry.js +105 -0
- package/dist/catalog-registry.js.map +1 -0
- package/dist/catalog.d.ts +51 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +189 -0
- package/dist/catalog.js.map +1 -0
- package/dist/challenge.d.ts +11 -0
- package/dist/challenge.d.ts.map +1 -0
- package/dist/challenge.js +36 -0
- package/dist/challenge.js.map +1 -0
- package/dist/config.d.ts +141 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +65 -0
- package/dist/config.js.map +1 -0
- package/dist/connection.d.ts +10 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +21 -0
- package/dist/connection.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +974 -0
- package/dist/index.js.map +1 -0
- package/dist/legal.d.ts +52 -0
- package/dist/legal.d.ts.map +1 -0
- package/dist/legal.js +139 -0
- package/dist/legal.js.map +1 -0
- package/dist/load-config.d.ts +11 -0
- package/dist/load-config.d.ts.map +1 -0
- package/dist/load-config.js +23 -0
- package/dist/load-config.js.map +1 -0
- package/dist/multi-token-store.d.ts +18 -0
- package/dist/multi-token-store.d.ts.map +1 -0
- package/dist/multi-token-store.js +95 -0
- package/dist/multi-token-store.js.map +1 -0
- package/dist/oauth.d.ts +20 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +123 -0
- package/dist/oauth.js.map +1 -0
- package/dist/rate-limit.d.ts +15 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +56 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/stock.d.ts +39 -0
- package/dist/stock.d.ts.map +1 -0
- package/dist/stock.js +77 -0
- package/dist/stock.js.map +1 -0
- package/dist/tenant.d.ts +69 -0
- package/dist/tenant.d.ts.map +1 -0
- package/dist/tenant.js +68 -0
- package/dist/tenant.js.map +1 -0
- package/dist/token-store.d.ts +16 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +47 -0
- package/dist/token-store.js.map +1 -0
- package/dist/tools.d.ts +201 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +779 -0
- package/dist/tools.js.map +1 -0
- package/dist/webhooks.d.ts +30 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +69 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/legal.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Kept in one place so the two pages cannot drift on who operates this. */
|
|
2
|
+
export type LegalContext = {
|
|
3
|
+
merchantName: string;
|
|
4
|
+
/** The merchant's own storefront — where the goods, and the money, are. */
|
|
5
|
+
storefront: string;
|
|
6
|
+
/** Who runs this connector on the merchant's behalf. */
|
|
7
|
+
operator: string;
|
|
8
|
+
operatorContact: string;
|
|
9
|
+
updated: string;
|
|
10
|
+
/** The *.myshopify.com host the connector reads — named in the docs page so a
|
|
11
|
+
* reviewer can see exactly which system it talks to. */
|
|
12
|
+
shopDomain: string;
|
|
13
|
+
/** Where it runs, for a reviewer with data-residency rules. */
|
|
14
|
+
region: string;
|
|
15
|
+
/** The merchant's own support address, as published in their own policies. */
|
|
16
|
+
merchantContact: string;
|
|
17
|
+
/** The two rate limits, quoted from the code rather than from memory. */
|
|
18
|
+
rateGeneral: number;
|
|
19
|
+
rateLookup: number;
|
|
20
|
+
/**
|
|
21
|
+
* THIS storefront's tool names and words.
|
|
22
|
+
*
|
|
23
|
+
* The page used to list list_moody_lenses and friends by hand — a reviewer
|
|
24
|
+
* reading Elspet's docs was told about tools that do not exist there, and
|
|
25
|
+
* that a shopper "picks a prescription" for cat litter. A compliance page
|
|
26
|
+
* that describes another merchant's shop is worse than none.
|
|
27
|
+
*/
|
|
28
|
+
tools: {
|
|
29
|
+
list: string;
|
|
30
|
+
get: string;
|
|
31
|
+
checkout: string;
|
|
32
|
+
lookupOrder: string;
|
|
33
|
+
};
|
|
34
|
+
noun: string;
|
|
35
|
+
nounPlural: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* The page an IT administrator reads before allowing this server into their
|
|
39
|
+
* organisation. A different audience from the other two: not "what are my
|
|
40
|
+
* rights" but "what can this thing reach, and what leaves my network".
|
|
41
|
+
*
|
|
42
|
+
* So it answers those first and in the negative where the negative is the
|
|
43
|
+
* answer — no writes, no accounts, no payment data — because a reviewer's job is
|
|
44
|
+
* to find what a service CAN do, and a list of capabilities it does not have is
|
|
45
|
+
* the fastest way through that.
|
|
46
|
+
*
|
|
47
|
+
* Every figure here is checked against the code: the rate limits are the two
|
|
48
|
+
* RateLimiter constructions in index.ts, the scopes are what the app requests at
|
|
49
|
+
* install, and the egress list is every outbound host the service can reach.
|
|
50
|
+
*/
|
|
51
|
+
export declare const docsPage: (c: LegalContext) => string;
|
|
52
|
+
//# sourceMappingURL=legal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AA+BA,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB;6DACyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,GAAI,GAAG,YAAY,KAAG,MAmGxC,CAAC"}
|
package/dist/legal.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// The documentation page, served by the service it documents.
|
|
2
|
+
//
|
|
3
|
+
// Privacy and terms are NOT here: the merchant publishes their own, and a second
|
|
4
|
+
// policy from us would be a second answer to the same question — the one place a
|
|
5
|
+
// shopper cannot afford ambiguity. `/privacy` and `/terms` redirect to theirs.
|
|
6
|
+
//
|
|
7
|
+
// This page survives because nothing on the merchant's site describes THIS: what
|
|
8
|
+
// the connector can reach, what leaves the network, what is retained. Every
|
|
9
|
+
// figure in it is checked against the code rather than copied from a template,
|
|
10
|
+
// so if `index.ts`, `tools.ts` or `rate-limit.ts` changes, so must this.
|
|
11
|
+
const PAGE = (title, body) => `<!doctype html><meta charset="utf-8"><link rel="icon" href="./icon.png">
|
|
12
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
13
|
+
<title>${title}</title>
|
|
14
|
+
<style>
|
|
15
|
+
body{font-family:Jost,"Avenir Next","Segoe UI",system-ui,sans-serif;margin:0 auto;
|
|
16
|
+
padding:40px 24px 64px;max-width:680px;color:#1a1b18;line-height:1.65;background:#fbf7f1}
|
|
17
|
+
img.brand{height:22px;display:block;margin-bottom:28px}
|
|
18
|
+
h1{font-size:22px;margin:0 0 4px}
|
|
19
|
+
h2{font-size:15px;margin:28px 0 6px}
|
|
20
|
+
p,li{font-size:14.5px}
|
|
21
|
+
.muted{color:#6f6a63;font-size:13px}
|
|
22
|
+
a{color:#1a1b18}
|
|
23
|
+
code{background:#f2ebe1;padding:1px 5px;border-radius:4px;font-size:13px}
|
|
24
|
+
</style>
|
|
25
|
+
<!-- Decorative: the merchant is named in the h1 immediately below, and a
|
|
26
|
+
screen reader should not hear it twice. -->
|
|
27
|
+
<img class="brand" src="./logo.png" alt="">
|
|
28
|
+
${body}`;
|
|
29
|
+
/**
|
|
30
|
+
* The page an IT administrator reads before allowing this server into their
|
|
31
|
+
* organisation. A different audience from the other two: not "what are my
|
|
32
|
+
* rights" but "what can this thing reach, and what leaves my network".
|
|
33
|
+
*
|
|
34
|
+
* So it answers those first and in the negative where the negative is the
|
|
35
|
+
* answer — no writes, no accounts, no payment data — because a reviewer's job is
|
|
36
|
+
* to find what a service CAN do, and a list of capabilities it does not have is
|
|
37
|
+
* the fastest way through that.
|
|
38
|
+
*
|
|
39
|
+
* Every figure here is checked against the code: the rate limits are the two
|
|
40
|
+
* RateLimiter constructions in index.ts, the scopes are what the app requests at
|
|
41
|
+
* install, and the egress list is every outbound host the service can reach.
|
|
42
|
+
*/
|
|
43
|
+
export const docsPage = (c) => PAGE(`Documentation — ${c.merchantName} shopping assistant`, `<h1>${c.merchantName} shopping assistant</h1>
|
|
44
|
+
<p class="muted">For administrators reviewing this MCP server · last updated ${c.updated}</p>
|
|
45
|
+
|
|
46
|
+
<p>A read-only view of one Shopify store — ${c.merchantName}'s — for AI assistants.
|
|
47
|
+
A shopper browses the catalogue, chooses the options, and is handed a link to
|
|
48
|
+
${c.merchantName}'s own checkout. Operated by ${c.operator}.</p>
|
|
49
|
+
|
|
50
|
+
<h2>What it cannot do</h2>
|
|
51
|
+
<p>The short list first, because it is the answer to most review questions.</p>
|
|
52
|
+
<ul>
|
|
53
|
+
<li><b>It cannot write anything.</b> All four tools are reads. The app holds
|
|
54
|
+
<code>read_products</code>, <code>read_orders</code> and <code>read_discounts</code> —
|
|
55
|
+
no write scope exists on the token, so no order, product or customer record can be
|
|
56
|
+
created or altered even by a bug.</li>
|
|
57
|
+
<li><b>It cannot take a payment.</b> Checkout is a link to Shopify. No card number,
|
|
58
|
+
billing address or payment token ever reaches this service.</li>
|
|
59
|
+
<li><b>It cannot read your users' data.</b> There are no accounts here. It has no
|
|
60
|
+
access to a user's files, mail, calendar or anything else on their machine — an MCP
|
|
61
|
+
server is reached over HTTPS and sees only the arguments of the four calls below.</li>
|
|
62
|
+
<li><b>It cannot enumerate a merchant's customers.</b> Order lookup answers exactly one
|
|
63
|
+
order, and only when given the order number <i>and</i> the email it was placed with.</li>
|
|
64
|
+
</ul>
|
|
65
|
+
|
|
66
|
+
<h2>The four tools</h2>
|
|
67
|
+
<ul>
|
|
68
|
+
<li><code>${c.tools.list}</code> — the catalogue. Optional free-text query, price cap,
|
|
69
|
+
result limit.</li>
|
|
70
|
+
<li><code>${c.tools.get}</code> — one product: its options, prices, and which
|
|
71
|
+
combinations are in stock.</li>
|
|
72
|
+
<li><code>${c.tools.checkout}</code> — a Shopify cart link for one specific variant.
|
|
73
|
+
Creates nothing; the URL is a link a browser can open.</li>
|
|
74
|
+
<li><code>${c.tools.lookupOrder}</code> — one order, by order number <b>and</b> email.</li>
|
|
75
|
+
</ul>
|
|
76
|
+
<p>All four are annotated <code>readOnlyHint: true</code>, <code>destructiveHint:
|
|
77
|
+
false</code>, <code>openWorldHint: false</code>.</p>
|
|
78
|
+
|
|
79
|
+
<h2>What leaves the network</h2>
|
|
80
|
+
<p>What a user types into their assistant reaches this server as tool arguments — a
|
|
81
|
+
search term, an option value, or an order number and email. Nothing else about the
|
|
82
|
+
conversation is sent.</p>
|
|
83
|
+
<p>From this server outbound, two hosts only:</p>
|
|
84
|
+
<ul>
|
|
85
|
+
<li><code>${c.shopDomain}</code> — Shopify's Admin API, to read the catalogue and to
|
|
86
|
+
look up a single order.</li>
|
|
87
|
+
<li><code>cdn.shopify.com</code> — product images, fetched so the card can display
|
|
88
|
+
them from this origin rather than the shopper's browser reaching Shopify directly.</li>
|
|
89
|
+
</ul>
|
|
90
|
+
|
|
91
|
+
<h2>Authentication</h2>
|
|
92
|
+
<p><b>There is none, deliberately.</b> A shopper has no account with this store's
|
|
93
|
+
assistant, so there is nothing to authenticate them as, and requiring a sign-in to read a
|
|
94
|
+
public catalogue would be theatre.</p>
|
|
95
|
+
<p>What guards it instead: the endpoint is read-only; the only sensitive answer it can
|
|
96
|
+
give needs a matching order number and email; and both are rate-limited — ${c.rateGeneral}
|
|
97
|
+
requests a minute per address overall, ${c.rateLookup} a minute for order lookup. A wrong
|
|
98
|
+
email and a non-existent order return the same answer, so the lookup cannot be used to
|
|
99
|
+
confirm an order exists.</p>
|
|
100
|
+
|
|
101
|
+
<h2>What is retained</h2>
|
|
102
|
+
<ul>
|
|
103
|
+
<li><b>Per-call logs</b> — tool name, outcome, duration. No arguments, so no order
|
|
104
|
+
numbers and no email addresses.</li>
|
|
105
|
+
<li><b>Web access logs</b> — including IP addresses, as any web server keeps them.</li>
|
|
106
|
+
<li><b>Rate-limit counters</b> — in memory only; discarded within minutes and on
|
|
107
|
+
restart.</li>
|
|
108
|
+
<li><b>The merchant's Shopify token</b> — file permissions 0600, on the server only,
|
|
109
|
+
never sent anywhere but Shopify.</li>
|
|
110
|
+
</ul>
|
|
111
|
+
<p>No shopper record is written, and nothing is sold, shared for advertising, or used to
|
|
112
|
+
build a profile.</p>
|
|
113
|
+
|
|
114
|
+
<h2>The interface</h2>
|
|
115
|
+
<p>Results render as an MCP Apps card: one self-contained HTML document served as a
|
|
116
|
+
<code>ui://</code> resource, with its Content-Security-Policy declared to the host. It
|
|
117
|
+
loads images from the two hosts above and makes no other network request.</p>
|
|
118
|
+
|
|
119
|
+
<h2>Operations</h2>
|
|
120
|
+
<ul>
|
|
121
|
+
<li>Hosted by ${c.operator} on AWS, ${c.region}.</li>
|
|
122
|
+
<li>TLS by Let's Encrypt, renewed automatically.</li>
|
|
123
|
+
<li>Catalogue refreshed every five minutes; a failed refresh keeps serving the last
|
|
124
|
+
good snapshot rather than presenting an empty store.</li>
|
|
125
|
+
<li>Health: <code>/healthz</code>.</li>
|
|
126
|
+
</ul>
|
|
127
|
+
|
|
128
|
+
<h2>Contact</h2>
|
|
129
|
+
<p>Anything a shopper would ask — an order, a payment, a return —
|
|
130
|
+
is ${c.merchantName}'s: <a href="mailto:${c.merchantContact}">${c.merchantContact}</a>,
|
|
131
|
+
or <a href="${c.storefront}">${c.storefront}</a>.</p>
|
|
132
|
+
<p>An administrator reviewing this server, or reporting a fault in it, reaches the
|
|
133
|
+
operator at <a href="mailto:${c.operatorContact}">${c.operatorContact}</a> — kept here
|
|
134
|
+
because the point of this page is to say who runs the thing you are being asked to
|
|
135
|
+
approve.</p>
|
|
136
|
+
<p class="muted"><a href="${c.storefront}/policies/privacy-policy">Privacy policy</a> ·
|
|
137
|
+
<a href="${c.storefront}/policies/terms-of-service">Terms</a> — both ${c.merchantName}'s
|
|
138
|
+
own, because the shopper's data and the sale are theirs.</p>`);
|
|
139
|
+
//# sourceMappingURL=legal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal.js","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,+EAA+E;AAC/E,EAAE;AACF,iFAAiF;AACjF,4EAA4E;AAC5E,+EAA+E;AAC/E,yEAAyE;AAEzE,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,IAAY,EAAU,EAAE,CACnD;;YAEU,KAAK;;;;;;;;;;;;;;;KAeZ,IAAI,EAAE,CAAC;AAkCZ;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAe,EAAU,EAAE,CAClD,IAAI,CACF,mBAAmB,CAAC,CAAC,YAAY,qBAAqB,EACtD,OAAO,CAAC,CAAC,YAAY;oFAC2D,CAAC,CAAC,OAAO;;kDAE3C,CAAC,CAAC,YAAY;;OAEzD,CAAC,CAAC,YAAY,gCAAgC,CAAC,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;mBAoB5C,CAAC,CAAC,KAAK,CAAC,IAAI;;mBAEZ,CAAC,CAAC,KAAK,CAAC,GAAG;;mBAEX,CAAC,CAAC,KAAK,CAAC,QAAQ;;mBAEhB,CAAC,CAAC,KAAK,CAAC,WAAW;;;;;;;;;;;mBAWnB,CAAC,CAAC,UAAU;;;;;;;;;;;iFAWkD,CAAC,CAAC,WAAW;8CAChD,CAAC,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;uBAwBnC,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,MAAM;;;;;;;;;UAS3C,CAAC,CAAC,YAAY,uBAAuB,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,eAAe;mBACnE,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;;mCAEb,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,eAAe;;;iCAGzC,CAAC,CAAC,UAAU;gBAC7B,CAAC,CAAC,UAAU,gDAAgD,CAAC,CAAC,YAAY;kEACxB,CAC/D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { StorefrontConfig } from './config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Which storefront this process is.
|
|
4
|
+
*
|
|
5
|
+
* `STOREFRONT_CONFIG` is a path to one of `configs/*.json`. Deliberately a path
|
|
6
|
+
* and not an inline blob: the config is reviewable in the repo and diffable
|
|
7
|
+
* between tenants, while the two secrets it never contains stay in the
|
|
8
|
+
* environment, the way moody's already do.
|
|
9
|
+
*/
|
|
10
|
+
export declare const loadStorefrontConfig: () => StorefrontConfig;
|
|
11
|
+
//# sourceMappingURL=load-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../src/load-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,QAAO,gBAYvC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* Which storefront this process is.
|
|
4
|
+
*
|
|
5
|
+
* `STOREFRONT_CONFIG` is a path to one of `configs/*.json`. Deliberately a path
|
|
6
|
+
* and not an inline blob: the config is reviewable in the repo and diffable
|
|
7
|
+
* between tenants, while the two secrets it never contains stay in the
|
|
8
|
+
* environment, the way moody's already do.
|
|
9
|
+
*/
|
|
10
|
+
export const loadStorefrontConfig = () => {
|
|
11
|
+
const path = process.env.STOREFRONT_CONFIG;
|
|
12
|
+
if (!path) {
|
|
13
|
+
// Fail at boot with the reason, rather than serving an anonymous storefront
|
|
14
|
+
// that answers with someone else's defaults.
|
|
15
|
+
throw new Error('STOREFRONT_CONFIG is unset — point it at a configs/<id>.json');
|
|
16
|
+
}
|
|
17
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
18
|
+
if (!parsed.id || !parsed.urls?.appUrl) {
|
|
19
|
+
throw new Error(`storefront config at ${path} is missing id or urls.appUrl`);
|
|
20
|
+
}
|
|
21
|
+
return parsed;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=load-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-config.js","sourceRoot":"","sources":["../src/load-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAqB,EAAE;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,4EAA4E;QAC5E,6CAA6C;QAC7C,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAqB,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,+BAA+B,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StoredToken } from './token-store.js';
|
|
2
|
+
export declare const isStorableShop: (shop: string) => boolean;
|
|
3
|
+
export declare class MultiTokenStore {
|
|
4
|
+
private readonly dir;
|
|
5
|
+
private readonly cache;
|
|
6
|
+
constructor(dir: string);
|
|
7
|
+
private fileFor;
|
|
8
|
+
get(shop: string): Promise<StoredToken | null>;
|
|
9
|
+
set(token: StoredToken): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Forget a shop — for `shop/redact` and for an uninstall webhook, both of
|
|
12
|
+
* which a listed app is REQUIRED to honour. Removing the file is not enough
|
|
13
|
+
* on its own: a cached token would keep answering after the merchant revoked
|
|
14
|
+
* it, so the cache is dropped first and unconditionally.
|
|
15
|
+
*/
|
|
16
|
+
forget(shop: string): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=multi-token-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-token-store.d.ts","sourceRoot":"","sources":["../src/multi-token-store.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAapD,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,OAAwC,CAAC;AAEvF,qBAAa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;gBAE3B,GAAG,EAAE,MAAM;IAExC,OAAO,CAAC,OAAO;IAYT,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqB9C,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5C;;;;;OAKG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU1C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Tokens for MANY shops, for the listed public app.
|
|
2
|
+
//
|
|
3
|
+
// The single-shop store beside this one is right for a branded deployment: the
|
|
4
|
+
// shop is known at deploy time and there is exactly one credential. A listed
|
|
5
|
+
// app cannot work that way — the shop is whoever installed it, decided at
|
|
6
|
+
// install time and different on every request afterwards.
|
|
7
|
+
//
|
|
8
|
+
// Still files, not a database, and for the same reason: this connector owns no
|
|
9
|
+
// database, and putting real merchants' access tokens in the payment gateway's
|
|
10
|
+
// Postgres would undo the separation that keeps a merchant's credentials out of
|
|
11
|
+
// the gateway's blast radius. One directory, one file per shop, each 0600.
|
|
12
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
/**
|
|
15
|
+
* A shop domain arrives as a REQUEST PARAMETER and is about to become a
|
|
16
|
+
* filename. `../../etc/whatever` would be a file write outside the directory,
|
|
17
|
+
* and a lenient check that merely rejected slashes would still admit
|
|
18
|
+
* `..%2f`-style surprises once something upstream decodes.
|
|
19
|
+
*
|
|
20
|
+
* So this is an allow-list, not a deny-list: exactly the shape Shopify issues,
|
|
21
|
+
* lowercase, and nothing else is a shop as far as this store is concerned.
|
|
22
|
+
*/
|
|
23
|
+
const SHOP = /^[a-z0-9][a-z0-9-]{0,60}\.myshopify\.com$/;
|
|
24
|
+
export const isStorableShop = (shop) => SHOP.test(shop.toLowerCase());
|
|
25
|
+
export class MultiTokenStore {
|
|
26
|
+
dir;
|
|
27
|
+
cache = new Map();
|
|
28
|
+
constructor(dir) {
|
|
29
|
+
this.dir = dir;
|
|
30
|
+
}
|
|
31
|
+
fileFor(shop) {
|
|
32
|
+
const key = shop.toLowerCase();
|
|
33
|
+
if (!isStorableShop(key)) {
|
|
34
|
+
// Thrown, not swallowed. A shop we cannot name is a shop we must not read
|
|
35
|
+
// or write a credential for, and returning null would let the caller
|
|
36
|
+
// treat it as "not installed" and quietly start an OAuth round for a
|
|
37
|
+
// domain we just refused to trust.
|
|
38
|
+
throw new Error(`refusing to use ${JSON.stringify(shop)} as a token filename`);
|
|
39
|
+
}
|
|
40
|
+
return join(this.dir, `${key}.json`);
|
|
41
|
+
}
|
|
42
|
+
async get(shop) {
|
|
43
|
+
const key = shop.toLowerCase();
|
|
44
|
+
const hit = this.cache.get(key);
|
|
45
|
+
if (hit)
|
|
46
|
+
return hit;
|
|
47
|
+
try {
|
|
48
|
+
const parsed = JSON.parse(await readFile(this.fileFor(key), 'utf8'));
|
|
49
|
+
if (!parsed.accessToken)
|
|
50
|
+
return null;
|
|
51
|
+
// Trust the FILENAME over the contents. A file whose body names a
|
|
52
|
+
// different shop is either a bug or tampering; either way, handing back a
|
|
53
|
+
// token under a shop it does not belong to is how one merchant's
|
|
54
|
+
// catalogue ends up answering for another.
|
|
55
|
+
if (parsed.shopDomain?.toLowerCase() !== key)
|
|
56
|
+
return null;
|
|
57
|
+
this.cache.set(key, parsed);
|
|
58
|
+
return parsed;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Absent, unreadable, or an unstorable name: all mean "not installed
|
|
62
|
+
// here", which is the ordinary state before a merchant installs.
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async set(token) {
|
|
67
|
+
const key = token.shopDomain.toLowerCase();
|
|
68
|
+
const path = this.fileFor(key);
|
|
69
|
+
await mkdir(this.dir, { recursive: true });
|
|
70
|
+
// Write-then-rename, so a crash mid-write cannot leave a truncated file that
|
|
71
|
+
// reads as installed with half a token.
|
|
72
|
+
const tmp = `${path}.tmp`;
|
|
73
|
+
await writeFile(tmp, JSON.stringify({ ...token, shopDomain: key }, null, 2), { mode: 0o600 });
|
|
74
|
+
await rename(tmp, path);
|
|
75
|
+
this.cache.set(key, { ...token, shopDomain: key });
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Forget a shop — for `shop/redact` and for an uninstall webhook, both of
|
|
79
|
+
* which a listed app is REQUIRED to honour. Removing the file is not enough
|
|
80
|
+
* on its own: a cached token would keep answering after the merchant revoked
|
|
81
|
+
* it, so the cache is dropped first and unconditionally.
|
|
82
|
+
*/
|
|
83
|
+
async forget(shop) {
|
|
84
|
+
const key = shop.toLowerCase();
|
|
85
|
+
this.cache.delete(key);
|
|
86
|
+
try {
|
|
87
|
+
const { unlink } = await import('node:fs/promises');
|
|
88
|
+
await unlink(this.fileFor(key));
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Already gone is the desired end state, not a failure to report.
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=multi-token-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-token-store.js","sourceRoot":"","sources":["../src/multi-token-store.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type OauthConfig = {
|
|
2
|
+
clientId: string;
|
|
3
|
+
clientSecret: string;
|
|
4
|
+
/** The one shop this app may be installed on, e.g. moodylenses.myshopify.com */
|
|
5
|
+
shopDomain: string;
|
|
6
|
+
/** Public base, e.g. https://mcp.curless.ai/moody */
|
|
7
|
+
appUrl: string;
|
|
8
|
+
scopes: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const isShopDomain: (shop: string) => boolean;
|
|
11
|
+
export declare const makeState: (secret: string, now?: number) => string;
|
|
12
|
+
export declare const verifyState: (secret: string, state: string, now?: number) => boolean;
|
|
13
|
+
export declare const verifyCallbackHmac: (secret: string, rawQuery: string) => boolean;
|
|
14
|
+
export declare const installUrl: (config: OauthConfig, state: string) => string;
|
|
15
|
+
export type TokenExchange = {
|
|
16
|
+
accessToken: string;
|
|
17
|
+
scope: string;
|
|
18
|
+
};
|
|
19
|
+
export declare const exchangeCode: (config: OauthConfig, code: string, fetchImpl?: typeof fetch) => Promise<TokenExchange>;
|
|
20
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAMF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAA6B,CAAC;AAe1E,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,EAAE,MAAK,MAAmB,KAAG,MAIpE,CAAC;AAMF,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,EAAE,MAAK,MAAmB,KAAG,OASrF,CAAC;AAKF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,OA0BrE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,WAAW,EAAE,OAAO,MAAM,KAAG,MAc/D,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,eAAO,MAAM,YAAY,GACvB,QAAQ,WAAW,EACnB,MAAM,MAAM,EACZ,YAAW,OAAO,KAAa,KAC9B,OAAO,CAAC,aAAa,CAmBvB,CAAC"}
|
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Shopify OAuth — the install flow for an app distributed to a merchant's store.
|
|
2
|
+
//
|
|
3
|
+
// This replaces the legacy custom-app token, which Shopify stopped issuing on
|
|
4
|
+
// 2026-01-01: an app now lives in OUR organisation and reaches a merchant's
|
|
5
|
+
// store only by them installing it. Custom distribution (one store) and public
|
|
6
|
+
// distribution (any store) use this same flow, so what is written here is also
|
|
7
|
+
// what the productised version runs.
|
|
8
|
+
//
|
|
9
|
+
// Two checks carry all the security, and both are easy to leave out and never
|
|
10
|
+
// notice, because the happy path works without them:
|
|
11
|
+
//
|
|
12
|
+
// • The callback's HMAC. Shopify signs the query string with the app secret.
|
|
13
|
+
// Without verifying it, anyone can call /auth/callback with a `code` of
|
|
14
|
+
// their choosing and make us exchange it — the endpoint is public.
|
|
15
|
+
// • The `state` nonce. Without it, a third party can start an install for a
|
|
16
|
+
// shop of their choosing and have our server store a token for it.
|
|
17
|
+
//
|
|
18
|
+
// The shop domain is also pinned: this app is distributed to ONE store, so an
|
|
19
|
+
// install request naming any other shop is not a mistake to accommodate.
|
|
20
|
+
import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
21
|
+
// Shopify's own shape. Anything else is not a shop we will talk to — a lookalike
|
|
22
|
+
// domain here would send the merchant's authorisation somewhere else entirely.
|
|
23
|
+
const SHOP_RE = /^[a-z0-9][a-z0-9-]*\.myshopify\.com$/i;
|
|
24
|
+
export const isShopDomain = (shop) => SHOP_RE.test(shop);
|
|
25
|
+
const constantTimeEqual = (a, b) => {
|
|
26
|
+
const ab = Buffer.from(a);
|
|
27
|
+
const bb = Buffer.from(b);
|
|
28
|
+
// Compare lengths first — timingSafeEqual throws on a mismatch, and a throw
|
|
29
|
+
// is itself a timing signal, so keep the shape uniform.
|
|
30
|
+
return ab.length === bb.length && timingSafeEqual(ab, bb);
|
|
31
|
+
};
|
|
32
|
+
// Signed, self-contained state: `<nonce>.<hmac>`. No server-side session store,
|
|
33
|
+
// which matters because this service holds no database and may restart between
|
|
34
|
+
// the redirect out and the callback back.
|
|
35
|
+
const STATE_TTL_MS = 15 * 60_000;
|
|
36
|
+
export const makeState = (secret, now = Date.now()) => {
|
|
37
|
+
const payload = `${randomBytes(16).toString('hex')}.${now}`;
|
|
38
|
+
const sig = createHmac('sha256', secret).update(payload).digest('hex');
|
|
39
|
+
return `${payload}.${sig}`;
|
|
40
|
+
};
|
|
41
|
+
// Signed AND time-boxed. Without the timestamp a state stays valid forever, so a
|
|
42
|
+
// link captured once (a browser history, a proxy log, a screenshot of the URL)
|
|
43
|
+
// remains a usable start-of-install indefinitely. An install takes a minute;
|
|
44
|
+
// fifteen is already generous.
|
|
45
|
+
export const verifyState = (secret, state, now = Date.now()) => {
|
|
46
|
+
const [nonce, issued, sig] = state.split('.');
|
|
47
|
+
if (!nonce || !issued || !sig)
|
|
48
|
+
return false;
|
|
49
|
+
const ts = Number(issued);
|
|
50
|
+
if (!Number.isFinite(ts) || now - ts > STATE_TTL_MS || ts - now > 60_000)
|
|
51
|
+
return false;
|
|
52
|
+
return constantTimeEqual(createHmac('sha256', secret).update(`${nonce}.${issued}`).digest('hex'), sig);
|
|
53
|
+
};
|
|
54
|
+
// Shopify signs the callback's query parameters: every param except `hmac`
|
|
55
|
+
// (and the legacy `signature`), sorted, joined as k=v with &, HMAC-SHA256 with
|
|
56
|
+
// the app secret.
|
|
57
|
+
export const verifyCallbackHmac = (secret, rawQuery) => {
|
|
58
|
+
// Built from the RAW query string, not from decoded values. Shopify signs what
|
|
59
|
+
// it sent: a value containing an encoded character (`host` is base64, and any
|
|
60
|
+
// parameter may carry %XX) decodes to different bytes than were signed, and
|
|
61
|
+
// rebuilding the message from decoded values would fail verification on a
|
|
62
|
+
// perfectly legitimate callback. Fails closed, so it presents as "the merchant
|
|
63
|
+
// cannot install" — a bug that is very hard to read backwards.
|
|
64
|
+
const pairs = [];
|
|
65
|
+
let hmac = '';
|
|
66
|
+
for (const part of rawQuery.replace(/^\?/, '').split('&')) {
|
|
67
|
+
if (!part)
|
|
68
|
+
continue;
|
|
69
|
+
const eq = part.indexOf('=');
|
|
70
|
+
const key = decodeURIComponent(eq === -1 ? part : part.slice(0, eq));
|
|
71
|
+
if (key === 'hmac') {
|
|
72
|
+
hmac = decodeURIComponent(part.slice(eq + 1));
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (key === 'signature')
|
|
76
|
+
continue; // legacy, excluded like hmac
|
|
77
|
+
pairs.push({ key, raw: part });
|
|
78
|
+
}
|
|
79
|
+
if (!hmac)
|
|
80
|
+
return false;
|
|
81
|
+
const message = pairs
|
|
82
|
+
.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0))
|
|
83
|
+
.map((p) => p.raw)
|
|
84
|
+
.join('&');
|
|
85
|
+
return constantTimeEqual(createHmac('sha256', secret).update(message).digest('hex'), hmac);
|
|
86
|
+
};
|
|
87
|
+
export const installUrl = (config, state) => {
|
|
88
|
+
const redirectUri = `${config.appUrl.replace(/\/$/, '')}/auth/callback`;
|
|
89
|
+
const qs = new URLSearchParams({
|
|
90
|
+
client_id: config.clientId,
|
|
91
|
+
scope: config.scopes,
|
|
92
|
+
redirect_uri: redirectUri,
|
|
93
|
+
state,
|
|
94
|
+
});
|
|
95
|
+
// `grant_options[]` is OMITTED on purpose. Absent = an OFFLINE token: one that
|
|
96
|
+
// belongs to the SHOP and keeps working when nobody is logged in, which is what
|
|
97
|
+
// an agent reading the catalogue at 3am needs. `per-user` would tie it to a
|
|
98
|
+
// merchant's session and die when they log out. Sending the key with an empty
|
|
99
|
+
// value is neither, and not something the docs define.
|
|
100
|
+
return `https://${config.shopDomain}/admin/oauth/authorize?${qs.toString()}`;
|
|
101
|
+
};
|
|
102
|
+
export const exchangeCode = async (config, code, fetchImpl = fetch) => {
|
|
103
|
+
const res = await fetchImpl(`https://${config.shopDomain}/admin/oauth/access_token`, {
|
|
104
|
+
method: 'POST',
|
|
105
|
+
headers: { 'content-type': 'application/json', accept: 'application/json' },
|
|
106
|
+
body: JSON.stringify({
|
|
107
|
+
client_id: config.clientId,
|
|
108
|
+
client_secret: config.clientSecret,
|
|
109
|
+
code,
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
if (!res.ok) {
|
|
113
|
+
// Never echo the body: it is a token exchange, and a failed one can still
|
|
114
|
+
// reflect inputs. The status separates a bad code (400) from a wrong app
|
|
115
|
+
// (401) from Shopify being down (5xx).
|
|
116
|
+
throw new Error(`shopify token exchange failed: HTTP ${res.status}`);
|
|
117
|
+
}
|
|
118
|
+
const body = (await res.json());
|
|
119
|
+
if (!body.access_token)
|
|
120
|
+
throw new Error('shopify token exchange returned no access_token');
|
|
121
|
+
return { accessToken: body.access_token, scope: body.scope ?? '' };
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class RateLimiter {
|
|
2
|
+
private readonly limit;
|
|
3
|
+
private readonly windowMs;
|
|
4
|
+
/** Bound the map so a flood of distinct IPs cannot grow it without limit. */
|
|
5
|
+
private readonly maxKeys;
|
|
6
|
+
private buckets;
|
|
7
|
+
constructor(limit: number, windowMs: number,
|
|
8
|
+
/** Bound the map so a flood of distinct IPs cannot grow it without limit. */
|
|
9
|
+
maxKeys?: number);
|
|
10
|
+
/** True when the call is allowed. */
|
|
11
|
+
take(key: string, now?: number): boolean;
|
|
12
|
+
private evictExpired;
|
|
13
|
+
}
|
|
14
|
+
export declare const clientIp: (headers: Headers, fallback?: string) => string;
|
|
15
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../src/rate-limit.ts"],"names":[],"mappings":"AAiBA,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,OAAO,CAA6B;gBAGzB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM;IACjC,6EAA6E;IAC5D,OAAO,SAAS;IAGnC,qCAAqC;IACrC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO;IAYpD,OAAO,CAAC,YAAY;CAarB;AAMD,eAAO,MAAM,QAAQ,GAAI,SAAS,OAAO,EAAE,iBAAoB,KAAG,MAOjE,CAAC"}
|