grainjs 1.0.1 → 1.0.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.
- package/README.md +54 -9
- package/dist/cjs/index.js +24 -17
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/PriorityQueue.d.ts +1 -1
- package/dist/cjs/lib/PriorityQueue.js +1 -0
- package/dist/cjs/lib/PriorityQueue.js.map +1 -1
- package/dist/cjs/lib/_computed_queue.js +1 -0
- package/dist/cjs/lib/_computed_queue.js.map +1 -1
- package/dist/cjs/lib/binding.js +1 -0
- package/dist/cjs/lib/binding.js.map +1 -1
- package/dist/cjs/lib/browserGlobals.d.ts +4 -1
- package/dist/cjs/lib/browserGlobals.js +2 -0
- package/dist/cjs/lib/browserGlobals.js.map +1 -1
- package/dist/cjs/lib/computed.js +1 -0
- package/dist/cjs/lib/computed.js.map +1 -1
- package/dist/cjs/lib/dispose.js +1 -0
- package/dist/cjs/lib/dispose.js.map +1 -1
- package/dist/cjs/lib/dom.d.ts +2 -0
- package/dist/cjs/lib/dom.js +20 -10
- package/dist/cjs/lib/dom.js.map +1 -1
- package/dist/cjs/lib/domComponent.d.ts +1 -4
- package/dist/cjs/lib/domComponent.js +2 -65
- package/dist/cjs/lib/domComponent.js.map +1 -1
- package/dist/cjs/lib/domComputed.d.ts +23 -3
- package/dist/cjs/lib/domComputed.js +27 -0
- package/dist/cjs/lib/domComputed.js.map +1 -1
- package/dist/cjs/lib/domDispose.js +1 -0
- package/dist/cjs/lib/domDispose.js.map +1 -1
- package/dist/cjs/lib/domForEach.d.ts +2 -2
- package/dist/cjs/lib/domForEach.js +38 -39
- package/dist/cjs/lib/domForEach.js.map +1 -1
- package/dist/cjs/lib/domImpl.js +1 -0
- package/dist/cjs/lib/domImpl.js.map +1 -1
- package/dist/cjs/lib/domMethods.js +3 -1
- package/dist/cjs/lib/domMethods.js.map +1 -1
- package/dist/cjs/lib/domevent.js +1 -0
- package/dist/cjs/lib/domevent.js.map +1 -1
- package/dist/cjs/lib/emit.js +1 -0
- package/dist/cjs/lib/emit.js.map +1 -1
- package/dist/cjs/lib/kowrap.js +1 -0
- package/dist/cjs/lib/kowrap.js.map +1 -1
- package/dist/cjs/lib/obsArray.js +1 -0
- package/dist/cjs/lib/obsArray.js.map +1 -1
- package/dist/cjs/lib/observable.js +2 -1
- package/dist/cjs/lib/observable.js.map +1 -1
- package/dist/cjs/lib/pureComputed.js +1 -0
- package/dist/cjs/lib/pureComputed.js.map +1 -1
- package/dist/cjs/lib/styled.js +1 -0
- package/dist/cjs/lib/styled.js.map +1 -1
- package/dist/cjs/lib/subscribe.js +1 -0
- package/dist/cjs/lib/subscribe.js.map +1 -1
- package/dist/cjs/lib/util.js +1 -0
- package/dist/cjs/lib/util.js.map +1 -1
- package/dist/cjs/lib/widgets/input.js +1 -0
- package/dist/cjs/lib/widgets/input.js.map +1 -1
- package/dist/cjs/lib/widgets/select.js +1 -0
- package/dist/cjs/lib/widgets/select.js.map +1 -1
- package/dist/esm/lib/browserGlobals.js +1 -0
- package/dist/esm/lib/browserGlobals.js.map +1 -1
- package/dist/esm/lib/dom.js +2 -0
- package/dist/esm/lib/dom.js.map +1 -1
- package/dist/esm/lib/domComponent.js +2 -66
- package/dist/esm/lib/domComponent.js.map +1 -1
- package/dist/esm/lib/domComputed.js +25 -1
- package/dist/esm/lib/domComputed.js.map +1 -1
- package/dist/esm/lib/domForEach.js +37 -39
- package/dist/esm/lib/domForEach.js.map +1 -1
- package/dist/esm/lib/domevent.js.map +1 -1
- package/dist/grain-full.debug.js +137 -135
- package/dist/grain-full.min.js +1 -1
- package/dist/grain-full.min.js.map +1 -1
- package/lib/browserGlobals.ts +3 -1
- package/lib/dom.ts +2 -0
- package/lib/domComponent.ts +2 -13
- package/lib/domComputed.ts +40 -5
- package/lib/domForEach.ts +7 -10
- package/lib/domevent.ts +1 -1
- package/package.json +33 -34
package/lib/browserGlobals.ts
CHANGED
|
@@ -27,6 +27,8 @@ export interface IBrowserGlobals {
|
|
|
27
27
|
window: typeof window;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
export interface IBrowserGlobalsLax extends IBrowserGlobals {window: any};
|
|
31
|
+
|
|
30
32
|
function _updateGlobals(dest: IBrowserGlobals, source: IBrowserGlobals): void {
|
|
31
33
|
dest.DocumentFragment = source.DocumentFragment;
|
|
32
34
|
dest.Element = source.Element;
|
|
@@ -48,7 +50,7 @@ const _globalsStack: IBrowserGlobals[] = [initial];
|
|
|
48
50
|
/**
|
|
49
51
|
* Replace globals with those from the given object. Use popGlobals() to restore previous values.
|
|
50
52
|
*/
|
|
51
|
-
export function pushGlobals(globals:
|
|
53
|
+
export function pushGlobals(globals: IBrowserGlobalsLax): void {
|
|
52
54
|
_globalsStack.push(globals);
|
|
53
55
|
_updateGlobals(G, globals);
|
|
54
56
|
}
|
package/lib/dom.ts
CHANGED
|
@@ -81,7 +81,9 @@ export namespace dom { // tslint:disable-line:no-namespace
|
|
|
81
81
|
export const getData = _domMethods.getData;
|
|
82
82
|
export const replaceContent = _domComputed.replaceContent;
|
|
83
83
|
export const domComputed = _domComputed.domComputed;
|
|
84
|
+
export const domComputedOwned = _domComputed.domComputedOwned;
|
|
84
85
|
export const maybe = _domComputed.maybe;
|
|
86
|
+
export const maybeOwned = _domComputed.maybeOwned;
|
|
85
87
|
|
|
86
88
|
export const forEach = _domForEach.forEach;
|
|
87
89
|
|
package/lib/domComponent.ts
CHANGED
|
@@ -55,11 +55,7 @@
|
|
|
55
55
|
* disposed when the containing element is disposed, followed by the `owner` itself.
|
|
56
56
|
*/
|
|
57
57
|
import {MultiHolder} from './dispose';
|
|
58
|
-
import {
|
|
59
|
-
import {autoDisposeElem} from './domDispose';
|
|
60
|
-
|
|
61
|
-
export type DomContents = Node | string | DomComputed | void | null | undefined | IDomContentsArray;
|
|
62
|
-
export interface IDomContentsArray extends Array<DomContents> {}
|
|
58
|
+
import {domComputedOwned, DomContents} from './domComputed';
|
|
63
59
|
|
|
64
60
|
export interface IDomComponent {
|
|
65
61
|
buildDom(): DomContents;
|
|
@@ -83,18 +79,11 @@ type DomCreatorArgs<T> =
|
|
|
83
79
|
(T extends new (...args: infer P) => any ? P : never);
|
|
84
80
|
|
|
85
81
|
export function create<Fn extends IDomCreator<any[]>>(fn: Fn, ...args: DomCreatorArgs<Fn>): DomContents {
|
|
86
|
-
|
|
87
|
-
// Note that the callback to domComputed() is not called until the markers have been attached
|
|
88
|
-
// to the parent element. We attach the MultiHolder's disposal to markerPost the way
|
|
89
|
-
// domComputed() normally attaches its own bindings.
|
|
90
|
-
const owner = MultiHolder.create(null);
|
|
91
|
-
autoDisposeElem(markerPost, owner);
|
|
92
|
-
|
|
82
|
+
return domComputedOwned(null, (owner) => {
|
|
93
83
|
const value: DomComponentReturn = ('create' in fn) ?
|
|
94
84
|
(fn as IDomCreateClass<any[]>).create(owner, ...args) :
|
|
95
85
|
(fn as IDomCreateFunc<any[]>)(owner, ...args);
|
|
96
86
|
return (value && typeof value === 'object' && 'buildDom' in value) ?
|
|
97
87
|
value.buildDom() : value;
|
|
98
88
|
});
|
|
99
|
-
return [markerPre, markerPost, func];
|
|
100
89
|
}
|
package/lib/domComputed.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {BindableValue, subscribeElem} from './binding';
|
|
2
|
-
import {
|
|
2
|
+
import {Holder, MultiHolder} from './dispose';
|
|
3
|
+
import {autoDisposeElem, domDispose} from './domDispose';
|
|
3
4
|
import {DomArg, DomMethod, frag} from './domImpl';
|
|
4
5
|
|
|
5
6
|
// Use the browser globals in a way that allows replacing them with mocks in tests.
|
|
@@ -9,12 +10,16 @@ import {G} from './browserGlobals';
|
|
|
9
10
|
// name for use in places where a DomComputed is suitable but a general DomArg is not.
|
|
10
11
|
export type DomComputed = [Node, Node, DomMethod];
|
|
11
12
|
|
|
13
|
+
export type DomContents = Node | string | DomComputed | void | null | undefined | IDomContentsArray;
|
|
14
|
+
export interface IDomContentsArray extends Array<DomContents> {}
|
|
15
|
+
|
|
16
|
+
|
|
12
17
|
/**
|
|
13
18
|
* Replaces the content between nodeBefore and nodeAfter, which should be two siblings within the
|
|
14
19
|
* same parent node. New content may be anything allowed as an argument to dom(), including null
|
|
15
20
|
* to insert nothing. Runs disposers, if any, on all removed content.
|
|
16
21
|
*/
|
|
17
|
-
export function replaceContent(nodeBefore: Node, nodeAfter: Node, content:
|
|
22
|
+
export function replaceContent(nodeBefore: Node, nodeAfter: Node, content: DomContents): void {
|
|
18
23
|
const elem = nodeBefore.parentNode;
|
|
19
24
|
if (elem) {
|
|
20
25
|
let next;
|
|
@@ -67,9 +72,9 @@ export function replaceContent(nodeBefore: Node, nodeAfter: Node, content: DomAr
|
|
|
67
72
|
// Note that DomMethod is excluded because it prevents typescript from inferring the type of
|
|
68
73
|
// the first argument when it's a function (and it's not useful).
|
|
69
74
|
export function domComputed(valueObs: BindableValue<Exclude<DomArg, DomMethod>>): DomComputed;
|
|
70
|
-
export function domComputed<T>(valueObs: BindableValue<T>, contentFunc: (val: T) =>
|
|
75
|
+
export function domComputed<T>(valueObs: BindableValue<T>, contentFunc: (val: T) => DomContents): DomComputed;
|
|
71
76
|
export function domComputed<T>(
|
|
72
|
-
valueObs: BindableValue<T>, contentFunc: (val: T) =>
|
|
77
|
+
valueObs: BindableValue<T>, contentFunc: (val: T) => DomContents = identity as any,
|
|
73
78
|
): DomComputed {
|
|
74
79
|
const markerPre = G.document.createComment('a');
|
|
75
80
|
const markerPost = G.document.createComment('b');
|
|
@@ -82,6 +87,23 @@ export function domComputed<T>(
|
|
|
82
87
|
}];
|
|
83
88
|
}
|
|
84
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Like domComputed(), but the callback gets an additional first argument, owner, which may be
|
|
92
|
+
* used to take ownership of objects created by the callback. These will be disposed before each
|
|
93
|
+
* new call to the callback, and when the containing DOM is disposed.
|
|
94
|
+
*
|
|
95
|
+
* domComputedOwned(valueObs, (owner, value) => Editor.create(owner, value).renderSomething());
|
|
96
|
+
*/
|
|
97
|
+
export function domComputedOwned<T>(
|
|
98
|
+
valueObs: BindableValue<T>, contentFunc: (owner: MultiHolder, val: T) => DomContents
|
|
99
|
+
): DomComputed {
|
|
100
|
+
const holder = Holder.create(null);
|
|
101
|
+
const [markerPre, markerPost, func] = domComputed(valueObs,
|
|
102
|
+
(val: T) => contentFunc(MultiHolder.create(holder), val));
|
|
103
|
+
autoDisposeElem(markerPost, holder);
|
|
104
|
+
return [markerPre, markerPost, func];
|
|
105
|
+
}
|
|
106
|
+
|
|
85
107
|
function identity<T>(arg: T): T { return arg; }
|
|
86
108
|
|
|
87
109
|
/**
|
|
@@ -106,6 +128,19 @@ function identity<T>(arg: T): T { return arg; }
|
|
|
106
128
|
* @param boolValueObs: Observable or function for a computed.
|
|
107
129
|
* @param contentFunc: Called with the result of boolValueObs when it is truthy. Should return DOM.
|
|
108
130
|
*/
|
|
109
|
-
export function maybe<T>(boolValueObs: BindableValue<T>,
|
|
131
|
+
export function maybe<T>(boolValueObs: BindableValue<T>,
|
|
132
|
+
contentFunc: (val: NonNullable<T>) => DomContents): DomComputed {
|
|
110
133
|
return domComputed(boolValueObs, (value) => value ? contentFunc(value!) : null);
|
|
111
134
|
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Like maybe(), but the callback gets an additional first argument, owner, which may be used to
|
|
138
|
+
* take ownership of objects created by the callback. These will be disposed before each new call
|
|
139
|
+
* to the callback, and when the condition becomes false or the containing DOM gets disposed.
|
|
140
|
+
*
|
|
141
|
+
* maybeOwned(showEditor, (owner) => Editor.create(owner).renderSomething());
|
|
142
|
+
*/
|
|
143
|
+
export function maybeOwned<T>(boolValueObs: BindableValue<T>,
|
|
144
|
+
contentFunc: (owner: MultiHolder, val: NonNullable<T>) => DomContents): DomComputed {
|
|
145
|
+
return domComputedOwned(boolValueObs, (owner, value) => value ? contentFunc(owner, value!) : null);
|
|
146
|
+
}
|
package/lib/domForEach.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {replaceContent} from './domComputed';
|
|
1
|
+
import {DomContents, replaceContent} from './domComputed';
|
|
2
2
|
import {autoDisposeElem, domDispose} from './domDispose';
|
|
3
|
-
import {
|
|
3
|
+
import {frag} from './domImpl';
|
|
4
4
|
import {computedArray, MaybeObsArray, ObsArray} from './obsArray';
|
|
5
5
|
|
|
6
6
|
// Use the browser globals in a way that allows replacing them with mocks in tests.
|
|
@@ -24,13 +24,10 @@ import {G} from './browserGlobals';
|
|
|
24
24
|
* If you'd like to map the DOM node back to its source item, use dom.data() and dom.getData() in
|
|
25
25
|
* itemCreateFunc().
|
|
26
26
|
*/
|
|
27
|
-
export function forEach<T>(obsArray: MaybeObsArray<T>, itemCreateFunc: (item: T) => Node|null):
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
elem.appendChild(markerPre);
|
|
32
|
-
elem.appendChild(markerPost);
|
|
33
|
-
|
|
27
|
+
export function forEach<T>(obsArray: MaybeObsArray<T>, itemCreateFunc: (item: T) => Node|null): DomContents {
|
|
28
|
+
const markerPre = G.document.createComment('a');
|
|
29
|
+
const markerPost = G.document.createComment('b');
|
|
30
|
+
return [markerPre, markerPost, (elem: Node) => {
|
|
34
31
|
if (Array.isArray(obsArray)) {
|
|
35
32
|
replaceContent(markerPre, markerPost, obsArray.map(itemCreateFunc));
|
|
36
33
|
return;
|
|
@@ -72,5 +69,5 @@ export function forEach<T>(obsArray: MaybeObsArray<T>, itemCreateFunc: (item: T)
|
|
|
72
69
|
}
|
|
73
70
|
});
|
|
74
71
|
replaceContent(markerPre, markerPost, nodes.get());
|
|
75
|
-
};
|
|
72
|
+
}];
|
|
76
73
|
}
|
package/lib/domevent.ts
CHANGED
|
@@ -171,7 +171,7 @@ export function onKeyElem<T extends HTMLElement>(
|
|
|
171
171
|
const plainHandler = keyHandlers[ev.key];
|
|
172
172
|
const handler = plainHandler || keyHandlers[ev.key + '$'];
|
|
173
173
|
if (handler) {
|
|
174
|
-
if (plainHandler) {
|
|
174
|
+
if (plainHandler!) {
|
|
175
175
|
ev.stopPropagation();
|
|
176
176
|
ev.preventDefault();
|
|
177
177
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grainjs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "JS library from Grist Labs",
|
|
5
5
|
"main": "dist/cjs/index",
|
|
6
6
|
"module": "dist/esm/index",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"test-browser-headless": "MOCHA_WEBDRIVER_ARGS='--no-sandbox --disable-gpu' MOCHA_WEBDRIVER_HEADLESS=1 mocha 'test/browser/*.{js,ts}'",
|
|
17
17
|
"test-browser": "mocha 'test/browser/*.{js,ts}'",
|
|
18
18
|
"test-browser-debug": "mocha --bail --no-exit 'test/browser/*.{js,ts}'",
|
|
19
|
-
"test-types": "dtslint --
|
|
19
|
+
"test-types": "dtslint --localTs node_modules/typescript/lib --expectOnly test/types",
|
|
20
20
|
"prepack": "npm run build && npm test"
|
|
21
21
|
},
|
|
22
22
|
"keywords": [
|
|
@@ -57,39 +57,38 @@
|
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@types/chai": "^4.
|
|
61
|
-
"@types/chai-as-promised": "^7.1.
|
|
62
|
-
"@types/jsdom": "^
|
|
63
|
-
"@types/lodash": "^4.14.
|
|
64
|
-
"@types/mocha": "^
|
|
65
|
-
"@types/node": "^
|
|
66
|
-
"@types/selenium-webdriver": "^4.0.
|
|
67
|
-
"@types/sinon": "^
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"chai": "^4.1.0",
|
|
60
|
+
"@types/chai": "^4.2.18",
|
|
61
|
+
"@types/chai-as-promised": "^7.1.4",
|
|
62
|
+
"@types/jsdom": "^16.2.11",
|
|
63
|
+
"@types/lodash": "^4.14.170",
|
|
64
|
+
"@types/mocha": "^8.2.2",
|
|
65
|
+
"@types/node": "^15.12.2",
|
|
66
|
+
"@types/selenium-webdriver": "^4.0.13",
|
|
67
|
+
"@types/sinon": "^10.0.2",
|
|
68
|
+
"browserify": "^17.0.0",
|
|
69
|
+
"chai": "^4.3.4",
|
|
71
70
|
"chai-as-promised": "^7.1.1",
|
|
72
|
-
"chromedriver": "^
|
|
73
|
-
"create-react-app": "^
|
|
74
|
-
"dtslint": "^
|
|
75
|
-
"fastpriorityqueue": "^0.
|
|
76
|
-
"geckodriver": "^
|
|
77
|
-
"jsdom": "
|
|
78
|
-
"knockout": "^3.5.
|
|
79
|
-
"lodash": "^4.17.
|
|
80
|
-
"mocha": "^
|
|
81
|
-
"mocha-webdriver": "^0.
|
|
82
|
-
"nyc": "^
|
|
83
|
-
"selenium-webdriver": "^4.0.0-
|
|
84
|
-
"sinon": "^
|
|
85
|
-
"ts-loader": "^
|
|
86
|
-
"ts-node": "^
|
|
87
|
-
"tslint": "^
|
|
88
|
-
"typescript": "~3.
|
|
89
|
-
"typescript-tslint-plugin": "^0.
|
|
71
|
+
"chromedriver": "^91.0.0",
|
|
72
|
+
"create-react-app": "^4.0.3",
|
|
73
|
+
"dtslint": "^4.1.0",
|
|
74
|
+
"fastpriorityqueue": "^0.7.1",
|
|
75
|
+
"geckodriver": "^2.0.0",
|
|
76
|
+
"jsdom": "16.6.0",
|
|
77
|
+
"knockout": "^3.5.1",
|
|
78
|
+
"lodash": "^4.17.21",
|
|
79
|
+
"mocha": "^9.0.0",
|
|
80
|
+
"mocha-webdriver": "^0.2.9",
|
|
81
|
+
"nyc": "^15.1.0",
|
|
82
|
+
"selenium-webdriver": "^4.0.0-beta.4",
|
|
83
|
+
"sinon": "^11.1.1",
|
|
84
|
+
"ts-loader": "^9.2.3",
|
|
85
|
+
"ts-node": "^10.0.0",
|
|
86
|
+
"tslint": "^6.1.3",
|
|
87
|
+
"typescript": "~4.3.2",
|
|
88
|
+
"typescript-tslint-plugin": "^1.0.1",
|
|
90
89
|
"uglify-es": "^3.2.0",
|
|
91
|
-
"webpack": "^
|
|
92
|
-
"webpack-cli": "^
|
|
93
|
-
"webpack-dev-server": "^3.
|
|
90
|
+
"webpack": "^5.38.1",
|
|
91
|
+
"webpack-cli": "^4.7.2",
|
|
92
|
+
"webpack-dev-server": "^3.11.2"
|
|
94
93
|
}
|
|
95
94
|
}
|