diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 460e7e6d..551e4d25 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -3,52 +3,34 @@ name: Publish on: release: types: [published] + # Manual re-run from the default branch, e.g. when a release publish failed. + workflow_dispatch: jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [20.x] - - steps: - - uses: actions/checkout@v1 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: Build and Test - run: | - npm install - npm run pack - cd test-app - npm install - npm install ../dist/imagekit-angular/imagekit-angular-*.tgz --no-save - npx playwright install --with-deps - npm run test:e2e - env: - CI: true - - publish: - needs: build runs-on: ubuntu-latest + permissions: + contents: read + id-token: write steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v4 + - name: Use Node.js 24.x + uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 24.x registry-url: https://registry.npmjs.org/ + - name: Upgrade npm for OIDC trusted publishing + # Trusted publishing needs npm >= 11.5.1. Pin the 11 line: npm@latest + # is now 12.x, which refuses to install on older Node runners. + run: | + npm install -g npm@11 + npm --version - name: NPM Publish run: | npm install npm run build cd dist/imagekit-angular - npm config set //registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN - # print the NPM user name for validation - npm whoami - VERSION=$(node -p "require('./package.json').version" ) + VERSION=$(node -p "require('./package.json').version") # Only publish stable versions to the latest tag if [[ "$VERSION" =~ ^[^-]+$ ]]; then NPM_TAG="latest" @@ -56,7 +38,6 @@ jobs: NPM_TAG="beta" fi echo "Publishing $VERSION with $NPM_TAG tag." - npm publish --tag $NPM_TAG --access public + npm publish --tag $NPM_TAG --provenance --access public env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} CI: true diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..ca62fc8d --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,22 @@ +name: Release Please +on: + push: + branches: + - master + # Manual trigger, e.g. when GitHub drops the push event for a merge. + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + if: github.repository == 'imagekit-developer/imagekit-angular' + runs-on: ubuntu-latest + + steps: + - uses: googleapis/release-please-action@5c625bfb5d1ff62eadeeb3772007f7f66fdcf071 # v4.4.1 + id: release + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} diff --git a/.github/workflows/sync-release-as.yml b/.github/workflows/sync-release-as.yml new file mode 100644 index 00000000..31620ede --- /dev/null +++ b/.github/workflows/sync-release-as.yml @@ -0,0 +1,63 @@ +name: Sync Release-As from release PR title + +on: + pull_request: + types: [edited] + +permissions: + contents: write + +jobs: + sync: + if: >- + github.event.pull_request.base.ref == 'master' && + startsWith(github.event.pull_request.head.ref, 'release-please--') && + github.event.changes.title != null + runs-on: ubuntu-latest + steps: + - name: Extract versions from old and new title + id: parse + env: + NEW_TITLE: ${{ github.event.pull_request.title }} + OLD_TITLE: ${{ github.event.changes.title.from }} + run: | + # Anchored on pull-request-title-pattern "release: ${version}" from release-please-config.json. + extract() { + echo "$1" | grep -oE '^release:[[:space:]]+v?[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?' \ + | sed -E 's/^release:[[:space:]]+v?//' + } + NEW_VERSION=$(extract "$NEW_TITLE") + OLD_VERSION=$(extract "$OLD_TITLE") + echo "old=$OLD_VERSION" + echo "new=$NEW_VERSION" + if [ -z "$NEW_VERSION" ]; then + echo "::notice::No semver in new title; nothing to do." + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + if [ "$NEW_VERSION" = "$OLD_VERSION" ]; then + echo "::notice::Version unchanged ($NEW_VERSION); not pushing." + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "version=$NEW_VERSION" >> "$GITHUB_OUTPUT" + + - name: Check out main + if: steps.parse.outputs.skip != 'true' + uses: actions/checkout@v6 + with: + ref: master + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + fetch-depth: 1 + + - name: Push empty Release-As commit + if: steps.parse.outputs.skip != 'true' + env: + VERSION: ${{ steps.parse.outputs.version }} + run: | + git config user.name "release-as-bot" + git config user.email "release-as-bot@users.noreply.github.com" + git commit --allow-empty -m "chore: pin next release + + Release-As: ${VERSION}" + git push origin master diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..a3a12f49 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "6.0.0" +} diff --git a/CHANGELOG.md b/CHANGELOG.md index cc478cc0..84f7f577 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +# Changelog + ## 6.0.0 This is a major release that includes breaking changes. Please refer to the [official documentation](https://imagekit.io/docs/integration/angular) for up-to-date usage instructions. diff --git a/package-lock.json b/package-lock.json index 1fe8973e..7a788105 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "imagekit-angular-workspace", - "version": "0.0.0", + "version": "6.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "imagekit-angular-workspace", - "version": "0.0.0", + "version": "6.0.0", "dependencies": { "@angular/common": "^15.0.0", "@angular/core": "^15.0.0", "@angular/platform-browser": "^15.0.0", - "@imagekit/javascript": "^5.1.0" + "@imagekit/javascript": "^5.5.0" }, "devDependencies": { "@angular-devkit/build-angular": "^15.0.0", @@ -2852,10 +2852,10 @@ "license": "MIT" }, "node_modules/@imagekit/javascript": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@imagekit/javascript/-/javascript-5.1.0.tgz", - "integrity": "sha512-P12NaxlO6Qu4GROFagX9qgP5kKde236mCu5jJB1cWJ6mPaVdjyk0Mw3ciGIWdKXST/jP1cFqS2ZoBVRSq1SWow==", - "license": "MIT" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@imagekit/javascript/-/javascript-5.5.0.tgz", + "integrity": "sha512-eu2lLzSwTj4awP6CeB8NUHnKz+GZk4og3ztZsb7MDjoy1NcfCVqB1gBxH8Q9xzCkBrP50SvGuSrK/ZGNzrXXDA==", + "license": "Apache-2.0" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", diff --git a/package.json b/package.json index 9946b9f5..349c4d69 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "imagekit-angular-workspace", - "version": "0.0.0", + "version": "6.0.0", "engines": { "node": ">=18.0.0" }, @@ -23,7 +23,7 @@ "@angular/common": "^15.0.0", "@angular/core": "^15.0.0", "@angular/platform-browser": "^15.0.0", - "@imagekit/javascript": "^5.1.0" + "@imagekit/javascript": "^5.5.0" }, "devDependencies": { "@angular-devkit/build-angular": "^15.0.0", diff --git a/projects/imagekit-angular/package.json b/projects/imagekit-angular/package.json index a9fe5d2b..db7eccba 100644 --- a/projects/imagekit-angular/package.json +++ b/projects/imagekit-angular/package.json @@ -22,7 +22,7 @@ "@angular/core": ">=14.0.0 <22.0.0" }, "dependencies": { - "@imagekit/javascript": "^5.1.0", + "@imagekit/javascript": "^5.5.0", "tslib": "^2.3.0" } } diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 00000000..73036207 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,70 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "packages": { + ".": { + "release-type": "node", + "package-name": "@imagekit/angular", + "extra-files": [ + { + "type": "json", + "path": "projects/imagekit-angular/package.json", + "jsonpath": "$.version" + } + ] + } + }, + "include-v-in-tag": false, + "include-component-in-tag": false, + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "pull-request-header": "Automated Release PR", + "pull-request-title-pattern": "release: ${version}", + "changelog-sections": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "perf", + "section": "Performance Improvements" + }, + { + "type": "revert", + "section": "Reverts" + }, + { + "type": "chore", + "section": "Chores" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "style", + "section": "Styles" + }, + { + "type": "refactor", + "section": "Refactors" + }, + { + "type": "test", + "section": "Tests", + "hidden": true + }, + { + "type": "build", + "section": "Build System" + }, + { + "type": "ci", + "section": "Continuous Integration", + "hidden": true + } + ] +} diff --git a/test-app/e2e/csr.spec.ts b/test-app/e2e/csr.spec.ts index 4bcf1baf..f45b5550 100644 --- a/test-app/e2e/csr.spec.ts +++ b/test-app/e2e/csr.spec.ts @@ -18,6 +18,10 @@ test("CSR test case", async ({ page }) => { // Grab the entire HTML from the element const outputHtml = await outputElement.evaluate(el => el.outerHTML); + // Angular stamps its exact version on the root element; normalize it so the + // snapshot doesn't break on every Angular patch release. + const normalizedHtml = outputHtml.replace(/ng-version="[^"]*"/g, 'ng-version="x.y.z"'); + // Compare against a stored snapshot - expect(outputHtml).toMatchSnapshot(); + expect(normalizedHtml).toMatchSnapshot(); }); \ No newline at end of file diff --git a/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-chromium.txt b/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-chromium.txt index 2a54d49e..28b8c914 100644 --- a/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-chromium.txt +++ b/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-chromium.txt @@ -1 +1 @@ -

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file +

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file diff --git a/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-mobile-chrome.txt b/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-mobile-chrome.txt index 2a54d49e..28b8c914 100644 --- a/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-mobile-chrome.txt +++ b/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-mobile-chrome.txt @@ -1 +1 @@ -

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file +

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file diff --git a/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-mobile-safari.txt b/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-mobile-safari.txt index 2a54d49e..28b8c914 100644 --- a/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-mobile-safari.txt +++ b/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-mobile-safari.txt @@ -1 +1 @@ -

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file +

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file diff --git a/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-webkit.txt b/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-webkit.txt index 2a54d49e..28b8c914 100644 --- a/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-webkit.txt +++ b/test-app/e2e/csr.spec.ts-snapshots/CSR-test-case-1-webkit.txt @@ -1 +1 @@ -

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file +

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file diff --git a/test-app/e2e/ssr.spec.ts b/test-app/e2e/ssr.spec.ts index 697a3c0a..3ffe6054 100644 --- a/test-app/e2e/ssr.spec.ts +++ b/test-app/e2e/ssr.spec.ts @@ -17,6 +17,10 @@ test("SSR test case", async ({ page }) => { // Grab the entire HTML from the element const outputHtml = await outputElement.evaluate(el => el.outerHTML); + // Angular stamps its exact version on the root element; normalize it so the + // snapshot doesn't break on every Angular patch release. + const normalizedHtml = outputHtml.replace(/ng-version="[^"]*"/g, 'ng-version="x.y.z"'); + // Compare against a stored snapshot - expect(outputHtml).toMatchSnapshot(); + expect(normalizedHtml).toMatchSnapshot(); }); diff --git a/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-chromium.txt b/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-chromium.txt index 494fb1e6..db3d39fa 100644 --- a/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-chromium.txt +++ b/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-chromium.txt @@ -1 +1 @@ -

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file +

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file diff --git a/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-mobile-chrome.txt b/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-mobile-chrome.txt index 494fb1e6..db3d39fa 100644 --- a/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-mobile-chrome.txt +++ b/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-mobile-chrome.txt @@ -1 +1 @@ -

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file +

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file diff --git a/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-mobile-safari.txt b/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-mobile-safari.txt index 494fb1e6..db3d39fa 100644 --- a/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-mobile-safari.txt +++ b/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-mobile-safari.txt @@ -1 +1 @@ -

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file +

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file diff --git a/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-webkit.txt b/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-webkit.txt index 494fb1e6..db3d39fa 100644 --- a/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-webkit.txt +++ b/test-app/e2e/ssr.spec.ts-snapshots/SSR-test-case-1-webkit.txt @@ -1 +1 @@ -

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file +

Directive

IKImageDirective

Image without ImageKit providerImage with ImageKit providerImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

IKVideoDirective

\ No newline at end of file