diff --git a/.github/workflows/pr-node-tests.yml b/.github/workflows/pr-node-tests.yml index 81ee1df..4437449 100644 --- a/.github/workflows/pr-node-tests.yml +++ b/.github/workflows/pr-node-tests.yml @@ -22,6 +22,7 @@ jobs: - examples/21 - examples/22 - examples/23 + - examples/24 lando-version: - 3-edge os: diff --git a/CHANGELOG.md b/CHANGELOG.md index cc551ea..bcbc0ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ## {{ UNRELEASED_VERSION }} - [{{ UNRELEASED_DATE }}]({{ UNRELEASED_LINK }}) +* Added support for Node LTS `24` (up to `24.11`) +* Updated Node LTS support to include the latest minor versions for `22` (up to `22.21`) and `20` (up to `20.19`) +* Fixed `test:leia` + ## v1.5.0 - [March 5, 2025](https://github.com/lando/node/releases/tag/v1.5.0) * Updated Node support to include the latest minor versions for Node `23` (up to `23.8`), `22` (up to `22.14`), `20` (up to `20.18`), `19` (up to `19.9`), `18` (up to `18.20`), and `16` (up to `16.20`) diff --git a/builders/node.js b/builders/node.js index 0ce200f..55a0883 100644 --- a/builders/node.js +++ b/builders/node.js @@ -6,6 +6,18 @@ const _ = require('lodash'); // Constants const LEGACY_DEFAULT_VERSION = '14'; const supportedVersions = [ + '24', + '24.11', + '24.10', + '24.9', + '24.8', + '24.7', + '24.6', + '24.5', + '24.4', + '24.3', + '24.2', + '24.1', '23', '23.8', '23.7', @@ -16,6 +28,13 @@ const supportedVersions = [ '23.2', '23.1', '22', + '22.21', + '22.20', + '22.19', + '22.18', + '22.17', + '22.16', + '22.15', '22.14', '22.13', '22.12', @@ -39,6 +58,7 @@ const supportedVersions = [ '21.2', '21.1', '20', + '20.19', '20.18', '20.17', '20.16', diff --git a/docs/index.md b/docs/index.md index f84f7e9..d888d36 100644 --- a/docs/index.md +++ b/docs/index.md @@ -19,6 +19,7 @@ services: ## Supported versions +* [24](https://hub.docker.com/_/node) * [23](https://hub.docker.com/_/node) * [22](https://hub.docker.com/_/node) * [21](https://hub.docker.com/_/node) diff --git a/examples/24/.gitignore b/examples/24/.gitignore new file mode 100644 index 0000000..740a0a4 --- /dev/null +++ b/examples/24/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +package-lock.json diff --git a/examples/24/.lando.yml b/examples/24/.lando.yml new file mode 100644 index 0000000..97e784f --- /dev/null +++ b/examples/24/.lando.yml @@ -0,0 +1,39 @@ +name: lando-node-24 +services: + defaults: + type: node:24 + build: + - yarn + command: /app/node_modules/.bin/nodemon src/app-http.js --watch src --ignore *.test.js + cli: + type: node + compass: + type: node:24 + globals: + grunt-cli: latest + custom: + type: node:24 + ssl: true + globals: + gulp-cli: latest + port: 3000 + build: + - yarn + command: /app/node_modules/.bin/nodemon src/app-https.js --watch src --ignore *.test.js + custom2: + type: node:24.7.0 + ssl: 4444 + port: 3000 + build: + - yarn + command: /app/node_modules/.bin/nodemon src/app-custom.js --watch src --ignore *.test.js +tooling: + grunt: + service: compass + npx: + service: cli + +# This is important because it lets lando know to test against the plugin in this repo +# DO NOT REMOVE THIS! +plugins: + "@lando/node": ../.. diff --git a/examples/24/README.md b/examples/24/README.md new file mode 100644 index 0000000..7dd65b8 --- /dev/null +++ b/examples/24/README.md @@ -0,0 +1,86 @@ +# Node 24 Example + +This example exists primarily to test the following documentation: + +* [Node 14-24 Service](https://docs.devwithlando.io/tutorials/node.html) +* [Installing compass in your node service](https://docs.lando.dev/guides/using-compass-on-a-lando-node-service.html) + +## Start up tests + +Run the following commands to get up and running with this example. + +```bash +# Should start up successfully +lando poweroff +lando start +``` + +## Verification commands + +Run the following commands to validate things are rolling as they should. + +```bash +# Should use 24.x as the default version +lando exec defaults -- "env | grep NODE_VERSION=24." + +# Should use a user specified version if given +lando exec custom -- "env | grep NODE_VERSION=24." + +# Should use a user specified patch version if given +lando exec custom2 -- "env | grep NODE_VERSION=24.7.0" + +# Should serve over port 80 by default +lando exec defaults -- "curl http://localhost | grep tune" + +# Should set NODE_EXTRA_CA_CERTS with lando domain CA +lando exec defaults -- "env" | grep NODE_EXTRA_CA_CERTS | grep "$LANDO_CA_CERT" + +# Should only serve over http by default +lando exec defaults -- "curl https://localhost" || echo $? | grep 7 + +# Should serve over specified ports if given +lando exec custom -- "curl http://localhost:3000 | grep tune" + +# Should serve over https is ssl is set by user +lando exec custom -- "curl https://localhost | grep tune" + +# Should serve over a custom https port if ssl is set to a specific port +lando exec custom2 -- "curl https://localhost:4444 | grep DANCING" + +# Should run as root if using ports below 1024 +lando exec defaults -- pgrep -c -u root -f "node src/app-http.js" | grep 1 +lando exec custom -- pgrep -c -u root -f "node src/app-https.js" | grep 1 + +# Should run as node if using ports 1024 and above +lando exec custom2 -- pgrep -c -u node -f "node src/app-custom.js" | grep 1 + +# Should install global dependencies if specified by user and have them available in PATH +lando exec custom -- "gulp -v" +lando exec custom -- "which gulp | grep /var/www/.npm-global" + +# Should PATH prefer node dependency binaries installed in /app/node_modules over global ones +lando exec custom -- "npm install gulp-cli --no-save" +lando exec custom -- "gulp -v" +lando exec custom -- "which gulp | grep /app/node_modules/.bin" +lando exec custom -- "npm uninstall gulp-cli" +lando exec custom -- "which gulp | grep /var/www/.npm-global" + +# Should not serve port for cli +lando exec cli -- "curl http://localhost" || echo $? | grep 7 + +# Should install gruntcli +lando grunt -V + +# Should execute npx scripts +lando npx cowsay "Hello World" +``` + +## Destroy tests + +Run the following commands to trash this app like nothing ever happened. + +```bash +# Should be destroyed with success +lando destroy -y +lando poweroff +``` diff --git a/examples/24/package.json b/examples/24/package.json new file mode 100644 index 0000000..7f9f428 --- /dev/null +++ b/examples/24/package.json @@ -0,0 +1,27 @@ +{ + "name": "node-lando", + "version": "1.0.0", + "description": "Node example for Lando", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/lando/lando/tree/master/examples/node" + }, + "keywords": [ + "node", + "docker", + "localdev" + ], + "author": "Mike Pirog", + "license": "MIT", + "dependencies": { + "express": "^4.19.2" + }, + "devDependencies": { + "grunt-contrib-compass": "^1.1.1", + "nodemon": "^3.0.1" + } +} diff --git a/examples/24/src/app-custom.js b/examples/24/src/app-custom.js new file mode 100644 index 0000000..b47fc14 --- /dev/null +++ b/examples/24/src/app-custom.js @@ -0,0 +1,28 @@ +/** + * Lando node express example + * + * @name taylorswift + */ + +'use strict'; + +// Load modules +const fs = require('fs'); +const http = require('http'); +const https = require('https'); +const express = require('express'); +const app = express(); + +// Create our HTTPS server options +const key = fs.readFileSync('/certs/cert.key'); +const cert = fs.readFileSync('/certs/cert.crt'); + +// Create our servers +https.createServer({key, cert}, app).listen(4444); +http.createServer(app).listen(3000); + +// Basic HTTP response +app.get('/', (req, res) => { + res.header('Content-type', 'text/html'); + return res.end('

DANCING DANCING STARLIGHT

'); +}); diff --git a/examples/24/src/app-http.js b/examples/24/src/app-http.js new file mode 100644 index 0000000..fe682e2 --- /dev/null +++ b/examples/24/src/app-http.js @@ -0,0 +1,21 @@ +/** + * Lando node express example + * + * @name taylorswift + */ + +'use strict'; + +// Load modules +const http = require('http'); +const express = require('express'); +const app = express(); + +// Create our server +http.createServer(app).listen(80); + +// Basic HTTP response +app.get('/', (req, res) => { + res.header('Content-type', 'text/html'); + return res.end('

I said "Oh my!" What a marvelous tune!!!

'); +}); diff --git a/examples/24/src/app-https.js b/examples/24/src/app-https.js new file mode 100644 index 0000000..84c81bf --- /dev/null +++ b/examples/24/src/app-https.js @@ -0,0 +1,28 @@ +/** + * Lando node express example + * + * @name taylorswift + */ + +'use strict'; + +// Load modules +const fs = require('fs'); +const http = require('http'); +const https = require('https'); +const express = require('express'); +const app = express(); + +// Create our HTTPS server options +const key = fs.readFileSync('/certs/cert.key'); +const cert = fs.readFileSync('/certs/cert.crt'); + +// Create our servers +https.createServer({key, cert}, app).listen(443); +http.createServer(app).listen(3000); + +// Basic HTTP response +app.get('/', (req, res) => { + res.header('Content-type', 'text/html'); + return res.end('

I said "Oh my!" What a marvelous tune!!!

'); +}); diff --git a/package.json b/package.json index 5914f2c..c90fec4 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "docs:preview": "vitepress preview docs", "lint": "eslint . --ext .js --ext .mjs ", "test:unit": "nyc --reporter=html --reporter=text mocha --timeout 5000 test/**/*.spec.js", - "test:leia": "npm run leia \"examples/**/README.md\" -c 'Destroy tests' --stdin", + "test:leia": "leia \"examples/**/README.md\" -c 'Destroy tests' --stdin", "test": "npm run lint && npm run test:unit" }, "dependencies": {