Skip to content
Snippets Groups Projects
Select Git revision
  • e18259c2a5cb6ddc1d8a7939aeeace86c0d2c5a7
  • main default protected
  • renovate/main-redis-5.x
  • next
  • revert-31645-feat/rename-gradle-wrapper-validation-action
  • fix/36615b-branch-reuse-no-cache
  • chore/punycode
  • fix/36615-branch-reuse-bug
  • refactor/pin-new-value
  • feat/36219--git-x509-signing
  • feat/structured-logger
  • hotfix/39.264.1
  • feat/skip-dangling
  • gh-readonly-queue/next/pr-36034-7a061c4ca1024a19e2c295d773d9642625d1c2be
  • hotfix/39.238.3
  • refactor/gitlab-auto-approve
  • feat/template-strings
  • gh-readonly-queue/next/pr-35654-137d934242c784e0c45d4b957362214f0eade1d7
  • fix/32307-global-extends-merging
  • fix/32307-global-extends-repositories
  • gh-readonly-queue/next/pr-35009-046ebf7cb84ab859f7fefceb5fa53a54ce9736f8
  • 41.35.2
  • 41.35.1
  • 41.35.0
  • 41.34.1
  • 41.34.0
  • 41.33.0
  • 41.32.3
  • 41.32.2
  • 41.32.1
  • 41.32.0
  • 41.31.1
  • 41.31.0
  • 41.30.5
  • 41.30.4
  • 41.30.3
  • 41.30.2
  • 41.30.1
  • 41.30.0
  • 41.29.1
  • 41.29.0
41 results

gitea.ts

Blame
  • index.spec.ts 8.78 KiB
    import fs from 'fs';
    import path from 'path';
    import { getConfig } from '../../../config/defaults';
    import * as _gitfs from '../../../util/gitfs/fs';
    import * as npmExtract from '.';
    
    const gitfs: any = _gitfs;
    
    // TODO: fix types
    const defaultConfig = getConfig();
    
    function readFixture(fixture: string) {
      return fs.readFileSync(
        path.resolve(__dirname, `../__fixtures__/${fixture}`),
        'utf8'
      );
    }
    
    const input01Content = readFixture('inputs/01.json');
    const workspacesContent = readFixture('inputs/workspaces.json');
    const workspacesSimpleContent = readFixture('inputs/workspaces-simple.json');
    const vendorisedContent = readFixture('is-object.json');
    const invalidNameContent = readFixture('invalid-name.json');
    
    describe('manager/npm/extract', () => {
      describe('.extractPackageFile()', () => {
        beforeEach(() => {
          gitfs.readLocalFile = jest.fn(() => null);
        });
        it('returns null if cannot parse', async () => {
          const res = await npmExtract.extractPackageFile(
            'not json',
            'package.json',
            defaultConfig
          );
          expect(res).toBeNull();
        });
        it('catches invalid names', async () => {
          const res = await npmExtract.extractPackageFile(
            invalidNameContent,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('ignores vendorised package.json', async () => {
          const res = await npmExtract.extractPackageFile(
            vendorisedContent,
            'package.json',
            defaultConfig
          );
          expect(res).toBeNull();
        });
        it('throws error if non-root renovate config', async () => {
          await expect(
            npmExtract.extractPackageFile(
              '{ "renovate": {} }',
              'backend/package.json',
              defaultConfig
            )
          ).rejects.toThrow();
        });
        it('returns null if no deps', async () => {
          const res = await npmExtract.extractPackageFile(
            '{ "renovate": {} }',
            'package.json',
            defaultConfig
          );
          expect(res).toBeNull();
        });
        it('handles invalid', async () => {
          const res = await npmExtract.extractPackageFile(
            '{"dependencies": true, "devDependencies": []}',
            'package.json',
            defaultConfig
          );
          expect(res).toBeNull();
        });
        it('returns an array of dependencies', async () => {
          const res = await npmExtract.extractPackageFile(
            input01Content,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('finds a lock file', async () => {
          gitfs.readLocalFile = jest.fn((fileName) => {
            if (fileName === 'yarn.lock') {
              return '# yarn.lock';
            }
            return null;
          });
          const res = await npmExtract.extractPackageFile(
            input01Content,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('finds and filters .npmrc', async () => {
          gitfs.readLocalFile = jest.fn((fileName) => {
            if (fileName === '.npmrc') {
              return 'save-exact = true\npackage-lock = false\n';
            }
            return null;
          });
          const res = await npmExtract.extractPackageFile(
            input01Content,
            'package.json',
            { global: {} }
          );
          expect(res.npmrc).toBeDefined();
        });
        it('finds and discards .npmrc', async () => {
          gitfs.readLocalFile = jest.fn((fileName) => {
            if (fileName === '.npmrc') {
              // eslint-disable-next-line
              return '//registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}\n';
            }
            return null;
          });
          const res = await npmExtract.extractPackageFile(
            input01Content,
            'package.json',
            { global: {} }
          );
          expect(res.npmrc).toBeUndefined();
        });
        it('finds lerna', async () => {
          gitfs.readLocalFile = jest.fn((fileName) => {
            if (fileName === 'lerna.json') {
              return '{}';
            }
            return null;
          });
          const res = await npmExtract.extractPackageFile(
            input01Content,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('finds "npmClient":"npm" in lerna.json', async () => {
          gitfs.readLocalFile = jest.fn((fileName) => {
            if (fileName === 'lerna.json') {
              return '{ "npmClient": "npm" }';
            }
            return null;
          });
          const res = await npmExtract.extractPackageFile(
            input01Content,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('finds "npmClient":"yarn" in lerna.json', async () => {
          gitfs.readLocalFile = jest.fn((fileName) => {
            if (fileName === 'lerna.json') {
              return '{ "npmClient": "yarn" }';
            }
            return null;
          });
          const res = await npmExtract.extractPackageFile(
            input01Content,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('finds simple yarn workspaces', async () => {
          gitfs.readLocalFile = jest.fn((fileName) => {
            if (fileName === 'lerna.json') {
              return '{}';
            }
            return null;
          });
          const res = await npmExtract.extractPackageFile(
            workspacesSimpleContent,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('finds complex yarn workspaces', async () => {
          gitfs.readLocalFile = jest.fn((fileName) => {
            if (fileName === 'lerna.json') {
              return '{}';
            }
            return null;
          });
          const res = await npmExtract.extractPackageFile(
            workspacesContent,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('extracts engines', async () => {
          const pJson = {
            dependencies: {
              angular: '1.6.0',
            },
            devDependencies: {
              '@angular/cli': '1.6.0',
              foo: '*',
              bar: 'file:../foo/bar',
              baz: '',
              other: 'latest',
            },
            engines: {
              atom: '>=1.7.0 <2.0.0',
              node: '>= 8.9.2',
              npm: '^8.0.0',
              pnpm: '^1.2.0',
              yarn: 'disabled',
            },
            main: 'index.js',
          };
          const pJsonStr = JSON.stringify(pJson);
          const res = await npmExtract.extractPackageFile(
            pJsonStr,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('extracts volta', async () => {
          const pJson = {
            main: 'index.js',
            engines: {
              node: '8.9.2',
            },
            volta: {
              node: '8.9.2',
              yarn: '1.12.3',
              npm: '5.9.0',
            },
          };
          const pJsonStr = JSON.stringify(pJson);
          const res = await npmExtract.extractPackageFile(
            pJsonStr,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
    
        it('extracts volta yarn unknown-version', async () => {
          const pJson = {
            main: 'index.js',
            engines: {
              node: '8.9.2',
            },
            volta: {
              node: '8.9.2',
              yarn: 'unknown',
            },
          };
          const pJsonStr = JSON.stringify(pJson);
          const res = await npmExtract.extractPackageFile(
            pJsonStr,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('extracts non-npmjs', async () => {
          const pJson = {
            dependencies: {
              a: 'github:owner/a',
              b: 'github:owner/b#master',
              c: 'github:owner/c#v1.1.0',
              d: 'github:owner/d#a7g3eaf',
              e: 'github:owner/e#49b5aca613b33c5b626ae68c03a385f25c142f55',
              f: 'owner/f#v2.0.0',
              g: 'gitlab:owner/g#v1.0.0',
              h: 'github:-hello/world#v1.0.0',
              i: '@foo/bar#v2.0.0',
              j: 'github:frank#v0.0.1',
              k: 'github:owner/k#49b5aca',
              l: 'github:owner/l.git#abcdef0',
              m: 'https://github.com/owner/m.git#v1.0.0',
              n: 'git+https://github.com/owner/n#v2.0.0',
            },
          };
          const pJsonStr = JSON.stringify(pJson);
          const res = await npmExtract.extractPackageFile(
            pJsonStr,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
        it('extracts npm package alias', async () => {
          const pJson = {
            dependencies: {
              a: 'npm:foo@1',
              b: 'npm:@foo/bar@1.2.3',
              c: 'npm:foo',
            },
          };
          const pJsonStr = JSON.stringify(pJson);
          const res = await npmExtract.extractPackageFile(
            pJsonStr,
            'package.json',
            defaultConfig
          );
          expect(res).toMatchSnapshot();
        });
      });
      describe('.postExtract()', () => {
        it('runs', async () => {
          await expect(npmExtract.postExtract([])).resolves.not.toThrow();
        });
      });
    });