@supernovaio/cli
Version:
Supernova.io Command Line Interface
155 lines (153 loc) • 5.71 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]="fda3d0c0-2968-5f78-9371-84666aec9096")}catch(e){}}();
import fs from "node:fs";
import path from "node:path";
import { globSync } from "glob";
import { sourceIndexEntryFileNames } from "./module-resolution.js";
function stripInlineYamlComment(line) {
let quote = null;
for (let index = 0; index < line.length; index += 1) {
const char = line[index];
const previous = index > 0 ? line[index - 1] : "";
if ((char === "'" || char === '"') && previous !== "\\") {
quote = quote === char ? null : (quote ?? char);
continue;
}
if (char === "#" && !quote && (index === 0 || /\s/.test(previous))) {
return line.slice(0, index);
}
}
return line;
}
function unquoteYamlScalar(value) {
const trimmed = value.trim();
const quote = trimmed[0];
if ((quote === "'" || quote === '"') && trimmed.endsWith(quote)) {
return trimmed.slice(1, -1);
}
return trimmed;
}
function splitInlineYamlArray(value) {
const trimmed = value.trim();
if (!trimmed.startsWith("[") || !trimmed.endsWith("]")) {
return [];
}
const items = [];
let current = "";
let quote = null;
for (const char of trimmed.slice(1, -1)) {
if (char === "'" || char === '"') {
quote = quote === char ? null : (quote ?? char);
current += char;
continue;
}
if (char === "," && !quote) {
items.push(current);
current = "";
continue;
}
current += char;
}
items.push(current);
return items.map(item => unquoteYamlScalar(item)).filter(Boolean);
}
function parsePnpmWorkspacePackagePatterns(contents) {
const patterns = [];
let packagesIndent = null;
for (const rawLine of contents.split(/\r?\n/)) {
const line = stripInlineYamlComment(rawLine);
const trimmed = line.trim();
if (!trimmed) {
continue;
}
const indent = line.length - line.trimStart().length;
if (packagesIndent === null) {
const match = trimmed.match(/^packages\s*:\s*(.*)$/);
if (!match) {
continue;
}
const inlineValue = match[1].trim();
if (inlineValue) {
patterns.push(...splitInlineYamlArray(inlineValue));
continue;
}
packagesIndent = indent;
continue;
}
if (indent <= packagesIndent && !trimmed.startsWith("-")) {
packagesIndent = null;
continue;
}
if (!trimmed.startsWith("-")) {
continue;
}
const value = unquoteYamlScalar(trimmed.slice(1).trim());
if (value) {
patterns.push(value);
}
}
return patterns;
}
function getPackageJsonWorkspacePatterns(packageJson) {
const raw = packageJson.workspaces;
if (!raw) {
return [];
}
return Array.isArray(raw) ? raw : (raw.packages ?? []);
}
export function readWorkspacePatterns(rootDir) {
const patterns = [];
const rootPackageJsonPath = path.join(rootDir, "package.json");
if (fs.existsSync(rootPackageJsonPath)) {
try {
const rootPackageJson = JSON.parse(fs.readFileSync(rootPackageJsonPath, "utf8"));
patterns.push(...getPackageJsonWorkspacePatterns(rootPackageJson));
}
catch {
}
}
const pnpmWorkspacePath = path.join(rootDir, "pnpm-workspace.yaml");
if (fs.existsSync(pnpmWorkspacePath)) {
patterns.push(...parsePnpmWorkspacePackagePatterns(fs.readFileSync(pnpmWorkspacePath, "utf8")));
}
const lernaJsonPath = path.join(rootDir, "lerna.json");
if (fs.existsSync(lernaJsonPath)) {
try {
const lernaJson = JSON.parse(fs.readFileSync(lernaJsonPath, "utf8"));
patterns.push(...(lernaJson.packages ?? ["packages/*"]));
}
catch {
}
}
return [...new Set(patterns.map(pattern => pattern.trim()).filter(Boolean))];
}
function normalizeWorkspacePattern(pattern) {
return pattern.replaceAll("\\", "/").replace(/^!/, "").replace(/\/$/, "");
}
function workspacePatternToPackageJsonGlob(pattern) {
return `${normalizeWorkspacePattern(pattern)}/package.json`;
}
export function hasSourceEntry(packageDir) {
return sourceIndexEntryFileNames.some(entryFileName => fs.existsSync(path.join(packageDir, "src", entryFileName)));
}
export function resolveWorkspacePackageDirs(rootDir) {
const packageDirs = [];
const workspacePatterns = readWorkspacePatterns(rootDir);
const ignoredPackageJsonFiles = workspacePatterns
.filter(pattern => pattern.startsWith("!"))
.map(pattern => workspacePatternToPackageJsonGlob(pattern));
for (const pattern of workspacePatterns) {
if (pattern.startsWith("!")) {
continue;
}
const packageJsonFiles = globSync(workspacePatternToPackageJsonGlob(pattern), {
absolute: true,
cwd: rootDir,
ignore: ["**/node_modules/**", ...ignoredPackageJsonFiles],
nodir: true,
});
packageDirs.push(...packageJsonFiles.map(packageJsonPath => path.dirname(packageJsonPath)));
}
return [...new Set(packageDirs)].sort((a, b) => a.localeCompare(b));
}
//# sourceMappingURL=workspace-packages.js.map
//# debugId=fda3d0c0-2968-5f78-9371-84666aec9096