@agnostack/next-shopify
Version:
Please contact agnoStack via info@agnostack.com for any questions
96 lines • 4.34 kB
JavaScript
;
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.decodeSessionToken = exports.isTokenExpired = exports.ensureShop = exports.sanitizeShop = exports.getSanitizedShopData = exports.decodeJWT = void 0;
const jwt_decode_1 = __importDefault(require("jwt-decode"));
const js_base64_1 = require("js-base64");
const display_1 = require("./display");
const datetime_1 = require("./datetime");
// NOTE: this gives us a client-side safe decoder
exports.decodeJWT = jwt_decode_1.default;
// NOTE: this is duplicated in lib-core/next-shopify
// NOTE: This is a semi-replica of shopify-api-node/src/utils/shop-validator.ts
const getSanitizedShopData = (shop, customDomains) => {
var _a;
const domainsRegex = (0, display_1.ensureArray)(customDomains).reduce((_domainsRegex, customDomain) => {
var _a;
return ([
..._domainsRegex,
(_a = customDomain === null || customDomain === void 0 ? void 0 : customDomain.source) !== null && _a !== void 0 ? _a : customDomain
]);
}, ['myshopify\\.com', 'myshopify\\.io']); // HMMM: do we need to add: shopify\\.com
const shopUrlRegex = new RegExp(`^([a-zA-Z0-9][a-zA-Z0-9-_]*)\\.(${domainsRegex.join('|')})[/]*$`);
const [sanitizedShop, store_name] = (_a = (0, display_1.ensureString)(shop).match(shopUrlRegex)) !== null && _a !== void 0 ? _a : [];
return {
shop: sanitizedShop,
store_name,
};
};
exports.getSanitizedShopData = getSanitizedShopData;
// NOTE: this is duplicated in lib-core/next-shopify
const sanitizeShop = (shop, { throwOnInvalid, customDomains } = {}) => {
const { shop: sanitizedShop } = (0, exports.getSanitizedShopData)(shop, customDomains);
if ((0, display_1.stringEmpty)(sanitizedShop) && throwOnInvalid) {
throw new Error('Received invalid shop argument');
}
return sanitizedShop;
};
exports.sanitizeShop = sanitizeShop;
// NOTE: this is duplicated in lib-core/next-shopify
const ensureShop = (store, _a = {}) => {
var { throwOnInvalid } = _a, params = __rest(_a, ["throwOnInvalid"]);
if ((0, display_1.stringEmpty)(store) && throwOnInvalid) {
throw new Error('Received invalid store argument');
}
const sanitizedShop = (0, exports.sanitizeShop)(store, Object.assign({ throwOnInvalid }, params));
if ((0, display_1.stringNotEmpty)(sanitizedShop)) {
return sanitizedShop;
}
return (0, display_1.stringNotEmpty)(store) ? `${store}.myshopify.com` : undefined;
};
exports.ensureShop = ensureShop;
const isTokenExpired = (session) => ((!(session === null || session === void 0 ? void 0 : session.expires) || ((0, datetime_1.ensureDateTime)(session.expires) < (0, datetime_1.getCurrentDateTime)())));
exports.isTokenExpired = isTokenExpired;
const decodeSessionToken = (token) => {
if ((0, display_1.stringEmpty)(token)) {
return {};
}
const decoded = (0, exports.decodeJWT)(token.replace('Bearer ', ''));
const { dest, sid } = decoded;
if ((0, display_1.stringEmpty)(dest)) {
return {};
}
let _shop;
try {
_shop = dest.startsWith('http') ? new URL(dest).hostname : undefined;
}
catch (ignore) {
console.log('Ignoring error decoding dest', ignore);
}
const { shop, store_name, } = (0, exports.getSanitizedShopData)(_shop !== null && _shop !== void 0 ? _shop : dest);
const host = (0, display_1.stringNotEmpty)(shop) ? js_base64_1.Base64.encode(`${shop}/admin`) : undefined;
return {
decoded,
token,
dest,
sid,
shop,
host,
store_name,
};
};
exports.decodeSessionToken = decodeSessionToken;
//# sourceMappingURL=shopify.js.map