Skip to content

Commit 432dffe

Browse files
committed
Upgrades oofta
ember-cli-babel ruins lives :( (or maybe just babel) Blocked by: NullVoxPopuli/ember-statechart-component#149 which is in-turn blocked by: emberjs/ember-cli-babel#419 which is then blocked by ember-data... *for some reason*. (I don't use ember-data here, so idgaf) Further work is blocked by embroider-build/embroider#1038
1 parent 53322d0 commit 432dffe

25 files changed

+3845
-4060
lines changed

frontend/app/app.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'ember-statechart-component';
2+
import './function-modifiers';
23

34
import Application from '@ember/application';
45

frontend/app/components/limber/editor-controls/index.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import Component from '@glimmer/component';
22
import { setComponentTemplate } from '@ember/component';
33
import { hbs } from 'ember-cli-htmlbars';
44

5-
import { modifier } from 'ember-could-get-used-to-this';
6-
75
import State from './state';
86

97
import type { InterpreterFrom, StateFrom } from 'xstate';
@@ -72,11 +70,11 @@ class CurriedControls extends Component<CurriedArgs> {
7270
// could this be a standalone modifier?
7371
// {{modifier (fn @send 'CONTAINER_FOUND') (fn @send 'CONTAINER_REMOVED')}}
7472
// ?
75-
containerToControl = modifier((element: Element) => {
73+
containerToControl = (element: Element) => {
7674
this.args.send('CONTAINER_FOUND', { container: element as HTMLElement });
7775

7876
return () => this.args.send('CONTAINER_REMOVED');
79-
});
77+
};
8078

8179
get Controls() {
8280
let { send, state } = this.args;

frontend/app/components/limber/editor/-code-mirror.ts

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import { assert } from '@ember/debug';
22

3-
import { modifier } from 'ember-could-get-used-to-this';
4-
53
import type { NamedArgs, PositionalArgs } from './-types';
64
import type { EditorView } from '@codemirror/view';
75

8-
export default modifier(
9-
(element: HTMLElement, [value, updateText]: PositionalArgs, named: NamedArgs) => {
10-
assert(`Expected CODEMIRROR to exist`, CODEMIRROR);
6+
export default function codeMirror(
7+
element: HTMLElement,
8+
[value, updateText]: PositionalArgs,
9+
named: NamedArgs
10+
) {
11+
assert(`Expected CODEMIRROR to exist`, CODEMIRROR);
1112

12-
element.innerHTML = '';
13+
element.innerHTML = '';
1314

14-
let { view, setText } = CODEMIRROR(element, value, updateText);
15+
let { view, setText } = CODEMIRROR(element, value, updateText);
1516

16-
named.setValue((text) => {
17-
updateText(text); // update the service / URL
18-
setText(text); // update the editor
19-
});
17+
named.setValue((text) => {
18+
updateText(text); // update the service / URL
19+
setText(text); // update the editor
20+
});
2021

21-
return () => view.destroy();
22-
}
23-
);
22+
return () => view.destroy();
23+
}
2424

2525
let CODEMIRROR:
2626
| undefined

frontend/app/components/limber/editor/-monaco.ts

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { assert } from '@ember/debug';
22

3-
import { modifier } from 'ember-could-get-used-to-this';
4-
53
import type { NamedArgs, PositionalArgs } from './-types';
64
/**
75
* I wish there was a way to specify types-only packages
@@ -13,23 +11,25 @@ import type { NamedArgs, PositionalArgs } from './-types';
1311
*/
1412
import type * as monaco from 'monaco-editor';
1513

16-
export default modifier(
17-
(element: HTMLElement, [value, updateText]: PositionalArgs, named: NamedArgs) => {
18-
assert(`Expected MONACO to exist`, MONACO);
14+
export default function installMonaco(
15+
element: HTMLElement,
16+
[value, updateText]: PositionalArgs,
17+
named: NamedArgs
18+
) {
19+
assert(`Expected MONACO to exist`, MONACO);
1920

20-
element.innerHTML = '';
21+
element.innerHTML = '';
2122

22-
let { editor, setText } = MONACO(element, value, updateText);
23+
let { editor, setText } = MONACO(element, value, updateText);
2324

24-
named.setValue((text) => {
25-
// changing the text this ways calls updateText for us
26-
// updateText(text); // update the service / URL
27-
setText(text); // update the editor
28-
});
25+
named.setValue((text) => {
26+
// changing the text this ways calls updateText for us
27+
// updateText(text); // update the service / URL
28+
setText(text); // update the editor
29+
});
2930

30-
return () => editor?.dispose();
31-
}
32-
);
31+
return () => editor?.dispose();
32+
}
3333

3434
let MONACO:
3535
| undefined

frontend/app/components/shadowed.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@ import { tracked } from '@glimmer/tracking';
33
import { setComponentTemplate } from '@ember/component';
44
import { hbs } from 'ember-cli-htmlbars';
55

6-
import { modifier } from 'ember-could-get-used-to-this';
7-
86
class Shadowed extends Component {
97
@tracked shadow?: ShadowRoot;
108

11-
attachShadow = modifier((element: HTMLElement) => {
9+
attachShadow = (element: HTMLElement) => {
1210
this.shadow = element.attachShadow({ mode: 'open' });
13-
});
11+
};
1412
}
1513

1614
export default setComponentTemplate(

frontend/app/function-modifiers.js

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { setOwner } from '@ember/application';
2+
import { destroy, registerDestructor } from '@ember/destroyable';
3+
import { capabilities as modifierCapabilities, setModifierManager } from '@ember/modifier';
4+
5+
class FunctionalModifierManager {
6+
capabilities = modifierCapabilities('3.22');
7+
8+
createModifier(fn, args) {
9+
return { fn, args, element: undefined, destructor: undefined };
10+
}
11+
12+
installModifier(state, element) {
13+
state.element = element;
14+
this.setupModifier(state);
15+
}
16+
17+
updateModifier(state) {
18+
this.destroyModifier(state);
19+
this.setupModifier(state);
20+
}
21+
22+
setupModifier(state) {
23+
let { fn, args, element } = state;
24+
25+
state.destructor = fn(element, args.positional, args.named);
26+
}
27+
28+
destroyModifier(state) {
29+
if (typeof state.destructor === 'function') {
30+
state.destructor();
31+
}
32+
}
33+
34+
getDebugName(fn) {
35+
return fn.name || '(anonymous function)';
36+
}
37+
}
38+
39+
const FUNCTIONAL_MODIFIER_MANAGER = new FunctionalModifierManager();
40+
const FUNCTIONAL_MODIFIER_MANAGER_FACTORY = () => FUNCTIONAL_MODIFIER_MANAGER;
41+
42+
setModifierManager(FUNCTIONAL_MODIFIER_MANAGER_FACTORY, Function.prototype);

frontend/app/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
{{content-for "head"}}
1313

14+
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/tailwind.css">
1415
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
1516
<link integrity="" rel="stylesheet" href="{{rootURL}}assets/limber.css">
1617

frontend/app/modifiers/constrain-vertically.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { debounce } from '@ember/runloop';
22

3-
import { modifier } from 'ember-could-get-used-to-this';
4-
5-
export default modifier(function constraintVertically(element: HTMLElement) {
3+
export default function constraintVertically(element: HTMLElement) {
64
let debouncedConstrain = () => constrain(element);
75
let x = () => debounce(debouncedConstrain, 10);
86

@@ -12,7 +10,7 @@ export default modifier(function constraintVertically(element: HTMLElement) {
1210
return () => {
1311
window.removeEventListener('resize', x);
1412
};
15-
});
13+
}
1614

1715
function constrain(element: HTMLElement) {
1816
let offset = element.getBoundingClientRect().y;
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,15 @@
1-
import { isDestroyed, isDestroying } from '@ember/destroyable';
2-
import { action } from '@ember/object';
3-
4-
import { Modifier } from 'ember-could-get-used-to-this';
5-
61
import { getHighlighter } from './-utils/highlighting';
72

8-
interface Args {
9-
positional: [unknown /* used to trigger updates */];
10-
}
11-
export default class HighlightCodeBlocks extends Modifier<Args> {
12-
get isSafe() {
13-
return !isDestroyed(this) && !isDestroying(this);
14-
}
15-
16-
setup() {
17-
this.highlight();
18-
}
19-
20-
update() {
21-
this.highlight();
3+
export default async function highlightCodeBlocks(element: HTMLElement, _: unknown) {
4+
if (!_) {
5+
console.warn(`No argument was passed to {{highlight-code-blocks}}. Updates won't be detected`);
226
}
237

24-
@action
25-
async highlight() {
26-
if (!this.args.positional[0]) {
27-
console.warn(
28-
`No argument was passed to {{highlight-code-blocks}}. Updates won't be detected`
29-
);
30-
}
31-
32-
if (this.isSafe && this.element) {
33-
let elements = this.element.querySelectorAll('pre > code');
8+
let elements = element.querySelectorAll('pre > code');
349

35-
for (let element of elements) {
36-
let hljs = await getHighlighter();
10+
for (let element of elements) {
11+
let hljs = await getHighlighter();
3712

38-
hljs.highlightElement(element as HTMLElement);
39-
}
40-
}
13+
hljs.highlightElement(element as HTMLElement);
4114
}
4215
}

frontend/app/modifiers/highlighted.js

+15-26
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,25 @@
1-
import { isDestroyed, isDestroying } from '@ember/destroyable';
2-
import { action } from '@ember/object';
3-
4-
import { Modifier } from 'ember-could-get-used-to-this';
1+
import { guidFor } from '@ember/object/internals';
52

63
import { getHighlighter, getPurifier } from './-utils/highlighting';
74

8-
export default class Highlighted extends Modifier {
9-
get isSafe() {
10-
return !isDestroyed(this) && !isDestroying(this);
11-
}
5+
/**
6+
* NOTE: this cannot have a destructor, because it is async
7+
*/
8+
export default async function highlighted(element, code) {
9+
let guid = guidFor(element);
1210

13-
get code() {
14-
return this.args.positional[0];
15-
}
11+
element.setAttribute('id', guid);
1612

17-
setup() {
18-
this.highlight(this.code);
19-
}
13+
let [hljs, purify] = await Promise.all([getHighlighter(), getPurifier()]);
2014

21-
update() {
22-
this.highlight(this.code);
15+
// because the above is async, it's possible that the element
16+
// has been removed from the DOM
17+
if (!window.body.getElementById(guid)) {
18+
return;
2319
}
2420

25-
@action
26-
async highlight(code) {
27-
if (this.isSafe && this.element) {
28-
let [hljs, purify] = await Promise.all([getHighlighter(), getPurifier()]);
29-
30-
let target = this.element.querySelector('code');
31-
let { value } = hljs.highlight(code, { language: target.classList[0] });
21+
let target = element.querySelector('code');
22+
let { value } = hljs.highlight(code, { language: target.classList[0] });
3223

33-
target.innerHTML = purify.sanitize(value);
34-
}
35-
}
24+
target.innerHTML = purify.sanitize(value);
3625
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
import { modifier } from 'ember-could-get-used-to-this';
2-
31
type PositionalArgs = [number, number];
42

5-
export default modifier(function positionFromTop(
6-
element: HTMLElement,
7-
[lines, padding]: PositionalArgs
8-
) {
3+
export default function positionFromTop(element: HTMLElement, [lines, padding]: PositionalArgs) {
94
let container = element.parentElement as Element;
105
let lineHeight = getComputedStyle(container).lineHeight;
116

127
element.setAttribute('style', `top: calc(${padding} + ${lineHeight} * ${lines - 1})`);
13-
});
8+
}

0 commit comments

Comments
 (0)