create-graphql-yoga
Version:
91 lines (90 loc) • 3.41 kB
JavaScript
;
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;