@supernovaio/cli
Version:
Supernova.io Command Line Interface
140 lines (138 loc) • 7.72 kB
JavaScript
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e7e7ee13-690b-5beb-94b7-185abf4577d6")}catch(e){}}();
import { execFile as execFileCallback } from "node:child_process";
import fs from "node:fs";
import fsPromises from "node:fs/promises";
import path from "node:path";
import { promisify } from "node:util";
import inquirer from "inquirer";
import { fileExists } from "../../validate-templates.js";
import { NPM_TOKEN_NPMRC_LINE, TEMP_NPMRC_MARKER } from "../constants.js";
import { createPrivateDependencyEntries, resolveExactPrivatePackages, uniqueStrings } from "../helpers.js";
import { promptNpmToken } from "../steps/dependencies/prompts.js";
import { muted, renderFramedLines, success, warning } from "../ui.js";
const execFile = promisify(execFileCallback);
export function createDependencyService(input) {
return {
createPrivateDependencyEntries(packageNames) {
return createPrivateDependencyEntries(packageNames);
},
async ensureLocalNpmrcFile(templateDestinationPath) {
const npmrcPath = path.join(templateDestinationPath, ".npmrc");
if (await fileExists(npmrcPath)) {
const npmrc = await fsPromises.readFile(npmrcPath, "utf8");
if (!npmrc.includes(NPM_TOKEN_NPMRC_LINE)) {
const prefix = npmrc.length > 0 && !npmrc.endsWith("\n") ? "\n" : "";
await fsPromises.writeFile(npmrcPath, `${npmrc}${prefix}${NPM_TOKEN_NPMRC_LINE}\n`, "utf8");
}
}
else {
await fsPromises.writeFile(npmrcPath, `${NPM_TOKEN_NPMRC_LINE}\n`, "utf8");
await fsPromises.writeFile(path.join(templateDestinationPath, TEMP_NPMRC_MARKER), "", "utf8");
}
return npmrcPath;
},
async applyTemplateDependencyConfiguration(context) {
if (!context.templateDestinationPath) {
input.error("Template destination path is missing.");
}
const packageJsonPath = path.join(context.templateDestinationPath, "package.json");
if (!fs.existsSync(packageJsonPath)) {
input.error(`Template package.json was not found at ${packageJsonPath}`);
}
const raw = await fsPromises.readFile(packageJsonPath, "utf8");
const packageJson = JSON.parse(raw);
packageJson.dependencies = packageJson.dependencies ?? {};
packageJson.supernova = packageJson.supernova ?? {};
const exactPrivatePackages = resolveExactPrivatePackages(context);
if (context.dependencyMode === "Public") {
for (const packageName of context.dependencyPackageNames ?? []) {
packageJson.dependencies[packageName] = packageJson.dependencies[packageName] ?? "latest";
}
}
else if (context.dependencyMode === "Private") {
for (const packageName of exactPrivatePackages) {
packageJson.dependencies[packageName] = packageJson.dependencies[packageName] ?? "latest";
}
packageJson.supernova.privateDependencies = uniqueStrings(context.privateDependencyEntries ?? []);
}
if (packageJson.supernova && Object.keys(packageJson.supernova).length === 0) {
delete packageJson.supernova;
}
const nextRaw = `${JSON.stringify(packageJson, null, 2)}\n`;
if (nextRaw === raw) {
return;
}
await fsPromises.writeFile(packageJsonPath, nextRaw, "utf8");
input.log(success("Updated template package.json with dependency configuration."));
},
async validateTemplateDependencies(context) {
if (!context.templateDestinationPath) {
input.error("Template destination path is missing.");
}
if (context.dependencyMode === "Public" && !context.dependencyPackageNames?.length) {
input.error("Public package names are missing.");
}
if (context.dependencyMode === "Private" && !context.privateDependencyEntries?.length) {
input.error("Private dependency entries are missing.");
}
if (context.dependencyMode === "Private" && resolveExactPrivatePackages(context).length === 0) {
input.error("Private package names are missing.");
}
if (context.dependencyMode === "Private" && !context.npmToken) {
input.log(muted("NPM token is required again because setup sessions do not save private tokens."));
context.npmToken = await promptNpmToken(input.error);
}
while (true) {
input.log(muted("Running npm install to validate dependency access..."));
try {
await execFile("npm", ["install", "--no-audit", "--no-fund"], {
cwd: context.templateDestinationPath,
env: context.npmToken ? { ...process.env, NPM_TOKEN: context.npmToken } : process.env,
});
input.log(success("Dependency access validated successfully."));
return;
}
catch (error) {
const message = error instanceof Error ? error.message : String(error);
input.log("");
input.log(warning(`Dependency validation failed: ${message}`));
if (context.dependencyMode === "Private") {
input.log("");
input.log(renderFramedLines([
"Dependency install failed - usually a missing or incorrect npm token.",
"Enter a new npm token and retry the validation step.",
]));
}
const response = await inquirer.prompt([
{
choices: [
{ name: "Retry dependency validation", value: "retry" },
...(context.dependencyMode === "Private"
? [{ name: "Enter npm token again and retry", value: "retry_private_registry" }]
: []),
{ name: "Continue without dependency validation", value: "continue" },
{ name: "Cancel setup", value: "cancel" },
],
default: "retry",
message: "Next action:",
name: "action",
type: "list",
},
]);
if (response.action === "continue") {
input.log(warning("Continuing without validated dependency access."));
return;
}
if (response.action === "cancel") {
input.error("Setup cancelled during dependency validation.");
}
if (response.action === "retry_private_registry") {
context.npmToken = await promptNpmToken(input.error);
}
}
}
},
};
}
//# sourceMappingURL=dependency-service.js.map
//# debugId=e7e7ee13-690b-5beb-94b7-185abf4577d6