UNPKG

@shopify/shopify-api

Version:

Shopify API Library for Node - accelerate development with support for authentication, graphql proxy, webhooks

74 lines (70 loc) 2.98 kB
'use strict'; var error = require('../error.js'); var decodeHost = require('../auth/decode-host.js'); var shopAdminUrlHelper = require('./shop-admin-url-helper.js'); var domainTransformer = require('./domain-transformer.js'); function sanitizeShop(config) { return (shop, throwOnInvalid = false) => { let shopUrl = shop; const domainsRegex = [ 'myshopify\\.com', 'shopify\\.com', 'myshopify\\.io', 'shop\\.dev', ]; // Add domains from transformations (both source and target) if (config.domainTransformations) { domainsRegex.push(...domainTransformer.getTransformationDomains(config)); } const shopUrlRegex = new RegExp(`^[a-zA-Z0-9][a-zA-Z0-9-_]*\\.(${domainsRegex.join('|')})[/]*$`); const shopAdminRegex = new RegExp(`^admin\\.(${domainsRegex.join('|')})/store/([a-zA-Z0-9][a-zA-Z0-9-_]*)$`); const isShopAdminUrl = shopAdminRegex.test(shopUrl); if (isShopAdminUrl) { shopUrl = shopAdminUrlHelper.shopAdminUrlToLegacyUrl(shopUrl) || ''; } const sanitizedShop = shopUrlRegex.test(shopUrl) ? shopUrl : null; if (!sanitizedShop && throwOnInvalid) { throw new error.InvalidShopError('Received invalid shop argument'); } if (sanitizedShop && config.domainTransformations) { return domainTransformer.applyDomainTransformations(sanitizedShop, config); } return sanitizedShop; }; } function sanitizeHost(config) { return (host, throwOnInvalid = false) => { const base64regex = /^[0-9a-zA-Z+/]+={0,2}$/; let sanitizedHost = base64regex.test(host) ? host : null; if (sanitizedHost) { const { hostname } = new URL(`https://${decodeHost.decodeHost(sanitizedHost)}`); const originsRegex = [ 'myshopify\\.com', 'shopify\\.com', 'myshopify\\.io', 'spin\\.dev', 'shop\\.dev', ]; if (config.domainTransformations) { const hostTransformationDomains = config.domainTransformations .filter((t) => t.includeHost !== false) .flatMap((t) => domainTransformer.getTransformationDomains({ ...config, domainTransformations: [t], })); originsRegex.push(...hostTransformationDomains); } const hostRegex = new RegExp(`\\.(${originsRegex.join('|')})$`); if (!hostRegex.test(hostname)) { sanitizedHost = null; } } if (!sanitizedHost && throwOnInvalid) { throw new error.InvalidHostError('Received invalid host argument'); } return sanitizedHost; }; } exports.sanitizeHost = sanitizeHost; exports.sanitizeShop = sanitizeShop; //# sourceMappingURL=shop-validator.js.map