





















@@ -168,18 +168,32 @@ function setupPluginInstallDirs() {
168168return { tmpDir, pluginDir, extensionsDir };
169169}
170170171-function setupInstallPluginFromDirFixture(params?: { devDependencies?: Record<string, string> }) {
171+function setupInstallPluginFromDirFixture(params?: {
172+devDependencies?: Record<string, string>;
173+optionalDependencies?: Record<string, string>;
174+omitDependencies?: boolean;
175+}) {
172176const caseDir = suiteTempRootTracker.makeTempDir();
173177const stateDir = path.join(caseDir, "state");
174178const pluginDir = path.join(caseDir, "plugin");
175179fs.mkdirSync(stateDir, { recursive: true });
176180fs.cpSync(installPluginFromDirTemplateDir, pluginDir, { recursive: true });
177-if (params?.devDependencies) {
181+if (params?.devDependencies || params?.optionalDependencies || params?.omitDependencies) {
178182const packageJsonPath = path.join(pluginDir, "package.json");
179183const manifest = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8")) as {
184+dependencies?: Record<string, string>;
180185devDependencies?: Record<string, string>;
186+optionalDependencies?: Record<string, string>;
181187};
182-manifest.devDependencies = params.devDependencies;
188+if (params.omitDependencies) {
189+delete manifest.dependencies;
190+}
191+if (params.devDependencies) {
192+manifest.devDependencies = params.devDependencies;
193+}
194+if (params.optionalDependencies) {
195+manifest.optionalDependencies = params.optionalDependencies;
196+}
183197fs.writeFileSync(packageJsonPath, JSON.stringify(manifest), "utf-8");
184198}
185199return { pluginDir, extensionsDir: path.join(stateDir, "extensions") };
@@ -2103,6 +2117,32 @@ describe("installPluginFromDir", () => {
21032117});
21042118});
210521192120+it("runs npm install for optional-only dependencies", async () => {
2121+const { pluginDir, extensionsDir } = setupInstallPluginFromDirFixture({
2122+omitDependencies: true,
2123+optionalDependencies: {
2124+"left-pad": "1.3.0",
2125+},
2126+});
2127+2128+const run = vi.mocked(runCommandWithTimeout);
2129+mockSuccessfulCommandRun(run);
2130+2131+const res = await installPluginFromDir({
2132+dirPath: pluginDir,
2133+ extensionsDir,
2134+});
2135+2136+expect(res.ok).toBe(true);
2137+if (!res.ok) {
2138+return;
2139+}
2140+expectSingleNpmInstallIgnoreScriptsCall({
2141+calls: run.mock.calls as Array<[unknown, { cwd?: string } | undefined]>,
2142+expectedTargetDir: res.targetDir,
2143+});
2144+});
2145+21062146it("strips workspace devDependencies before npm install", async () => {
21072147const { pluginDir, extensionsDir } = setupInstallPluginFromDirFixture({
21082148devDependencies: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。