@nxtedition/lib 13.2.3 → 14.0.0-alpha.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/lib",
3
- "version": "13.2.3",
3
+ "version": "14.0.0-alpha.1",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "files": [
@@ -1,5 +1,5 @@
1
1
  const rx = require('rxjs/operators')
2
- const Observable = require('rxjs')
2
+ const rxjs = require('rxjs')
3
3
  const fp = require('lodash/fp')
4
4
  const getNxtpressionsCompiler = require('./nextpressions')
5
5
  const getJavascriptCompiler = require('./javascript')
@@ -22,52 +22,86 @@ module.exports = (options) => {
22
22
  try {
23
23
  return compileObjectTemplate(obj)(...args)
24
24
  } catch (err) {
25
- return Observable.throwError(err)
25
+ return rxjs.throwError(err)
26
26
  }
27
27
  }
28
28
 
29
- // TODO (perf): Optimize...
30
- const compileArrayTemplate = weakCache(function compileArrayTemplate(arr) {
29
+ const compileArrayTemplateLazy = (arr) => {
31
30
  if (!fp.isArray(arr)) {
32
31
  throw new Error('invalid argument')
33
32
  }
34
33
 
35
- if (arr.length === 0) {
36
- return () => Observable.of([])
34
+ let resolvers
35
+ let indices
36
+
37
+ for (let i = 0; i < arr.length; i++) {
38
+ const resolver = compileTemplateLazy(arr[i])
39
+ if (resolver) {
40
+ resolvers ??= []
41
+ resolvers.push(resolver)
42
+ indices ??= []
43
+ indices.push(i)
44
+ }
45
+ }
46
+
47
+ if (!resolvers) {
48
+ return null
37
49
  }
38
50
 
39
- const resolvers = arr.map((template) => compileTemplate(template))
51
+ return (...args) =>
52
+ rxjs.combineLatest(resolvers.map((resolver) => resolver(...args))).pipe(
53
+ rx.map((values) => {
54
+ const ret = [...arr]
55
+ for (let n = 0; n < values.length; n++) {
56
+ ret[indices[n]] = values[n]
57
+ }
58
+ return ret
59
+ })
60
+ )
61
+ }
40
62
 
41
- return (...args) => Observable.combineLatest(resolvers.map((resolver) => resolver(...args)))
63
+ const compileArrayTemplate = weakCache(function compileArrayTemplate(arr) {
64
+ return compileArrayTemplateLazy(arr) ?? (() => rxjs.of(arr))
42
65
  })
43
66
 
44
- // TODO (perf): Optimize...
45
- const compileObjectTemplate = weakCache(function compileObjectTemplate(obj) {
67
+ const compileObjectTemplateLazy = (obj) => {
46
68
  if (!fp.isPlainObject(obj)) {
47
69
  throw new Error('invalid argument')
48
70
  }
49
71
 
50
- const xs = []
51
- for (const key of Object.keys(obj)) {
52
- xs.push(key, obj[key])
53
- }
72
+ let resolvers
73
+ let indices
54
74
 
55
- if (xs.length === 0) {
56
- return () => Observable.of({})
75
+ const keys = Object.keys(obj)
76
+
77
+ for (let i = 0; i < keys.length; i++) {
78
+ const resolver = compileTemplateLazy(obj[keys[i]])
79
+ if (resolver) {
80
+ resolvers ??= []
81
+ resolvers.push(resolver)
82
+ indices ??= []
83
+ indices.push(keys[i])
84
+ }
57
85
  }
58
86
 
59
- const resolvers = xs.map((template) => compileTemplate(template))
87
+ if (!resolvers) {
88
+ return null
89
+ }
60
90
 
61
91
  return (...args) =>
62
- Observable.combineLatest(resolvers.map((resolver) => resolver(...args))).pipe(
63
- rx.map((ys) => {
64
- const ret = {}
65
- for (let n = 0; n < ys.length; n += 2) {
66
- ret[ys[n + 0]] = ys[n + 1]
92
+ rxjs.combineLatest(resolvers.map((resolver) => resolver(...args))).pipe(
93
+ rx.map((values) => {
94
+ const ret = { ...obj }
95
+ for (let n = 0; n < values.length; n++) {
96
+ ret[indices[n]] = values[n]
67
97
  }
68
98
  return ret
69
99
  })
70
100
  )
101
+ }
102
+
103
+ const compileObjectTemplate = weakCache(function compileObjectTemplate(obj) {
104
+ return compileObjectTemplateLazy(obj) ?? (() => rxjs.of(obj))
71
105
  })
72
106
 
73
107
  function inner(str) {
@@ -98,7 +132,7 @@ module.exports = (options) => {
98
132
  }
99
133
  }
100
134
 
101
- const compileStringTemplate = weakCache(function compileStringTemplate(str) {
135
+ const compileStringTemplateLazy = weakCache(function compileStringTemplatLazy(str) {
102
136
  if (!fp.isString(str)) {
103
137
  throw new Error('invalid argument')
104
138
  }
@@ -106,7 +140,7 @@ module.exports = (options) => {
106
140
  const match = inner(str)
107
141
 
108
142
  if (!match) {
109
- return () => Observable.of(str)
143
+ return null
110
144
  }
111
145
 
112
146
  const { pre, type, body, post } = match
@@ -130,6 +164,10 @@ module.exports = (options) => {
130
164
  )
131
165
  })
132
166
 
167
+ const compileStringTemplate = function compileStringTemplate(str) {
168
+ return compileStringTemplateLazy(str) ?? (() => rxjs.of(str))
169
+ }
170
+
133
171
  function stringify(value, escape) {
134
172
  if (value == null) {
135
173
  return ''
@@ -145,6 +183,18 @@ module.exports = (options) => {
145
183
  return typeof val === 'string' && val.indexOf('{{') !== -1
146
184
  }
147
185
 
186
+ function compileTemplateLazy(template) {
187
+ if (fp.isPlainObject(template)) {
188
+ return compileObjectTemplateLazy(template)
189
+ } else if (fp.isArray(template)) {
190
+ return compileArrayTemplateLazy(template)
191
+ } else if (fp.isString(template)) {
192
+ return compileStringTemplateLazy(template)
193
+ } else {
194
+ return null
195
+ }
196
+ }
197
+
148
198
  function compileTemplate(template) {
149
199
  if (fp.isPlainObject(template)) {
150
200
  return compileObjectTemplate(template)
@@ -153,7 +203,7 @@ module.exports = (options) => {
153
203
  } else if (fp.isString(template)) {
154
204
  return compileStringTemplate(template)
155
205
  } else {
156
- return () => Observable.of(template)
206
+ return () => rxjs.of(template)
157
207
  }
158
208
  }
159
209
 
@@ -165,13 +215,13 @@ module.exports = (options) => {
165
215
 
166
216
  function onResolveTemplate(str, ...args) {
167
217
  if (fp.isString(str) && str.lastIndexOf('{{') === -1) {
168
- return Observable.of(str)
218
+ return rxjs.of(str)
169
219
  }
170
220
 
171
221
  try {
172
222
  return compileTemplate(str)(...args)
173
223
  } catch (err) {
174
- return Observable.throwError(err)
224
+ return rxjs.throwError(err)
175
225
  }
176
226
  }
177
227
 
package/weakCache.js CHANGED
@@ -18,8 +18,10 @@ module.exports = function weakCache(valueSelector, keySelector) {
18
18
  }
19
19
  }
20
20
  const value = valueSelector(...args)
21
- cache.set(key, new WeakRef(value))
22
- finalizationRegistry.register(value, key)
21
+ if (value != null) {
22
+ cache.set(key, new WeakRef(value))
23
+ finalizationRegistry.register(value, key)
24
+ }
23
25
  return value
24
26
  }
25
27
  }