@axis-ds/mcp 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +169 -30
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -873,10 +873,45 @@ var RegistryClient = class {
|
|
|
873
873
|
// ../axis-registry-core/src/project.ts
|
|
874
874
|
import { existsSync as existsSync2, readFileSync as readFileSync3, statSync } from "fs";
|
|
875
875
|
import path3 from "path";
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
876
|
+
var LOCKFILE_COMMANDS = [
|
|
877
|
+
["pnpm-lock.yaml", "pnpm install"],
|
|
878
|
+
["yarn.lock", "yarn install"],
|
|
879
|
+
["package-lock.json", "npm install"]
|
|
880
|
+
];
|
|
881
|
+
function lockfileCommandAt(dir) {
|
|
882
|
+
return LOCKFILE_COMMANDS.find(([file]) => existsSync2(path3.join(dir, file)))?.[1];
|
|
883
|
+
}
|
|
884
|
+
function isWorkspaceRootDir(dir) {
|
|
885
|
+
if (isFile(path3.join(dir, "pnpm-workspace.yaml"))) return true;
|
|
886
|
+
let parsed;
|
|
887
|
+
try {
|
|
888
|
+
parsed = JSON.parse(readFileSync3(path3.join(dir, "package.json"), "utf8"));
|
|
889
|
+
} catch {
|
|
890
|
+
return false;
|
|
891
|
+
}
|
|
892
|
+
if (!isPlainObject(parsed)) return false;
|
|
893
|
+
const ws = parsed.workspaces;
|
|
894
|
+
return Array.isArray(ws) || isPlainObject(ws) && Array.isArray(ws.packages);
|
|
895
|
+
}
|
|
896
|
+
function findWorkspaceRoot(baseDirInput) {
|
|
897
|
+
let dir = path3.resolve(baseDirInput);
|
|
898
|
+
for (; ; ) {
|
|
899
|
+
if (isWorkspaceRootDir(dir)) return dir;
|
|
900
|
+
if (existsSync2(path3.join(dir, ".git"))) return void 0;
|
|
901
|
+
const parent = path3.dirname(dir);
|
|
902
|
+
if (parent === dir) return void 0;
|
|
903
|
+
dir = parent;
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
function detectInstallCommand(baseDirInput) {
|
|
907
|
+
const baseDir = path3.resolve(baseDirInput);
|
|
908
|
+
const own = lockfileCommandAt(baseDir);
|
|
909
|
+
if (own !== void 0) return own;
|
|
910
|
+
const root = findWorkspaceRoot(baseDir);
|
|
911
|
+
if (root !== void 0 && root !== baseDir) {
|
|
912
|
+
const fromRoot = lockfileCommandAt(root);
|
|
913
|
+
if (fromRoot !== void 0) return fromRoot;
|
|
914
|
+
}
|
|
880
915
|
return "pnpm install";
|
|
881
916
|
}
|
|
882
917
|
function hasDependency(pkg, name) {
|
|
@@ -975,8 +1010,8 @@ function compareExactVersions(a, b) {
|
|
|
975
1010
|
}
|
|
976
1011
|
|
|
977
1012
|
// ../axis-registry-core/src/template/tailwind-core.ts
|
|
978
|
-
import { existsSync as existsSync3, lstatSync, readdirSync, readFileSync as readFileSync4 } from "fs";
|
|
979
|
-
import { extname, join as join2, resolve } from "path";
|
|
1013
|
+
import { existsSync as existsSync3, lstatSync, readdirSync, readFileSync as readFileSync4, realpathSync } from "fs";
|
|
1014
|
+
import { basename, dirname as dirname2, extname, isAbsolute, join as join2, relative, resolve, sep } from "path";
|
|
980
1015
|
function hasDependency2(pkg, name) {
|
|
981
1016
|
for (const field of ["dependencies", "devDependencies"]) {
|
|
982
1017
|
const deps = pkg[field];
|
|
@@ -1519,6 +1554,92 @@ function contentGlobToRegExp(glob) {
|
|
|
1519
1554
|
}
|
|
1520
1555
|
return new RegExp(`^${re}$`);
|
|
1521
1556
|
}
|
|
1557
|
+
function leadingParentSegments(p) {
|
|
1558
|
+
const s = p.trim().replace(/\\/g, "/").replace(/^\.\//, "");
|
|
1559
|
+
return (/^(?:\.\.\/)*/.exec(s)?.[0].length ?? 0) / 3;
|
|
1560
|
+
}
|
|
1561
|
+
function isAbsoluteGlob(glob) {
|
|
1562
|
+
const t = glob.trim();
|
|
1563
|
+
return t.startsWith("/") || /^[A-Za-z]:[\\/]/.test(t);
|
|
1564
|
+
}
|
|
1565
|
+
var MAX_BRACE_EXPANSION = 256;
|
|
1566
|
+
function expandBraces(glob) {
|
|
1567
|
+
const open = glob.indexOf("{");
|
|
1568
|
+
if (open === -1) return [glob];
|
|
1569
|
+
let depth = 0;
|
|
1570
|
+
let close = -1;
|
|
1571
|
+
const commas = [];
|
|
1572
|
+
for (let i = open; i < glob.length; i++) {
|
|
1573
|
+
const c = glob[i];
|
|
1574
|
+
if (c === "{") depth++;
|
|
1575
|
+
else if (c === "}") {
|
|
1576
|
+
depth--;
|
|
1577
|
+
if (depth === 0) {
|
|
1578
|
+
close = i;
|
|
1579
|
+
break;
|
|
1580
|
+
}
|
|
1581
|
+
} else if (c === "," && depth === 1) commas.push(i);
|
|
1582
|
+
}
|
|
1583
|
+
const head = glob.slice(0, open + 1);
|
|
1584
|
+
if (close === -1 || commas.length === 0) {
|
|
1585
|
+
return expandBraces(glob.slice(open + 1))?.map((r) => head + r);
|
|
1586
|
+
}
|
|
1587
|
+
const parts = [];
|
|
1588
|
+
let from = open + 1;
|
|
1589
|
+
for (const c of [...commas, close]) {
|
|
1590
|
+
parts.push(glob.slice(from, c));
|
|
1591
|
+
from = c + 1;
|
|
1592
|
+
}
|
|
1593
|
+
const prefix = glob.slice(0, open);
|
|
1594
|
+
const suffix = glob.slice(close + 1);
|
|
1595
|
+
const out = [];
|
|
1596
|
+
for (const part of parts) {
|
|
1597
|
+
const expanded = expandBraces(prefix + part + suffix);
|
|
1598
|
+
if (expanded === void 0) return void 0;
|
|
1599
|
+
out.push(...expanded);
|
|
1600
|
+
if (out.length > MAX_BRACE_EXPANSION) return void 0;
|
|
1601
|
+
}
|
|
1602
|
+
return out;
|
|
1603
|
+
}
|
|
1604
|
+
function realpathPosix(p) {
|
|
1605
|
+
let cur = p;
|
|
1606
|
+
const tail = [];
|
|
1607
|
+
for (let i = 0; i < 64; i++) {
|
|
1608
|
+
try {
|
|
1609
|
+
return [realpathSync(cur), ...tail].join(sep).split(sep).join("/");
|
|
1610
|
+
} catch {
|
|
1611
|
+
const parent = dirname2(cur);
|
|
1612
|
+
if (parent === cur) return void 0;
|
|
1613
|
+
tail.unshift(basename(cur));
|
|
1614
|
+
cur = parent;
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
return void 0;
|
|
1618
|
+
}
|
|
1619
|
+
function contentGlobBranchCovers(glob, sample, baseDir) {
|
|
1620
|
+
if (isAbsoluteGlob(glob)) {
|
|
1621
|
+
const re = contentGlobToRegExp(glob.trim().replace(/\\/g, "/"));
|
|
1622
|
+
const absSample = resolve(baseDir, sample);
|
|
1623
|
+
if (re.test(absSample.split(sep).join("/"))) return true;
|
|
1624
|
+
const real = realpathPosix(absSample);
|
|
1625
|
+
return real !== void 0 && re.test(real);
|
|
1626
|
+
}
|
|
1627
|
+
return leadingParentSegments(glob) === leadingParentSegments(sample) && contentGlobToRegExp(glob).test(sample);
|
|
1628
|
+
}
|
|
1629
|
+
function contentGlobCovers(glob, sample, baseDir) {
|
|
1630
|
+
const branches = expandBraces(glob.trim()) ?? [glob];
|
|
1631
|
+
return branches.some((b) => contentGlobBranchCovers(b, sample, baseDir));
|
|
1632
|
+
}
|
|
1633
|
+
var CONTENT_PARENT_PATH_NOTE = "\uC0C1\uC704 \uACBD\uB85C\uB294 Tailwind 3 \uAC00 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C \uB514\uB809\uD130\uB9AC \uAE30\uC900\uC73C\uB85C \uD480\uB824\uC694. \uBAA8\uB178\uB808\uD3EC \uB8E8\uD2B8 \uB4F1 \uC571 \uB514\uB809\uD130\uB9AC \uBC16\uC5D0\uC11C \uBE4C\uB4DC\uD558\uBA74 content: { relative: true, files: [...] } \uB85C \uC124\uC815 \uD30C\uC77C \uAE30\uC900\uC73C\uB85C \uBC14\uAFB8\uC138\uC694";
|
|
1634
|
+
function packageContentTarget(baseDir, name) {
|
|
1635
|
+
const found = isPnpProject(baseDir) ? void 0 : findInstalledPackage(baseDir, name);
|
|
1636
|
+
const rel2 = found === void 0 ? void 0 : relative(baseDir, found.dir);
|
|
1637
|
+
const relDir = rel2 === void 0 || rel2 === "" || isAbsolute(rel2) ? `node_modules/${name}` : rel2.split(sep).join("/");
|
|
1638
|
+
return {
|
|
1639
|
+
sample: `${relDir}/dist/index.js`,
|
|
1640
|
+
suggest: `${relDir.startsWith("../") ? "" : "./"}${relDir}/dist/**/*.{js,mjs}`
|
|
1641
|
+
};
|
|
1642
|
+
}
|
|
1522
1643
|
function balancedSlice(src, start) {
|
|
1523
1644
|
const open = src[start];
|
|
1524
1645
|
const close = open === "[" ? "]" : "}";
|
|
@@ -1580,17 +1701,17 @@ function inspectTailwindContent(baseDirInput) {
|
|
|
1580
1701
|
}
|
|
1581
1702
|
for (const name of TAILWIND4_COMPONENT_PACKAGES) {
|
|
1582
1703
|
if (pkg !== void 0 && hasDependency2(pkg, name) !== void 0) {
|
|
1583
|
-
targets.push({ label: name,
|
|
1704
|
+
targets.push({ label: name, ...packageContentTarget(baseDir, name) });
|
|
1584
1705
|
}
|
|
1585
1706
|
}
|
|
1586
1707
|
if (targets.length === 0) return null;
|
|
1587
1708
|
const read = readTailwindContent(readFileSync4(join2(baseDir, configFile), "utf8"));
|
|
1588
|
-
const
|
|
1709
|
+
const globs = (read?.globs ?? []).filter((g) => !g.trim().startsWith("!"));
|
|
1589
1710
|
return {
|
|
1590
1711
|
configFile,
|
|
1591
1712
|
unreadable: read === void 0,
|
|
1592
1713
|
dynamic: read?.dynamic ?? false,
|
|
1593
|
-
targets: targets.map((t) => ({ ...t, covered:
|
|
1714
|
+
targets: targets.map((t) => ({ ...t, covered: globs.some((g) => contentGlobCovers(g, t.sample, baseDir)) }))
|
|
1594
1715
|
};
|
|
1595
1716
|
}
|
|
1596
1717
|
function checkTailwindContent(baseDir) {
|
|
@@ -1605,17 +1726,18 @@ function checkTailwindContent(baseDir) {
|
|
|
1605
1726
|
};
|
|
1606
1727
|
}
|
|
1607
1728
|
const list = missing.map((t) => `${t.label} \u2192 "${t.suggest}"`).join(" \xB7 ");
|
|
1729
|
+
const note = missing.some((t) => t.suggest.startsWith("../")) ? ` (${CONTENT_PARENT_PATH_NOTE})` : "";
|
|
1608
1730
|
if (r.unreadable || r.dynamic) {
|
|
1609
1731
|
return {
|
|
1610
1732
|
name: "tailwind.content",
|
|
1611
1733
|
severity: "warn",
|
|
1612
|
-
message: `${r.configFile}\uC758 content \uB97C \uC815\uC801\uC73C\uB85C \uB2E4 \uC77D\uC9C0 \uBABB\uD574 \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4: ${list}`
|
|
1734
|
+
message: `${r.configFile}\uC758 content \uB97C \uC815\uC801\uC73C\uB85C \uB2E4 \uC77D\uC9C0 \uBABB\uD574 \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4: ${list}${note}`
|
|
1613
1735
|
};
|
|
1614
1736
|
}
|
|
1615
1737
|
return {
|
|
1616
1738
|
name: "tailwind.content",
|
|
1617
1739
|
severity: "fail",
|
|
1618
|
-
message: `${r.configFile}\uC758 content \uAC00 \uCEF4\uD3EC\uB10C\uD2B8 \uACBD\uB85C\uB97C \uB36E\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4(\uD074\uB798\uC2A4\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC74C): ${list}`
|
|
1740
|
+
message: `${r.configFile}\uC758 content \uAC00 \uCEF4\uD3EC\uB10C\uD2B8 \uACBD\uB85C\uB97C \uB36E\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4(\uD074\uB798\uC2A4\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC74C): ${list}${note}`
|
|
1619
1741
|
};
|
|
1620
1742
|
}
|
|
1621
1743
|
var ANIMATION_PLUGIN_TAILWIND3 = "tailwindcss-animate";
|
|
@@ -1769,7 +1891,7 @@ function selectUtilsDependencies(tailwind) {
|
|
|
1769
1891
|
}
|
|
1770
1892
|
|
|
1771
1893
|
// ../axis-registry-core/src/add/safe-write.ts
|
|
1772
|
-
import { constants as fsConstants, existsSync as existsSync4, lstatSync as lstatSync2, realpathSync, statSync as statSync2 } from "fs";
|
|
1894
|
+
import { constants as fsConstants, existsSync as existsSync4, lstatSync as lstatSync2, realpathSync as realpathSync2, statSync as statSync2 } from "fs";
|
|
1773
1895
|
import path4 from "path";
|
|
1774
1896
|
import fs2 from "fs-extra";
|
|
1775
1897
|
var NEW_FILE_FLAGS = fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | (fsConstants.O_NOFOLLOW ?? 0);
|
|
@@ -1796,12 +1918,12 @@ function nearestExisting(p) {
|
|
|
1796
1918
|
return cur;
|
|
1797
1919
|
}
|
|
1798
1920
|
function escapeReason(root, target, options = {}) {
|
|
1799
|
-
const realRoot =
|
|
1921
|
+
const realRoot = realpathSync2(root);
|
|
1800
1922
|
if (!isSameOrInside(path4.resolve(root), path4.resolve(target)) || path4.resolve(target) === path4.resolve(root)) {
|
|
1801
1923
|
return `\uACBD\uB85C\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD130\uB9AC \uBC16\uC785\uB2C8\uB2E4(${target})`;
|
|
1802
1924
|
}
|
|
1803
1925
|
const anchor = nearestExisting(path4.dirname(target));
|
|
1804
|
-
const realAnchor =
|
|
1926
|
+
const realAnchor = realpathSync2(anchor);
|
|
1805
1927
|
if (!isSameOrInside(realRoot, realAnchor)) {
|
|
1806
1928
|
return `\uC0C1\uC704 \uB514\uB809\uD130\uB9AC\uC758 \uC2E4\uC81C \uC704\uCE58(${realAnchor})\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD130\uB9AC \uBC16\uC785\uB2C8\uB2E4`;
|
|
1807
1929
|
}
|
|
@@ -1816,7 +1938,7 @@ function escapeReason(root, target, options = {}) {
|
|
|
1816
1938
|
const shown = path4.relative(path4.resolve(root), path4.resolve(target)).split(path4.sep).join("/");
|
|
1817
1939
|
let realTarget;
|
|
1818
1940
|
try {
|
|
1819
|
-
realTarget =
|
|
1941
|
+
realTarget = realpathSync2(target);
|
|
1820
1942
|
} catch {
|
|
1821
1943
|
return `\uAE30\uC874 \uD30C\uC77C ${shown} \uC774 \uAE68\uC9C4 \uC2EC\uBCFC\uB9AD \uB9C1\uD06C\uB77C \uB530\uB77C\uAC08 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4(\uB9C1\uD06C\uB97C \uC9C0\uC6B0\uAC70\uB098 \uACE0\uCE5C \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694)`;
|
|
1822
1944
|
}
|
|
@@ -1849,8 +1971,8 @@ function isSymlink(p) {
|
|
|
1849
1971
|
function outsideLinkTarget(root, target) {
|
|
1850
1972
|
if (!isSymlink(target)) return null;
|
|
1851
1973
|
try {
|
|
1852
|
-
const realTarget =
|
|
1853
|
-
return isSameOrInside(
|
|
1974
|
+
const realTarget = realpathSync2(target);
|
|
1975
|
+
return isSameOrInside(realpathSync2(root), realTarget) ? null : realTarget;
|
|
1854
1976
|
} catch {
|
|
1855
1977
|
return null;
|
|
1856
1978
|
}
|
|
@@ -1867,10 +1989,10 @@ function hardLinkMessage(shownPath, nlink) {
|
|
|
1867
1989
|
return `\uAE30\uC874 \uD30C\uC77C ${shownPath} \uC774 \uB2E4\uB978 \uACBD\uB85C\uC640 \uD558\uB4DC\uB9C1\uD06C\uB85C \uC774\uC5B4\uC9C4 \uD30C\uC77C\uC774\uB77C(\uB9C1\uD06C \uC218 ${nlink}) \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB36E\uC5B4\uC4F0\uBA74 \uC774\uC5B4\uC9C4 \uB2E4\uB978 \uACBD\uB85C\uC758 \uB0B4\uC6A9\uB3C4 \uBC14\uB01D\uB2C8\uB2E4. \uD558\uB4DC\uB9C1\uD06C\uB97C \uB04A\uC740(\uD30C\uC77C\uC744 \uBCF5\uC0AC\uD574 \uBC14\uAFBC) \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694`;
|
|
1868
1990
|
}
|
|
1869
1991
|
function writtenOutside(root, target) {
|
|
1870
|
-
const realRoot =
|
|
1992
|
+
const realRoot = realpathSync2(root);
|
|
1871
1993
|
let realTarget;
|
|
1872
1994
|
try {
|
|
1873
|
-
realTarget =
|
|
1995
|
+
realTarget = realpathSync2(target);
|
|
1874
1996
|
} catch {
|
|
1875
1997
|
return target;
|
|
1876
1998
|
}
|
|
@@ -1904,8 +2026,8 @@ async function writeNoFollow(target, content, mode) {
|
|
|
1904
2026
|
return actual;
|
|
1905
2027
|
}
|
|
1906
2028
|
function checkParentInside(root, target) {
|
|
1907
|
-
const realRoot =
|
|
1908
|
-
const realParent =
|
|
2029
|
+
const realRoot = realpathSync2(root);
|
|
2030
|
+
const realParent = realpathSync2(path4.dirname(target));
|
|
1909
2031
|
if (!isSameOrInside(realRoot, realParent)) {
|
|
1910
2032
|
return `\uBD80\uBAA8 \uB514\uB809\uD130\uB9AC\uC758 \uC2E4\uC81C \uC704\uCE58(${realParent})\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD130\uB9AC \uBC16\uC785\uB2C8\uB2E4`;
|
|
1911
2033
|
}
|
|
@@ -4427,7 +4549,7 @@ import path9 from "path";
|
|
|
4427
4549
|
// src/tools/brand-core.ts
|
|
4428
4550
|
import { existsSync as existsSync8, readFileSync as readFileSync8, statSync as statSync5 } from "fs";
|
|
4429
4551
|
import { createRequire } from "module";
|
|
4430
|
-
import { dirname as
|
|
4552
|
+
import { dirname as dirname4, join as join4, relative as relative2, resolve as resolve3, sep as sep2 } from "path";
|
|
4431
4553
|
var TOKENS_PACKAGE = "@axis-ds/tokens";
|
|
4432
4554
|
var MIN_BRAND_TOKENS_VERSION = "1.3.0";
|
|
4433
4555
|
var TOKENS_DEPENDENCY_MIN_VERSION = "1.6.0";
|
|
@@ -4457,7 +4579,7 @@ function findTokensPackageJson(baseDir) {
|
|
|
4457
4579
|
for (; ; ) {
|
|
4458
4580
|
const candidate = join4(dir, "node_modules", TOKENS_PACKAGE, "package.json");
|
|
4459
4581
|
if (existsSync8(candidate)) return candidate;
|
|
4460
|
-
const parent =
|
|
4582
|
+
const parent = dirname4(dir);
|
|
4461
4583
|
if (parent === dir) return void 0;
|
|
4462
4584
|
dir = parent;
|
|
4463
4585
|
}
|
|
@@ -4541,7 +4663,7 @@ function inspectBrandImport(baseDir) {
|
|
|
4541
4663
|
if (!location.path) {
|
|
4542
4664
|
return { ...base, state: "css-missing", imports: [] };
|
|
4543
4665
|
}
|
|
4544
|
-
const cssFile =
|
|
4666
|
+
const cssFile = relative2(root, location.path).split(sep2).join("/");
|
|
4545
4667
|
const imports = [...new Set(findBrandImports(readFileSync8(location.path, "utf8")))];
|
|
4546
4668
|
let state;
|
|
4547
4669
|
if (imports.includes(brand)) state = "match";
|
|
@@ -4657,7 +4779,7 @@ function findBrandActivation(baseDir) {
|
|
|
4657
4779
|
const providerTexts = [];
|
|
4658
4780
|
for (const m of text.matchAll(/from\s+["']\.\/(providers?)["']/g)) {
|
|
4659
4781
|
for (const ext of [".tsx", ".jsx", ".ts", ".js"]) {
|
|
4660
|
-
const rel2 = `${
|
|
4782
|
+
const rel2 = `${dirname4(candidate)}/${m[1]}${ext}`;
|
|
4661
4783
|
const p = join4(root, rel2);
|
|
4662
4784
|
if (isFile2(p)) providerTexts.push({ rel: rel2, text: stripJsLikeComments(readFileSync8(p, "utf8")) });
|
|
4663
4785
|
}
|
|
@@ -4740,6 +4862,16 @@ function declaredAxisPackages(pkg) {
|
|
|
4740
4862
|
}
|
|
4741
4863
|
return out;
|
|
4742
4864
|
}
|
|
4865
|
+
function workspaceRootPackage(baseDir) {
|
|
4866
|
+
const root = findWorkspaceRoot(baseDir);
|
|
4867
|
+
if (root === void 0 || root === baseDir) return void 0;
|
|
4868
|
+
try {
|
|
4869
|
+
const parsed = JSON.parse(readFileSync9(join5(root, "package.json"), "utf8"));
|
|
4870
|
+
return isPlainObject(parsed) ? parsed : void 0;
|
|
4871
|
+
} catch {
|
|
4872
|
+
return void 0;
|
|
4873
|
+
}
|
|
4874
|
+
}
|
|
4743
4875
|
function checkDependencies(baseDirInput) {
|
|
4744
4876
|
const baseDir = resolve4(baseDirInput);
|
|
4745
4877
|
let pkg;
|
|
@@ -4753,13 +4885,17 @@ function checkDependencies(baseDirInput) {
|
|
|
4753
4885
|
}
|
|
4754
4886
|
return { name: "dependencies", severity: "fail", message: "package.json \uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(JSON \uD655\uC778)" };
|
|
4755
4887
|
}
|
|
4756
|
-
const
|
|
4888
|
+
const rootPkg = workspaceRootPackage(baseDir);
|
|
4889
|
+
const fromRoot = (d) => !hasDependency(pkg, d) && rootPkg !== void 0 && Boolean(hasDependency(rootPkg, d));
|
|
4890
|
+
const missingRequired = REQUIRED_DEPENDENCIES.filter((d) => !hasDependency(pkg, d) && !fromRoot(d));
|
|
4757
4891
|
if (missingRequired.length > 0) {
|
|
4758
4892
|
return { name: "dependencies", severity: "fail", message: `\uD544\uC218 \uC758\uC874\uC131 \uB204\uB77D: ${missingRequired.join(", ")}` };
|
|
4759
4893
|
}
|
|
4760
|
-
const missingRecommended = RECOMMENDED_DEPENDENCIES.filter((d) => !hasDependency(pkg, d));
|
|
4894
|
+
const missingRecommended = RECOMMENDED_DEPENDENCIES.filter((d) => !hasDependency(pkg, d) && !fromRoot(d));
|
|
4895
|
+
const rootDeclared = [...REQUIRED_DEPENDENCIES, ...RECOMMENDED_DEPENDENCIES].filter((d) => fromRoot(d));
|
|
4896
|
+
const rootNote = rootDeclared.length > 0 ? `\uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uB8E8\uD2B8\uC5D0 \uC120\uC5B8: ${rootDeclared.join(", ")}` : void 0;
|
|
4761
4897
|
const targets = [
|
|
4762
|
-
...[...REQUIRED_DEPENDENCIES, ...RECOMMENDED_DEPENDENCIES].filter((d) => hasDependency(pkg, d) !== void 0),
|
|
4898
|
+
...[...REQUIRED_DEPENDENCIES, ...RECOMMENDED_DEPENDENCIES].filter((d) => hasDependency(pkg, d) !== void 0 || fromRoot(d)),
|
|
4763
4899
|
...declaredAxisPackages(pkg)
|
|
4764
4900
|
];
|
|
4765
4901
|
const pnp = isPnpProject(baseDir);
|
|
@@ -4769,11 +4905,14 @@ function checkDependencies(baseDirInput) {
|
|
|
4769
4905
|
if (notInstalled.length > 0) {
|
|
4770
4906
|
problems.push(`\uC120\uC5B8\uB410\uC9C0\uB9CC \uC124\uCE58\uB418\uC9C0 \uC54A\uC740 \uC758\uC874\uC131: ${notInstalled.join(", ")} \u2192 ${detectInstallCommand(baseDir)}`);
|
|
4771
4907
|
}
|
|
4772
|
-
if (problems.length > 0)
|
|
4908
|
+
if (problems.length > 0) {
|
|
4909
|
+
return { name: "dependencies", severity: "warn", message: problems.join(" / ") + (rootNote ? ` (${rootNote})` : "") };
|
|
4910
|
+
}
|
|
4911
|
+
const note = rootNote ? `, ${rootNote}` : "";
|
|
4773
4912
|
return {
|
|
4774
4913
|
name: "dependencies",
|
|
4775
4914
|
severity: "pass",
|
|
4776
|
-
message: pnp ? `\uD544\uC218 \uBC0F \uAD8C\uC7A5 \uC758\uC874\uC131\uC774 \uC120\uC5B8\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (Plug'n'Play \uB77C \uC124\uCE58\uBCF8\uC740 \uD655\uC778\uD558\uC9C0 \uC54A\uC74C, ${targets.length}\uAC1C)` : `\uD544\uC218 \uBC0F \uAD8C\uC7A5 \uC758\uC874\uC131\uC774 \uC120\uC5B8 \xB7 \uC124\uCE58\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (${targets.length}\uAC1C \uD655\uC778)`
|
|
4915
|
+
message: pnp ? `\uD544\uC218 \uBC0F \uAD8C\uC7A5 \uC758\uC874\uC131\uC774 \uC120\uC5B8\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (Plug'n'Play \uB77C \uC124\uCE58\uBCF8\uC740 \uD655\uC778\uD558\uC9C0 \uC54A\uC74C, ${targets.length}\uAC1C${note})` : `\uD544\uC218 \uBC0F \uAD8C\uC7A5 \uC758\uC874\uC131\uC774 \uC120\uC5B8 \xB7 \uC124\uCE58\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (${targets.length}\uAC1C \uD655\uC778${note})`
|
|
4777
4916
|
};
|
|
4778
4917
|
}
|
|
4779
4918
|
|