@agnostack/next-shopify 1.9.0-beta.2 → 1.9.0-beta.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/dist/lib/handlers/api/appInstallation.js +4 -4
- package/dist/lib/handlers/api/appInstallation.js.map +1 -1
- package/dist/lib/handlers/api/auth.js +5 -4
- package/dist/lib/handlers/api/auth.js.map +1 -1
- package/dist/lib/handlers/api/billing.js +3 -2
- package/dist/lib/handlers/api/billing.js.map +1 -1
- package/dist/lib/handlers/api/callback.js +24 -23
- package/dist/lib/handlers/api/callback.js.map +1 -1
- package/dist/lib/handlers/api/graph.js +11 -10
- package/dist/lib/handlers/api/graph.js.map +1 -1
- package/dist/lib/handlers/api/proxy.js +12 -11
- package/dist/lib/handlers/api/proxy.js.map +1 -1
- package/dist/lib/handlers/api/rest.js +7 -6
- package/dist/lib/handlers/api/rest.js.map +1 -1
- package/dist/lib/handlers/api/uninstall.js +3 -2
- package/dist/lib/handlers/api/uninstall.js.map +1 -1
- package/dist/lib/handlers/api/webhook.js +3 -2
- package/dist/lib/handlers/api/webhook.js.map +1 -1
- package/dist/lib/handlers/ssr/protect.js +10 -9
- package/dist/lib/handlers/ssr/protect.js.map +1 -1
- package/dist/lib/handlers/ssr/wrap.js +2 -1
- package/dist/lib/handlers/ssr/wrap.js.map +1 -1
- package/dist/lib/utils/shopify.d.ts +11 -0
- package/dist/lib/utils/shopify.js +19 -1
- package/dist/lib/utils/shopify.js.map +1 -1
- package/dist/lib/withShopify.js +60 -59
- package/dist/lib/withShopify.js.map +1 -1
- package/dist/shared/errors.d.ts +0 -11
- package/dist/shared/errors.js +1 -20
- package/dist/shared/errors.js.map +1 -1
- package/package.json +3 -2
|
@@ -12,7 +12,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.handleLoadAppInstallation = void 0;
|
|
15
|
-
const
|
|
15
|
+
const shared_1 = require("../../../shared");
|
|
16
16
|
const graph_1 = require("./graph");
|
|
17
17
|
const APP_INSTALLATION_QUERY = `
|
|
18
18
|
query getAppInstallation($namespace: String!) {
|
|
@@ -48,7 +48,7 @@ const APP_INSTALLATION_QUERY = `
|
|
|
48
48
|
// NOTE: typically handling: "/api/admin/installation/[appId]"
|
|
49
49
|
const handleLoadAppInstallation = (serverRuntimeConfig) => async (req, res, params) => {
|
|
50
50
|
const { appId } = params !== null && params !== void 0 ? params : {};
|
|
51
|
-
if (
|
|
51
|
+
if (shared_1.stringEmpty(appId)) {
|
|
52
52
|
return res.status(412).json({ message: 'Missing required param' });
|
|
53
53
|
}
|
|
54
54
|
const _handleGraph = graph_1.handleGraph(serverRuntimeConfig);
|
|
@@ -57,7 +57,7 @@ const handleLoadAppInstallation = (serverRuntimeConfig) => async (req, res, para
|
|
|
57
57
|
variables: { namespace: `${appId}-metafields` },
|
|
58
58
|
transform: (data) => {
|
|
59
59
|
const { id: appInstallationId, launchUrl, uninstallUrl, activeSubscriptions, oneTimePurchases: { nodes: oneTimePurchases, } = {}, metafields: { nodes: metafields, } = {}, } = data !== null && data !== void 0 ? data : {};
|
|
60
|
-
const activePurchases =
|
|
60
|
+
const activePurchases = shared_1.ensureArray(oneTimePurchases).reduce((_activePurchases, _a) => {
|
|
61
61
|
var { status } = _a, oneTimePurchase = __rest(_a, ["status"]);
|
|
62
62
|
return ([
|
|
63
63
|
..._activePurchases,
|
|
@@ -67,7 +67,7 @@ const handleLoadAppInstallation = (serverRuntimeConfig) => async (req, res, para
|
|
|
67
67
|
]);
|
|
68
68
|
}, []);
|
|
69
69
|
// NOTE: removing namespace for security
|
|
70
|
-
const appMetafields =
|
|
70
|
+
const appMetafields = shared_1.ensureArray(metafields).reduce((_appMetafields,
|
|
71
71
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
72
72
|
_a) => {
|
|
73
73
|
var
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appInstallation.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/appInstallation.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"appInstallation.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/appInstallation.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAA0D;AAC1D,mCAAqC;AAErC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B9B,CAAA;AAED,8DAA8D;AACvD,MAAM,yBAAyB,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;IAC3F,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAA;IAE9B,IAAI,oBAAW,CAAC,KAAK,CAAC,EAAE;QACtB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAA;KACnE;IAED,MAAM,YAAY,GAAG,mBAAW,CAAC,mBAAmB,CAAC,CAAA;IAErD,OAAO,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;QAC5B,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,aAAa,EAAE;QAC/C,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,EACJ,EAAE,EAAE,iBAAiB,EACrB,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAAE,EAChB,KAAK,EAAE,gBAAgB,GACxB,GAAG,EAAE,EACN,UAAU,EAAE,EACV,KAAK,EAAE,UAAU,GAClB,GAAG,EAAE,GACP,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,CAAA;YAEd,MAAM,eAAe,GAAG,oBAAW,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAC3D,gBAAgB,EAChB,EAA8B,EAC9B,EAAE;oBADF,EAAE,MAAM,OAAsB,EAAjB,eAAe,cAA5B,UAA8B,CAAF;gBACzB,OAAA,CAAC;oBACJ,GAAG,gBAAgB;oBACnB,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;wBACzB,eAAe;qBAChB,CAAC,CAAC,CAAC,EAAE;iBACP,CAAC,CAAA;aAAA,EAAE,EAAE,CAAC,CAAA;YAEP,wCAAwC;YACxC,MAAM,aAAa,GAAG,oBAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CACnD,cAAc;YACd,6DAA6D;YAC7D,EAA4C,EAC5C,EAAE;;gBAFF,6DAA6D;gBAC7D,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAgB,EAAX,SAAS;gBAD1C,6DAA6D;gBAC7D,oBAA4C,CAAF;gBACvC,OAAA,iCACA,cAAc,KACjB,CAAC,GAAG,CAAC,EAAE,SAAS,IAChB,CAAA;aAAA,EAAE,EAAE,CAAC,CAAA;YAEP,OAAO;gBACL,aAAa;gBACb,eAAe,gCACb,EAAE,EAAE,iBAAiB,EACrB,mBAAmB;oBACnB,eAAe,IACZ,SAAS,IAAI;oBACd,SAAS,EAAE,SAAS;iBACrB,GACE,YAAY,IAAI;oBACjB,YAAY,EAAE,YAAY;iBAC3B,CACF;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC,CAAA;AA9DY,QAAA,yBAAyB,6BA8DrC"}
|
|
@@ -13,6 +13,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.handleAuth = void 0;
|
|
15
15
|
const utils_1 = require("../../utils");
|
|
16
|
+
const shared_1 = require("../../../shared");
|
|
16
17
|
// NOTE: typically handling: "/api/auth/online" and "/api/auth/offline"
|
|
17
18
|
const handleAuth = (serverRuntimeConfig) => async (req, res, params) => {
|
|
18
19
|
var _a;
|
|
@@ -20,18 +21,18 @@ const handleAuth = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
20
21
|
const { isOnline } = params !== null && params !== void 0 ? params : {};
|
|
21
22
|
const _b = (_a = req.query) !== null && _a !== void 0 ? _a : {}, { reAuth: _reAuth } = _b, query = __rest(_b, ["reAuth"]);
|
|
22
23
|
const { embedded, state, host, shop: _shop } = query;
|
|
23
|
-
const reAuth =
|
|
24
|
+
const reAuth = shared_1.isTrue(_reAuth, 'undefined');
|
|
24
25
|
const shopify = utils_1.getInitializedShopify(serverRuntimeConfig);
|
|
25
26
|
const shop = shopify.utils.sanitizeShop(_shop);
|
|
26
|
-
if (
|
|
27
|
-
return res.redirect(`${PAGE_PATHS[
|
|
27
|
+
if (shared_1.stringEmpty(shop)) {
|
|
28
|
+
return res.redirect(`${PAGE_PATHS[shared_1.PAGE_ROUTE_NAMES.ERROR]}?code=no_shop_provided&type=handleAuth`);
|
|
28
29
|
}
|
|
29
30
|
if (embedded === '1') {
|
|
30
31
|
const callbackURL = utils_1.getCallback(API_URLS, { reAuth, isOnline });
|
|
31
32
|
// TODO: explore objectToQuerystring
|
|
32
33
|
const redirectUriParams = new URLSearchParams({ shop, host, state }).toString();
|
|
33
34
|
const queryParams = new URLSearchParams(Object.assign(Object.assign({}, query), { shop, redirectUri: `${callbackURL}?${redirectUriParams}` })).toString();
|
|
34
|
-
return res.redirect(`${PAGE_PATHS[
|
|
35
|
+
return res.redirect(`${PAGE_PATHS[shared_1.PAGE_ROUTE_NAMES.EXIT]}?${queryParams}`);
|
|
35
36
|
}
|
|
36
37
|
const callbackPath = utils_1.getCallback(API_PATHS, { reAuth, isOnline });
|
|
37
38
|
return utils_1.beginAuth({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/auth.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/auth.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,uCAIoB;AACpB,4CAIwB;AAExB,wEAAwE;AACjE,MAAM,UAAU,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;;IAC5E,MAAM,EACJ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,UAAU,GACX,GAAG,mBAAmB,CAAA;IACvB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAA;IACjC,MAAM,KAAgC,MAAA,GAAG,CAAC,KAAK,mCAAI,EAAE,EAA/C,EAAE,MAAM,EAAE,OAAO,OAA8B,EAAzB,KAAK,cAA3B,UAA6B,CAAkB,CAAA;IACrD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IACpD,MAAM,MAAM,GAAG,eAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAE3C,MAAM,OAAO,GAAG,6BAAqB,CAAC,mBAAmB,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAE9C,IAAI,oBAAW,CAAC,IAAI,CAAC,EAAE;QACrB,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,yBAAgB,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAA;KACnG;IAED,IAAI,QAAQ,KAAK,GAAG,EAAE;QACpB,MAAM,WAAW,GAAG,mBAAW,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC/D,oCAAoC;QACpC,MAAM,iBAAiB,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC/E,MAAM,WAAW,GAAG,IAAI,eAAe,iCAClC,KAAK,KACR,IAAI,EACJ,WAAW,EAAE,GAAG,WAAW,IAAI,iBAAiB,EAAE,IAClD,CAAC,QAAQ,EAAE,CAAA;QAEb,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,yBAAgB,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,CAAA;KAC3E;IAED,MAAM,YAAY,GAAG,mBAAW,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAEjE,OAAO,iBAAS,CAAC;QACf,IAAI;QACJ,KAAK;QACL,QAAQ;QACR,YAAY;QACZ,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,GAAG;QAChB,MAAM,EAAE,UAAU;KACnB,CAAC,CAAA;AACJ,CAAC,CAAA;AA3CY,QAAA,UAAU,cA2CtB"}
|
|
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
exports.handleAppBilling = void 0;
|
|
18
18
|
const raw_body_1 = __importDefault(require("raw-body"));
|
|
19
19
|
const utils_1 = require("../../utils");
|
|
20
|
+
const shared_1 = require("../../../shared");
|
|
20
21
|
const TERMINAL_STATUSES = [
|
|
21
22
|
'EXPIRED',
|
|
22
23
|
'DECLINED',
|
|
@@ -27,7 +28,7 @@ const handleAppBilling = (serverRuntimeConfig) => async (req, res) => {
|
|
|
27
28
|
var _a;
|
|
28
29
|
try {
|
|
29
30
|
const { 'x-shopify-shop-domain': shop } = (_a = req.headers) !== null && _a !== void 0 ? _a : {};
|
|
30
|
-
if (
|
|
31
|
+
if (shared_1.stringEmpty(shop)) {
|
|
31
32
|
return res.status(200).json({ handler: 'billing', error: 'Missing shop' });
|
|
32
33
|
}
|
|
33
34
|
const { shopify, loadSession, updateSession } = await utils_1.getShopifyHelpers(serverRuntimeConfig, { shop });
|
|
@@ -43,7 +44,7 @@ const handleAppBilling = (serverRuntimeConfig) => async (req, res) => {
|
|
|
43
44
|
try {
|
|
44
45
|
let message = 'ignored';
|
|
45
46
|
const [eventType, { status } = {}] = Object.entries(JSON.parse(rawBody))[0];
|
|
46
|
-
if ((eventType ===
|
|
47
|
+
if ((eventType === shared_1.BILLING_EVENT_TYPES.SUBSCRIPTION) && TERMINAL_STATUSES.includes(status)) {
|
|
47
48
|
const { Rest } = await utils_1.getVerifiedClients(serverRuntimeConfig, { shop });
|
|
48
49
|
// NOTE: this deletes the app in the case of subscription apps in a "terminal" state to cover the info in ShopifyApi docs for billing:
|
|
49
50
|
// "Note: the merchant may refuse payment when prompted or cancel subscriptions later on, but the app will already be installed at that point. We recommend using billing webhooks to revoke access for merchants when they cancel / decline payment."
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/billing.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wDAAiC;AAEjC,
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/billing.js"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.handleCallback = void 0;
|
|
15
15
|
const shopify_api_1 = require("@shopify/shopify-api");
|
|
16
16
|
const utils_1 = require("../../utils");
|
|
17
|
+
const shared_1 = require("../../../shared");
|
|
17
18
|
/* NOTE: typically handling:
|
|
18
19
|
* "/api/auth/online/callback"
|
|
19
20
|
* "/api/auth/offline/callback"
|
|
@@ -24,16 +25,16 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
24
25
|
var _a, _b;
|
|
25
26
|
const _c = serverRuntimeConfig, { API_PATHS, PAGE_PATHS, PAYMENT_CONFIG, SHOPIFY_RUN_MODE } = _c, _d = _c.APP_WEBHOOKS, _e = _d === void 0 ? {} : _d,
|
|
26
27
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
27
|
-
_f =
|
|
28
|
+
_f = shared_1.API_WEBHOOK_TOPICS.APP_UNINSTALLED,
|
|
28
29
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
29
30
|
_uninstalledWebhook = _e[_f], webhooks = __rest(_e, [typeof _f === "symbol" ? _f : _f + ""]);
|
|
30
|
-
const errorPath = PAGE_PATHS[
|
|
31
|
+
const errorPath = PAGE_PATHS[shared_1.PAGE_ROUTE_NAMES.ERROR];
|
|
31
32
|
const { isOnline, reAuth } = params !== null && params !== void 0 ? params : {};
|
|
32
33
|
const { shop, host, state } = (_a = req.query) !== null && _a !== void 0 ? _a : {};
|
|
33
34
|
const authPayload = { rawRequest: req, rawResponse: res };
|
|
34
|
-
if (
|
|
35
|
+
if (shared_1.stringEmpty(shop) || shared_1.stringEmpty(host)) {
|
|
35
36
|
// HMMM: why is this a 303 (rather than a 302 or or anything)??
|
|
36
|
-
return res.redirect(303, `${errorPath}?code=${
|
|
37
|
+
return res.redirect(303, `${errorPath}?code=${shared_1.ERROR_CODES.INVALID_CALLBACK}`);
|
|
37
38
|
}
|
|
38
39
|
let redirectUrl = `${errorPath}?code=invalid_callback_response`;
|
|
39
40
|
let shopify;
|
|
@@ -44,10 +45,10 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
44
45
|
const session = _session.toObject();
|
|
45
46
|
const isReviewMode = ((SHOPIFY_RUN_MODE === 'review') &&
|
|
46
47
|
(PAYMENT_CONFIG === null || PAYMENT_CONFIG === void 0 ? void 0 : PAYMENT_CONFIG.required) &&
|
|
47
|
-
API_PATHS[
|
|
48
|
+
API_PATHS[shared_1.API_ROUTE_NAMES.AUTH_OFFLINE]);
|
|
48
49
|
const shouldStoreSession = isOnline || !isReviewMode;
|
|
49
|
-
const shouldProcessOfflineAuth = isOnline &&
|
|
50
|
-
const shouldRegisterWebhooks = !
|
|
50
|
+
const shouldProcessOfflineAuth = isOnline && shared_1.objectNotEmpty(webhooks) && API_PATHS[shared_1.API_ROUTE_NAMES.AUTH_OFFLINE];
|
|
51
|
+
const shouldRegisterWebhooks = !shared_1.isTrue(session === null || session === void 0 ? void 0 : session.isOnline) || !API_PATHS[shared_1.API_ROUTE_NAMES.AUTH_OFFLINE];
|
|
51
52
|
const shouldCheckBilling = PAYMENT_CONFIG === null || PAYMENT_CONFIG === void 0 ? void 0 : PAYMENT_CONFIG.required;
|
|
52
53
|
// NOTE: billingStatus is a custom field we add when we're in review mode to handle reauth billing correctly
|
|
53
54
|
let billingStatus = 'PENDING';
|
|
@@ -58,7 +59,7 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
58
59
|
// NOTE our review approach requires that all paid apps must support offline tokens
|
|
59
60
|
const offlineSession = await loadSession().catch((_error) => {
|
|
60
61
|
// NOTE: first time install, this is expected
|
|
61
|
-
if (!(_error instanceof
|
|
62
|
+
if (!(_error instanceof shared_1.ShopifySessionMissingError)) {
|
|
62
63
|
throw _error;
|
|
63
64
|
}
|
|
64
65
|
});
|
|
@@ -69,7 +70,7 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
69
70
|
if (shouldProcessOfflineAuth) {
|
|
70
71
|
// TODO: explore objectToQuerystring
|
|
71
72
|
const queryParams = new URLSearchParams({ host, shop, state, reAuth, isOnline: false }).toString();
|
|
72
|
-
return res.redirect(302, `${API_PATHS[
|
|
73
|
+
return res.redirect(302, `${API_PATHS[shared_1.API_ROUTE_NAMES.AUTH_OFFLINE]}?${queryParams}`);
|
|
73
74
|
}
|
|
74
75
|
if (shouldRegisterWebhooks) {
|
|
75
76
|
const webhookHandlers = utils_1.getWebhookHandlers(serverRuntimeConfig);
|
|
@@ -81,15 +82,15 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
81
82
|
redirectUrl = await shopify.auth.getEmbeddedAppUrl(authPayload);
|
|
82
83
|
if (shouldCheckBilling) {
|
|
83
84
|
// NOTE this ensures while in "review" mode that we rebill each time
|
|
84
|
-
const skipBillingCheck = isReviewMode && (!
|
|
85
|
+
const skipBillingCheck = isReviewMode && (!shared_1.isTrue(reAuth) || (billingStatus != 'ACTIVE'));
|
|
85
86
|
const confirmationUrl = await ensureBilling(session, skipBillingCheck);
|
|
86
|
-
if (
|
|
87
|
+
if (shared_1.stringNotEmpty(confirmationUrl)) {
|
|
87
88
|
redirectUrl = confirmationUrl;
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
// NOTE confirm that state can be appended to the confirmationUrl,
|
|
91
92
|
// otherwise we can append to the redirectUrl above the billing check
|
|
92
|
-
redirectUrl =
|
|
93
|
+
redirectUrl = shared_1.appendQuery(redirectUrl, new URLSearchParams({ state }).toString());
|
|
93
94
|
}
|
|
94
95
|
catch (error) {
|
|
95
96
|
console.error('Error handling callback route', error);
|
|
@@ -98,8 +99,8 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
98
99
|
if (shopify) {
|
|
99
100
|
try {
|
|
100
101
|
const embeddedAppUrl = await shopify.auth.getEmbeddedAppUrl(authPayload);
|
|
101
|
-
if (
|
|
102
|
-
baseErrorUrl = `${embeddedAppUrl}${
|
|
102
|
+
if (shared_1.stringNotEmpty(embeddedAppUrl)) {
|
|
103
|
+
baseErrorUrl = `${embeddedAppUrl}${shared_1.ensureLeadingSlash(errorPath)}`;
|
|
103
104
|
}
|
|
104
105
|
// eslint-disable-next-line no-empty
|
|
105
106
|
}
|
|
@@ -110,10 +111,10 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
110
111
|
case error instanceof shopify_api_1.InvalidHmacError: {
|
|
111
112
|
console.warn(`${errorMessage}. InvalidHmac Error ${error.message}`);
|
|
112
113
|
// HMMMM: not sure
|
|
113
|
-
const authOnlinePath = API_PATHS[
|
|
114
|
+
const authOnlinePath = API_PATHS[shared_1.API_ROUTE_NAMES.AUTH_ONLINE];
|
|
114
115
|
const authPath = isOnline
|
|
115
116
|
? authOnlinePath
|
|
116
|
-
: API_PATHS[
|
|
117
|
+
: API_PATHS[shared_1.API_ROUTE_NAMES.AUTH_OFFLINE] || authOnlinePath;
|
|
117
118
|
// TODO: explore objectToQuerystring
|
|
118
119
|
const queryParams = new URLSearchParams({ host, shop, state }).toString();
|
|
119
120
|
redirectUrl = `${authPath}?${queryParams}`;
|
|
@@ -122,10 +123,10 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
122
123
|
case error instanceof shopify_api_1.CookieNotFound: {
|
|
123
124
|
console.warn(`${errorMessage}. This may occur if Cookie is already deleted. CookieNotFound Error ${error.message}`);
|
|
124
125
|
// HMMMM: not sure
|
|
125
|
-
const authOnlinePath = API_PATHS[
|
|
126
|
+
const authOnlinePath = API_PATHS[shared_1.API_ROUTE_NAMES.AUTH_ONLINE];
|
|
126
127
|
const authPath = isOnline
|
|
127
128
|
? authOnlinePath
|
|
128
|
-
: API_PATHS[
|
|
129
|
+
: API_PATHS[shared_1.API_ROUTE_NAMES.AUTH_OFFLINE] || authOnlinePath;
|
|
129
130
|
// TODO: explore objectToQuerystring
|
|
130
131
|
const queryParams = new URLSearchParams({ host, shop, state }).toString();
|
|
131
132
|
redirectUrl = `${authPath}?${queryParams}`;
|
|
@@ -133,23 +134,23 @@ const handleCallback = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
133
134
|
}
|
|
134
135
|
case error instanceof shopify_api_1.BillingError: {
|
|
135
136
|
console.error(`${errorMessage}. Billing Error ${error.message}`, error.errorData);
|
|
136
|
-
redirectUrl = `${baseErrorUrl}?code=${
|
|
137
|
+
redirectUrl = `${baseErrorUrl}?code=${shared_1.ERROR_CODES.BILLING}`;
|
|
137
138
|
break;
|
|
138
139
|
}
|
|
139
140
|
case error instanceof shopify_api_1.GraphqlQueryError: {
|
|
140
|
-
const errorMessages =
|
|
141
|
+
const errorMessages = shared_1.ensureArray((_b = error.response) === null || _b === void 0 ? void 0 : _b.errors).map(({ message }) => shared_1.ensureString(message));
|
|
141
142
|
console.error(`${errorMessage}. GraphqlQuery Error ${errorMessages.join('. ')}`);
|
|
142
|
-
redirectUrl = `${baseErrorUrl}?code=${
|
|
143
|
+
redirectUrl = `${baseErrorUrl}?code=${shared_1.ERROR_CODES.QUERY}`;
|
|
143
144
|
break;
|
|
144
145
|
}
|
|
145
146
|
case error instanceof shopify_api_1.InvalidOAuthError: {
|
|
146
147
|
console.error(`${errorMessage}. InvalidOAuth Error`, error);
|
|
147
|
-
redirectUrl = `${baseErrorUrl}?code=${
|
|
148
|
+
redirectUrl = `${baseErrorUrl}?code=${shared_1.ERROR_CODES.OAUTH}`;
|
|
148
149
|
break;
|
|
149
150
|
}
|
|
150
151
|
default: {
|
|
151
152
|
console.error(errorMessage, error);
|
|
152
|
-
redirectUrl = `${baseErrorUrl}?code=${
|
|
153
|
+
redirectUrl = `${baseErrorUrl}?code=${shared_1.ERROR_CODES.CALLBACK}`;
|
|
153
154
|
}
|
|
154
155
|
}
|
|
155
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/callback.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,sDAM6B;AAE7B,
|
|
1
|
+
{"version":3,"file":"callback.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/callback.js"],"names":[],"mappings":"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"}
|
|
@@ -14,15 +14,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.handleGraph = void 0;
|
|
15
15
|
const shopify_api_1 = require("@shopify/shopify-api");
|
|
16
16
|
const utils_1 = require("../../utils");
|
|
17
|
+
const shared_1 = require("../../../shared");
|
|
17
18
|
const handleGraph = (serverRuntimeConfig) => async (req, res, params) => {
|
|
18
19
|
var _a, _b;
|
|
19
20
|
const { body = '{}' } = req, _c = req.query, _d = _c === void 0 ? {} : _c, { shop, apiVersion } = _d, _query = __rest(_d, ["shop", "apiVersion"]);
|
|
20
21
|
const _e = params !== null && params !== void 0 ? params : JSON.parse(body), { query: graphQuery, variables: graphVariables, transform = (_data) => _data } = _e, graphParams = __rest(_e, ["query", "variables", "transform"]);
|
|
21
22
|
let query = _query;
|
|
22
|
-
if (
|
|
23
|
-
query =
|
|
23
|
+
if (shared_1.isType(query, 'string')) {
|
|
24
|
+
query = shared_1.querystringToObject(query);
|
|
24
25
|
}
|
|
25
|
-
if (
|
|
26
|
+
if (shared_1.stringEmpty(shop) || shared_1.stringEmpty(graphQuery)) {
|
|
26
27
|
return res.status(400).json({ message: 'Invalid arguments' });
|
|
27
28
|
}
|
|
28
29
|
let statusCode;
|
|
@@ -34,14 +35,14 @@ const handleGraph = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
34
35
|
response = await Graphql.query(Object.assign(Object.assign({ data: graphVariables ? {
|
|
35
36
|
query: graphQuery,
|
|
36
37
|
variables: graphVariables,
|
|
37
|
-
} : graphQuery },
|
|
38
|
+
} : graphQuery }, shared_1.objectNotEmpty(query) && { query }), graphParams));
|
|
38
39
|
statusCode = 200;
|
|
39
40
|
}
|
|
40
41
|
catch (error) {
|
|
41
42
|
statusCode = 500;
|
|
42
43
|
// TODO: clean up to share between rest and graph (pr at least keep in sync)
|
|
43
44
|
switch (true) {
|
|
44
|
-
case error instanceof
|
|
45
|
+
case error instanceof shared_1.ShopifyAuthenticationError: {
|
|
45
46
|
console.error(`${message}. Authentication Error.`, error);
|
|
46
47
|
const errorResponse = utils_1.getAuthErrorResponse(serverRuntimeConfig, { error, shop });
|
|
47
48
|
statusCode = errorResponse.statusCode;
|
|
@@ -62,7 +63,7 @@ const handleGraph = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
62
63
|
break;
|
|
63
64
|
}
|
|
64
65
|
case error instanceof shopify_api_1.GraphqlQueryError: {
|
|
65
|
-
const errorMessages =
|
|
66
|
+
const errorMessages = shared_1.ensureArray((_a = error.response) === null || _a === void 0 ? void 0 : _a.errors).map(({ message }) => shared_1.ensureString(message));
|
|
66
67
|
console.error(`${message}. ${errorMessages.join('. ')}.`);
|
|
67
68
|
// HMMMM, should this be:
|
|
68
69
|
// message = `${message}. ${errorMessages.join('. ')}.`
|
|
@@ -82,10 +83,10 @@ const handleGraph = (serverRuntimeConfig) => async (req, res, params) => {
|
|
|
82
83
|
}
|
|
83
84
|
try {
|
|
84
85
|
const responseBody = (_b = response.body.data) !== null && _b !== void 0 ? _b : response.body;
|
|
85
|
-
const [_responseData] = Object.values(
|
|
86
|
-
const _f =
|
|
87
|
-
if (
|
|
88
|
-
const errorMessages =
|
|
86
|
+
const [_responseData] = Object.values(shared_1.ensureObject(responseBody));
|
|
87
|
+
const _f = shared_1.ensureObject(_responseData), { userErrors } = _f, responseData = __rest(_f, ["userErrors"]);
|
|
88
|
+
if (shared_1.arrayNotEmpty(userErrors)) {
|
|
89
|
+
const errorMessages = shared_1.ensureArray(userErrors).map(({ message }) => shared_1.ensureString(message));
|
|
89
90
|
return res.status(500).json({ message: `${message}. ${errorMessages.join('. ')}.` });
|
|
90
91
|
}
|
|
91
92
|
// NOTE: sending in both to transform in case someone needs the userErrors
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/graph.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,sDAAsE;AAEtE,
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/graph.js"],"names":[],"mappings":"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"}
|
|
@@ -20,18 +20,19 @@ exports.handleProxy = void 0;
|
|
|
20
20
|
const http_proxy_1 = __importDefault(require("http-proxy"));
|
|
21
21
|
const nextjs_cors_1 = __importDefault(require("nextjs-cors"));
|
|
22
22
|
const utils_1 = require("../../utils");
|
|
23
|
+
const shared_1 = require("../../../shared");
|
|
23
24
|
const PROXY_TIMEOUT = 6000; // NOTE: 6 seconds
|
|
24
25
|
const verifyAppProxySignature = (signature, verifiable, sharedSecret) => {
|
|
25
|
-
const hmac = utils_1.generateHMAC(
|
|
26
|
+
const hmac = utils_1.generateHMAC(shared_1.objectToSortedString(verifiable), sharedSecret);
|
|
26
27
|
return utils_1.compareHashes(signature, hmac);
|
|
27
28
|
};
|
|
28
29
|
const handleProxy = (serverRuntimeConfig) => async (req, res, _params) => {
|
|
29
30
|
var _a;
|
|
30
31
|
const { APP_CONFIG, SETTING_REPLACEMENTS, TARGET_SAFELIST, ORIGIN_SAFELIST } = serverRuntimeConfig;
|
|
31
|
-
const targetSafelist =
|
|
32
|
+
const targetSafelist = shared_1.ensureObject(TARGET_SAFELIST);
|
|
32
33
|
const targetOriginsSafelist = Object.keys(targetSafelist);
|
|
33
34
|
const originsSafelist = [
|
|
34
|
-
...
|
|
35
|
+
...shared_1.ensureArray(ORIGIN_SAFELIST),
|
|
35
36
|
'https://cdn.shopify.com'
|
|
36
37
|
];
|
|
37
38
|
await nextjs_cors_1.default(req, res, {
|
|
@@ -43,12 +44,12 @@ const handleProxy = (serverRuntimeConfig) => async (req, res, _params) => {
|
|
|
43
44
|
}
|
|
44
45
|
let _shop;
|
|
45
46
|
try {
|
|
46
|
-
_shop =
|
|
47
|
+
_shop = shared_1.ensureString(origin).startsWith('http') ? new URL(origin).hostname : origin;
|
|
47
48
|
}
|
|
48
49
|
catch (ignore) {
|
|
49
50
|
console.log('Ignoring error decoding origin', ignore);
|
|
50
51
|
}
|
|
51
|
-
if (_shop &&
|
|
52
|
+
if (_shop && shared_1.stringNotEmpty((_a = utils_1.getSanitizedShopData(_shop)) === null || _a === void 0 ? void 0 : _a.shop)) {
|
|
52
53
|
return callback(null, true);
|
|
53
54
|
}
|
|
54
55
|
return callback(new Error('Invalid CORS origin'));
|
|
@@ -58,16 +59,16 @@ const handleProxy = (serverRuntimeConfig) => async (req, res, _params) => {
|
|
|
58
59
|
const proxy = http_proxy_1.default.createProxy();
|
|
59
60
|
const { target: _target } = _params !== null && _params !== void 0 ? _params : {};
|
|
60
61
|
const { origin: target, hostname, pathname, search } = _target ? new URL(_target) : {};
|
|
61
|
-
const targetUrl = [pathname, search].filter(
|
|
62
|
-
if (!targetUrl ||
|
|
62
|
+
const targetUrl = [pathname, search].filter(shared_1.stringNotEmpty).join('');
|
|
63
|
+
if (!targetUrl || shared_1.arrayEmpty(targetOriginsSafelist) || !targetOriginsSafelist.includes(hostname)) {
|
|
63
64
|
return res.status(407).json({ message: 'Unproxyable target.' });
|
|
64
65
|
}
|
|
65
66
|
const { query: _query, headers: _headers } = req;
|
|
66
|
-
const query =
|
|
67
|
+
const query = shared_1.ensureObject(_query);
|
|
67
68
|
// TODO!!!!!!: update this to not send as querystring/get via app itself somehow on backend?
|
|
68
69
|
const { signature, proxyEncoded } = query, verifiable = __rest(query, ["signature", "proxyEncoded"]);
|
|
69
70
|
const { shop: _shop, host: _host, timestamp, path_prefix } = verifiable;
|
|
70
|
-
const isShopifyOriginOrRelative =
|
|
71
|
+
const isShopifyOriginOrRelative = shared_1.stringNotEmpty(shared_1.ensureString(path_prefix).startsWith('http')
|
|
71
72
|
? (_a = utils_1.getSanitizedShopData(new URL(path_prefix).hostname)) === null || _a === void 0 ? void 0 : _a.shop
|
|
72
73
|
: path_prefix);
|
|
73
74
|
// TODO: explore moving this to sessionToken middleware??
|
|
@@ -86,8 +87,8 @@ const handleProxy = (serverRuntimeConfig) => async (req, res, _params) => {
|
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
89
|
// TODO: explore adding hmac check/middleware?
|
|
89
|
-
const setting =
|
|
90
|
-
const headers = Object.entries(
|
|
90
|
+
const setting = shared_1.ensureObject(SETTING_REPLACEMENTS);
|
|
91
|
+
const headers = Object.entries(shared_1.ensureObject(targetSafelist[hostname])).reduce((_replacedHeaders, [header, headerValue]) => (Object.assign(Object.assign({}, _replacedHeaders), { [header]: shared_1.templateReplace(headerValue, { setting }) })), __headers);
|
|
91
92
|
return new Promise((_resolve, reject) => {
|
|
92
93
|
req.url = targetUrl;
|
|
93
94
|
req.headers = headers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/proxy.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,sDAAsD;AACtD,gDAAgD;AAChD,4DAAkC;AAClC,8DAAkC;AAElC,
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/proxy.js"],"names":[],"mappings":"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"}
|
|
@@ -15,11 +15,12 @@ exports.handleRest = void 0;
|
|
|
15
15
|
// NOTE: api routes do NOT work in `next export`
|
|
16
16
|
const shopify_api_1 = require("@shopify/shopify-api");
|
|
17
17
|
const utils_1 = require("../../utils");
|
|
18
|
+
const shared_1 = require("../../../shared");
|
|
18
19
|
const handleRest = (serverRuntimeConfig) => async (req, res, _params) => {
|
|
19
20
|
const { query: _query, method: _method, body: _body } = req;
|
|
20
21
|
const { shop } = _query !== null && _query !== void 0 ? _query : {};
|
|
21
22
|
const _a = _params !== null && _params !== void 0 ? _params : {}, { method: methodParam, query: queryParam, body: bodyParam, path, transform = (_data) => _data } = _a, params = __rest(_a, ["method", "query", "body", "path", "transform"]);
|
|
22
|
-
if (
|
|
23
|
+
if (shared_1.stringEmpty(shop) || shared_1.stringEmpty(path)) {
|
|
23
24
|
return {
|
|
24
25
|
statusCode: 400,
|
|
25
26
|
message: 'Invalid arguments',
|
|
@@ -31,12 +32,12 @@ const handleRest = (serverRuntimeConfig) => async (req, res, _params) => {
|
|
|
31
32
|
let headers = {};
|
|
32
33
|
try {
|
|
33
34
|
let queryData = queryParam !== null && queryParam !== void 0 ? queryParam : _query;
|
|
34
|
-
if (
|
|
35
|
-
queryData =
|
|
35
|
+
if (shared_1.isType(queryData, 'string')) {
|
|
36
|
+
queryData = shared_1.querystringToObject(queryData);
|
|
36
37
|
}
|
|
37
|
-
const _b =
|
|
38
|
+
const _b = shared_1.ensureObject(queryData), { apiVersion } = _b, query = __rest(_b, ["apiVersion"]);
|
|
38
39
|
const body = bodyParam !== null && bodyParam !== void 0 ? bodyParam : _body;
|
|
39
|
-
const method =
|
|
40
|
+
const method = shared_1.ensureString(methodParam !== null && methodParam !== void 0 ? methodParam : _method).toLowerCase();
|
|
40
41
|
const { Rest } = await utils_1.getVerifiedClients(serverRuntimeConfig, { req, res, shop, apiVersion });
|
|
41
42
|
response = await Rest[method](Object.assign({ path,
|
|
42
43
|
query,
|
|
@@ -48,7 +49,7 @@ const handleRest = (serverRuntimeConfig) => async (req, res, _params) => {
|
|
|
48
49
|
statusCode = 500;
|
|
49
50
|
// TODO: clean up to share between rest and graph (pr at least keep in sync)
|
|
50
51
|
switch (true) {
|
|
51
|
-
case error instanceof
|
|
52
|
+
case error instanceof shared_1.ShopifyAuthenticationError: {
|
|
52
53
|
console.error(`${message}. Authentication Error.`, error);
|
|
53
54
|
const errorResponse = utils_1.getAuthErrorResponse(serverRuntimeConfig, { error, shop });
|
|
54
55
|
statusCode = errorResponse.statusCode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/rest.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,gDAAgD;AAChD,sDAA6D;AAE7D,
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/rest.js"],"names":[],"mappings":"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"}
|
|
@@ -17,12 +17,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
exports.handleAppUninstalled = void 0;
|
|
18
18
|
const raw_body_1 = __importDefault(require("raw-body"));
|
|
19
19
|
const utils_1 = require("../../utils");
|
|
20
|
+
const shared_1 = require("../../../shared");
|
|
20
21
|
// NOTE: typically handling: "/api/webhooks/app/uninstalled"
|
|
21
22
|
const handleAppUninstalled = (serverRuntimeConfig) => async (req, res) => {
|
|
22
23
|
var _a;
|
|
23
24
|
try {
|
|
24
25
|
const { 'x-shopify-shop-domain': shop } = (_a = req.headers) !== null && _a !== void 0 ? _a : {};
|
|
25
|
-
if (
|
|
26
|
+
if (shared_1.stringEmpty(shop)) {
|
|
26
27
|
return res.status(200).json({ handler: 'uninstall', error: 'Missing shop' });
|
|
27
28
|
}
|
|
28
29
|
const { shopify, findSessionIds, deleteSessions } = await utils_1.getShopifyHelpers(serverRuntimeConfig, { shop });
|
|
@@ -36,7 +37,7 @@ const handleAppUninstalled = (serverRuntimeConfig) => async (req, res) => {
|
|
|
36
37
|
if (valid) {
|
|
37
38
|
try {
|
|
38
39
|
const sessionsIds = await findSessionIds(shop);
|
|
39
|
-
if (
|
|
40
|
+
if (shared_1.arrayNotEmpty(sessionsIds)) {
|
|
40
41
|
await deleteSessions(sessionsIds);
|
|
41
42
|
}
|
|
42
43
|
return res.status(200).json({ handler: 'uninstall', message: 'success' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/uninstall.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wDAAiC;AAEjC,
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../../src/lib/handlers/api/uninstall.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wDAAiC;AAEjC,uCAA+C;AAC/C,4CAGwB;AAExB,4DAA4D;AACrD,MAAM,oBAAoB,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;;IAC9E,IAAI;QACF,MAAM,EAAE,uBAAuB,EAAE,IAAI,EAAE,GAAG,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE,CAAA;QAE3D,IAAI,oBAAW,CAAC,IAAI,CAAC,EAAE;YACrB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;SAC7E;QAED,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,yBAAiB,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QAE1G,mEAAmE;QACnE,MAAM,OAAO,GAAG,MAAM,kBAAU,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,KAA6B,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC3B,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,GAAG;SACjB,CAAC,EAJI,EAAE,KAAK,OAIX,EAJgB,YAAY,cAAxB,SAA0B,CAI9B,CAAA;QAEF,IAAI,KAAK,EAAE;YACT,IAAI;gBACF,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAA;gBAC9C,IAAI,sBAAa,CAAC,WAAW,CAAC,EAAE;oBAC9B,MAAM,cAAc,CAAC,WAAW,CAAC,CAAA;iBAClC;gBACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;aAC1E;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,EAAE,CAAC,CAAA;aAC7E;SACF;QAED,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,YAAY,CAAC,CAAA;QAClE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAA;KACrG;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;QAChD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAA;KACzF;AACH,CAAC,CAAA;AApCY,QAAA,oBAAoB,wBAoChC"}
|
|
@@ -17,12 +17,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
exports.handlWebhookEvent = void 0;
|
|
18
18
|
const raw_body_1 = __importDefault(require("raw-body"));
|
|
19
19
|
const utils_1 = require("../../utils");
|
|
20
|
+
const shared_1 = require("../../../shared");
|
|
20
21
|
// NOTE: typically handling: "/api/webhooks/app/event"
|
|
21
22
|
const handlWebhookEvent = (serverRuntimeConfig, topicHandlers) => async (req, res) => {
|
|
22
23
|
var _a;
|
|
23
24
|
try {
|
|
24
25
|
const _b = (_a = req.headers) !== null && _a !== void 0 ? _a : {}, { 'x-shopify-shop-domain': shop } = _b, _headers = __rest(_b, ['x-shopify-shop-domain']);
|
|
25
|
-
if (
|
|
26
|
+
if (shared_1.stringEmpty(shop)) {
|
|
26
27
|
return res.status(200).json({ handler: 'webhook', error: 'Missing shop' });
|
|
27
28
|
}
|
|
28
29
|
const { shopify } = await utils_1.getShopifyHelpers(serverRuntimeConfig, { shop });
|
|
@@ -46,7 +47,7 @@ const handlWebhookEvent = (serverRuntimeConfig, topicHandlers) => async (req, re
|
|
|
46
47
|
try {
|
|
47
48
|
const { topic, domain, webhookId, apiVersion, rawBody: eventRawBody } = message;
|
|
48
49
|
const eventBody = JSON.parse(eventRawBody);
|
|
49
|
-
const topicHandlePromises =
|
|
50
|
+
const topicHandlePromises = shared_1.ensureArray(topicHandlers === null || topicHandlers === void 0 ? void 0 : topicHandlers[shared_1.convertEventTopic(topic)]).map((handler) => handler({
|
|
50
51
|
apiVersion,
|
|
51
52
|
webhookId,
|
|
52
53
|
topic,
|