@agnostack/next-shopify 1.6.0-alpha.9 → 1.7.0-alpha.1
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 +71 -62
- package/dist/handlers/api.js +22 -36
- package/dist/handlers/api.js.map +1 -1
- package/dist/handlers/ssr.d.ts +10 -1
- package/dist/handlers/ssr.js +11 -22
- package/dist/handlers/ssr.js.map +1 -1
- package/dist/helpers/auth.d.ts +9 -1
- package/dist/helpers/auth.js +9 -16
- package/dist/helpers/auth.js.map +1 -1
- package/dist/helpers/callback.d.ts +4 -1
- package/dist/helpers/callback.js +25 -36
- package/dist/helpers/callback.js.map +1 -1
- package/dist/helpers/graph.js +2 -2
- package/dist/helpers/graph.js.map +1 -1
- package/dist/helpers/rest.js +3 -3
- package/dist/helpers/rest.js.map +1 -1
- package/dist/helpers/uninstall.d.ts +4 -5
- package/dist/helpers/uninstall.js +31 -16
- package/dist/helpers/uninstall.js.map +1 -1
- package/dist/utils/billing.d.ts +1 -0
- package/dist/utils/billing.js +47 -1
- package/dist/utils/billing.js.map +1 -1
- package/dist/utils/constants.js +1 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/display.d.ts +1 -0
- package/dist/utils/display.js +19 -1
- package/dist/utils/display.js.map +1 -1
- package/dist/utils/errors.d.ts +12 -0
- package/dist/utils/errors.js +16 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/firebase.js +6 -0
- package/dist/utils/firebase.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session.d.ts +14 -0
- package/dist/utils/session.js +86 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/utils/shopify-api-node/beginAuth.d.ts +2 -5
- package/dist/utils/shopify-api-node/beginAuth.js +17 -10
- package/dist/utils/shopify-api-node/beginAuth.js.map +1 -1
- package/dist/utils/shopify.d.ts +3 -41
- package/dist/utils/shopify.js +11 -203
- package/dist/utils/shopify.js.map +1 -1
- package/dist/utils/webhooks.d.ts +1 -0
- package/dist/utils/webhooks.js +22 -0
- package/dist/utils/webhooks.js.map +1 -0
- package/dist/withShopify.js +13 -4
- package/dist/withShopify.js.map +1 -1
- package/package.json +3 -2
package/dist/utils/shopify.js
CHANGED
|
@@ -1,197 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getRedirectUrl = exports.getInitializedShopify = void 0;
|
|
4
4
|
require("@shopify/shopify-api/adapters/node");
|
|
5
5
|
const shopify_api_1 = require("@shopify/shopify-api");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const billing_1 = require("./billing");
|
|
9
|
-
const errors_1 = require("./errors");
|
|
6
|
+
const shopify_api_node_1 = require("./shopify-api-node");
|
|
7
|
+
const webhooks_1 = require("./webhooks");
|
|
10
8
|
const display_1 = require("./display");
|
|
11
|
-
const firebase_1 = require("./firebase");
|
|
12
9
|
const constants_1 = require("./constants");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const shopify = shopify_api_1.shopifyApi(Object.assign(Object.assign({}, APP_CONFIG), (display_1.stringNotEmpty(version)) && {
|
|
10
|
+
// TODO cleanup/consolidate getSessionStorage and getInitializedShopify
|
|
11
|
+
const getInitializedShopify = async (serverRuntimeConfig, _shop, version) => {
|
|
12
|
+
const shopify = shopify_api_1.shopifyApi(Object.assign(Object.assign({}, serverRuntimeConfig === null || serverRuntimeConfig === void 0 ? void 0 : serverRuntimeConfig.APP_CONFIG), (display_1.stringNotEmpty(version)) && {
|
|
17
13
|
apiVersion: version,
|
|
18
14
|
}));
|
|
15
|
+
await webhooks_1.addWebhookHandlers(serverRuntimeConfig, shopify);
|
|
19
16
|
return shopify;
|
|
20
17
|
};
|
|
21
18
|
exports.getInitializedShopify = getInitializedShopify;
|
|
22
|
-
|
|
23
|
-
// TODO!!!!: explore moving into FirebaseSessionHandler.getInstance and/or another singleton here??
|
|
24
|
-
// export const getInitializedShopify = (serverRuntimeConfig, _shop, version) => {
|
|
25
|
-
// const { FB_CONFIG, FB_ROOT_COLLECTION, APP_ID, APP_CONFIG } = serverRuntimeConfig
|
|
26
|
-
// const data = { app: APP_ID, shop: Shopify.Utils.sanitizeShop(_shop)}
|
|
27
|
-
// const sessionHandler = FirebaseSessionHandler.getInstance(FB_CONFIG, FB_ROOT_COLLECTION)
|
|
28
|
-
// Shopify.Context.initialize({
|
|
29
|
-
// ...APP_CONFIG,
|
|
30
|
-
// ...(stringNotEmpty(version)) && {
|
|
31
|
-
// API_VERSION: version,
|
|
32
|
-
// },
|
|
33
|
-
// SESSION_STORAGE: new Shopify.Session.CustomSessionStorage(
|
|
34
|
-
// (session) => storeCallback(session, data, sessionHandler),
|
|
35
|
-
// (id) => loadCallback(id, data, sessionHandler),
|
|
36
|
-
// (id) => deleteSessionsCallback(id, data, sessionHandler),
|
|
37
|
-
// (ids) => deleteSessionsCallback(ids, data, sessionHandler),
|
|
38
|
-
// (__shop) => findSessionsByShop(Shopify.Utils.sanitizeShop(__shop), data, sessionHandler)
|
|
39
|
-
// ),
|
|
40
|
-
// })
|
|
41
|
-
// return Shopify
|
|
42
|
-
// }
|
|
43
|
-
const getSessionStorage = (serverRuntimeConfig, _shop) => {
|
|
44
|
-
const { FB_CONFIG, FB_ROOT_COLLECTION, APP_ID } = serverRuntimeConfig;
|
|
45
|
-
const shopify = exports.getInitializedShopify(serverRuntimeConfig);
|
|
46
|
-
const data = { app: APP_ID, shop: shopify.utils.sanitizeShop(_shop) };
|
|
47
|
-
const sessionHandler = firebase_1.FirebaseSessionHandler.getInstance(FB_CONFIG, FB_ROOT_COLLECTION);
|
|
48
|
-
return {
|
|
49
|
-
store: (session) => firebase_1.storeCallback(session, data, sessionHandler),
|
|
50
|
-
load: (id) => firebase_1.loadCallback(id, data, sessionHandler),
|
|
51
|
-
delete: (id) => firebase_1.deleteSessionsCallback(id, data, sessionHandler),
|
|
52
|
-
deleteMany: (ids) => firebase_1.deleteSessionsCallback(ids, data, sessionHandler),
|
|
53
|
-
find: (__shop) => firebase_1.findSessionsByShop(shopify.utils.sanitizeShop(__shop), data, sessionHandler),
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
exports.getSessionStorage = getSessionStorage;
|
|
57
|
-
const generatePaymentConfig = (paymentConfig, data) => {
|
|
58
|
-
const { name, price, currency = 'USD', type = constants_1.BILLING_INTERVALS.ONE_TIME, } = display_1.ensureObject(paymentConfig);
|
|
59
|
-
const { debugMode, environment } = display_1.ensureObject(data);
|
|
60
|
-
if (display_1.objectEmpty(paymentConfig) || display_1.stringEmpty(environment)) {
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
|
-
const notProduction = (environment !== 'production');
|
|
64
|
-
// TODO ensure this logic is correct
|
|
65
|
-
let test = environment !== 'production';
|
|
66
|
-
if (debugMode) {
|
|
67
|
-
test = true;
|
|
68
|
-
}
|
|
69
|
-
const _paymentConfig = {
|
|
70
|
-
type,
|
|
71
|
-
required: (environment !== 'development'),
|
|
72
|
-
test,
|
|
73
|
-
name: `${name}${notProduction ? ` - ${environment}` : ''} - ${display_1.unsnakecase(type)}`,
|
|
74
|
-
price: {
|
|
75
|
-
amount: price,
|
|
76
|
-
currencyCode: currency,
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
console.log(`>>> ~ _paymentConfig`, {
|
|
80
|
-
_paymentConfig,
|
|
81
|
-
debugMode,
|
|
82
|
-
debugEnv: process.env.DEBUG,
|
|
83
|
-
});
|
|
84
|
-
return _paymentConfig;
|
|
85
|
-
};
|
|
86
|
-
exports.generatePaymentConfig = generatePaymentConfig;
|
|
87
|
-
const getVerifiedSession = async ({ req, res, shop, serverRuntimeConfig }) => {
|
|
88
|
-
console.log('getVerifiedSession');
|
|
89
|
-
try {
|
|
90
|
-
const shopify = exports.getInitializedShopify(serverRuntimeConfig, shop);
|
|
91
|
-
const sessionStorage = exports.getSessionStorage(serverRuntimeConfig, shop);
|
|
92
|
-
if (sessionStorage) {
|
|
93
|
-
console.log('have sessionStorage');
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
console.log('have NO sessionStorage');
|
|
97
|
-
}
|
|
98
|
-
const { PAYMENT_CONFIG } = serverRuntimeConfig !== null && serverRuntimeConfig !== void 0 ? serverRuntimeConfig : {};
|
|
99
|
-
// TODO OLD/Remove
|
|
100
|
-
// const session = await shopify.Utils.loadCurrentSession(req, res)
|
|
101
|
-
const sessionId = await shopify.session.getCurrentId({
|
|
102
|
-
rawRequest: req,
|
|
103
|
-
rawResponse: res,
|
|
104
|
-
});
|
|
105
|
-
console.log('sessionId:', sessionId);
|
|
106
|
-
const session = await sessionStorage.load(sessionId);
|
|
107
|
-
console.log('session:', session);
|
|
108
|
-
if (shop && (session === null || session === void 0 ? void 0 : session.shop) !== shop) {
|
|
109
|
-
throw new errors_1.ShopifyAuthenticationError('Invalid shop');
|
|
110
|
-
}
|
|
111
|
-
if (!session.isActive(shopify.config.scopes)) {
|
|
112
|
-
throw new errors_1.ShopifyAuthenticationError('Inactive session');
|
|
113
|
-
}
|
|
114
|
-
if (PAYMENT_CONFIG === null || PAYMENT_CONFIG === void 0 ? void 0 : PAYMENT_CONFIG.required) {
|
|
115
|
-
const billingManager = new billing_1.BillingManager(shopify, session, serverRuntimeConfig);
|
|
116
|
-
const confirmationUrl = await billingManager.ensureBilling();
|
|
117
|
-
console.log('confirmationUrl:', confirmationUrl);
|
|
118
|
-
if (display_1.stringNotEmpty(confirmationUrl)) {
|
|
119
|
-
throw new errors_1.ShopifyAuthenticationError('Invalid payment status', { redirectUrl: confirmationUrl });
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
// NOTE making a test call to ensure a valid session for free apps
|
|
124
|
-
const client = new shopify.clients.Graphql({ session });
|
|
125
|
-
await client.query({ data: constants_1.SHOP_QUERY });
|
|
126
|
-
}
|
|
127
|
-
return session;
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
if (error instanceof shopify_api_1.HttpResponseError &&
|
|
131
|
-
error.response.code === 401) {
|
|
132
|
-
throw new errors_1.ShopifyAuthenticationError('Not authenticated');
|
|
133
|
-
}
|
|
134
|
-
throw error;
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
exports.getVerifiedSession = getVerifiedSession;
|
|
138
|
-
const registerTopicWebhook = async ({ serverRuntimeConfig, webhook, topic, session }) => {
|
|
139
|
-
console.log('session:', session);
|
|
140
|
-
console.log('registerTopicWebhook');
|
|
141
|
-
console.log('topic:', topic);
|
|
142
|
-
const shopify = exports.getInitializedShopify(serverRuntimeConfig, session === null || session === void 0 ? void 0 : session.shop);
|
|
143
|
-
console.log('shopify:', shopify);
|
|
144
|
-
const webhookResponse = display_1.ensureObject(await shopify.webhooks.register({ session }));
|
|
145
|
-
console.log('webhookResponse:', webhookResponse);
|
|
146
|
-
if (display_1.objectEmpty(webhookResponse)) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
// TODO validate this is the correct conditional
|
|
150
|
-
if (!webhookResponse[topic][0].success) {
|
|
151
|
-
throw new Error(`Failed to register ${webhook.path} on topic: ${topic} webhook`, webhookResponse.result);
|
|
152
|
-
}
|
|
153
|
-
// TODO validate this is the correct conditional
|
|
154
|
-
return webhookResponse[topic][0].success;
|
|
155
|
-
};
|
|
156
|
-
const handleWebhookRequest = async (topic, shop, webhookRequestBody, webhookId, apiVersion) => {
|
|
157
|
-
// const sessionId = shopify.session.getOfflineId({ shop })
|
|
158
|
-
console.log('handleWebhookRequest topic:', topic);
|
|
159
|
-
console.log('handleWebhookRequest shop:', shop);
|
|
160
|
-
console.log('handleWebhookRequest webhookRequestBody:', webhookRequestBody);
|
|
161
|
-
console.log('handleWebhookRequest webhookId:', webhookId);
|
|
162
|
-
console.log('handleWebhookRequest apiVersion:', apiVersion);
|
|
163
|
-
// console.log('handleWebhookRequest sessionId:', sessionId)
|
|
164
|
-
// Fetch the session from storage and process the webhook event
|
|
165
|
-
return;
|
|
166
|
-
};
|
|
167
|
-
const registerWebhooks = async (serverRuntimeConfig, webhookRegistry, session) => {
|
|
168
|
-
console.log('registerWebhooks');
|
|
169
|
-
return Promise.all(Object.entries(webhookRegistry).map(async ([topic, webhooks]) => (Promise.all(webhooks.map(async (webhook) => registerTopicWebhook({ serverRuntimeConfig, webhook, topic, session }))))));
|
|
170
|
-
};
|
|
171
|
-
exports.registerWebhooks = registerWebhooks;
|
|
172
|
-
const addWebhookHandlers = async (serverRuntimeConfig, shopify) => {
|
|
173
|
-
const { APP_WEBHOOKS } = serverRuntimeConfig;
|
|
174
|
-
return shopify.webhooks.addHandlers(Object.entries(APP_WEBHOOKS).reduce((__payload, [topic, webhooks]) => (Object.assign(Object.assign({}, __payload), { [topic]: {
|
|
175
|
-
deliveryMethod: shopify_api_1.DeliveryMethod.Http,
|
|
176
|
-
callbackUrl: webhooks.path,
|
|
177
|
-
callback: handleWebhookRequest,
|
|
178
|
-
} }))));
|
|
179
|
-
};
|
|
180
|
-
exports.addWebhookHandlers = addWebhookHandlers;
|
|
181
|
-
const getRedirectUrl = async (props, { req, res, query: _query, registerHandlers = false, }) => {
|
|
19
|
+
const getRedirectUrl = async (props, { req, res, query: _query, }) => {
|
|
182
20
|
var _a;
|
|
183
|
-
|
|
184
|
-
const { API_URLS, API_PATHS, PAGE_PATHS } = props;
|
|
21
|
+
const { API_URLS, PAGE_PATHS } = props;
|
|
185
22
|
const query = (_a = _query !== null && _query !== void 0 ? _query : req.query) !== null && _a !== void 0 ? _a : {};
|
|
186
|
-
console.log('query:', query);
|
|
187
23
|
const { embedded, host, shop: _shop } = query !== null && query !== void 0 ? query : {};
|
|
188
|
-
const shopify = exports.getInitializedShopify(props, _shop);
|
|
189
|
-
console.log('shopify initialized', shopify);
|
|
190
|
-
if (registerHandlers) {
|
|
191
|
-
await exports.addWebhookHandlers(props, shopify);
|
|
192
|
-
}
|
|
24
|
+
const shopify = await exports.getInitializedShopify(props, _shop);
|
|
193
25
|
const shop = shopify.utils.sanitizeShop(_shop);
|
|
194
|
-
console.log('shop:', shop);
|
|
195
26
|
if (display_1.stringEmpty(shop)) {
|
|
196
27
|
return `${PAGE_PATHS[constants_1.PAGE_ROUTE_NAMES.ERROR]}?code=no_shop_provided&type=getRedirectUrl`;
|
|
197
28
|
}
|
|
@@ -203,32 +34,9 @@ const getRedirectUrl = async (props, { req, res, query: _query, registerHandlers
|
|
|
203
34
|
}).toString();
|
|
204
35
|
// TODO: explore objectToQuerystring
|
|
205
36
|
const queryParams = new URLSearchParams(Object.assign(Object.assign({}, query), { shop, redirectUri: `${API_URLS[constants_1.API_ROUTE_NAMES.AUTH_CALLBACK]}?${redirectUriParams}` })).toString();
|
|
206
|
-
console.log('embedded queryParams:', queryParams);
|
|
207
37
|
return `${PAGE_PATHS[constants_1.PAGE_ROUTE_NAMES.EXIT]}?${queryParams}`;
|
|
208
38
|
}
|
|
209
|
-
|
|
210
|
-
console.log('begin auth');
|
|
211
|
-
return shopify.auth.begin({
|
|
212
|
-
shop,
|
|
213
|
-
callbackPath: API_PATHS[constants_1.API_ROUTE_NAMES.AUTH_CALLBACK],
|
|
214
|
-
isOnline: true,
|
|
215
|
-
rawRequest: req,
|
|
216
|
-
rawResponse: res,
|
|
217
|
-
});
|
|
39
|
+
return shopify_api_node_1.beginAuth(props, { req, res, shop });
|
|
218
40
|
};
|
|
219
41
|
exports.getRedirectUrl = getRedirectUrl;
|
|
220
|
-
const getAuthErrorResponse = ({ error, shop, serverRuntimeConfig }) => {
|
|
221
|
-
const { message, data } = error;
|
|
222
|
-
const { API_URLS } = serverRuntimeConfig;
|
|
223
|
-
const reauthorizationUrl = (data === null || data === void 0 ? void 0 : data.redirectUrl) || `${API_URLS[constants_1.API_ROUTE_NAMES.AUTH]}?shop=${shop}`;
|
|
224
|
-
return {
|
|
225
|
-
statusCode: 403,
|
|
226
|
-
message,
|
|
227
|
-
headers: {
|
|
228
|
-
'X-Shopify-API-Request-Failure-Reauthorize': '1',
|
|
229
|
-
'X-Shopify-API-Request-Failure-Reauthorize-Url': reauthorizationUrl,
|
|
230
|
-
},
|
|
231
|
-
};
|
|
232
|
-
};
|
|
233
|
-
exports.getAuthErrorResponse = getAuthErrorResponse;
|
|
234
42
|
//# sourceMappingURL=shopify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shopify.js","sourceRoot":"","sources":["../../src/utils/shopify.js"],"names":[],"mappings":";;;AAAA,8CAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"shopify.js","sourceRoot":"","sources":["../../src/utils/shopify.js"],"names":[],"mappings":";;;AAAA,8CAA2C;AAC3C,sDAAiD;AAEjD,yDAA8C;AAC9C,yCAA+C;AAC/C,uCAAuD;AACvD,2CAA+D;AAE/D,uEAAuE;AAChE,MAAM,qBAAqB,GAAG,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IACjF,MAAM,OAAO,GAAG,wBAAU,iCACrB,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,UAAU,GAC/B,CAAC,wBAAc,CAAC,OAAO,CAAC,CAAC,IAAI;QAC9B,UAAU,EAAE,OAAO;KACpB,EACD,CAAA;IAEF,MAAM,6BAAkB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;IAEtD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAXY,QAAA,qBAAqB,yBAWjC;AAEM,MAAM,cAAc,GAAG,KAAK,EAAE,KAAK,EAAE,EAC1C,GAAG,EACH,GAAG,EACH,KAAK,EAAE,MAAM,GACd,EAAE,EAAE;;IACH,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,CAAA;IAEtC,MAAM,KAAK,GAAG,MAAA,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,GAAG,CAAC,KAAK,mCAAI,EAAE,CAAA;IACvC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAA;IAEnD,MAAM,OAAO,GAAG,MAAM,6BAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAEzD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAE9C,IAAI,qBAAW,CAAC,IAAI,CAAC,EAAE;QACrB,OAAO,GAAG,UAAU,CAAC,4BAAgB,CAAC,KAAK,CAAC,4CAA4C,CAAA;KACzF;IAED,IAAI,QAAQ,KAAK,GAAG,EAAE;QACpB,oCAAoC;QACpC,MAAM,iBAAiB,GAAG,IAAI,eAAe,CAAC;YAC5C,IAAI;YACJ,IAAI;SACL,CAAC,CAAC,QAAQ,EAAE,CAAA;QAEb,oCAAoC;QACpC,MAAM,WAAW,GAAG,IAAI,eAAe,iCAClC,KAAK,KACR,IAAI,EACJ,WAAW,EAAE,GAAG,QAAQ,CAAC,2BAAe,CAAC,aAAa,CAAC,IAAI,iBAAiB,EAAE,IAC9E,CAAC,QAAQ,EAAE,CAAA;QAEb,OAAO,GAAG,UAAU,CAAC,4BAAgB,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAA;KAC7D;IAED,OAAO,4BAAS,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAA;AApCY,QAAA,cAAc,kBAoC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function addWebhookHandlers(serverRuntimeConfig: any, shopify: any): Promise<void>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addWebhookHandlers = void 0;
|
|
4
|
+
const shopify_api_1 = require("@shopify/shopify-api");
|
|
5
|
+
const addWebhookHandlers = async (serverRuntimeConfig, shopify) => {
|
|
6
|
+
const { APP_WEBHOOKS } = serverRuntimeConfig;
|
|
7
|
+
// TODO look for all topics via APP_WEBHOOKS
|
|
8
|
+
const existingHandlers = await shopify.webhooks.getHandlers('APP_UNINSTALLED');
|
|
9
|
+
if (existingHandlers.length === 0) {
|
|
10
|
+
shopify.webhooks.addHandlers(Object.entries(APP_WEBHOOKS).reduce((__payload, [topic, webhooks]) => (Object.assign(Object.assign({}, __payload), { [topic]: webhooks.map((webhook) => ({
|
|
11
|
+
deliveryMethod: shopify_api_1.DeliveryMethod.Http,
|
|
12
|
+
callbackUrl: webhook.path,
|
|
13
|
+
callback: async (topic, shop) => {
|
|
14
|
+
// NOTE our webhook logic is handled in each api route
|
|
15
|
+
console.log(`handleWebhook for ${shop}:${topic}`);
|
|
16
|
+
return true;
|
|
17
|
+
},
|
|
18
|
+
})) })), {}));
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
exports.addWebhookHandlers = addWebhookHandlers;
|
|
22
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/utils/webhooks.js"],"names":[],"mappings":";;;AAAA,sDAAqD;AAE9C,MAAM,kBAAkB,GAAG,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE;IACvE,MAAM,EAAE,YAAY,EAAE,GAAG,mBAAmB,CAAA;IAE5C,4CAA4C;IAC5C,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAA;IAE9E,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;QACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,iCAC9F,SAAS,KACZ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAClC,cAAc,EAAE,4BAAc,CAAC,IAAI;gBACnC,WAAW,EAAE,OAAO,CAAC,IAAI;gBACzB,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC9B,sDAAsD;oBACtD,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,KAAK,EAAE,CAAC,CAAA;oBAEjD,OAAO,IAAI,CAAA;gBACb,CAAC;aACF,CAAC,CAAC,IACH,EAAE,EAAE,CAAC,CAAC,CAAA;KACT;AACH,CAAC,CAAA;AArBY,QAAA,kBAAkB,sBAqB9B"}
|
package/dist/withShopify.js
CHANGED
|
@@ -23,8 +23,13 @@ const withShopify = async (nextPhase, _a) => {
|
|
|
23
23
|
defaultConfig } = _c, // NOTE: This is here in case we need anything from it
|
|
24
24
|
pluginConfig = __rest(_c, ["defaultConfig"]);
|
|
25
25
|
const basePath = utils_1.ensureString(_basePath);
|
|
26
|
-
const { data, interactive, paymentConfig, firebaseConfig, pageRoutes: { [utils_1.PAGE_ROUTE_NAMES.EXIT]: _pageRouteExit = '/exit', [utils_1.PAGE_ROUTE_NAMES.ERROR]: _pageRouteError = '/error', } = {}, apiRoutes: { [utils_1.API_ROUTE_NAMES.AUTH]: _apiRouteAuth = '/api/auth', [utils_1.API_ROUTE_NAMES.AUTH_CALLBACK]: _apiRouteAuthCallback = '/api/auth/callback', [utils_1.API_ROUTE_NAMES.APP_UNINSTALLED]: _apiRouteAppUninstalled = '/api/webhooks/app/uninstalled', } = {}, params: { APP_ID, URL: netlifyUrl, NEXT_PUBLIC_APP_BASE_URL, NEXT_PUBLIC_APP_ROUTE_PAGE_EXIT: _pageRouteParamExit, NEXT_PUBLIC_APP_ROUTE_PAGE_ERROR: _pageRouteParamError, NEXT_PUBLIC_APP_ROUTE_API_AUTH: _apiRouteParamAuth, NEXT_PUBLIC_APP_ROUTE_API_AUTH_CALLBACK: _apiRouteParamAuthCallback, NEXT_PUBLIC_APP_ROUTE_API_UNINSTALLED: _apiRouteParamAppUninstalled,
|
|
27
|
-
|
|
26
|
+
const { data, interactive, paymentConfig, firebaseConfig, pageRoutes: { [utils_1.PAGE_ROUTE_NAMES.EXIT]: _pageRouteExit = '/exit', [utils_1.PAGE_ROUTE_NAMES.ERROR]: _pageRouteError = '/error', } = {}, apiRoutes: { [utils_1.API_ROUTE_NAMES.AUTH]: _apiRouteAuth = '/api/auth', [utils_1.API_ROUTE_NAMES.AUTH_CALLBACK]: _apiRouteAuthCallback = '/api/auth/callback', [utils_1.API_ROUTE_NAMES.APP_UNINSTALLED]: _apiRouteAppUninstalled = '/api/webhooks/app/uninstalled', } = {}, params: { APP_ID: _appId, URL: netlifyUrl, HOST: shopifyCLIUrl, NEXT_PUBLIC_APP_BASE_URL, NEXT_PUBLIC_SHOPIFY_API_ID, NEXT_PUBLIC_SHOPIFY_API_KEY, NEXT_PUBLIC_APP_ROUTE_PAGE_EXIT: _pageRouteParamExit, NEXT_PUBLIC_APP_ROUTE_PAGE_ERROR: _pageRouteParamError, NEXT_PUBLIC_APP_ROUTE_API_AUTH: _apiRouteParamAuth, NEXT_PUBLIC_APP_ROUTE_API_AUTH_CALLBACK: _apiRouteParamAuthCallback, NEXT_PUBLIC_APP_ROUTE_API_UNINSTALLED: _apiRouteParamAppUninstalled, NEXT_PUBLIC_FB_ROOT_COLLECTION: FB_ROOT_COLLECTION, SHOPIFY_API_PUBLIC_KEY: _shopifyPublicAPIKey, SHOPIFY_API_VERSION = shopify_api_1.LATEST_API_VERSION, SHOPIFY_API_SCOPES, SHOPIFY_API_KEY, SHOPIFY_RUN_MODE, } = {}, } = pluginConfig !== null && pluginConfig !== void 0 ? pluginConfig : {};
|
|
27
|
+
console.log(`>>> > withShopify > _appId:`, _appId);
|
|
28
|
+
const SHOPIFY_API_PUBLIC_KEY = NEXT_PUBLIC_SHOPIFY_API_KEY || _shopifyPublicAPIKey;
|
|
29
|
+
console.log(`>>> > withShopify > SHOPIFY_API_PUBLIC_KEY:`, SHOPIFY_API_PUBLIC_KEY);
|
|
30
|
+
const APP_ID = NEXT_PUBLIC_SHOPIFY_API_ID || _appId || SHOPIFY_API_PUBLIC_KEY;
|
|
31
|
+
console.log(`>>> > withShopify > APP_ID:`, APP_ID);
|
|
32
|
+
const appBaseUrl = NEXT_PUBLIC_APP_BASE_URL || netlifyUrl || shopifyCLIUrl;
|
|
28
33
|
const APP_BASE_URL = `${appBaseUrl}${basePath}`;
|
|
29
34
|
const appUrl = new URL(appBaseUrl);
|
|
30
35
|
const { [utils_1.PAGE_ROUTE_NAMES.EXIT]: pageRouteExit, [utils_1.PAGE_ROUTE_NAMES.ERROR]: pageRouteError, [utils_1.API_ROUTE_NAMES.AUTH]: apiRouteAuth, [utils_1.API_ROUTE_NAMES.AUTH_CALLBACK]: apiRouteAuthCallback, [utils_1.API_ROUTE_NAMES.APP_UNINSTALLED]: apiRouteAppUninstalled, } = await next_plugins_1.getPrompts([
|
|
@@ -87,10 +92,14 @@ const withShopify = async (nextPhase, _a) => {
|
|
|
87
92
|
}],
|
|
88
93
|
};
|
|
89
94
|
const PAYMENT_CONFIG = utils_1.generatePaymentConfig(paymentConfig, data);
|
|
90
|
-
const publicRuntimeConfig = Object.assign(Object.assign({}, _publicRuntimeConfig), {
|
|
95
|
+
const publicRuntimeConfig = Object.assign(Object.assign({}, _publicRuntimeConfig), { SHOPIFY_API_PUBLIC_KEY,
|
|
96
|
+
SHOPIFY_RUN_MODE,
|
|
97
|
+
APP_BASE_URL,
|
|
91
98
|
API_ROUTES,
|
|
92
99
|
API_PATHS });
|
|
93
|
-
const serverRuntimeConfig = Object.assign(Object.assign({}, _serverRuntimeConfig), {
|
|
100
|
+
const serverRuntimeConfig = Object.assign(Object.assign({}, _serverRuntimeConfig), { SHOPIFY_RUN_MODE,
|
|
101
|
+
SHOPIFY_API_PUBLIC_KEY, FB_CONFIG: firebaseConfig, FB_ROOT_COLLECTION,
|
|
102
|
+
PAYMENT_CONFIG,
|
|
94
103
|
APP_CONFIG,
|
|
95
104
|
APP_WEBHOOKS,
|
|
96
105
|
PAGE_ROUTES,
|
package/dist/withShopify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withShopify.js","sourceRoot":"","sources":["../src/withShopify.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,sDAAyD;AAEzD,0DAAoD;AAEpD,mCAOgB;AAET,MAAM,WAAW,GAAG,KAAK,EAAE,SAAS,EAAE,EAAyB,EAAE,EAAE;QAA7B,EAAE,UAAU,OAAa,EAAR,MAAM,cAAvB,cAAyB,CAAF;IAClE,MAAM,KAKF,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,EALd,EACJ,QAAQ,EAAE,SAAS,EACnB,mBAAmB,EAAE,oBAAoB,GAAG,EAAE,EAC9C,mBAAmB,EAAE,oBAAoB,GAAG,EAAE,OAE5B,EADf,WAAW,cAJV,0DAKL,CAAmB,CAAA;IAEpB,MAAM,KAIF,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,EAJV;IACJ,6DAA6D;IAC7D,aAAa,OAEC,EAFC,sDAAsD;IAClE,YAAY,cAHX,iBAIL,CAAe,CAAA;IAEhB,MAAM,QAAQ,GAAG,oBAAY,CAAC,SAAS,CAAC,CAAA;IAExC,MAAM,EACJ,IAAI,EACJ,WAAW,EACX,aAAa,EACb,cAAc,EACd,UAAU,EAAE,EACV,CAAC,wBAAgB,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,EACjD,CAAC,wBAAgB,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,QAAQ,GACrD,GAAG,EAAE,EACN,SAAS,EAAE,EACT,CAAC,uBAAe,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,WAAW,EACnD,CAAC,uBAAe,CAAC,aAAa,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,EAC7E,CAAC,uBAAe,CAAC,eAAe,CAAC,EAAE,uBAAuB,GAAG,+BAA+B,GAC7F,GAAG,EAAE,EACN,MAAM,EAAE,EACN,MAAM,
|
|
1
|
+
{"version":3,"file":"withShopify.js","sourceRoot":"","sources":["../src/withShopify.js"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agnostack/next-shopify",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0-alpha.1",
|
|
4
4
|
"author": "agnoStack Dev <developers@agnostack.com> (https://agnostack.com)",
|
|
5
5
|
"owner": "agnoStack",
|
|
6
6
|
"description": "Please contact agnoStack via info@agnostack.com for any questions",
|
|
@@ -51,7 +51,8 @@
|
|
|
51
51
|
"@shopify/shopify-api": "7.1.0",
|
|
52
52
|
"browser-monads": "1.0.0",
|
|
53
53
|
"cookies": "0.8.0",
|
|
54
|
-
"nextjs-cors": "2.1.1"
|
|
54
|
+
"nextjs-cors": "2.1.1",
|
|
55
|
+
"raw-body": "2.5.2"
|
|
55
56
|
},
|
|
56
57
|
"devDependencies": {
|
|
57
58
|
"@babel/core": "7.18.9",
|