Latest Releases

These releases come straight from our repositories. Latest releases may not be published yet.

swissup / shopify-relax

2.17.0 Sep

breezefront / module-breeze-ai

1.8.7 Sep

swissup / module-firecheckout-integrations

1.4.11 Sep

breezefront / module-breeze-content-builder

1.2.3 Sep

swissup / module-ajaxlayerednavigation

1.6.10 Sep

swissup / firecheckout

1.36.0 Sep
  • 1.36.0

    Report (rev.1)

    Package was generated and uploaded to GitHub on with the following dependencies:

    swissup/module-address-autocomplete:1.8.4

    swissup/module-address-field-manager:1.6.21

    swissup/module-address-validation:1.0.4

    swissup/module-bot-protection:1.0.2

    swissup/module-checkout-cart:1.5.10

    swissup/module-checkout-consumer-rights:1.1.0

    swissup/module-checkout-fields:1.6.17

    swissup/module-checkout-registration:1.2.3

    swissup/module-checkout-success:2.0.12

    swissup/module-customer-field-manager:1.2.11

    swissup/module-delivery-date:1.9.0

    swissup/module-firecheckout:1.36.0

    swissup/module-geoip:1.6.2

    swissup/module-orderattachment:1.5.3

    swissup/module-subscribe-at-checkout:1.3.6

    swissup/module-taxvat:1.4.9

    swissup/module-checkout:1.5.4

    swissup/module-core:1.13.1

    swissup/module-field-manager:1.3.7

    swissup/module-firecheckout-integrations:1.4.10

    Changelog (autogenerated)

    swissup/module-address-autocomplete — 1.8.4 (was 1.8.3)
    • Version 1.8.4 d5c54d

    • Fixed proper city detection for some addresses

      ```
      Not Working: Via Spinazzola, 24, Rovolon, PD, Italia
      Working: Via Spinazzola, 24, Roma
      ```

      https://developers.google.com/maps/documentation/places/web-service/legacy/supported_types:

      ```
      The (cities) type collection instructs the Places service to return results that match locality or administrative_area_level_3.
      ``` 7578e9

    swissup/module-checkout-consumer-rights — 1.1.0 (was 1.0.0)
    • Version 1.1.0 02da05

    • Allow to withdraw order from customer account page 58b399

    • Better naming for emails templates 009a6e

    • Feature: send notification email to customer 816777

    • Add order Grid items variable 3f1522

    • Order items block expects DB order_id b64f33

    • Fixed not working custom template 6f1f41

    • Version 1.0.2 0c6a57

    • Add translation to 'Read your legal guarantee rights' phrase af71dd

    • Version 1.0.1 61551f

    • Added missing Breeze integration e2467d

    swissup/module-checkout-fields — 1.6.17 (was 1.6.16)
    • Version 1.6.17 61f0d4

    • Fixed double-escape in email template c41827

    • Mage-OS 3.5.0 compatibility: moved block used in email from Adminhtml f636e5

    swissup/module-checkout-success — 2.0.12 (was 2.0.11)
    swissup/module-delivery-date — 1.9.0 (was 1.8.1)
    • Version 1.9.0 1ed62b

    • Delivery date on PaypalExpress checkout review page #17 d2f2eb

    swissup/module-firecheckout — 1.36.0 (was 1.35.0)
    • Version 1.36.0 c6b511

    • Fix readonly env: deploy jsbuild during static content deployment f29be0

    • Fix "Maximum call stack size exceeded" in jsbuild

      mage/requirejs/static.js patches the global require.load and parks the
      previous function on require._load. That patch is not idempotent, and its
      modules are reachable two ways on a FireCheckout page: as the plain
      <script> we inject after require.js, and via the bundles entry below.
      requirejs keeps `defined` per context, so with a second context on the
      page (e.g. "$" next to "_") the jsbuild factory runs twice: require._load
      then holds the first wrapper, whose own fallback is itself, and
      require.load recurses forever. Symptoms are the RangeError plus
      "Load timeout for modules: mage/requirejs/text".

      Pin require._load to the real loader before static.js can install the
      wrapper, so any number of jsbuild evaluations stay harmless.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> bed9ef

    • Replace curl-powered deployment with Asset\Publisher
      This commit should improve speed of jsbuild in development mode a13472

    • Replace curl-powered deployment with Asset\Publisher
      This commit should improve speed of jsbuild in development mode 46c4d4

    swissup/module-core — 1.13.1 (was 1.12.27)
    • Version 1.13.1 5b7b24

    • Fixed invisible update instructions when Mollie Payments is installed 72aab6

    • Version 1.13.0 f34c7b

    • Fill the links after ajax refresh b6a316

    • Show loading state on the "Check for Updates" button 1ab16e

    • Use optimized repo to fetch latest releases 1aa8fb

    • Check theme source files in Virtual Theme Check (#19)

      Making a virtual theme physical while its source files are unavailable is
      what breaks the storefront with "Required parameter 'theme_dir' was not
      passed", so the check now reports the state of the files and the fixer
      refuses to touch the themes it cannot read.

      - Virtual Theme Check gets Path and Status columns
      - Status names the files Magento can't read. Unreadable file is never
      reported as a removed one - a failed stat cannot tell them apart
      - Fix All opens up the permissions of unreadable source files and skips
      the themes that are still unreadable, listing them in the response
      - Readability check extracted into Swissup\Core\Model\Theme\SourceFiles,
      shared by the block and the controller
      - Config table styles shared between Modules and Virtual Theme Check

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 88915a

    • Check theme source files in Virtual Theme Check (#19)

      Making a virtual theme physical while its source files are unavailable is
      what breaks the storefront with "Required parameter 'theme_dir' was not
      passed", so the check now reports the state of the files and the fixer
      refuses to touch the themes it cannot read.

      - Virtual Theme Check gets Path and Status columns
      - Status names the files Magento can't read. Unreadable file is never
      reported as a removed one - a failed stat cannot tell them apart
      - Fix All opens up the permissions of unreadable source files and skips
      the themes that are still unreadable, listing them in the response
      - Readability check extracted into Swissup\Core\Model\Theme\SourceFiles,
      shared by the block and the controller
      - Config table styles shared between Modules and Virtual Theme Check

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 6e39e2

    • Mark core section with badge when outdated modules found 9a3764

    • Outdated modules badge and Modules config group (#25) 7df026

    • MCS fix 3b9121

    • Update instructions 0e686f

    • Read links info from marketplace meta 21e95b

    • Keep the last check time when a refresh fails

      Removing the stored time was what made the next load re-check the feed.
      An unreachable feed left no time at all: the config page had nothing to
      display, and every page load kept re-checking until one request made it
      through.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 3437f9

    • Post the modules refresh to an action of its own

      The refresh drops the version check throttle and re-reads the remote
      source, and a get carries no form key validation - Magento checks it for
      post requests only, and the url secret key is optional. Reading the list
      stays a get, so the two live in separate actions now.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 4a95c9

    • Keep the module links out of the response

      The links cell is rendered by the server and never touched by js.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 7556db

    • Send only the module metadata the browser renders

      The merged Loader record carries the local filesystem path and the
      download, license and purchase-code fields of the remote feed. None of
      them is rendered by the config page, so keep them on the server.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 2bd425

    • Too much red 2e307e

    • Use the same `outdated` class name everywhere

      The version span was already renamed, while the row and the js still said
      `_outdated` - a row that stopped being outdated kept its red version pill.

      Since the row now wears the very same class, the pill rule had to be
      scoped to the version cell, or the whole row would turn red.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> c21086

    • Report the check time with the modules, and keep outdated rows first

      Two things the clients were guessing at:

      The `Check for Updates` handler stamped the label with the current time,
      but the request may have re-used the stored packages after a failed feed
      request - `just now` was not always true. And an automatic load did check
      the remote source, yet nothing updated the label at all. The endpoint now
      returns `['items' => ..., 'last_check' => ...]`, and the label follows the
      time the server reports for every load.

      The table was re-rendered cell by cell, so a module that became outdated
      kept its old position while the counter above it grew. Mark the rows and
      move the outdated ones back to the top - both groups stay sorted by name.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 70f271

    • Keep the last check time once the check is due

      The timestamp was stored with a one hour lifetime and the throttle was
      `is the entry still there?`. Handy, but it also meant the config page
      could no longer tell how old the data was as soon as the check was due -
      exactly when that is worth showing next to `Check for Updates`.

      Store it without a lifetime and compare the age instead. Same hour
      boundary, and the label now reads `Last checked 2 h ago` instead of
      disappearing.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 9e4c2a

    • Don't update the modules on refresh. Wait for isVersionCheckRequired 129e66

    • Hovered color for outdated badge 0a0016

    • Show outdated modules count in config and add Modules group

      The admin had no hint that installed Swissup modules have updates
      available - one had to open Module Manager to find out.

      Add a counter badge to the Swissup tab of the config navigation, and a
      Modules group in Swissup > Core listing every installed module with its
      installed and latest version, outdated ones first.

      Neither of them may slow down the config page, so both render from the
      data stored in var/swissup/core (Loader::setOfflineMode()), and the
      versions, the counters and the badge itself are then refreshed by a
      single ajax request shared by all the consumers. `Check for Updates`
      re-runs that request with refresh=1, which drops the version check
      throttle and re-reads the remote source.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> bf1ad6

    • Move core config to the top as it will display outdated modules 115f37

    • Added ability to immidiately re-check remote source for updates `-r` 357d33

    • Keep the remote packages data in files instead of the cache (#24) cbeecc

    • Trim the comments down to what is not in the code

      The two lock docblocks carried the same paragraph, and save() explained
      the reasoning that belongs in the commit that introduced it.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 09d6b9

    • Serialize the writes with a lock taken before the entry is opened

      openFile() truncates whatever it opens, so a lock taken afterwards keeps
      the writes apart but not the truncations. Two saves could interleave into
      one file: the second one truncates, the first one writes a whole entry,
      and the second one then overwrites its beginning - leaving the head of
      one entry on the tail of another. The length line does not catch that
      when both entries encode to the same size, as fixed width values like a
      version hash always do.

      Take the lock before opening, on a file of its own - the entry cannot be
      opened before the lock is held, and the file lock() uses is likely held
      by the caller already, which flock would deadlock against.

      Failing to open a lock file is no longer reported as a lock held by
      somebody else. A lock left behind by another user cannot be opened at
      all, and reporting that as contention kept the caller away from the
      entry for good - silently serving a list that could never be refreshed.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 73cf28

    • Don't download the list that another process has just stored

      The version is fetched before the download lock is taken, so a process
      that was still asking for it when the lock was released would go on to
      download the very list the lock holder had just stored. Look at the
      storage once more before downloading.

      Also correct what the save() lock claims to do: it serializes the
      writes, but the truncation happens in openFile(), outside of it.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> d557a0

    • Reject an entry whose expiration time is not a number

      A corrupt header such as `expires:invalid` was cast to zero, which reads
      as "never expires" - so an entry that should have gone stale could be
      served indefinitely instead of being treated as missing. Validate the
      field the same way the length line is validated.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 12db16

    • Keep the remote packages data in files instead of the cache

      The packages list was kept in the Magento cache, so every cache flush
      threw it away and the next admin request had to download it again. It is
      now stored under var/swissup/core, where it outlives the flush.

      FileStorage writes the expiration time and the data length ahead of the
      contents, so an entry knows itself when it goes stale, and a reader can
      tell a half-written entry from a complete one - openFile() truncates the
      file before the write lock is taken, so a reader can catch the entry
      mid-save. An incomplete entry is reported as missing and refetched,
      rather than served as if it were whole.

      Remote revalidates against the version hash from packages.json, at most
      once an hour, and only downloads the full list when that hash moves. The
      download itself is guarded by a non-blocking lock, so several admins
      hitting the page at once produce one request instead of one each - the
      others serve the stored copy, or wait for the download when there is
      nothing stored yet. fetch() now reports connection errors and 4xx/5xx
      responses by returning an empty body, letting the caller fall back to
      the stored data instead of decoding a failure page.

      The admin notification feed keeps its last-update timestamp in the same
      storage, replacing its own copy of the file handling.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 617dbd

    • Small fixes f7eef6

    • Single source of truth for is_outdated, is_installed 37ad01

    • Fixed `Undefined array key "type"` warning b2a9c1

    • Don't show non installed modules when asking for outdated bf5fb1

    swissup/module-firecheckout-integrations — 1.4.10 (was 1.4.8)

swissup / module-firecheckout

1.36.0 Sep

swissup / delivery-date

1.9.0 Sep
  • 1.9.0

    Report (rev.1)

    Package was generated and uploaded to GitHub on with the following dependencies:

    swissup/module-delivery-date:1.9.0

    swissup/module-checkout:1.5.4

    swissup/module-core:1.13.1

    Changelog (autogenerated)

    swissup/module-delivery-date — 1.9.0 (was 1.7.11)
    • Version 1.9.0 1ed62b

    • Delivery date on PaypalExpress checkout review page #17 d2f2eb

    • Version 1.8.1 7f2f72

    • Fixed missing holiday when offset is empty string 90c827

    • Remove private repo from readme, because users add it too 5caa73

    • Version 1.8.0 47e33b

    • Improve naming 413c70

    • Added option that allows to exclude weekends and holidays from offset
      Closes #18 850b50

    • Remove old mixin (Magento < 2.2.2) 21dca6

    • Version 1.7.12 8a52a1

    • Fixed unescaped output, closes #16 d6c289

    swissup/module-checkout — 1.5.4 (was 1.5.2)
    • Version 1.5.4 e06d43

    • checkout-consumer-rights icon 027810

    • Version 1.5.3 d22b9f

    • Breeze: update integration 880a83

    • Breeze: exclude requirejs-config files 019ad4

    • Revert "Icon for security module"

      This reverts commit 088ee1bf78be5f00695d2a469937f090d865688f. c1f27c

    • Icon for security module 088ee1

    swissup/module-core — 1.13.1 (was 1.12.22)
    • Version 1.13.1 5b7b24

    • Fixed invisible update instructions when Mollie Payments is installed 72aab6

    • Version 1.13.0 f34c7b

    • Fill the links after ajax refresh b6a316

    • Show loading state on the "Check for Updates" button 1ab16e

    • Use optimized repo to fetch latest releases 1aa8fb

    • Check theme source files in Virtual Theme Check (#19)

      Making a virtual theme physical while its source files are unavailable is
      what breaks the storefront with "Required parameter 'theme_dir' was not
      passed", so the check now reports the state of the files and the fixer
      refuses to touch the themes it cannot read.

      - Virtual Theme Check gets Path and Status columns
      - Status names the files Magento can't read. Unreadable file is never
      reported as a removed one - a failed stat cannot tell them apart
      - Fix All opens up the permissions of unreadable source files and skips
      the themes that are still unreadable, listing them in the response
      - Readability check extracted into Swissup\Core\Model\Theme\SourceFiles,
      shared by the block and the controller
      - Config table styles shared between Modules and Virtual Theme Check

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 88915a

    • Check theme source files in Virtual Theme Check (#19)

      Making a virtual theme physical while its source files are unavailable is
      what breaks the storefront with "Required parameter 'theme_dir' was not
      passed", so the check now reports the state of the files and the fixer
      refuses to touch the themes it cannot read.

      - Virtual Theme Check gets Path and Status columns
      - Status names the files Magento can't read. Unreadable file is never
      reported as a removed one - a failed stat cannot tell them apart
      - Fix All opens up the permissions of unreadable source files and skips
      the themes that are still unreadable, listing them in the response
      - Readability check extracted into Swissup\Core\Model\Theme\SourceFiles,
      shared by the block and the controller
      - Config table styles shared between Modules and Virtual Theme Check

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 6e39e2

    • Mark core section with badge when outdated modules found 9a3764

    • Outdated modules badge and Modules config group (#25) 7df026

    • MCS fix 3b9121

    • Update instructions 0e686f

    • Read links info from marketplace meta 21e95b

    • Keep the last check time when a refresh fails

      Removing the stored time was what made the next load re-check the feed.
      An unreachable feed left no time at all: the config page had nothing to
      display, and every page load kept re-checking until one request made it
      through.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 3437f9

    • Post the modules refresh to an action of its own

      The refresh drops the version check throttle and re-reads the remote
      source, and a get carries no form key validation - Magento checks it for
      post requests only, and the url secret key is optional. Reading the list
      stays a get, so the two live in separate actions now.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 4a95c9

    • Keep the module links out of the response

      The links cell is rendered by the server and never touched by js.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 7556db

    • Send only the module metadata the browser renders

      The merged Loader record carries the local filesystem path and the
      download, license and purchase-code fields of the remote feed. None of
      them is rendered by the config page, so keep them on the server.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 2bd425

    • Too much red 2e307e

    • Use the same `outdated` class name everywhere

      The version span was already renamed, while the row and the js still said
      `_outdated` - a row that stopped being outdated kept its red version pill.

      Since the row now wears the very same class, the pill rule had to be
      scoped to the version cell, or the whole row would turn red.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> c21086

    • Report the check time with the modules, and keep outdated rows first

      Two things the clients were guessing at:

      The `Check for Updates` handler stamped the label with the current time,
      but the request may have re-used the stored packages after a failed feed
      request - `just now` was not always true. And an automatic load did check
      the remote source, yet nothing updated the label at all. The endpoint now
      returns `['items' => ..., 'last_check' => ...]`, and the label follows the
      time the server reports for every load.

      The table was re-rendered cell by cell, so a module that became outdated
      kept its old position while the counter above it grew. Mark the rows and
      move the outdated ones back to the top - both groups stay sorted by name.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 70f271

    • Keep the last check time once the check is due

      The timestamp was stored with a one hour lifetime and the throttle was
      `is the entry still there?`. Handy, but it also meant the config page
      could no longer tell how old the data was as soon as the check was due -
      exactly when that is worth showing next to `Check for Updates`.

      Store it without a lifetime and compare the age instead. Same hour
      boundary, and the label now reads `Last checked 2 h ago` instead of
      disappearing.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 9e4c2a

    • Don't update the modules on refresh. Wait for isVersionCheckRequired 129e66

    • Hovered color for outdated badge 0a0016

    • Show outdated modules count in config and add Modules group

      The admin had no hint that installed Swissup modules have updates
      available - one had to open Module Manager to find out.

      Add a counter badge to the Swissup tab of the config navigation, and a
      Modules group in Swissup > Core listing every installed module with its
      installed and latest version, outdated ones first.

      Neither of them may slow down the config page, so both render from the
      data stored in var/swissup/core (Loader::setOfflineMode()), and the
      versions, the counters and the badge itself are then refreshed by a
      single ajax request shared by all the consumers. `Check for Updates`
      re-runs that request with refresh=1, which drops the version check
      throttle and re-reads the remote source.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> bf1ad6

    • Move core config to the top as it will display outdated modules 115f37

    • Added ability to immidiately re-check remote source for updates `-r` 357d33

    • Keep the remote packages data in files instead of the cache (#24) cbeecc

    • Trim the comments down to what is not in the code

      The two lock docblocks carried the same paragraph, and save() explained
      the reasoning that belongs in the commit that introduced it.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 09d6b9

    • Serialize the writes with a lock taken before the entry is opened

      openFile() truncates whatever it opens, so a lock taken afterwards keeps
      the writes apart but not the truncations. Two saves could interleave into
      one file: the second one truncates, the first one writes a whole entry,
      and the second one then overwrites its beginning - leaving the head of
      one entry on the tail of another. The length line does not catch that
      when both entries encode to the same size, as fixed width values like a
      version hash always do.

      Take the lock before opening, on a file of its own - the entry cannot be
      opened before the lock is held, and the file lock() uses is likely held
      by the caller already, which flock would deadlock against.

      Failing to open a lock file is no longer reported as a lock held by
      somebody else. A lock left behind by another user cannot be opened at
      all, and reporting that as contention kept the caller away from the
      entry for good - silently serving a list that could never be refreshed.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 73cf28

    • Don't download the list that another process has just stored

      The version is fetched before the download lock is taken, so a process
      that was still asking for it when the lock was released would go on to
      download the very list the lock holder had just stored. Look at the
      storage once more before downloading.

      Also correct what the save() lock claims to do: it serializes the
      writes, but the truncation happens in openFile(), outside of it.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> d557a0

    • Reject an entry whose expiration time is not a number

      A corrupt header such as `expires:invalid` was cast to zero, which reads
      as "never expires" - so an entry that should have gone stale could be
      served indefinitely instead of being treated as missing. Validate the
      field the same way the length line is validated.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 12db16

    • Keep the remote packages data in files instead of the cache

      The packages list was kept in the Magento cache, so every cache flush
      threw it away and the next admin request had to download it again. It is
      now stored under var/swissup/core, where it outlives the flush.

      FileStorage writes the expiration time and the data length ahead of the
      contents, so an entry knows itself when it goes stale, and a reader can
      tell a half-written entry from a complete one - openFile() truncates the
      file before the write lock is taken, so a reader can catch the entry
      mid-save. An incomplete entry is reported as missing and refetched,
      rather than served as if it were whole.

      Remote revalidates against the version hash from packages.json, at most
      once an hour, and only downloads the full list when that hash moves. The
      download itself is guarded by a non-blocking lock, so several admins
      hitting the page at once produce one request instead of one each - the
      others serve the stored copy, or wait for the download when there is
      nothing stored yet. fetch() now reports connection errors and 4xx/5xx
      responses by returning an empty body, letting the caller fall back to
      the stored data instead of decoding a failure page.

      The admin notification feed keeps its last-update timestamp in the same
      storage, replacing its own copy of the file handling.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 617dbd

    • Small fixes f7eef6

    • Single source of truth for is_outdated, is_installed 37ad01

    • Fixed `Undefined array key "type"` warning b2a9c1

    • Don't show non installed modules when asking for outdated bf5fb1

    • Version 1.12.27 ac70c7

    • Magento 2.4.9 fix (CLI execute command) d224be

    • Prevent news retrieval after each cache flush ac96b7

    • Version 1.12.26 74dff6

    • Improve the libxml fix to include `data-post` and `data-config` attrs 3fee5e

    • Version 1.12.25 2186f6

    • Fixed broken markup when using newer libxml version (2.15.1) (#23) 61ceab

    • Use same quotes c33f29

    • Update Plugin/FixHtmlMarkup.php

      Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> e056e2

    • Fixed broken markup when using newer libxml version (2.15.1) 7ff0db

    • Version 1.12.24 4ac8cb

    • Fixed unescaped output, closes #22 67c9f1

    • Version 1.12.23 13d1c7

    • Fixed integrity constraint violation: Duplicate entry for key primary b9d95d