diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d9d233b7..225d549f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,12 +12,12 @@ jobs: strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest] - node-version: [18.13.0, '*'] + node-version: [18.18.2, '*'] exclude: - os: macOS-latest - node-version: 18.13.0 + node-version: 18.18.2 - os: windows-latest - node-version: 18.13.0 + node-version: 18.18.2 fail-fast: false steps: diff --git a/package.json b/package.json index fc72d411..ac9b7903 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,10 @@ "prepublishOnly:pull": "git pull", "prepublishOnly:install": "npm ci", "prepublishOnly:test": "npm test", - "pretest:demo": "cd demo && npm ci && netlify build --cwd . --offline && cd ..", - "pretest:fixtures": "cd tests/fixtures/non-angular-project && npm ci", + "pretest:demo": "cd demo && npm ci && netlify build --cwd . --offline", + "pretest:fixtures": "run-s pretest:fixtures:*", + "pretest:fixtures:non-angular-project": "cd tests/fixtures/non-angular-project && npm ci", + "pretest:fixtures:missing-angular-deps": "cd tests/fixtures/missing-angular-deps && npm ci", "pretest": "run-s pretest:*", "test": "node --test" }, diff --git a/src/helpers/validateAngularVersion.js b/src/helpers/validateAngularVersion.js index 79f95ac5..eecb6452 100644 --- a/src/helpers/validateAngularVersion.js +++ b/src/helpers/validateAngularVersion.js @@ -7,9 +7,12 @@ const { satisfies } = require('semver') * @returns {Promise} */ const validateAngularVersion = async function (root) { - // eslint-disable-next-line n/no-missing-require - const packagePath = require.resolve('@angular/core/package.json', { paths: [root] }) - if (!packagePath) { + let packagePath + try { + // eslint-disable-next-line n/no-missing-require + packagePath = require.resolve('@angular/core/package.json', { paths: [root] }) + } catch { + // module not found console.warn('This site does not seem to be using Angular.') return false } diff --git a/tests/fixtures/missing-angular-deps/netlify.toml b/tests/fixtures/missing-angular-deps/netlify.toml new file mode 100644 index 00000000..19ba21e3 --- /dev/null +++ b/tests/fixtures/missing-angular-deps/netlify.toml @@ -0,0 +1,6 @@ +[build] + command="npm run build" + ignore="exit 1" ## always build, there might be changes in the plugin + +[[plugins]] + package="@netlify/angular-runtime" diff --git a/tests/fixtures/missing-angular-deps/package-lock.json b/tests/fixtures/missing-angular-deps/package-lock.json new file mode 100644 index 00000000..43970fce --- /dev/null +++ b/tests/fixtures/missing-angular-deps/package-lock.json @@ -0,0 +1,41 @@ +{ + "name": "missing-angular-deps", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "missing-angular-deps", + "version": "0.0.0", + "dependencies": { + "@netlify/angular-runtime": "file:../../../" + }, + "devDependencies": {} + }, + "../../..": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "semver": "^7.5.4" + }, + "devDependencies": { + "@netlify/build": "^29.28.2", + "@netlify/eslint-config-node": "^7.0.1", + "@types/node": "^16.3.1", + "eslint-plugin-unicorn": "^49.0.0", + "husky": "^4.3.0", + "netlify-cli": "^17.2.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.1.2" + }, + "engines": { + "node": ">=18.13.0" + } + }, + "node_modules/@netlify/angular-runtime": { + "resolved": "../../..", + "link": true + } + } +} diff --git a/tests/fixtures/missing-angular-deps/package.json b/tests/fixtures/missing-angular-deps/package.json new file mode 100644 index 00000000..9336def3 --- /dev/null +++ b/tests/fixtures/missing-angular-deps/package.json @@ -0,0 +1,12 @@ +{ + "name": "missing-angular-deps", + "version": "0.0.0", + "scripts": { + "build": "echo hello!" + }, + "private": true, + "dependencies": { + "@netlify/angular-runtime": "file:../../../" + }, + "devDependencies": {} +} diff --git a/tests/integration.test.mjs b/tests/integration.test.mjs index 706cd0f1..3dc8714d 100644 --- a/tests/integration.test.mjs +++ b/tests/integration.test.mjs @@ -3,7 +3,7 @@ import assert from 'node:assert' import { test } from 'node:test' import { fileURLToPath } from 'node:url' -test('non angular project fails the plugin execution but does not error', async () => { +test('project without angular config file fails the plugin execution but does not error', async () => { const { severityCode, success } = await build({ repositoryRoot: fileURLToPath(new URL('./fixtures/non-angular-project', import.meta.url)), }) @@ -11,3 +11,12 @@ test('non angular project fails the plugin execution but does not error', async assert.deepEqual(severityCode, 0) assert.deepEqual(success, true) }) + +test('project with missing angular dependencies does not error', async () => { + const { severityCode, success } = await build({ + repositoryRoot: fileURLToPath(new URL('./fixtures/missing-angular-deps', import.meta.url)), + }) + + assert.deepEqual(severityCode, 0) + assert.deepEqual(success, true) +})