UNPKG

create-graphql-yoga

Version:
91 lines (90 loc) 3.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createGraphQLYoga = void 0; const tslib_1 = require("tslib"); const ora_1 = tslib_1.__importDefault(require("ora")); const node_util_1 = require("node:util"); const fetch_1 = require("@whatwg-node/fetch"); const tar_1 = tslib_1.__importDefault(require("tar")); const node_path_1 = require("node:path"); const node_stream_1 = require("node:stream"); const node_fs_1 = require("node:fs"); const spinner = (0, ora_1.default)(); const options = { template: { type: 'string', short: 't', }, }; function getRegistryAPIUrl(packageName, version) { return `https://registry.npmjs.org/${packageName}/${version}`; } async function getVersionByTag(packageName, tag) { const url = getRegistryAPIUrl(packageName, tag); const response = await (0, fetch_1.fetch)(url); if (response.status === 404) { spinner.fail(`Package not found: ${packageName}`); process.exit(1); } if (!response.ok) { spinner.fail(`Failed to fetch package ${packageName} with ${response.status}: ${await response.text()}`); process.exit(1); } const { version } = await response.json(); return version; } function getTarballUrl(packageName, version) { return `https://registry.npmjs.org/${packageName}/-/${packageName}-${version}.tgz`; } function getPackageNameAndTagForTemplate(template) { const [suffix, tag] = template.split('@'); return { packageName: `@graphql-yoga/template-${suffix}`, tag: tag ?? 'latest', }; } async function createGraphQLYoga(fullArgs = process.argv) { const args = [...fullArgs]; while (args[0].startsWith('/') || args[0] === '--') { args.shift(); } const { values: { template = 'node-ts' }, } = (0, node_util_1.parseArgs)({ args, options, allowPositionals: true }); spinner.start(`Fetching template ${template}...`); const { packageName, tag } = getPackageNameAndTagForTemplate(template); const version = await getVersionByTag(packageName, tag); const url = getTarballUrl(packageName, version); const response = await (0, fetch_1.fetch)(url); if (response.status === 404) { spinner.fail(`Template not found: ${template}`); process.exit(1); } if (!response.ok) { spinner.fail(`Failed to fetch template ${template} with ${response.status}: ${await response.text()}`); process.exit(1); } if (!response.body) { spinner.fail(`Failed to fetch template ${template} with empty body`); process.exit(1); } const nodeStream = node_stream_1.Readable.from(response.body); const targetDir = (0, node_path_1.join)(process.cwd(), template); const extractedTarStream = tar_1.default.extract({ strip: 1, C: targetDir, }); if ((0, node_fs_1.existsSync)(targetDir)) { spinner.fail(`Target directory ${targetDir} already exists.`); process.exit(1); } (0, node_fs_1.mkdirSync)(targetDir, { recursive: true }); nodeStream .pipe(extractedTarStream) .once('error', (err) => { spinner.fail(`Failed to extract template ${template} with ${err}`); process.exit(1); }) .once('close', () => { spinner.succeed(`Template ${template} created on ${targetDir}.`); }); } exports.createGraphQLYoga = createGraphQLYoga;