UNPKG

@wix/cli

Version:

CLI tool for building Wix sites and applications

524 lines (518 loc) 16.6 kB
import { createRequire as _createRequire } from 'node:module'; const require = _createRequire(import.meta.url); import { external_exports } from "./chunk-SDLCFZRL.js"; import { CliError, CliErrorCode } from "./chunk-CO5A7CZG.js"; import { __commonJS, __require, __toESM, init_esm_shims } from "./chunk-EXLZF52D.js"; // ../../node_modules/dotenv/package.json var require_package = __commonJS({ "../../node_modules/dotenv/package.json"(exports, module) { module.exports = { name: "dotenv", version: "16.5.0", description: "Loads environment variables from .env file", main: "lib/main.js", types: "lib/main.d.ts", exports: { ".": { types: "./lib/main.d.ts", require: "./lib/main.js", default: "./lib/main.js" }, "./config": "./config.js", "./config.js": "./config.js", "./lib/env-options": "./lib/env-options.js", "./lib/env-options.js": "./lib/env-options.js", "./lib/cli-options": "./lib/cli-options.js", "./lib/cli-options.js": "./lib/cli-options.js", "./package.json": "./package.json" }, scripts: { "dts-check": "tsc --project tests/types/tsconfig.json", lint: "standard", pretest: "npm run lint && npm run dts-check", test: "tap run --allow-empty-coverage --disable-coverage --timeout=60000", "test:coverage": "tap run --show-full-coverage --timeout=60000 --coverage-report=lcov", prerelease: "npm test", release: "standard-version" }, repository: { type: "git", url: "git://github.com/motdotla/dotenv.git" }, homepage: "https://github.com/motdotla/dotenv#readme", funding: "https://dotenvx.com", keywords: [ "dotenv", "env", ".env", "environment", "variables", "config", "settings" ], readmeFilename: "README.md", license: "BSD-2-Clause", devDependencies: { "@types/node": "^18.11.3", decache: "^4.6.2", sinon: "^14.0.1", standard: "^17.0.0", "standard-version": "^9.5.0", tap: "^19.2.0", typescript: "^4.8.4" }, engines: { node: ">=12" }, browser: { fs: false } }; } }); // ../../node_modules/dotenv/lib/main.js var require_main = __commonJS({ "../../node_modules/dotenv/lib/main.js"(exports, module) { "use strict"; init_esm_shims(); var fs = __require("fs"); var path = __require("path"); var os = __require("os"); var crypto = __require("crypto"); var packageJson = require_package(); var version = packageJson.version; var LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; function parse(src) { const obj = {}; let lines = src.toString(); lines = lines.replace(/\r\n?/mg, "\n"); let match; while ((match = LINE.exec(lines)) != null) { const key = match[1]; let value = match[2] || ""; value = value.trim(); const maybeQuote = value[0]; value = value.replace(/^(['"`])([\s\S]*)\1$/mg, "$2"); if (maybeQuote === '"') { value = value.replace(/\\n/g, "\n"); value = value.replace(/\\r/g, "\r"); } obj[key] = value; } return obj; } function _parseVault(options) { const vaultPath = _vaultPath(options); const result = DotenvModule.configDotenv({ path: vaultPath }); if (!result.parsed) { const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`); err.code = "MISSING_DATA"; throw err; } const keys = _dotenvKey(options).split(","); const length = keys.length; let decrypted; for (let i = 0; i < length; i++) { try { const key = keys[i].trim(); const attrs = _instructions(result, key); decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key); break; } catch (error) { if (i + 1 >= length) { throw error; } } } return DotenvModule.parse(decrypted); } function _warn(message) { console.log(`[dotenv@${version}][WARN] ${message}`); } function _debug(message) { console.log(`[dotenv@${version}][DEBUG] ${message}`); } function _dotenvKey(options) { if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) { return options.DOTENV_KEY; } if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) { return process.env.DOTENV_KEY; } return ""; } function _instructions(result, dotenvKey) { let uri; try { uri = new URL(dotenvKey); } catch (error) { if (error.code === "ERR_INVALID_URL") { const err = new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development"); err.code = "INVALID_DOTENV_KEY"; throw err; } throw error; } const key = uri.password; if (!key) { const err = new Error("INVALID_DOTENV_KEY: Missing key part"); err.code = "INVALID_DOTENV_KEY"; throw err; } const environment = uri.searchParams.get("environment"); if (!environment) { const err = new Error("INVALID_DOTENV_KEY: Missing environment part"); err.code = "INVALID_DOTENV_KEY"; throw err; } const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`; const ciphertext = result.parsed[environmentKey]; if (!ciphertext) { const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`); err.code = "NOT_FOUND_DOTENV_ENVIRONMENT"; throw err; } return { ciphertext, key }; } function _vaultPath(options) { let possibleVaultPath = null; if (options && options.path && options.path.length > 0) { if (Array.isArray(options.path)) { for (const filepath of options.path) { if (fs.existsSync(filepath)) { possibleVaultPath = filepath.endsWith(".vault") ? filepath : `${filepath}.vault`; } } } else { possibleVaultPath = options.path.endsWith(".vault") ? options.path : `${options.path}.vault`; } } else { possibleVaultPath = path.resolve(process.cwd(), ".env.vault"); } if (fs.existsSync(possibleVaultPath)) { return possibleVaultPath; } return null; } function _resolveHome(envPath) { return envPath[0] === "~" ? path.join(os.homedir(), envPath.slice(1)) : envPath; } function _configVault(options) { const debug = Boolean(options && options.debug); if (debug) { _debug("Loading env from encrypted .env.vault"); } const parsed = DotenvModule._parseVault(options); let processEnv = process.env; if (options && options.processEnv != null) { processEnv = options.processEnv; } DotenvModule.populate(processEnv, parsed, options); return { parsed }; } function configDotenv(options) { const dotenvPath = path.resolve(process.cwd(), ".env"); let encoding = "utf8"; const debug = Boolean(options && options.debug); if (options && options.encoding) { encoding = options.encoding; } else { if (debug) { _debug("No encoding is specified. UTF-8 is used by default"); } } let optionPaths = [dotenvPath]; if (options && options.path) { if (!Array.isArray(options.path)) { optionPaths = [_resolveHome(options.path)]; } else { optionPaths = []; for (const filepath of options.path) { optionPaths.push(_resolveHome(filepath)); } } } let lastError; const parsedAll = {}; for (const path2 of optionPaths) { try { const parsed = DotenvModule.parse(fs.readFileSync(path2, { encoding })); DotenvModule.populate(parsedAll, parsed, options); } catch (e) { if (debug) { _debug(`Failed to load ${path2} ${e.message}`); } lastError = e; } } let processEnv = process.env; if (options && options.processEnv != null) { processEnv = options.processEnv; } DotenvModule.populate(processEnv, parsedAll, options); if (lastError) { return { parsed: parsedAll, error: lastError }; } else { return { parsed: parsedAll }; } } function config(options) { if (_dotenvKey(options).length === 0) { return DotenvModule.configDotenv(options); } const vaultPath = _vaultPath(options); if (!vaultPath) { _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`); return DotenvModule.configDotenv(options); } return DotenvModule._configVault(options); } function decrypt(encrypted, keyStr) { const key = Buffer.from(keyStr.slice(-64), "hex"); let ciphertext = Buffer.from(encrypted, "base64"); const nonce = ciphertext.subarray(0, 12); const authTag = ciphertext.subarray(-16); ciphertext = ciphertext.subarray(12, -16); try { const aesgcm = crypto.createDecipheriv("aes-256-gcm", key, nonce); aesgcm.setAuthTag(authTag); return `${aesgcm.update(ciphertext)}${aesgcm.final()}`; } catch (error) { const isRange = error instanceof RangeError; const invalidKeyLength = error.message === "Invalid key length"; const decryptionFailed = error.message === "Unsupported state or unable to authenticate data"; if (isRange || invalidKeyLength) { const err = new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)"); err.code = "INVALID_DOTENV_KEY"; throw err; } else if (decryptionFailed) { const err = new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY"); err.code = "DECRYPTION_FAILED"; throw err; } else { throw error; } } } function populate(processEnv, parsed, options = {}) { const debug = Boolean(options && options.debug); const override = Boolean(options && options.override); if (typeof parsed !== "object") { const err = new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate"); err.code = "OBJECT_REQUIRED"; throw err; } for (const key of Object.keys(parsed)) { if (Object.prototype.hasOwnProperty.call(processEnv, key)) { if (override === true) { processEnv[key] = parsed[key]; } if (debug) { if (override === true) { _debug(`"${key}" is already defined and WAS overwritten`); } else { _debug(`"${key}" is already defined and was NOT overwritten`); } } } else { processEnv[key] = parsed[key]; } } } var DotenvModule = { configDotenv, _configVault, _parseVault, config, decrypt, parse, populate }; module.exports.configDotenv = DotenvModule.configDotenv; module.exports._configVault = DotenvModule._configVault; module.exports._parseVault = DotenvModule._parseVault; module.exports.config = DotenvModule.config; module.exports.decrypt = DotenvModule.decrypt; module.exports.parse = DotenvModule.parse; module.exports.populate = DotenvModule.populate; module.exports = DotenvModule; } }); // ../cli-fs/src/index.ts init_esm_shims(); import { access, readFile as fsReadFile, writeFile, mkdir, rm } from "node:fs/promises"; import { dirname, join, relative, resolve, sep } from "node:path"; import { EOL } from "node:os"; var import_dotenv = __toESM(require_main(), 1); // ../cli-fs/src/schemas.ts init_esm_shims(); var packageJsonSchema = external_exports.object({ dependencies: external_exports.record(external_exports.string()).optional(), devDependencies: external_exports.record(external_exports.string()).optional(), peerDependencies: external_exports.record(external_exports.string()).optional(), scripts: external_exports.record(external_exports.string()).optional() }); // ../cli-fs/src/index.ts function toJsonString(object, opts) { return JSON.stringify(object, null, opts?.spaces).concat(EOL); } async function writeJson(filePath, object, opts) { const str = toJsonString(object, opts); await outputDir(dirname(filePath)); try { await writeFile(filePath, str, "utf-8"); } catch (e) { throw new CliError({ code: CliErrorCode.FailedToWriteJson({ filePath }), cause: e }); } } async function readJson(file) { let content = null; try { content = await fsReadFile(file, "utf-8"); } catch (e) { throw new CliError({ code: CliErrorCode.FailedToReadJson({ filePath: file }), cause: e }); } try { return JSON.parse(content); } catch (e) { throw new CliError({ code: CliErrorCode.InvalidJsonFile({ filePath: file }), cause: e }); } } async function readFile(file, encoding) { try { return await fsReadFile(file, encoding); } catch (e) { throw new CliError({ code: CliErrorCode.FailedToReadFile({ filePath: file }), cause: e }); } } function pathExists(path) { return access(path).then(() => true).catch(() => false); } async function outputFile(file, content) { await outputDir(dirname(file)); try { await writeFile(file, content, "utf-8"); } catch (e) { throw new CliError({ code: CliErrorCode.FailedToWriteFile({ filePath: file }), cause: e }); } } async function removeDir(dir) { if (!await pathExists(dir)) { return; } try { await rm(dir, { recursive: true }); } catch (e) { throw new CliError({ code: CliErrorCode.FailedToRemoveDir({ dirPath: dir }), cause: e }); } } async function outputDir(dir) { try { await mkdir(dir, { recursive: true }); } catch (e) { throw new CliError({ code: CliErrorCode.FailedToCreateDir({ dirPath: dir }), cause: e }); } } async function readPackageJson(projectFolder) { const packageJsonPath = join(projectFolder, "package.json"); const json = await readJson(packageJsonPath); const parsedPackageJson = await packageJsonSchema.safeParseAsync(json); if (!parsedPackageJson.success) { throw new CliError({ code: CliErrorCode.InvalidConfigSchemaError({ configPath: packageJsonPath, zodError: parsedPackageJson.error }), cause: parsedPackageJson.error }); } return json; } function readPackageJsonContent(projectFolder) { return readFile(join(projectFolder, "package.json"), "utf-8"); } async function writePackageJson(projectFolder, packageJson) { const packageJsonPath = join(projectFolder, "package.json"); await writeJson(packageJsonPath, packageJson, { spaces: 2 }); } async function readEnvFile(source) { if (await pathExists(source)) { try { const content = await readFile(source); return import_dotenv.default.parse(content); } catch { return {}; } } return {}; } async function updateEnvFile(target, variables) { const mergedEnvVars = { ...await readEnvFile(target), ...variables }; const outputEnvVar = Object.entries(mergedEnvVars).map(([key, value]) => `${key}="${value}"`).join("\n"); await outputFile(target, outputEnvVar); } function isSameOrChild(parent, child) { const resolvedParent = resolve(parent); const resolvedChild = resolve(child); if (resolvedParent === resolvedChild) { return true; } const parentWithSep = resolvedParent.endsWith(sep) ? resolvedParent : resolvedParent + sep; return resolvedChild.startsWith(parentWithSep); } export { writeJson, readJson, readFile, pathExists, outputFile, removeDir, outputDir, readPackageJson, readPackageJsonContent, writePackageJson, readEnvFile, updateEnvFile, isSameOrChild }; //# sourceMappingURL=chunk-TLLAD5LU.js.map