achilles 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/README.md +57 -7
- data/app/javascript/achilles/application/application.js +2 -2
- data/app/javascript/achilles/application/hooks-manager/turbo.js +19 -0
- data/app/javascript/achilles/components/component_parser.js +1 -1
- data/app/javascript/achilles/components/components_registry.js +37 -0
- data/docs/release-checklist.md +41 -23
- data/docs/releases/v1.1.0.md +74 -0
- data/docs/releases/v1.1.1.md +46 -0
- data/docs/releases/v1.1.2.md +58 -0
- data/docs/upgrading.md +6 -0
- data/lib/achilles/version.rb +1 -1
- metadata +4 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b4d4c63799a2a26d7d7a819ec2e17559de59d80be593e5b28d2cc6445864ccda
|
|
4
|
+
data.tar.gz: 8fe623f377d068436dc08beed221ad293ed85159a46930aa5868e24aece5a1ca
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5a1b4835b8cc60697ac3eb8d44e23c8799f76fa0d82f9a481b6a1a8cbdfe77373b91e1443dfcb62b6d733430bae427cd5bf624b3390f8a4f59ce5c632e223292
|
|
7
|
+
data.tar.gz: f6eed0197de6d71b6c74f4dfedf63920207f798fd4260a1d22076d7459587624fa2aa3d6fa88dc51d90fbe3be2735b687265122eb1222a67cfe25d9a94960f66
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Achilles will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 1.1.2
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Fixed Turbo Frame rendering so registered components in the outgoing frame are
|
|
10
|
+
torn down and deregistered immediately before Turbo invokes the frame renderer.
|
|
11
|
+
|
|
12
|
+
## 1.1.1
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Fixed Turbo browser history restoration so components restored from cached DOM
|
|
17
|
+
are registered and set up again when their registry entries were already
|
|
18
|
+
removed.
|
|
19
|
+
- Fixed component subtree deregistration so child components are removed with
|
|
20
|
+
their parent and cannot block later re-registration.
|
|
21
|
+
- Added browser system coverage for back, forward, restored nested components,
|
|
22
|
+
restored form-field listeners, Turbo-replaced form restoration, and duplicate
|
|
23
|
+
listener prevention.
|
|
24
|
+
|
|
5
25
|
## 1.1.0
|
|
6
26
|
|
|
7
27
|
### Added
|
data/README.md
CHANGED
|
@@ -8,6 +8,11 @@ Achilles scans the page for elements with `data-component-class`, instantiates
|
|
|
8
8
|
the matching JavaScript class, and calls `setup` and `teardown` as Turbo renders
|
|
9
9
|
new pages or new component markup is inserted.
|
|
10
10
|
|
|
11
|
+
Current applications should use Achilles `1.1.2`. If you are upgrading an
|
|
12
|
+
existing app, start with the [1.1.0 upgrade guide](docs/upgrading-to-1.1.0.md)
|
|
13
|
+
and then read the [1.1.1](docs/releases/v1.1.1.md) and
|
|
14
|
+
[1.1.2](docs/releases/v1.1.2.md) release notes.
|
|
15
|
+
|
|
11
16
|
## Why Achilles?
|
|
12
17
|
|
|
13
18
|
Rails and Turbo make server-rendered interfaces productive, but many apps still
|
|
@@ -79,6 +84,9 @@ achilles.componentsClassMapper.addComponentClass("CounterComponent", CounterComp
|
|
|
79
84
|
achilles.start();
|
|
80
85
|
```
|
|
81
86
|
|
|
87
|
+
Call `start()` after registering component classes. Achilles parses the current
|
|
88
|
+
page and attaches Turbo lifecycle hooks when the application starts.
|
|
89
|
+
|
|
82
90
|
Create components by extending `ComponentBase`:
|
|
83
91
|
|
|
84
92
|
```js
|
|
@@ -108,9 +116,10 @@ Mark the component root in your view:
|
|
|
108
116
|
<button id="counter" data-component-class="CounterComponent">0</button>
|
|
109
117
|
```
|
|
110
118
|
|
|
111
|
-
Every component root must have a unique `id`. Achilles uses that id to
|
|
112
|
-
the component, find its root element, and avoid running setup twice for
|
|
113
|
-
DOM node.
|
|
119
|
+
Every component root must have a non-empty unique `id`. Achilles uses that id to
|
|
120
|
+
register the component, find its root element, and avoid running setup twice for
|
|
121
|
+
the same DOM node. Components without ids are skipped and reported in the browser
|
|
122
|
+
console.
|
|
114
123
|
|
|
115
124
|
## Dynamic Components
|
|
116
125
|
|
|
@@ -148,6 +157,26 @@ Register the component class once:
|
|
|
148
157
|
achilles.componentsClassMapper.addComponentClass("NotificationComponent", NotificationComponent);
|
|
149
158
|
```
|
|
150
159
|
|
|
160
|
+
## Nested Components
|
|
161
|
+
|
|
162
|
+
Achilles keeps a component tree rooted at a single synthetic `Page` component.
|
|
163
|
+
A component's parent is its nearest ancestor element with `data-component-class`.
|
|
164
|
+
If there is no component ancestor, its parent is `Page`.
|
|
165
|
+
|
|
166
|
+
```erb
|
|
167
|
+
<div id="dashboard" data-component-class="DashboardComponent">
|
|
168
|
+
<div id="filters" data-component-class="FiltersComponent"></div>
|
|
169
|
+
</div>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
This creates the following component tree:
|
|
173
|
+
|
|
174
|
+
```text
|
|
175
|
+
Page
|
|
176
|
+
dashboard
|
|
177
|
+
filters
|
|
178
|
+
```
|
|
179
|
+
|
|
151
180
|
## Example App
|
|
152
181
|
|
|
153
182
|
The dummy Rails app includes a working counter component. See
|
|
@@ -157,9 +186,21 @@ The dummy Rails app includes a working counter component. See
|
|
|
157
186
|
|
|
158
187
|
- `setup()` runs after `turbo:load` and after new matching DOM nodes are inserted.
|
|
159
188
|
- `teardown()` runs before Turbo renders a new page.
|
|
189
|
+
- Before Turbo renders replacement content in a frame, Achilles tears down and
|
|
190
|
+
deregisters registered components in the outgoing frame from children to
|
|
191
|
+
parents.
|
|
160
192
|
- `setup()` and `teardown()` are called once per registered component instance.
|
|
193
|
+
- Parent components are set up before their children.
|
|
194
|
+
- Child components are torn down before their parents.
|
|
161
195
|
- Components that attach listeners, timers, observers, subscriptions, or widgets
|
|
162
196
|
should clean them up in `teardown()`.
|
|
197
|
+
- Lifecycle errors are logged and swallowed by default so one broken component
|
|
198
|
+
does not stop the page. Enable strict mode in tests or development when errors
|
|
199
|
+
should be re-raised:
|
|
200
|
+
|
|
201
|
+
```js
|
|
202
|
+
achilles.strictLifecycleErrors = true;
|
|
203
|
+
```
|
|
163
204
|
|
|
164
205
|
## API Reference
|
|
165
206
|
|
|
@@ -178,6 +219,7 @@ Useful properties:
|
|
|
178
219
|
|
|
179
220
|
- `componentsClassMapper`: register component classes by name.
|
|
180
221
|
- `componentRegistry`: inspect or manage registered component instances.
|
|
222
|
+
- `strictLifecycleErrors`: re-raise lifecycle errors after logging them.
|
|
181
223
|
- `timezone`: access the configured app timezone.
|
|
182
224
|
|
|
183
225
|
Call `start()` after registering component classes. Call `stop()` when an
|
|
@@ -219,7 +261,9 @@ Useful methods:
|
|
|
219
261
|
```
|
|
220
262
|
|
|
221
263
|
The `data-component-class` value must match a class registered with
|
|
222
|
-
`componentsClassMapper`.
|
|
264
|
+
`componentsClassMapper`. The element must also have a non-empty unique `id`.
|
|
265
|
+
Nested components are parented by DOM ancestry, with top-level components
|
|
266
|
+
parented by the synthetic `Page` component.
|
|
223
267
|
|
|
224
268
|
## Timezone
|
|
225
269
|
|
|
@@ -232,6 +276,13 @@ value through `achilles.timezone.timezoneString`.
|
|
|
232
276
|
|
|
233
277
|
If no timezone is present, Achilles falls back to `Etc/UTC`.
|
|
234
278
|
|
|
279
|
+
## Upgrading
|
|
280
|
+
|
|
281
|
+
Applications upgrading to `1.1.0` should read the
|
|
282
|
+
[1.1.0 upgrade guide](docs/upgrading-to-1.1.0.md). The complete upgrade index
|
|
283
|
+
lives in [docs/upgrading.md](docs/upgrading.md), and the current release note is
|
|
284
|
+
available at [docs/releases/v1.1.2.md](docs/releases/v1.1.2.md).
|
|
285
|
+
|
|
235
286
|
## Upgrading From 0.1.3
|
|
236
287
|
|
|
237
288
|
Achilles `1.0.0` changes `rootElement()` to return a DOM element. It no longer
|
|
@@ -255,9 +306,8 @@ Or wrap explicitly if the application still uses jQuery:
|
|
|
255
306
|
$(this.rootElement()).addClass("is-open");
|
|
256
307
|
```
|
|
257
308
|
|
|
258
|
-
Applications upgrading
|
|
259
|
-
[
|
|
260
|
-
also read the [v1 migration guide](docs/migrating-from-0.1.3-to-v1.md).
|
|
309
|
+
Applications upgrading from `0.1.3` should also read the
|
|
310
|
+
[v1 migration guide](docs/migrating-from-0.1.3-to-v1.md).
|
|
261
311
|
|
|
262
312
|
## Contributing
|
|
263
313
|
|
|
@@ -117,8 +117,8 @@ class Application {
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
deregisterAllComponentsExceptPage() {
|
|
120
|
-
let pageComponent = this.componentRegistry.getRegisteredComponent(AppConstants.PageComponentId)
|
|
121
|
-
pageComponent.subComponents.forEach((subComponentId) => {
|
|
120
|
+
let pageComponent = this.componentRegistry.getRegisteredComponent(AppConstants.PageComponentId);
|
|
121
|
+
[...pageComponent.subComponents].forEach((subComponentId) => {
|
|
122
122
|
this.componentRegistry.deregisterComponent(subComponentId);
|
|
123
123
|
})
|
|
124
124
|
}
|
|
@@ -4,6 +4,7 @@ class Turbo {
|
|
|
4
4
|
_teardownCallback;
|
|
5
5
|
_setupHandler;
|
|
6
6
|
_teardownHandler;
|
|
7
|
+
_frameRenderHandler;
|
|
7
8
|
_started = false;
|
|
8
9
|
|
|
9
10
|
constructor(application, setupCallback, teardownCallback) {
|
|
@@ -27,8 +28,24 @@ class Turbo {
|
|
|
27
28
|
this._teardownCallback();
|
|
28
29
|
};
|
|
29
30
|
|
|
31
|
+
this._frameRenderHandler = (event) => {
|
|
32
|
+
const frame = event.target;
|
|
33
|
+
const originalRender = event.detail?.render;
|
|
34
|
+
|
|
35
|
+
if (!frame || typeof originalRender !== "function") {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const componentRegistry = this._application.componentRegistry;
|
|
40
|
+
event.detail.render = function(...args) {
|
|
41
|
+
componentRegistry.teardownAndDeregisterWithin(frame);
|
|
42
|
+
return Reflect.apply(originalRender, this, args);
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
30
46
|
document.addEventListener("turbo:load", this._setupHandler);
|
|
31
47
|
document.addEventListener("turbo:before-render", this._teardownHandler);
|
|
48
|
+
document.addEventListener("turbo:before-frame-render", this._frameRenderHandler);
|
|
32
49
|
this._started = true;
|
|
33
50
|
}
|
|
34
51
|
|
|
@@ -39,8 +56,10 @@ class Turbo {
|
|
|
39
56
|
|
|
40
57
|
document.removeEventListener("turbo:load", this._setupHandler);
|
|
41
58
|
document.removeEventListener("turbo:before-render", this._teardownHandler);
|
|
59
|
+
document.removeEventListener("turbo:before-frame-render", this._frameRenderHandler);
|
|
42
60
|
this._setupHandler = null;
|
|
43
61
|
this._teardownHandler = null;
|
|
62
|
+
this._frameRenderHandler = null;
|
|
44
63
|
this._started = false;
|
|
45
64
|
}
|
|
46
65
|
}
|
|
@@ -53,6 +53,10 @@ class ComponentsRegistry {
|
|
|
53
53
|
if(!component)
|
|
54
54
|
return;
|
|
55
55
|
|
|
56
|
+
[...component.subComponents].forEach((subComponentId) => {
|
|
57
|
+
this.deregisterComponent(subComponentId);
|
|
58
|
+
});
|
|
59
|
+
|
|
56
60
|
let parentComponent = this.getRegisteredComponent(component.parentComponentId);
|
|
57
61
|
|
|
58
62
|
if(parentComponent != null){
|
|
@@ -126,6 +130,39 @@ class ComponentsRegistry {
|
|
|
126
130
|
this.deregisterComponent(id);
|
|
127
131
|
}
|
|
128
132
|
|
|
133
|
+
teardownAndDeregisterWithin(rootElement) {
|
|
134
|
+
if(!rootElement || typeof rootElement.contains !== 'function')
|
|
135
|
+
return;
|
|
136
|
+
|
|
137
|
+
Object.values(this._registeredComponents)
|
|
138
|
+
.filter((component) => {
|
|
139
|
+
if(component.id === AppConstants.PageComponentId)
|
|
140
|
+
return false;
|
|
141
|
+
|
|
142
|
+
let element = this.elementForId(component.id);
|
|
143
|
+
return element && rootElement.contains(element);
|
|
144
|
+
})
|
|
145
|
+
.sort((firstComponent, secondComponent) => {
|
|
146
|
+
return this.elementDepth(secondComponent.id) - this.elementDepth(firstComponent.id);
|
|
147
|
+
})
|
|
148
|
+
.forEach((component) => {
|
|
149
|
+
if(this.getRegisteredComponent(component.id))
|
|
150
|
+
this.teardownAndDeregister(component.id);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
elementDepth(id) {
|
|
155
|
+
let depth = 0;
|
|
156
|
+
let element = this.elementForId(id);
|
|
157
|
+
|
|
158
|
+
while(element?.parentElement) {
|
|
159
|
+
depth += 1;
|
|
160
|
+
element = element.parentElement;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return depth;
|
|
164
|
+
}
|
|
165
|
+
|
|
129
166
|
elementNotFound(id) {
|
|
130
167
|
console.error('Cannot find element while setup, so teardown & deregister. id: ' + id);
|
|
131
168
|
this.teardownAndDeregister(id);
|
data/docs/release-checklist.md
CHANGED
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
# Release Checklist
|
|
2
2
|
|
|
3
|
-
Use this checklist for
|
|
3
|
+
Use this checklist for every Achilles release. Replace `VERSION` with the
|
|
4
|
+
version being prepared, for example `1.1.0`.
|
|
4
5
|
|
|
5
|
-
## Before
|
|
6
|
+
## Before Finalizing The Version
|
|
6
7
|
|
|
8
|
+
- Confirm the release type: patch, minor, major, or prerelease.
|
|
7
9
|
- Confirm `lib/achilles/version.rb` has the intended version.
|
|
8
10
|
- Confirm `CHANGELOG.md` has an entry for the intended version.
|
|
11
|
+
- Confirm application-facing changes have an upgrade note in `docs/upgrading.md`.
|
|
12
|
+
- Confirm release notes exist in `docs/releases/` when the release needs a
|
|
13
|
+
GitHub release body.
|
|
14
|
+
- Confirm package file expectations are covered by `test/gemspec_files_test.rb`
|
|
15
|
+
when adding source or documentation files.
|
|
16
|
+
|
|
17
|
+
## Before Building
|
|
18
|
+
|
|
9
19
|
- Confirm CI is green on GitHub.
|
|
10
20
|
- Run the local verification commands:
|
|
11
21
|
|
|
12
22
|
```bash
|
|
13
23
|
bin/rails test
|
|
24
|
+
node --test test/javascript/*_test.mjs
|
|
25
|
+
for file in $(rg --files app/javascript/achilles test/dummy/app/javascript test/javascript | rg "\.(js|mjs)$"); do node --input-type=module --check < "$file" || exit 1; done
|
|
14
26
|
bin/rails test:system
|
|
15
|
-
for file in $(find app/javascript/achilles test/dummy/app/javascript -name '*.js' -print); do node --input-type=module --check < "$file" || exit 1; done
|
|
16
27
|
RAILS_ENV=test bin/rails app:assets:precompile
|
|
17
28
|
```
|
|
18
29
|
|
|
@@ -25,13 +36,13 @@ gem build achilles.gemspec
|
|
|
25
36
|
Confirm the generated gem name matches the intended version:
|
|
26
37
|
|
|
27
38
|
```bash
|
|
28
|
-
ls achilles
|
|
39
|
+
ls achilles-VERSION.gem
|
|
29
40
|
```
|
|
30
41
|
|
|
31
42
|
## Test In A Real Application
|
|
32
43
|
|
|
33
|
-
|
|
34
|
-
|
|
44
|
+
Before a broad rollout, test the built gem in at least one real Rails + Turbo
|
|
45
|
+
application that already uses Achilles.
|
|
35
46
|
|
|
36
47
|
Check:
|
|
37
48
|
|
|
@@ -45,30 +56,37 @@ Check:
|
|
|
45
56
|
- components that attach window, document, timer, observer, or third-party
|
|
46
57
|
widget state
|
|
47
58
|
|
|
48
|
-
For
|
|
49
|
-
|
|
50
|
-
`$(this.rootElement())`.
|
|
59
|
+
For releases with breaking or compatibility-sensitive behavior, test one app
|
|
60
|
+
first, then roll out to the rest of the maintained apps gradually.
|
|
51
61
|
|
|
52
62
|
## Publish A Prerelease
|
|
53
63
|
|
|
54
|
-
|
|
64
|
+
Publish a prerelease only when the release needs real-app validation before a
|
|
65
|
+
final tag.
|
|
55
66
|
|
|
56
67
|
```bash
|
|
57
|
-
|
|
58
|
-
git
|
|
59
|
-
|
|
68
|
+
git tag vVERSION
|
|
69
|
+
git push origin vVERSION
|
|
70
|
+
gem push achilles-VERSION.gem
|
|
60
71
|
```
|
|
61
72
|
|
|
62
|
-
|
|
73
|
+
Mark the GitHub release as a prerelease and include the matching release notes.
|
|
63
74
|
|
|
64
|
-
Publish
|
|
65
|
-
|
|
75
|
+
## Publish A Final Release
|
|
76
|
+
|
|
77
|
+
Publish a final release after local checks, GitHub CI, packaging verification,
|
|
78
|
+
and real-app testing are complete.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git tag vVERSION
|
|
82
|
+
git push origin vVERSION
|
|
83
|
+
gem push achilles-VERSION.gem
|
|
84
|
+
```
|
|
66
85
|
|
|
67
|
-
|
|
86
|
+
After pushing:
|
|
68
87
|
|
|
69
|
-
- update
|
|
70
|
-
-
|
|
71
|
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
- tag `v1.0.0`
|
|
88
|
+
- Create or update the GitHub release for `vVERSION`.
|
|
89
|
+
- Paste the release note from `docs/releases/vVERSION.md` when one exists, for
|
|
90
|
+
example `docs/releases/v1.1.0.md`.
|
|
91
|
+
- Link the release back to the upgrade guide for application-facing changes.
|
|
92
|
+
- Confirm the pushed gem is visible on RubyGems.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Achilles 1.1.0
|
|
2
|
+
|
|
3
|
+
Achilles `1.1.0` tightens the application lifecycle for Rails + Turbo apps and
|
|
4
|
+
adds stronger nested-component behavior. This release is intended for existing
|
|
5
|
+
Achilles users who want explicit startup, safer teardown ordering, and better
|
|
6
|
+
runtime behavior around Turbo navigation and dynamic markup.
|
|
7
|
+
|
|
8
|
+
## Upgrade First
|
|
9
|
+
|
|
10
|
+
This release includes application-facing changes. Before upgrading an existing
|
|
11
|
+
app, read the full guide:
|
|
12
|
+
|
|
13
|
+
- [Upgrading to 1.1.0](../upgrading-to-1.1.0.md)
|
|
14
|
+
|
|
15
|
+
The most important change is explicit application startup:
|
|
16
|
+
|
|
17
|
+
```js
|
|
18
|
+
const achilles = new Application();
|
|
19
|
+
achilles.componentsClassMapper.addComponentClass("MenuComponent", MenuComponent);
|
|
20
|
+
achilles.start();
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Call `start()` after registering component classes. Achilles no longer starts
|
|
24
|
+
from the `Application` constructor.
|
|
25
|
+
|
|
26
|
+
## Highlights
|
|
27
|
+
|
|
28
|
+
- Added explicit `Application#start` and `Application#stop` lifecycle methods.
|
|
29
|
+
- Added `Application#strictLifecycleErrors` for tests and development.
|
|
30
|
+
- Component parentage now follows DOM ancestry under the synthetic `Page` root.
|
|
31
|
+
- Component teardown now runs from children to parents.
|
|
32
|
+
- Elements with `data-component-class` must have a non-empty `id`; invalid roots
|
|
33
|
+
are skipped with a browser-console error.
|
|
34
|
+
- Achilles now requires `turbo-rails`, so Turbo importmap assets are available
|
|
35
|
+
to host applications.
|
|
36
|
+
- Added browser system coverage for nested components inside Turbo form
|
|
37
|
+
replacement and Turbo Drive navigation.
|
|
38
|
+
|
|
39
|
+
## Breaking Or Compatibility-Sensitive Changes
|
|
40
|
+
|
|
41
|
+
Applications should check these items before updating:
|
|
42
|
+
|
|
43
|
+
- Search for `new Application` and make sure each Achilles instance calls
|
|
44
|
+
`start()` after all component classes are registered.
|
|
45
|
+
- Search for `data-component-class` and make sure every component root has a
|
|
46
|
+
non-empty unique `id`.
|
|
47
|
+
- Review parent components whose `teardown()` removes DOM nodes, shared event
|
|
48
|
+
targets, widgets, or state that child components also use during cleanup.
|
|
49
|
+
- If you have tests that should fail on lifecycle errors, enable strict mode:
|
|
50
|
+
|
|
51
|
+
```js
|
|
52
|
+
achilles.strictLifecycleErrors = true;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Verification
|
|
56
|
+
|
|
57
|
+
This release line was verified with:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
bin/rails test
|
|
61
|
+
node --test test/javascript/*_test.mjs
|
|
62
|
+
bin/rails test:system
|
|
63
|
+
RAILS_ENV=test bin/rails app:assets:precompile
|
|
64
|
+
gem build achilles.gemspec
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
One real application has also been updated successfully. Continue testing in
|
|
68
|
+
your own Rails + Turbo apps before rolling the update through every project.
|
|
69
|
+
|
|
70
|
+
## Links
|
|
71
|
+
|
|
72
|
+
- [Changelog](../../CHANGELOG.md)
|
|
73
|
+
- [Upgrade index](../upgrading.md)
|
|
74
|
+
- [1.1.0 upgrade guide](../upgrading-to-1.1.0.md)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Achilles 1.1.1
|
|
2
|
+
|
|
3
|
+
Achilles `1.1.1` is a patch release for Rails + Turbo applications using
|
|
4
|
+
browser history restoration. It fixes restored component markup that appeared on
|
|
5
|
+
screen after browser back or forward navigation but no longer had active
|
|
6
|
+
Achilles event listeners.
|
|
7
|
+
|
|
8
|
+
## Who Should Upgrade
|
|
9
|
+
|
|
10
|
+
Upgrade from `1.1.0` if your application uses Turbo Drive navigation and users
|
|
11
|
+
can return to Achilles-managed pages with the browser back or forward buttons.
|
|
12
|
+
|
|
13
|
+
There are no new application setup requirements in this patch release. Apps
|
|
14
|
+
upgrading from versions before `1.1.0` should still read the
|
|
15
|
+
[1.1.0 upgrade guide](../upgrading-to-1.1.0.md).
|
|
16
|
+
|
|
17
|
+
## Fixed
|
|
18
|
+
|
|
19
|
+
- Restored Turbo-cached DOM with stale `data-component-registered="true"` flags
|
|
20
|
+
is now parsed correctly when Achilles no longer has a matching registry entry.
|
|
21
|
+
- Deregistering a parent component now deregisters its child component subtree,
|
|
22
|
+
preventing orphaned child registry entries from blocking future setup.
|
|
23
|
+
- Page-level deregistration now iterates over a stable copy of child component
|
|
24
|
+
ids while the registry is being mutated.
|
|
25
|
+
|
|
26
|
+
## Verification
|
|
27
|
+
|
|
28
|
+
This release was verified with:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
bin/rails test
|
|
32
|
+
node --test test/javascript/*_test.mjs
|
|
33
|
+
bin/rails test:system
|
|
34
|
+
RAILS_ENV=test bin/rails app:assets:precompile
|
|
35
|
+
gem build achilles.gemspec
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The system suite includes browser back, browser forward, restored nested
|
|
39
|
+
components, restored form-field listeners, restored Turbo-replaced forms, and
|
|
40
|
+
duplicate listener prevention.
|
|
41
|
+
|
|
42
|
+
## Links
|
|
43
|
+
|
|
44
|
+
- [Changelog](../../CHANGELOG.md)
|
|
45
|
+
- [Upgrade index](../upgrading.md)
|
|
46
|
+
- [1.1.0 upgrade guide](../upgrading-to-1.1.0.md)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Achilles 1.1.2
|
|
2
|
+
|
|
3
|
+
Achilles `1.1.2` is a patch release for Rails + Turbo applications using Turbo
|
|
4
|
+
Frames. It fixes late component cleanup when Turbo replaces frame content.
|
|
5
|
+
|
|
6
|
+
## Who Should Upgrade
|
|
7
|
+
|
|
8
|
+
Upgrade from `1.1.0` or `1.1.1` if your application registers
|
|
9
|
+
Achilles-managed components inside a Turbo Frame or on the frame root itself.
|
|
10
|
+
|
|
11
|
+
There are no new application setup requirements in this patch release. Apps
|
|
12
|
+
upgrading from versions before `1.1.0` should still read the
|
|
13
|
+
[1.1.0 upgrade guide](../upgrading-to-1.1.0.md).
|
|
14
|
+
|
|
15
|
+
## Fixed
|
|
16
|
+
|
|
17
|
+
- Registered components in an outgoing Turbo Frame are now torn down and
|
|
18
|
+
deregistered immediately before Turbo invokes the frame renderer.
|
|
19
|
+
- Cleanup runs from children to parents and includes the frame root when it is
|
|
20
|
+
registered as a component.
|
|
21
|
+
- The original Turbo renderer keeps its receiver, arguments, return value, and
|
|
22
|
+
error behavior.
|
|
23
|
+
- Incoming components continue to register through the existing DOM observer,
|
|
24
|
+
while ordinary non-Turbo removal behavior remains unchanged.
|
|
25
|
+
- Starting and stopping an Achilles application manages the frame-render
|
|
26
|
+
listener without creating duplicates.
|
|
27
|
+
|
|
28
|
+
## Compatibility
|
|
29
|
+
|
|
30
|
+
This backward-compatible `1.1.x` patch intentionally moves frame-contained
|
|
31
|
+
teardown earlier, while the outgoing component elements are still present,
|
|
32
|
+
instead of relying on missing-element recovery after replacement.
|
|
33
|
+
|
|
34
|
+
Achilles continues to require Turbo Rails `2.0.11` or newer. This release does
|
|
35
|
+
not add dependencies or require an application migration.
|
|
36
|
+
|
|
37
|
+
## Verification
|
|
38
|
+
|
|
39
|
+
This release was verified with:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
bin/rails test
|
|
43
|
+
node --test test/javascript/*_test.mjs
|
|
44
|
+
for file in $(rg --files app/javascript/achilles test/dummy/app/javascript test/javascript | rg "\.(js|mjs)$"); do node --input-type=module --check < "$file" || exit 1; done
|
|
45
|
+
bin/rails test:system
|
|
46
|
+
RAILS_ENV=test bin/rails app:assets:precompile
|
|
47
|
+
gem build achilles.gemspec
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The system suite covers a native Turbo Frame replacement with a registered
|
|
51
|
+
frame root, nested outgoing components, incoming component registration and
|
|
52
|
+
interaction, and browser-console error checks.
|
|
53
|
+
|
|
54
|
+
## Links
|
|
55
|
+
|
|
56
|
+
- [Changelog](../../CHANGELOG.md)
|
|
57
|
+
- [Upgrade index](../upgrading.md)
|
|
58
|
+
- [1.1.0 upgrade guide](../upgrading-to-1.1.0.md)
|
data/docs/upgrading.md
CHANGED
|
@@ -10,6 +10,12 @@ setup, component markup, lifecycle behavior, or public APIs.
|
|
|
10
10
|
- [Upgrading to 1.1.0](upgrading-to-1.1.0.md)
|
|
11
11
|
- [Migrating from 0.1.3 to v1](migrating-from-0.1.3-to-v1.md)
|
|
12
12
|
|
|
13
|
+
## Release Notes
|
|
14
|
+
|
|
15
|
+
- [Achilles 1.1.2](releases/v1.1.2.md)
|
|
16
|
+
- [Achilles 1.1.1](releases/v1.1.1.md)
|
|
17
|
+
- [Achilles 1.1.0](releases/v1.1.0.md)
|
|
18
|
+
|
|
13
19
|
## Upgrade Policy
|
|
14
20
|
|
|
15
21
|
Before upgrading an existing application:
|
data/lib/achilles/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: achilles
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jey Geethan
|
|
@@ -90,6 +90,9 @@ files:
|
|
|
90
90
|
- docs/core-js-gaps.md
|
|
91
91
|
- docs/migrating-from-0.1.3-to-v1.md
|
|
92
92
|
- docs/release-checklist.md
|
|
93
|
+
- docs/releases/v1.1.0.md
|
|
94
|
+
- docs/releases/v1.1.1.md
|
|
95
|
+
- docs/releases/v1.1.2.md
|
|
93
96
|
- docs/upgrading-to-1.1.0.md
|
|
94
97
|
- docs/upgrading.md
|
|
95
98
|
- docs/v1-roadmap.md
|