diff --git a/.github/matrix.json b/.github/matrix.json
index f15a18dd6920..17b4f64b7209 100644
--- a/.github/matrix.json
+++ b/.github/matrix.json
@@ -1,5 +1,5 @@
{
"postgresql": ["12"],
"ruby": ["2.7", "3.0"],
- "node": ["14"]
+ "node": ["18"]
}
diff --git a/.github/workflows/plugins_react_tests.yml b/.github/workflows/plugins_react_tests.yml
index 09615b630b27..7d0f7184b7cb 100644
--- a/.github/workflows/plugins_react_tests.yml
+++ b/.github/workflows/plugins_react_tests.yml
@@ -66,10 +66,10 @@ jobs:
repository: ${{ matrix.plugin }}
path: ${{ github.workspace }}/projects/plugin
- name: Generate ${{ matrix.plugin }} npm dependencies package-lock
- run: npm install --package-lock-only --no-audit
+ run: npm install --package-lock-only --no-audit --legacy-peer-deps
working-directory: ${{ github.workspace }}/projects/plugin
- name: Install ${{ matrix.plugin }} npm dependencies
- run: npm ci --no-audit
+ run: npm ci --no-audit --legacy-peer-deps
working-directory: ${{ github.workspace }}/projects/plugin
- name: Run ${{ matrix.plugin }} tests
run: npm test
diff --git a/.npmrc b/.npmrc
index b6f27f135954..d5831dd51888 100644
--- a/.npmrc
+++ b/.npmrc
@@ -1 +1,2 @@
engine-strict=true
+legacy-peer-deps=true
diff --git a/Dockerfile b/Dockerfile
index b5e8fe1571dc..83c4ac1b7714 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,7 @@
# Base container that is used for both building and running the app
FROM quay.io/centos/centos:stream8 as base
ARG RUBY_VERSION="2.7"
-ARG NODEJS_VERSION="14"
+ARG NODEJS_VERSION="18"
ENV FOREMAN_FQDN=foreman.example.com
ENV FOREMAN_DOMAIN=example.com
diff --git a/developer_docs/foreman_dev_setup.asciidoc b/developer_docs/foreman_dev_setup.asciidoc
index 4b17d284e2e2..94fc32ff7362 100644
--- a/developer_docs/foreman_dev_setup.asciidoc
+++ b/developer_docs/foreman_dev_setup.asciidoc
@@ -5,12 +5,11 @@
[[prerequisites]]
== Prerequisites
-Foreman will run with the following requirements (aside from rubygem dependencies):
+Please refer to the `.github/matrix.json` file in the project repository to find the latest supported versions for Ruby, NodeJS, and PostgreSQL. This file is regularly updated to reflect our current support.
-* Ruby 2.7.x
-* NodeJS 14
-* NPM 6.x
-* PostgreSQL 10+ (12+ recommended)
+We reccomend using PostgreSQL 12+.
+
+If you're using NPM version 7.x or higher, you will need to use the `--legacy-peer-deps` flag when installing npm packages. This is due to changes in how NPM handles peer dependencies from version 7 onwards.
https://github.com/rbenv/rbenv[rbenv] or https://github.com/rvm/rvm[RVM] can be used to install compatible Ruby versions. Similarly, https://github.com/nvm-sh/nvm[nvm] can be used to manage node and npm on your system.
diff --git a/package.json b/package.json
index 2901807f428c..05b90f7f458e 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"description": "Foreman isn't really a node module, these are just dependencies needed to build the webpack bundle. 'dependencies' are the asset libraries in use and 'devDependencies' are used for the build process.",
"private": true,
"engines": {
- "node": ">14.0.0 <16.0.0"
+ "node": ">=14.0.0 <21.0.0"
},
"scripts": {
"lint": "tfm-lint",
diff --git a/webpack/assets/javascripts/react_app/components/common/dates/LongDateTime.test.js b/webpack/assets/javascripts/react_app/components/common/dates/LongDateTime.test.js
index 58444c1b595d..c4f096b10e90 100644
--- a/webpack/assets/javascripts/react_app/components/common/dates/LongDateTime.test.js
+++ b/webpack/assets/javascripts/react_app/components/common/dates/LongDateTime.test.js
@@ -18,7 +18,59 @@ describe('LongDateTime', () => {
intl.ready.then(() => {
wrapper.update();
- expect(wrapper.find('LongDateTime')).toMatchSnapshot();
+ if (process.version.startsWith('v14') || process.version.startsWith('v16')) {
+ expect(wrapper.find('LongDateTime')).toMatchInlineSnapshot(
+ `
+
+
+
+
+ October 13, 2017, 11:54 AM
+
+
+
+
+ `
+ );
+ } else {
+ expect(wrapper.find('LongDateTime')).toMatchInlineSnapshot(
+ `
+
+
+
+
+ October 13, 2017 at 11:54 AM
+
+
+
+
+ `
+ );
+ }
});
});
@@ -33,7 +85,63 @@ describe('LongDateTime', () => {
intl.ready.then(() => {
wrapper.update();
- expect(wrapper.find('LongDateTime')).toMatchSnapshot();
+ if (process.version.startsWith('v14') || process.version.startsWith('v16')) {
+ expect(wrapper.find('LongDateTime')).toMatchInlineSnapshot(
+ `
+
+
+
+
+ October 13, 2017, 11:54 AM
+
+
+
+
+ `
+ );
+ } else {
+ expect(wrapper.find('LongDateTime')).toMatchInlineSnapshot(
+ `
+
+
+
+
+ October 13, 2017 at 11:54 AM
+
+
+
+
+ `
+ );
+ }
});
});
@@ -44,7 +152,61 @@ describe('LongDateTime', () => {
intl.ready.then(() => {
wrapper.update();
- expect(wrapper.find('LongDateTime')).toMatchSnapshot();
+ if (process.version.startsWith('v14') || process.version.startsWith('v16')) {
+ expect(wrapper.find('LongDateTime')).toMatchInlineSnapshot(
+ `
+
+
+
+
+ October 13, 2017, 11:54:55 AM
+
+
+
+
+ `
+ );
+ } else {
+ expect(wrapper.find('LongDateTime')).toMatchInlineSnapshot(
+ `
+
+
+
+
+ October 13, 2017 at 11:54:55 AM
+
+
+
+
+ `
+ );
+ }
});
});
@@ -55,7 +217,18 @@ describe('LongDateTime', () => {
intl.ready.then(() => {
wrapper.update();
- expect(wrapper.find('LongDateTime')).toMatchSnapshot();
+ expect(wrapper.find('LongDateTime')).toMatchInlineSnapshot(`
+
+
+ Default value
+
+
+ `);
});
});
});
diff --git a/webpack/assets/javascripts/react_app/components/common/dates/__snapshots__/LongDateTime.test.js.snap b/webpack/assets/javascripts/react_app/components/common/dates/__snapshots__/LongDateTime.test.js.snap
deleted file mode 100644
index 62a6f38960de..000000000000
--- a/webpack/assets/javascripts/react_app/components/common/dates/__snapshots__/LongDateTime.test.js.snap
+++ /dev/null
@@ -1,89 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`LongDateTime formats date 1`] = `
-
-
-
-
- October 13, 2017, 11:54 AM
-
-
-
-
-`;
-
-exports[`LongDateTime formats date with relative tooltip 1`] = `
-
-
-
-
- October 13, 2017, 11:54 AM
-
-
-
-
-`;
-
-exports[`LongDateTime formats date with seconds 1`] = `
-
-
-
-
- October 13, 2017, 11:54:55 AM
-
-
-
-
-`;
-
-exports[`LongDateTime renders default value 1`] = `
-
-
- Default value
-
-
-`;