diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..03b81a3 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,20 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-name: "@lando/*" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + actions: + applies-to: version-updates + update-types: [ "major", "minor", "patch" ] + + ignore: + - dependency-name: "lando/prepare-release-action" + versions: ["99", "99.x.x"] # v99 used for internal testing diff --git a/.github/workflows/label-add-to-project.yml b/.github/workflows/label-add-to-project.yml index b32106c..db11231 100644 --- a/.github/workflows/label-add-to-project.yml +++ b/.github/workflows/label-add-to-project.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Add issue/PR to GitHub Project if: github.event.label.name == 'flag' - uses: actions/add-to-project@v1.0.0 + uses: actions/add-to-project@v1.0.2 with: project-url: https://github.com/orgs/lando/projects/7 github-token: ${{ secrets.SHADOW_COUNCIL_ESCALATOR }} diff --git a/.github/workflows/pr-apache-tests.yml b/.github/workflows/pr-apache-tests.yml index 38a04f6..236e7a1 100644 --- a/.github/workflows/pr-apache-tests.yml +++ b/.github/workflows/pr-apache-tests.yml @@ -23,9 +23,9 @@ jobs: - '20' steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org diff --git a/.github/workflows/pr-docs-tests.yml b/.github/workflows/pr-docs-tests.yml index 3537cb8..d0ea99c 100644 --- a/.github/workflows/pr-docs-tests.yml +++ b/.github/workflows/pr-docs-tests.yml @@ -15,15 +15,15 @@ jobs: steps: # Install deps and cache - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Cache version builds - uses: actions/cache@v4 + uses: actions/cache@v5 with: key: lando-mvb-docs path: docs/.vitepress/cache/@lando/mvb save-always: true - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: npm diff --git a/.github/workflows/pr-linter.yml b/.github/workflows/pr-linter.yml index 7dbfd1b..0ded5e1 100644 --- a/.github/workflows/pr-linter.yml +++ b/.github/workflows/pr-linter.yml @@ -15,9 +15,9 @@ jobs: steps: # Install deps and cache - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: npm diff --git a/.github/workflows/pr-unit-tests.yml b/.github/workflows/pr-unit-tests.yml index 501c954..68a92dc 100644 --- a/.github/workflows/pr-unit-tests.yml +++ b/.github/workflows/pr-unit-tests.yml @@ -18,9 +18,9 @@ jobs: steps: # Install deps and cache - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: npm diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b225647..dd1fc14 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,9 +3,45 @@ name: Publish to NPM on: release: types: - - created + - published + - released jobs: + # When a prerelease is promoted to a full release, update the npm latest tag + promote: + if: github.event.action == 'released' + runs-on: ubuntu-24.04 + steps: + - name: Checkout code + uses: actions/checkout@v6 + - name: Install node 20 + uses: actions/setup-node@v6 + with: + node-version: '20' + registry-url: https://registry.npmjs.org + - name: Promote edge to latest + run: | + VERSION=$(echo "$TAG_NAME" | sed 's/^v//') + PACKAGE=$(node -p "require('./package.json').name") + + # Wait for version to be available on npm (handles race with deploy job) + for i in $(seq 1 30); do + if npm view "$PACKAGE@$VERSION" version &>/dev/null; then + npm dist-tag add "$PACKAGE@$VERSION" latest + echo "::notice title=Promoted $VERSION to latest::The latest tag now points to $VERSION" + exit 0 + fi + echo "Waiting for $PACKAGE@$VERSION on npm... (attempt $i/30)" + sleep 10 + done + + echo "::error title=Promotion failed::$PACKAGE@$VERSION not found on npm after 5 minutes" + exit 1 + env: + TAG_NAME: ${{ github.event.release.tag_name }} + NODE_AUTH_TOKEN: ${{secrets.NPM_DEPLOY_TOKEN}} + deploy: + if: github.event.action == 'published' runs-on: ${{ matrix.os }} env: TERM: xterm @@ -18,9 +54,9 @@ jobs: steps: # Install deps and cache - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Install node ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org diff --git a/.gitignore b/.gitignore index 8b56b4b..ff68704 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,11 @@ config.*.timestamp-*-*.* # YARN yarn.lock + + +# Syncthing +.stfolder/ +.stversions/ +.stignore +*.sync-conflict-* + diff --git a/CHANGELOG.md b/CHANGELOG.md index ade95a2..6bf3197 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ ## {{ UNRELEASED_VERSION }} - [{{ UNRELEASED_DATE }}]({{ UNRELEASED_LINK }}) +## v1.3.0 - [March 8, 2026](https://github.com/lando/apache/releases/tag/v1.3.0) + +* Enabled `mod_expires` Apache module by default [lando/lando#976](https://github.com/lando/lando/issues/976) +* Fixed unclosed `` tag in `httpd.conf` +* Updated `@lando/argv` to `1.2.0` +* Updated `lodash` to `4.17.23` +* Updated `lodash-es` to `4.17.23` + ## v1.2.0 - [August 30, 2025](https://github.com/lando/apache/releases/tag/v1.2.0) * Switched images to [bitnamilegacy](https://github.com/bitnami/containers/issues/83267) namespace diff --git a/README.md b/README.md index f0fa644..a83d085 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ We try to log all changes big and small in both [THE CHANGELOG](https://github.c * [@pirog](https://github.com/pirog) * [@reynoldsalec](https://github.com/reynoldsalec) +* [@aaronfeledy](https://github.com/AaronFeledy) ## Contributors diff --git a/config/httpd.conf b/config/httpd.conf index 3397b7c..c436726 100644 --- a/config/httpd.conf +++ b/config/httpd.conf @@ -113,7 +113,7 @@ LoadModule log_config_module modules/mod_log_config.so #LoadModule log_debug_module modules/mod_log_debug.so #LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so -#LoadModule expires_module modules/mod_expires.so +LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so #LoadModule unique_id_module modules/mod_unique_id.so LoadModule setenvif_module modules/mod_setenvif.so @@ -518,3 +518,4 @@ IncludeOptional /opt/bitnami/apache/conf/vhosts/*.conf RequestHeader unset Proxy + diff --git a/examples/2.4/.htaccess b/examples/2.4/.htaccess new file mode 100644 index 0000000..a26e080 --- /dev/null +++ b/examples/2.4/.htaccess @@ -0,0 +1,8 @@ + + Header set X-Lando-Test "blazes" + + + + ExpiresActive On + ExpiresDefault "access plus 1 hour" + diff --git a/examples/2.4/README.md b/examples/2.4/README.md index 92a3203..37a621a 100644 --- a/examples/2.4/README.md +++ b/examples/2.4/README.md @@ -30,6 +30,12 @@ lando exec curl -- curl http://defaults | grep ROOTDIR # Should only serve over http by default lando exec curl -- curl https://defaults || echo $? | grep 7 + +# Should have mod_headers enabled and working +lando exec curl -- curl -sI http://defaults | grep -i "X-Lando-Test: blazes" + +# Should have mod_expires enabled and working +lando exec curl -- curl -sI http://defaults | grep -i "Expires:" ``` ## Destroy tests diff --git a/netlify.toml b/netlify.toml index b69a084..5c685f0 100644 --- a/netlify.toml +++ b/netlify.toml @@ -10,7 +10,7 @@ [[context.deploy-preview.plugins]] package = "netlify-plugin-checklinks" [context.deploy-preview.plugins.inputs] - todoPatterns = [ "load", "CHANGELOG.html", "x.com", "twitter.com", "/v/" ] + todoPatterns = [ "load", "CHANGELOG.html", "x.com", "twitter.com", "/v/", "hub.docker.com" ] skipPatterns = [ ".rss", ".gif", ".jpg" ] checkExternal = true diff --git a/package-lock.json b/package-lock.json index 1dc9254..3f2e92e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@lando/apache", - "version": "1.2.0", + "version": "1.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@lando/apache", - "version": "1.1.3", + "version": "1.3.0", "license": "MIT", "dependencies": { "lodash": "^4.17.21" @@ -14,7 +14,7 @@ "devDependencies": { "@babel/eslint-parser": "^7.16.0", "@lando/leia": "^1.0.0-beta.3", - "@lando/vitepress-theme-default-plus": "^1.1.1", + "@lando/vitepress-theme-default-plus": "^1.1.5", "chai": "^4.3.4", "command-line-test": "^1.0.10", "eslint": "^7.32.0", @@ -1322,12 +1322,12 @@ } }, "node_modules/@lando/argv": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@lando/argv/-/argv-1.1.2.tgz", - "integrity": "sha512-b3d4zF1QBrFgUCFxEb48b0hse98wRhfnnydFsKXTcQc4aogfCBZc9wbgktLrs6TUtLKvU57YtlfNU4ack1ll7w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lando/argv/-/argv-1.2.0.tgz", + "integrity": "sha512-Usr0FuXfzDezQG7ZSuaaMNoF9v/YsavgnclQqTBzV48oku/vi9fiKttlaSoXOQ1UPrC1KPC/ean1ZrDnZqcosw==", "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@lando/chai": { @@ -1350,9 +1350,9 @@ } }, "node_modules/@lando/leia": { - "version": "1.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@lando/leia/-/leia-1.0.0-beta.3.tgz", - "integrity": "sha512-JW8so42+UcDHzNg1LHb7wta13NRAEd4ammKNaPSJVd5qZ4tu4aVk8aUi1wmUONamZlLEsB8/oy7eBFzbHjumvw==", + "version": "1.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@lando/leia/-/leia-1.0.0-beta.4.tgz", + "integrity": "sha512-mJ6ZR8KuB8HmsThV2A0VfRhinJ517TmRR6kw8hux/O0zCwyd7peFK/8ASkkahC2Pni1CwDIApVu1q7d/LX68Fg==", "dev": true, "dependencies": { "@lando/argv": "^1.0.6", @@ -1451,11 +1451,11 @@ } }, "node_modules/@lando/vitepress-theme-default-plus": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lando/vitepress-theme-default-plus/-/vitepress-theme-default-plus-1.1.1.tgz", - "integrity": "sha512-DcwDvsUHJ8n9ofKRgclbkEXGl5DglzUSQdXNEY1MvoSMKGDTP/iZUXR5acZk6gsOmaUyQ3/vBRrIjXUvCsC1vQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@lando/vitepress-theme-default-plus/-/vitepress-theme-default-plus-1.1.5.tgz", + "integrity": "sha512-a54uTRfiKwOXTJ4Gm6xhnMKRg0lpZ/CosDIfh1jksw5fg/VELpmPKhbC6A0i8OgoNO27hXIe5EOby2sZWshKjg==", "dev": true, - "license": "GPL-3.0", + "license": "MIT", "dependencies": { "@docsearch/js": "^3.5.2", "axios": "^1.7.7", @@ -5728,14 +5728,14 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "dev": true }, "node_modules/lodash.flattendeep": { @@ -5945,9 +5945,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "dev": true, "dependencies": { "@types/hast": "^3.0.0", @@ -8106,9 +8106,9 @@ } }, "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "dependencies": { "esbuild": "^0.21.3", @@ -9403,9 +9403,9 @@ } }, "@lando/argv": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@lando/argv/-/argv-1.1.2.tgz", - "integrity": "sha512-b3d4zF1QBrFgUCFxEb48b0hse98wRhfnnydFsKXTcQc4aogfCBZc9wbgktLrs6TUtLKvU57YtlfNU4ack1ll7w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lando/argv/-/argv-1.2.0.tgz", + "integrity": "sha512-Usr0FuXfzDezQG7ZSuaaMNoF9v/YsavgnclQqTBzV48oku/vi9fiKttlaSoXOQ1UPrC1KPC/ean1ZrDnZqcosw==", "dev": true }, "@lando/chai": { @@ -9424,9 +9424,9 @@ } }, "@lando/leia": { - "version": "1.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@lando/leia/-/leia-1.0.0-beta.3.tgz", - "integrity": "sha512-JW8so42+UcDHzNg1LHb7wta13NRAEd4ammKNaPSJVd5qZ4tu4aVk8aUi1wmUONamZlLEsB8/oy7eBFzbHjumvw==", + "version": "1.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@lando/leia/-/leia-1.0.0-beta.4.tgz", + "integrity": "sha512-mJ6ZR8KuB8HmsThV2A0VfRhinJ517TmRR6kw8hux/O0zCwyd7peFK/8ASkkahC2Pni1CwDIApVu1q7d/LX68Fg==", "dev": true, "requires": { "@lando/argv": "^1.0.6", @@ -9502,9 +9502,9 @@ } }, "@lando/vitepress-theme-default-plus": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lando/vitepress-theme-default-plus/-/vitepress-theme-default-plus-1.1.1.tgz", - "integrity": "sha512-DcwDvsUHJ8n9ofKRgclbkEXGl5DglzUSQdXNEY1MvoSMKGDTP/iZUXR5acZk6gsOmaUyQ3/vBRrIjXUvCsC1vQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@lando/vitepress-theme-default-plus/-/vitepress-theme-default-plus-1.1.5.tgz", + "integrity": "sha512-a54uTRfiKwOXTJ4Gm6xhnMKRg0lpZ/CosDIfh1jksw5fg/VELpmPKhbC6A0i8OgoNO27hXIe5EOby2sZWshKjg==", "dev": true, "requires": { "@docsearch/js": "^3.5.2", @@ -12604,14 +12604,14 @@ } }, "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "dev": true }, "lodash.flattendeep": { @@ -12769,9 +12769,9 @@ } }, "mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "dev": true, "requires": { "@types/hast": "^3.0.0", @@ -14324,9 +14324,9 @@ } }, "vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "requires": { "esbuild": "^0.21.3", diff --git a/package.json b/package.json index 33c57bd..3befa0f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@lando/apache", "description": "A Lando plugin that provides a tight integration with Apache.", - "version": "1.2.0", + "version": "1.3.0", "author": "Mike Pirog @pirog", "license": "MIT", "repository": "lando/apache", @@ -48,7 +48,7 @@ "devDependencies": { "@babel/eslint-parser": "^7.16.0", "@lando/leia": "^1.0.0-beta.3", - "@lando/vitepress-theme-default-plus": "^1.1.1", + "@lando/vitepress-theme-default-plus": "^1.1.5", "chai": "^4.3.4", "command-line-test": "^1.0.10", "eslint": "^7.32.0",