pnpm-plugin.spec.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { rm } from 'node:fs/promises';
  2. import { join } from 'node:path';
  3. import tsconfigPaths from 'tsconfig-paths';
  4. import { describe, expect, it } from 'vitest';
  5. import { compile } from '../utils/compiler.js';
  6. import { debugLogger, noopLogger } from '../utils/logger.js';
  7. import { findVendurePluginFiles } from '../utils/plugin-discovery.js';
  8. describe('detecting plugins in pnpm packages', () => {
  9. it('should detect plugins in pnpm node_modules structure', { timeout: 60_000 }, async () => {
  10. const tempDir = join(__dirname, './__temp/pnpm-plugin');
  11. await rm(tempDir, { recursive: true, force: true });
  12. const nodeModulesRoot = join(__dirname, 'fixtures-pnpm-plugin', 'fake_node_modules');
  13. tsconfigPaths.register({
  14. baseUrl: nodeModulesRoot,
  15. paths: {
  16. 'test-plugin': [join(nodeModulesRoot, 'test-plugin')],
  17. },
  18. });
  19. const result = await compile({
  20. outputPath: tempDir,
  21. vendureConfigPath: join(__dirname, 'fixtures-pnpm-plugin', 'vendure-config.ts'),
  22. logger: process.env.LOG ? debugLogger : noopLogger,
  23. pluginPackageScanner: {
  24. nodeModulesRoot,
  25. },
  26. });
  27. expect(result.pluginInfo).toHaveLength(1);
  28. expect(result.pluginInfo[0].name).toBe('TestPlugin');
  29. expect(result.pluginInfo[0].dashboardEntryPath).toBe('./dashboard/index.tsx');
  30. expect(result.pluginInfo[0].sourcePluginPath).toBeUndefined();
  31. // Plugin found via pnpm symlink
  32. expect(result.pluginInfo[0].pluginPath).toBe(join(nodeModulesRoot, 'test-plugin', 'index.js'));
  33. });
  34. it('should not filter out files in pnpm nested node_modules paths', async () => {
  35. const nodeModulesRoot = join(__dirname, 'fixtures-pnpm-plugin', 'fake_node_modules');
  36. const pnpmPath = '.pnpm/test-plugin@1.0.0/node_modules/test-plugin';
  37. // Directly scan the .pnpm directory to verify files with nested node_modules
  38. // paths are not filtered out by glob ignore patterns
  39. const files = await findVendurePluginFiles({
  40. outputPath: join(__dirname, './__temp/pnpm-ignore-test'),
  41. vendureConfigPath: join(__dirname, 'fixtures-pnpm-plugin', 'vendure-config.ts'),
  42. logger: noopLogger,
  43. nodeModulesRoot,
  44. packageGlobs: [pnpmPath + '/**/*.js'],
  45. });
  46. expect(files).toHaveLength(1);
  47. expect(files[0]).toContain('.pnpm');
  48. expect(files[0]).toContain('node_modules/test-plugin');
  49. });
  50. });