@supernovaio/cli
Version:
Supernova.io Command Line Interface
265 lines (263 loc) • 9.47 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]="de233e0b-b94f-59be-b508-f134959bd583")}catch(e){}}();
import fs from "node:fs";
import path from "node:path";
export const packageEntryFieldPriority = ["source", "module", "jsnext:main", "browser", "main", "types", "typings"];
export const packageDeclarationEntryFieldPriority = [
"types",
"typings",
"source",
"module",
"jsnext:main",
"browser",
"main",
];
export const exportConditionPriority = [
"source",
"import",
"module",
"browser",
"development",
"production",
"default",
"require",
"types",
"typings",
];
export const exportDeclarationConditionPriority = [
"types",
"typings",
"source",
"import",
"module",
"browser",
"development",
"production",
"default",
"require",
];
export const sourceModuleFileExtensions = [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"];
export const declarationModuleFileExtensions = [".d.ts", ".d.mts", ".d.cts"];
export const sourceIndexEntryFileNames = [
"index.ts",
"index.tsx",
"index.mts",
"index.cts",
"index.js",
"index.jsx",
"index.mjs",
"index.cjs",
];
export const indexEntryFileNames = [
...sourceIndexEntryFileNames,
"index.d.ts",
"index.d.mts",
"index.d.cts",
];
export const declarationPreferredIndexEntryFileNames = [
"index.d.ts",
"index.d.mts",
"index.d.cts",
...sourceIndexEntryFileNames,
];
export function isRecord(value) {
return typeof value === "object" && value !== null && !Array.isArray(value);
}
export function normalizePath(value) {
return value.replaceAll("\\", "/");
}
export function isDeclarationModuleFile(filePath) {
return declarationModuleFileExtensions.some(extension => filePath.endsWith(extension));
}
function moduleFileExtensionsFor(options = {}) {
if (options.allowDeclarations === false) {
return sourceModuleFileExtensions;
}
return options.preferDeclarations
? [...declarationModuleFileExtensions, ...sourceModuleFileExtensions]
: [...sourceModuleFileExtensions, ...declarationModuleFileExtensions];
}
function indexFileNamesFor(options = {}) {
const fileNames = options.preferDeclarations ? declarationPreferredIndexEntryFileNames : indexEntryFileNames;
return options.allowDeclarations === false
? fileNames.filter(fileName => !isDeclarationModuleFile(fileName))
: fileNames;
}
function stripKnownModuleExtension(filePath) {
const knownExtensions = [...declarationModuleFileExtensions, ...sourceModuleFileExtensions];
const extension = knownExtensions.find(candidate => filePath.endsWith(candidate));
return extension ? filePath.slice(0, -extension.length) : filePath;
}
export function resolveExistingModuleFile(entryPath, options = {}) {
if (fs.existsSync(entryPath)) {
const stats = fs.statSync(entryPath);
if (stats.isFile()) {
return options.allowDeclarations === false && isDeclarationModuleFile(entryPath) ? null : entryPath;
}
if (stats.isDirectory()) {
for (const entryFileName of indexFileNamesFor(options)) {
const candidate = path.join(entryPath, entryFileName);
if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {
return candidate;
}
}
return null;
}
}
const basePath = stripKnownModuleExtension(entryPath);
const candidates = moduleFileExtensionsFor(options).map(extension => `${basePath}${extension}`);
for (const candidate of new Set(candidates)) {
if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {
return candidate;
}
}
return null;
}
export function readPackageJson(packageDir) {
const packageJsonPath = path.join(packageDir, "package.json");
if (!fs.existsSync(packageJsonPath)) {
return null;
}
try {
return JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
}
catch {
return null;
}
}
export function rootExportValue(exportsField) {
if (!isRecord(exportsField)) {
return exportsField;
}
if (Object.hasOwn(exportsField, ".")) {
return exportsField["."];
}
if (Object.keys(exportsField).some(key => key.startsWith("."))) {
return undefined;
}
return exportsField;
}
export function targetCandidates(value, conditionPriority = exportConditionPriority) {
if (typeof value === "string") {
return [value];
}
if (Array.isArray(value)) {
return value.flatMap(item => targetCandidates(item, conditionPriority));
}
if (!isRecord(value)) {
return [];
}
const conditionPrioritySet = new Set(conditionPriority);
const orderedValues = [
...conditionPriority.map(condition => value[condition]),
...Object.entries(value)
.filter(([condition]) => !conditionPrioritySet.has(condition))
.map(([, target]) => target),
];
return orderedValues.flatMap(item => targetCandidates(item, conditionPriority));
}
export function exportValueForSubpath(exportsField, subpath) {
if (subpath === ".") {
return rootExportValue(exportsField);
}
if (!isRecord(exportsField)) {
return undefined;
}
return exportsField[subpath];
}
export function packageJsonEntryCandidates(packageJson, subpath) {
const exportEntries = targetCandidates(exportValueForSubpath(packageJson.exports, subpath));
const fieldEntries = subpath === "."
? packageEntryFieldPriority
.map(field => packageJson[field])
.filter((entry) => typeof entry === "string" && entry.trim().length > 0)
: [];
return [...new Set([...exportEntries, ...fieldEntries])].filter(entry => entry.startsWith(".") || !path.isAbsolute(entry));
}
export function resolvePatternTarget(pattern, targetPattern, specifier) {
if (!pattern.includes("*")) {
return pattern === specifier ? targetPattern : null;
}
const [prefix, suffix] = pattern.split("*");
if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) {
return null;
}
const wildcardValue = specifier.slice(prefix.length, specifier.length - suffix.length);
return targetPattern.replaceAll("*", wildcardValue);
}
function packageImportMatches(importsField, moduleSpecifier) {
return Object.entries(importsField)
.flatMap(([pattern, target]) => {
const score = packageImportPatternScore(pattern, moduleSpecifier);
if (score === null) {
return [];
}
return [{ pattern, score, target }];
})
.sort((a, b) => b.score - a.score)
.map(match => [match.pattern, match.target]);
}
function packageImportPatternScore(pattern, moduleSpecifier) {
if (!pattern.includes("*")) {
return pattern === moduleSpecifier ? 2000 + pattern.length : null;
}
const [prefix, suffix] = pattern.split("*");
if (!moduleSpecifier.startsWith(prefix) || !moduleSpecifier.endsWith(suffix)) {
return null;
}
return 1000 + prefix.length + suffix.length;
}
function findNearestPackageDir(startPath) {
let current = path.dirname(startPath);
while (true) {
if (fs.existsSync(path.join(current, "package.json"))) {
return current;
}
const parent = path.dirname(current);
if (parent === current) {
return null;
}
current = parent;
}
}
export function resolvePackageImportModulePath(containingFilePath, moduleSpecifier) {
if (!moduleSpecifier.startsWith("#")) {
return null;
}
const packageDir = findNearestPackageDir(containingFilePath);
if (!packageDir) {
return null;
}
const importsField = readPackageJson(packageDir)?.imports;
if (!isRecord(importsField)) {
return null;
}
for (const [pattern, targetValue] of packageImportMatches(importsField, moduleSpecifier)) {
for (const target of targetCandidates(targetValue)) {
const replacedTarget = resolvePatternTarget(pattern, target, moduleSpecifier);
if (!replacedTarget || !replacedTarget.startsWith(".")) {
continue;
}
const resolvedPath = resolveExistingModuleFile(path.resolve(packageDir, replacedTarget), {
preferDeclarations: isDeclarationModuleFile(containingFilePath),
});
if (resolvedPath) {
return resolvedPath;
}
}
}
return null;
}
export function resolveModuleSpecifierFromFile(containingFilePath, moduleSpecifier) {
const packageImportPath = resolvePackageImportModulePath(containingFilePath, moduleSpecifier);
if (packageImportPath) {
return packageImportPath;
}
if (!moduleSpecifier.startsWith(".")) {
return null;
}
return resolveExistingModuleFile(path.resolve(path.dirname(containingFilePath), moduleSpecifier), {
preferDeclarations: isDeclarationModuleFile(containingFilePath),
});
}
//# sourceMappingURL=module-resolution.js.map
//# debugId=de233e0b-b94f-59be-b508-f134959bd583