creevey
Version:
Cross-browser screenshot testing tool for Storybook with fancy UI Runner
60 lines (48 loc) • 1.72 kB
text/typescript
import { readFile } from 'fs/promises';
import { pathToFileURL } from 'url';
import semver from 'semver';
import sh from 'shelljs';
import { detect } from 'package-manager-detector/detect';
const importMetaUrl = pathToFileURL(__filename).href;
const getRegistryCommand: Record<string, string> = {
npm: 'npm config get registry --workspaces=false --include-workspace-root',
yarn: 'yarn config get registry',
'yarn@berry': 'yarn config get npmRegistryServer',
};
// TODO Support custom docker images
export async function playwrightDockerFile(browser: string, version: string, npmRegistry?: string): Promise<string> {
const sv = semver.coerce(version);
if (!npmRegistry) {
const { agent } = (await detect()) ?? {};
const command = agent ? getRegistryCommand[agent] : getRegistryCommand.npm;
try {
npmRegistry = sh
// NOTE: https://github.com/npm/cli/issues/6099#issuecomment-2062122615
.exec(command, { silent: true })
.stdout.trim();
} catch {
/* noop */
}
}
const indexJs = await readFile(new URL('./index-source.mjs', importMetaUrl), 'utf-8');
const dockerfile = `
FROM node:lts
WORKDIR /creevey
RUN echo "{ \\"type\\": \\"module\\" }" > package.json && \\
${indexJs
.split('\n')
.map((line) => ` echo "${line.replace(/"/g, '\\"')}" >> index.js && \\`)
.join('\n')}
${
npmRegistry
? `
echo "registry=${npmRegistry}" > .npmrc && \\`
: ''
}
npm i playwright-core${sv ? `@${sv.format()}` : ''} && \\
npx -y playwright${sv ? `@${sv.format()}` : ''} install --with-deps ${browser}
EXPOSE 4444
ENTRYPOINT [ "node", "./index.js" ]
`;
return dockerfile.replace(/\\\n\s*\\?\n/g, '\\\n');
}