@shopify/cli-kit
Version:
A set of utilities, interfaces, and models that are common across all the platform features
68 lines • 2.16 kB
JavaScript
import fs from 'node:fs';
import * as ni from 'network-interfaces';
import { assertConnectable, getIpFromHosts } from './network/index.js';
import { assertCompatibleEnvironment } from './env.js';
const NON_SHOP_PREFIXES = ['app', 'dev', 'shopify'];
const BACKEND_PORT = 8080;
export function createServer(projectName) {
return {
host: (options = {}) => host(projectName, options),
url: (options = {}) => url(projectName, options),
};
}
function host(projectName, options = {}) {
assertCompatibleEnvironment();
(assertRunningOverride || assertRunning2024)(projectName);
const prefix = (options.nonstandardHostPrefix || projectName).replace(/_/g, '-');
if (projectName === 'shopify') {
if (prefix.endsWith('-dev-api')) {
const shopName = prefix.replace('-dev-api', '');
return `${shopName}.dev-api.shop.dev`;
}
if (!NON_SHOP_PREFIXES.includes(prefix)) {
return `${prefix}.my.shop.dev`;
}
}
return `${prefix}.shop.dev`;
}
function url(projectName, options = {}) {
return `https://${host(projectName, options)}`;
}
function assertRunning2024(projectName) {
assertConnectable({
projectName,
addr: getBackendIp(projectName),
port: BACKEND_PORT,
});
}
function getBackendIp(projectName) {
try {
const backendIp = resolveBackendHost(projectName);
ni.fromIp(backendIp, { internal: true, ipVersion: 4 });
return backendIp;
}
catch (error) {
throw new Error(`DevServer for '${projectName}' is not running: \`dev up ${projectName}\` to start it.`);
}
}
function resolveBackendHost(name) {
let host;
try {
host = fs.readlinkSync(`/opt/nginx/etc/manifest/${name}/current`);
}
catch (error) {
host = `${name}.root.shopify.dev.internal`;
}
try {
return getIpFromHosts(host);
}
catch {
return host;
}
}
// Allow overrides for more concise test setup. Meh.
let assertRunningOverride;
export function setAssertRunning(override) {
assertRunningOverride = override;
}
//# sourceMappingURL=dev-server-2024.js.map