Skip to content

fix(component): drop view from mixin attribute to load on Lucee 7#2

Merged
bpamiri merged 1 commit intomainfrom
peter/fix-lucee7-mixin-attribute
Apr 29, 2026
Merged

fix(component): drop view from mixin attribute to load on Lucee 7#2
bpamiri merged 1 commit intomainfrom
peter/fix-lucee7-mixin-attribute

Conversation

@bpamiri
Copy link
Copy Markdown
Contributor

@bpamiri bpamiri commented Apr 29, 2026

Summary

Same fix as wheels-dev/wheels-basecoat#2. The component declaration

component mixin="controller,view" output="false" {

asks Lucee 7 to load view.cfc as a trait via native mixin composition. There is no view.cfc on the component path → whole component fails to compile → wheels-hotwire silently fails to activate on Lucee 7.

No Turbo Drive, no Turbo Frames, no Turbo Streams, no Stimulus controllers. Package shows up in application.wheels.failedPackages rather than application.wheels.mixins.

Fix

- component mixin="controller,view" output="false" {
+ component mixin="controller" output="false" {

package.json's provides.mixins: "controller" field is the framework's actual source of truth for PackageLoader. The component-level attribute is a historical convention now obsolete on Lucee 7.

Verification

End-to-end on a fresh VM running wheels 4.0.0-SNAPSHOT+1644 with framework PRs #2373 + #2374 patched in. Same shape of test as wheels-basecoat#2 — uiButton-style helpers activate after this fix; nothing activates before.

Cross-engine

Lucee 5/6 don't enforce native mixin composition the same way, which is why this went undetected until Lucee 7 became the default in Wheels 4.0. The fix is backward-compatible across all Lucee versions, Adobe CF, and BoxLang.

Related

This is part of a coordinated fix chain bringing the Wheels package system end-to-end functional on Lucee 7:

Same fix as wheels-dev/wheels-basecoat#2 — the component declaration

    component mixin="controller,view" output="false"

asks Lucee 7 to load `view.cfc` as a trait via native mixin
composition. There is no `view.cfc` on the component path (Wheels has
no `view` mixin target — view helpers go into `controller` mixins
because views render in the controller's variables scope). The missing
trait makes the whole component fail to compile, with a misleading
"can't find component [vendor.wheels-hotwire.Hotwire]" error that
points at the outer component rather than the unresolved trait.

Net effect: wheels-hotwire silently fails to activate on Lucee 7. No
Turbo Drive, no Turbo Frames, no Turbo Streams, no Stimulus controllers.
Package shows up in `application.wheels.failedPackages`.

Fix: drop `view` from the mixin attribute. `package.json`'s
`provides.mixins: "controller"` field is the actual source of truth for
the framework's PackageLoader. The component-level attribute is a
historical convention now obsolete on Lucee 7.

Lucee 5/6 don't enforce native mixin composition the same way, which
is why this went undetected until Lucee 7 became the default in
Wheels 4.0.

Pairs with wheels-dev/wheels#2368 + #2373 + #2374 (framework-side
fixes that get the install path working) and wheels-dev/wheels-basecoat#2
(same fix in the basecoat package).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bpamiri bpamiri merged commit 3275a60 into main Apr 29, 2026
@bpamiri bpamiri deleted the peter/fix-lucee7-mixin-attribute branch April 29, 2026 20:44
bpamiri added a commit to wheels-dev/wheels that referenced this pull request Apr 29, 2026
Adds 08-bonus-basecoat.mdx, a 30-minute optional follow-up to Part 7
that walks through installing the wheels-basecoat package and
rewriting the post show view using uiCard, uiField, and uiButton
helpers. Lands the Wheels package system as a teachable end-to-end
flow rather than a chapter-3 conceptual aside.

Chapter shape follows the existing tutorial conventions:

  - "Where we left off" recap so readers can resume from a clean
    Part-7 state.
  - "Why basecoat over simple.css" frames the choice as a tradeoff,
    not a recommendation. Tutorial readers stay on simple.css; the
    chapter is for when you've finished the tutorial and want a real
    component kit.
  - Steps blocks for install, CSS asset serving, layout wiring, and
    view rewrite.
  - Checkpoint with three concrete `curl | grep` verifications a
    reader can run themselves.
  - Troubleshooting with four real failure modes I hit during
    end-to-end verification on a fresh VM, including the version-
    detection edge case (`No version of 'wheels-basecoat' satisfies
    runtime '0.0.0-dev'`) tied to PR #2373.

The install path uses `wheels packages add wheels-basecoat` (the
canonical verb after PR #2374), not `install`. The chapter explicitly
calls out the LuCLI interception with a caution Aside so readers
who reach for the historic verb get an immediate explanation.

Adjusts:
  - tutorial/index.mdx — adds the bonus chapter as a row in the
    parts table and as a card in the "Ready to start" CardGrid.
  - 01-hello-wheels.mdx — the existing "On styling" Aside now links
    to the bonus chapter for upgrade-path readers (was a bare GitHub
    repo link).
  - 07-testing-deploying.mdx — adds the bonus chapter as the
    first card in "What to read next" (recommended next step
    immediately after finishing the main tutorial).

Prerequisites for the chapter to actually work end-to-end:

  - PR #2368: BuildInfo.isDev() self-substituting sentinel fix
    (merged) — needed for runtime version reporting.
  - PR #2373: $detectRuntime fix (merged) — CLI knows its runtime
    version.
  - PR #2374: `wheels packages install` → `add` rename (merged) —
    canonical install command works.
  - wheels-dev/wheels-basecoat#2: drop `view` from the mixin
    component attribute (open) — required for Lucee 7 helper
    activation. Tutorial reader's experience depends on basecoat
    1.0.2 (or whatever ships this fix) being current in the
    registry.
  - wheels-dev/wheels-hotwire#2: same fix on the hotwire side.

Verified end-to-end on a fresh VM: with all five fixes in place,
`wheels packages add wheels-basecoat` followed by a full server
restart produces working `#uiButton(...)#`, `#uiCard(...)#`,
`#uiField(...)#` calls in views. The rendered HTML is shadcn/ui-
quality output.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bpamiri added a commit that referenced this pull request Apr 29, 2026
- Bump package.json version (1.0.1 → 1.0.2)
- Bump box.json version (1.0.0 → 1.0.2; was lagging)
- Add 1.0.2 CHANGELOG entry covering the Lucee 7 mixin attribute fix
  shipped in #2

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bpamiri added a commit to wheels-dev/wheels-packages that referenced this pull request Apr 29, 2026
Both packages ship the same fix: drop `view` from the component-level
`mixin` attribute on their entry CFCs. The previous

    component mixin="controller,view" output="false"

asks Lucee 7 to load `view.cfc` as a trait via native mixin
composition. There is no `view.cfc` on the path, so the entry
component fails to compile and the package silently fails to activate.

After this fix:

  - wheels-basecoat 1.0.2: helpers like #uiButton(...)#, #uiCard(...)#,
    #uiField(...)# render correctly on Lucee 7.
  - wheels-hotwire 1.0.2: Turbo Drive, Turbo Frames, Turbo Streams,
    and Stimulus helpers all activate correctly on Lucee 7.

Lucee 5/6 don't enforce native mixin composition the same way, which
is why this went undetected until Wheels 4.0 made Lucee 7 the default.

This PR registers each version in the registry with `tarball: null`
and `sha256: null`. The `mirror-tarball` workflow will fill both in
on merge by cloning the tagged source, building a deterministic
tarball, uploading it as a release asset on this registry, and
committing the URL + sha back into the manifest.

Source PRs:
  - wheels-dev/wheels-basecoat#2 (merged)
  - wheels-dev/wheels-hotwire#2 (merged)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bpamiri added a commit to wheels-dev/wheels that referenced this pull request Apr 29, 2026
Adds 08-bonus-basecoat.mdx, a 30-minute optional follow-up to Part 7
that walks through installing the wheels-basecoat package and
rewriting the post show view using uiCard, uiField, and uiButton
helpers. Lands the Wheels package system as a teachable end-to-end
flow rather than a chapter-3 conceptual aside.

Chapter shape follows the existing tutorial conventions:

  - "Where we left off" recap so readers can resume from a clean
    Part-7 state.
  - "Why basecoat over simple.css" frames the choice as a tradeoff,
    not a recommendation. Tutorial readers stay on simple.css; the
    chapter is for when you've finished the tutorial and want a real
    component kit.
  - Steps blocks for install, CSS asset serving, layout wiring, and
    view rewrite.
  - Checkpoint with three concrete `curl | grep` verifications a
    reader can run themselves.
  - Troubleshooting with four real failure modes I hit during
    end-to-end verification on a fresh VM, including the version-
    detection edge case (`No version of 'wheels-basecoat' satisfies
    runtime '0.0.0-dev'`) tied to PR #2373.

The install path uses `wheels packages add wheels-basecoat` (the
canonical verb after PR #2374), not `install`. The chapter explicitly
calls out the LuCLI interception with a caution Aside so readers
who reach for the historic verb get an immediate explanation.

Adjusts:
  - tutorial/index.mdx — adds the bonus chapter as a row in the
    parts table and as a card in the "Ready to start" CardGrid.
  - 01-hello-wheels.mdx — the existing "On styling" Aside now links
    to the bonus chapter for upgrade-path readers (was a bare GitHub
    repo link).
  - 07-testing-deploying.mdx — adds the bonus chapter as the
    first card in "What to read next" (recommended next step
    immediately after finishing the main tutorial).

Prerequisites for the chapter to actually work end-to-end:

  - PR #2368: BuildInfo.isDev() self-substituting sentinel fix
    (merged) — needed for runtime version reporting.
  - PR #2373: $detectRuntime fix (merged) — CLI knows its runtime
    version.
  - PR #2374: `wheels packages install` → `add` rename (merged) —
    canonical install command works.
  - wheels-dev/wheels-basecoat#2: drop `view` from the mixin
    component attribute (open) — required for Lucee 7 helper
    activation. Tutorial reader's experience depends on basecoat
    1.0.2 (or whatever ships this fix) being current in the
    registry.
  - wheels-dev/wheels-hotwire#2: same fix on the hotwire side.

Verified end-to-end on a fresh VM: with all five fixes in place,
`wheels packages add wheels-basecoat` followed by a full server
restart produces working `#uiButton(...)#`, `#uiCard(...)#`,
`#uiField(...)#` calls in views. The rendered HTML is shadcn/ui-
quality output.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant