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.
Files changed (78) hide show
  1. package/README.md +54 -9
  2. package/dist/cjs/index.js +24 -17
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/lib/PriorityQueue.d.ts +1 -1
  5. package/dist/cjs/lib/PriorityQueue.js +1 -0
  6. package/dist/cjs/lib/PriorityQueue.js.map +1 -1
  7. package/dist/cjs/lib/_computed_queue.js +1 -0
  8. package/dist/cjs/lib/_computed_queue.js.map +1 -1
  9. package/dist/cjs/lib/binding.js +1 -0
  10. package/dist/cjs/lib/binding.js.map +1 -1
  11. package/dist/cjs/lib/browserGlobals.d.ts +4 -1
  12. package/dist/cjs/lib/browserGlobals.js +2 -0
  13. package/dist/cjs/lib/browserGlobals.js.map +1 -1
  14. package/dist/cjs/lib/computed.js +1 -0
  15. package/dist/cjs/lib/computed.js.map +1 -1
  16. package/dist/cjs/lib/dispose.js +1 -0
  17. package/dist/cjs/lib/dispose.js.map +1 -1
  18. package/dist/cjs/lib/dom.d.ts +2 -0
  19. package/dist/cjs/lib/dom.js +20 -10
  20. package/dist/cjs/lib/dom.js.map +1 -1
  21. package/dist/cjs/lib/domComponent.d.ts +1 -4
  22. package/dist/cjs/lib/domComponent.js +2 -65
  23. package/dist/cjs/lib/domComponent.js.map +1 -1
  24. package/dist/cjs/lib/domComputed.d.ts +23 -3
  25. package/dist/cjs/lib/domComputed.js +27 -0
  26. package/dist/cjs/lib/domComputed.js.map +1 -1
  27. package/dist/cjs/lib/domDispose.js +1 -0
  28. package/dist/cjs/lib/domDispose.js.map +1 -1
  29. package/dist/cjs/lib/domForEach.d.ts +2 -2
  30. package/dist/cjs/lib/domForEach.js +38 -39
  31. package/dist/cjs/lib/domForEach.js.map +1 -1
  32. package/dist/cjs/lib/domImpl.js +1 -0
  33. package/dist/cjs/lib/domImpl.js.map +1 -1
  34. package/dist/cjs/lib/domMethods.js +3 -1
  35. package/dist/cjs/lib/domMethods.js.map +1 -1
  36. package/dist/cjs/lib/domevent.js +1 -0
  37. package/dist/cjs/lib/domevent.js.map +1 -1
  38. package/dist/cjs/lib/emit.js +1 -0
  39. package/dist/cjs/lib/emit.js.map +1 -1
  40. package/dist/cjs/lib/kowrap.js +1 -0
  41. package/dist/cjs/lib/kowrap.js.map +1 -1
  42. package/dist/cjs/lib/obsArray.js +1 -0
  43. package/dist/cjs/lib/obsArray.js.map +1 -1
  44. package/dist/cjs/lib/observable.js +2 -1
  45. package/dist/cjs/lib/observable.js.map +1 -1
  46. package/dist/cjs/lib/pureComputed.js +1 -0
  47. package/dist/cjs/lib/pureComputed.js.map +1 -1
  48. package/dist/cjs/lib/styled.js +1 -0
  49. package/dist/cjs/lib/styled.js.map +1 -1
  50. package/dist/cjs/lib/subscribe.js +1 -0
  51. package/dist/cjs/lib/subscribe.js.map +1 -1
  52. package/dist/cjs/lib/util.js +1 -0
  53. package/dist/cjs/lib/util.js.map +1 -1
  54. package/dist/cjs/lib/widgets/input.js +1 -0
  55. package/dist/cjs/lib/widgets/input.js.map +1 -1
  56. package/dist/cjs/lib/widgets/select.js +1 -0
  57. package/dist/cjs/lib/widgets/select.js.map +1 -1
  58. package/dist/esm/lib/browserGlobals.js +1 -0
  59. package/dist/esm/lib/browserGlobals.js.map +1 -1
  60. package/dist/esm/lib/dom.js +2 -0
  61. package/dist/esm/lib/dom.js.map +1 -1
  62. package/dist/esm/lib/domComponent.js +2 -66
  63. package/dist/esm/lib/domComponent.js.map +1 -1
  64. package/dist/esm/lib/domComputed.js +25 -1
  65. package/dist/esm/lib/domComputed.js.map +1 -1
  66. package/dist/esm/lib/domForEach.js +37 -39
  67. package/dist/esm/lib/domForEach.js.map +1 -1
  68. package/dist/esm/lib/domevent.js.map +1 -1
  69. package/dist/grain-full.debug.js +137 -135
  70. package/dist/grain-full.min.js +1 -1
  71. package/dist/grain-full.min.js.map +1 -1
  72. package/lib/browserGlobals.ts +3 -1
  73. package/lib/dom.ts +2 -0
  74. package/lib/domComponent.ts +2 -13
  75. package/lib/domComputed.ts +40 -5
  76. package/lib/domForEach.ts +7 -10
  77. package/lib/domevent.ts +1 -1
  78. package/package.json +33 -34
@@ -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: IBrowserGlobals): void {
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
 
@@ -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 {domComputed, DomComputed} from './domComputed';
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
- const [markerPre, markerPost, func] = domComputed(null, () => {
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
  }
@@ -1,5 +1,6 @@
1
1
  import {BindableValue, subscribeElem} from './binding';
2
- import {domDispose} from './domDispose';
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: DomArg): void {
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) => DomArg): DomComputed;
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) => DomArg = identity as any,
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>, contentFunc: (val: NonNullable<T>) => DomArg): DomComputed {
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 {DomMethod, frag} from './domImpl';
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): DomMethod {
28
- return (elem: Node) => {
29
- const markerPre = G.document.createComment('a');
30
- const markerPost = G.document.createComment('b');
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.1",
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 --onlyTestTsNext --expectOnly test/types",
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.1.2",
61
- "@types/chai-as-promised": "^7.1.0",
62
- "@types/jsdom": "^12.2.0",
63
- "@types/lodash": "^4.14.100",
64
- "@types/mocha": "^5.2.5",
65
- "@types/node": "^11.13.8",
66
- "@types/selenium-webdriver": "^4.0.0",
67
- "@types/sinon": "^7.0.11",
68
- "@types/webpack-dev-server": "^3.1.5",
69
- "browserify": "^16.2.3",
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": "^74.0.0",
73
- "create-react-app": "^3.0.0",
74
- "dtslint": "^0.7.1",
75
- "fastpriorityqueue": "^0.6.1",
76
- "geckodriver": "^1.11.0",
77
- "jsdom": "15.0.0",
78
- "knockout": "^3.5.0",
79
- "lodash": "^4.17.15",
80
- "mocha": "^6.1.4",
81
- "mocha-webdriver": "^0.1.13",
82
- "nyc": "^14.0.0",
83
- "selenium-webdriver": "^4.0.0-alpha.1",
84
- "sinon": "^7.1.0",
85
- "ts-loader": "^5.2.2",
86
- "ts-node": "^8.1.0",
87
- "tslint": "^5.11.0",
88
- "typescript": "~3.4.5",
89
- "typescript-tslint-plugin": "^0.3.1",
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": "^4.15.1",
92
- "webpack-cli": "^3.0.8",
93
- "webpack-dev-server": "^3.3.1"
90
+ "webpack": "^5.38.1",
91
+ "webpack-cli": "^4.7.2",
92
+ "webpack-dev-server": "^3.11.2"
94
93
  }
95
94
  }