diff --git a/.github/workflows/pr-node-tests.yml b/.github/workflows/pr-node-tests.yml index 8fd6dc8..55b4cef 100644 --- a/.github/workflows/pr-node-tests.yml +++ b/.github/workflows/pr-node-tests.yml @@ -22,6 +22,7 @@ jobs: - examples/22 - examples/23 - examples/24 + - examples/26 lando-version: - 3-edge os: diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bd57f2..608d304 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ * Updated GitHub Actions dependencies * Removed Node 19 test example (EOL, deps like `minimatch` no longer support it) * Fixed Node 21 test example by pinning `minimatch` to `^9.0.0` for compatibility +* Added support for Node `26` (up to `26.4`) +* Updated Node LTS support to include the latest minor versions for `24` (up to `24.18`) and `22` (up to `22.23`) ## v1.6.0 - [December 6, 2025](https://github.com/lando/node/releases/tag/v1.6.0) diff --git a/builders/node.js b/builders/node.js index 55a0883..c3d6781 100644 --- a/builders/node.js +++ b/builders/node.js @@ -6,7 +6,19 @@ const _ = require('lodash'); // Constants const LEGACY_DEFAULT_VERSION = '14'; const supportedVersions = [ + '26', + '26.4', + '26.3', + '26.2', + '26.1', '24', + '24.18', + '24.17', + '24.16', + '24.15', + '24.14', + '24.13', + '24.12', '24.11', '24.10', '24.9', @@ -28,6 +40,8 @@ const supportedVersions = [ '23.2', '23.1', '22', + '22.23', + '22.22', '22.21', '22.20', '22.19', diff --git a/docs/index.md b/docs/index.md index 052257d..49bf395 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,6 +18,7 @@ services: ## Supported versions +* [26](https://hub.docker.com/_/node) * [24](https://hub.docker.com/_/node) * [23](https://hub.docker.com/_/node) * [22](https://hub.docker.com/_/node) diff --git a/examples/26/.gitignore b/examples/26/.gitignore new file mode 100644 index 0000000..740a0a4 --- /dev/null +++ b/examples/26/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +package-lock.json diff --git a/examples/26/.lando.yml b/examples/26/.lando.yml new file mode 100644 index 0000000..9ffe6ca --- /dev/null +++ b/examples/26/.lando.yml @@ -0,0 +1,39 @@ +name: lando-node-26 +services: + defaults: + type: node:26 + build: + - yarn + command: /app/node_modules/.bin/nodemon src/app-http.js --watch src --ignore *.test.js + cli: + type: node + compass: + type: node:26 + globals: + grunt-cli: latest + custom: + type: node:26 + 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:26.3.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/26/README.md b/examples/26/README.md new file mode 100644 index 0000000..c73a30d --- /dev/null +++ b/examples/26/README.md @@ -0,0 +1,86 @@ +# Node 26 Example + +This example exists primarily to test the following documentation: + +* [Node 14-26 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 26.x as the default version +lando exec defaults -- "env | grep NODE_VERSION=26." + +# Should use a user specified version if given +lando exec custom -- "env | grep NODE_VERSION=26." + +# Should use a user specified patch version if given +lando exec custom2 -- "env | grep NODE_VERSION=26.3.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/26/package.json b/examples/26/package.json new file mode 100644 index 0000000..7f9f428 --- /dev/null +++ b/examples/26/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/26/src/app-custom.js b/examples/26/src/app-custom.js new file mode 100644 index 0000000..b47fc14 --- /dev/null +++ b/examples/26/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/26/src/app-http.js b/examples/26/src/app-http.js new file mode 100644 index 0000000..fe682e2 --- /dev/null +++ b/examples/26/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/26/src/app-https.js b/examples/26/src/app-https.js new file mode 100644 index 0000000..84c81bf --- /dev/null +++ b/examples/26/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!!!

'); +});