@math.gl/expressions 4.2.0-alpha.5
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/LICENSE +140 -0
- package/README.md +12 -0
- package/dist/dggs.cjs +54 -0
- package/dist/dggs.cjs.map +6 -0
- package/dist/dggs.d.ts +18 -0
- package/dist/dggs.d.ts.map +1 -0
- package/dist/dggs.js +42 -0
- package/dist/dggs.js.map +1 -0
- package/dist/expression-eval.d.ts +103 -0
- package/dist/expression-eval.d.ts.map +1 -0
- package/dist/expression-eval.js +298 -0
- package/dist/expression-eval.js.map +1 -0
- package/dist/function-libraries.d.ts +75 -0
- package/dist/function-libraries.d.ts.map +1 -0
- package/dist/function-libraries.js +98 -0
- package/dist/function-libraries.js.map +1 -0
- package/dist/function-registry.d.ts +93 -0
- package/dist/function-registry.d.ts.map +1 -0
- package/dist/function-registry.js +131 -0
- package/dist/function-registry.js.map +1 -0
- package/dist/get.d.ts +9 -0
- package/dist/get.d.ts.map +1 -0
- package/dist/get.js +32 -0
- package/dist/get.js.map +1 -0
- package/dist/index.cjs +473 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/parse-expression-string.d.ts +21 -0
- package/dist/parse-expression-string.d.ts.map +1 -0
- package/dist/parse-expression-string.js +61 -0
- package/dist/parse-expression-string.js.map +1 -0
- package/package.json +50 -0
- package/src/dggs.ts +62 -0
- package/src/expression-eval.ts +426 -0
- package/src/function-libraries.ts +168 -0
- package/src/function-registry.ts +163 -0
- package/src/get.ts +37 -0
- package/src/index.ts +26 -0
- package/src/parse-expression-string.ts +80 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
// math.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
/**
|
|
5
|
+
* Sources:
|
|
6
|
+
* - Copyright (c) 2013 Stephen Oney, http://jsep.from.so/, MIT License
|
|
7
|
+
* - Copyright (c) 2023 Don McCurdy, https://github.com/donmccurdy/expression-eval, MIT License
|
|
8
|
+
*/
|
|
9
|
+
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/restrict-plus-operands */
|
|
10
|
+
import jsep from 'jsep';
|
|
11
|
+
import { mergeFunctionLibraries } from "./function-libraries.js";
|
|
12
|
+
const DEFAULT_PRECEDENCE = {
|
|
13
|
+
'||': 1,
|
|
14
|
+
'&&': 2,
|
|
15
|
+
'|': 3,
|
|
16
|
+
'^': 4,
|
|
17
|
+
'&': 5,
|
|
18
|
+
'==': 6,
|
|
19
|
+
'!=': 6,
|
|
20
|
+
'===': 6,
|
|
21
|
+
'!==': 6,
|
|
22
|
+
'<': 7,
|
|
23
|
+
'>': 7,
|
|
24
|
+
'<=': 7,
|
|
25
|
+
'>=': 7,
|
|
26
|
+
'<<': 8,
|
|
27
|
+
'>>': 8,
|
|
28
|
+
'>>>': 8,
|
|
29
|
+
'+': 9,
|
|
30
|
+
'-': 9,
|
|
31
|
+
'*': 10,
|
|
32
|
+
'/': 10,
|
|
33
|
+
'%': 10
|
|
34
|
+
};
|
|
35
|
+
const binops = {
|
|
36
|
+
'||': (a, b) => a || b,
|
|
37
|
+
'&&': (a, b) => a && b,
|
|
38
|
+
'|': (a, b) => a | b,
|
|
39
|
+
'^': (a, b) => a ^ b,
|
|
40
|
+
'&': (a, b) => a & b,
|
|
41
|
+
'==': (a, b) => {
|
|
42
|
+
// biome-ignore lint/suspicious/noDoubleEquals: this operator implements JavaScript loose equality.
|
|
43
|
+
return a == b;
|
|
44
|
+
},
|
|
45
|
+
'!=': (a, b) => {
|
|
46
|
+
// biome-ignore lint/suspicious/noDoubleEquals: this operator implements JavaScript loose inequality.
|
|
47
|
+
return a != b;
|
|
48
|
+
},
|
|
49
|
+
'===': (a, b) => a === b,
|
|
50
|
+
'!==': (a, b) => a !== b,
|
|
51
|
+
'<': (a, b) => a < b,
|
|
52
|
+
'>': (a, b) => a > b,
|
|
53
|
+
'<=': (a, b) => a <= b,
|
|
54
|
+
'>=': (a, b) => a >= b,
|
|
55
|
+
'<<': (a, b) => a << b,
|
|
56
|
+
'>>': (a, b) => a >> b,
|
|
57
|
+
'>>>': (a, b) => a >>> b,
|
|
58
|
+
'+': (a, b) => {
|
|
59
|
+
// @ts-expect-error Addition intentionally supports JS coercion semantics.
|
|
60
|
+
return a + b;
|
|
61
|
+
},
|
|
62
|
+
'-': (a, b) => a - b,
|
|
63
|
+
'*': (a, b) => a * b,
|
|
64
|
+
'/': (a, b) => a / b,
|
|
65
|
+
'%': (a, b) => a % b
|
|
66
|
+
};
|
|
67
|
+
const unops = {
|
|
68
|
+
'-': (a) => -a,
|
|
69
|
+
'+': (a) => {
|
|
70
|
+
// eslint-disable-next-line no-implicit-coercion
|
|
71
|
+
return +a;
|
|
72
|
+
},
|
|
73
|
+
'~': (a) => ~a,
|
|
74
|
+
'!': (a) => !a
|
|
75
|
+
};
|
|
76
|
+
function evaluateArray(list, context) {
|
|
77
|
+
return list.map(value => evaluate(value, context));
|
|
78
|
+
}
|
|
79
|
+
/** Evaluates each expression in an array concurrently. */
|
|
80
|
+
async function evaluateArrayAsync(list, context) {
|
|
81
|
+
return await Promise.all(list.map(value => evalAsync(value, context)));
|
|
82
|
+
}
|
|
83
|
+
/** Resolves a member expression and preserves its receiver for method calls. */
|
|
84
|
+
function evaluateMember(node, context) {
|
|
85
|
+
const object = evaluate(node.object, context);
|
|
86
|
+
const key = node.computed
|
|
87
|
+
? evaluate(node.property, context)
|
|
88
|
+
: node.property.name;
|
|
89
|
+
if (/^__proto__|prototype|constructor$/.test(key)) {
|
|
90
|
+
throw new Error(`Access to member "${key}" disallowed.`);
|
|
91
|
+
}
|
|
92
|
+
return [object, object?.[key]];
|
|
93
|
+
}
|
|
94
|
+
/** Asynchronously resolves a member expression and its receiver. */
|
|
95
|
+
async function evaluateMemberAsync(node, context) {
|
|
96
|
+
const object = (await evalAsync(node.object, context));
|
|
97
|
+
const key = node.computed
|
|
98
|
+
? (await evalAsync(node.property, context))
|
|
99
|
+
: node.property.name;
|
|
100
|
+
if (/^__proto__|prototype|constructor$/.test(key)) {
|
|
101
|
+
throw new Error(`Access to member "${key}" disallowed.`);
|
|
102
|
+
}
|
|
103
|
+
return [object, object?.[key]];
|
|
104
|
+
}
|
|
105
|
+
/** Evaluates one expression node synchronously. */
|
|
106
|
+
// eslint-disable-next-line complexity
|
|
107
|
+
function evaluateExpression(node, context, options) {
|
|
108
|
+
const expression = node;
|
|
109
|
+
const mergedContext = mergeFunctionLibraries(context, options);
|
|
110
|
+
switch (expression.type) {
|
|
111
|
+
case 'ArrayExpression':
|
|
112
|
+
return evaluateArray(expression.elements, mergedContext);
|
|
113
|
+
case 'BinaryExpression':
|
|
114
|
+
if (expression.operator === '||') {
|
|
115
|
+
return (evaluate(expression.left, mergedContext) || evaluate(expression.right, mergedContext));
|
|
116
|
+
}
|
|
117
|
+
if (expression.operator === '&&') {
|
|
118
|
+
return (evaluate(expression.left, mergedContext) && evaluate(expression.right, mergedContext));
|
|
119
|
+
}
|
|
120
|
+
return binops[expression.operator](evaluate(expression.left, mergedContext), evaluate(expression.right, mergedContext));
|
|
121
|
+
case 'CallExpression': {
|
|
122
|
+
let caller;
|
|
123
|
+
let fn;
|
|
124
|
+
if (expression.callee.type === 'MemberExpression') {
|
|
125
|
+
const member = evaluateMember(expression.callee, mergedContext);
|
|
126
|
+
caller = member[0];
|
|
127
|
+
fn = member[1];
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
fn = evaluate(expression.callee, mergedContext);
|
|
131
|
+
}
|
|
132
|
+
if (typeof fn !== 'function') {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
return fn.apply(caller, evaluateArray(expression.arguments, mergedContext));
|
|
136
|
+
}
|
|
137
|
+
case 'ConditionalExpression':
|
|
138
|
+
return evaluate(expression.test, mergedContext)
|
|
139
|
+
? evaluate(expression.consequent, mergedContext)
|
|
140
|
+
: evaluate(expression.alternate, mergedContext);
|
|
141
|
+
case 'Identifier':
|
|
142
|
+
return mergedContext[expression.name];
|
|
143
|
+
case 'Literal':
|
|
144
|
+
return expression.value;
|
|
145
|
+
case 'MemberExpression':
|
|
146
|
+
return evaluateMember(expression, mergedContext)[1];
|
|
147
|
+
case 'ThisExpression':
|
|
148
|
+
return mergedContext;
|
|
149
|
+
case 'UnaryExpression':
|
|
150
|
+
return unops[expression.operator](evaluate(expression.argument, mergedContext));
|
|
151
|
+
default:
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Evaluates a nested expression using an already-merged context. */
|
|
156
|
+
function evaluate(node, context) {
|
|
157
|
+
return evaluateExpression(node, context);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Evaluates a parsed expression asynchronously.
|
|
161
|
+
*
|
|
162
|
+
* @param node - Expression AST to evaluate.
|
|
163
|
+
* @param context - Named values and functions available to the expression.
|
|
164
|
+
* @param options - Function libraries to add to the context.
|
|
165
|
+
* @returns The resolved expression value.
|
|
166
|
+
*
|
|
167
|
+
* @remarks
|
|
168
|
+
* Function calls are awaited, including calls nested inside arrays, member
|
|
169
|
+
* expressions, conditionals, unary expressions, and binary expressions.
|
|
170
|
+
*/
|
|
171
|
+
// eslint-disable-next-line complexity
|
|
172
|
+
export async function evalAsync(node, context, options) {
|
|
173
|
+
const expression = node;
|
|
174
|
+
const mergedContext = mergeFunctionLibraries(context, options);
|
|
175
|
+
switch (expression.type) {
|
|
176
|
+
case 'ArrayExpression':
|
|
177
|
+
return await evaluateArrayAsync(expression.elements, mergedContext);
|
|
178
|
+
case 'BinaryExpression':
|
|
179
|
+
if (expression.operator === '||') {
|
|
180
|
+
return ((await evalAsync(expression.left, mergedContext)) ||
|
|
181
|
+
(await evalAsync(expression.right, mergedContext)));
|
|
182
|
+
}
|
|
183
|
+
if (expression.operator === '&&') {
|
|
184
|
+
return ((await evalAsync(expression.left, mergedContext)) &&
|
|
185
|
+
(await evalAsync(expression.right, mergedContext)));
|
|
186
|
+
}
|
|
187
|
+
return binops[expression.operator](await evalAsync(expression.left, mergedContext), await evalAsync(expression.right, mergedContext));
|
|
188
|
+
case 'CallExpression': {
|
|
189
|
+
let caller;
|
|
190
|
+
let fn;
|
|
191
|
+
if (expression.callee.type === 'MemberExpression') {
|
|
192
|
+
const member = await evaluateMemberAsync(expression.callee, mergedContext);
|
|
193
|
+
caller = member[0];
|
|
194
|
+
fn = member[1];
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
fn = (await evalAsync(expression.callee, mergedContext));
|
|
198
|
+
}
|
|
199
|
+
if (typeof fn !== 'function') {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
return await fn.apply(caller, await evaluateArrayAsync(expression.arguments, mergedContext));
|
|
203
|
+
}
|
|
204
|
+
case 'ConditionalExpression':
|
|
205
|
+
return (await evalAsync(expression.test, mergedContext))
|
|
206
|
+
? await evalAsync(expression.consequent, mergedContext)
|
|
207
|
+
: await evalAsync(expression.alternate, mergedContext);
|
|
208
|
+
case 'Identifier':
|
|
209
|
+
return mergedContext[expression.name];
|
|
210
|
+
case 'Literal':
|
|
211
|
+
return expression.value;
|
|
212
|
+
case 'MemberExpression':
|
|
213
|
+
return (await evaluateMemberAsync(expression, mergedContext))[1];
|
|
214
|
+
case 'ThisExpression':
|
|
215
|
+
return mergedContext;
|
|
216
|
+
case 'UnaryExpression':
|
|
217
|
+
return unops[expression.operator](await evalAsync(expression.argument, mergedContext));
|
|
218
|
+
default:
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Compiles an expression into a reusable synchronous evaluator.
|
|
224
|
+
*
|
|
225
|
+
* @param expression - Expression source or a previously parsed AST.
|
|
226
|
+
* @param options - Function libraries to add to each evaluation context.
|
|
227
|
+
* @returns A function that evaluates the expression against a context.
|
|
228
|
+
*/
|
|
229
|
+
export function compile(expression, options) {
|
|
230
|
+
const ast = parse(expression);
|
|
231
|
+
return (context) => evaluateExpression(ast, context, options);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Compiles an expression into a reusable asynchronous evaluator.
|
|
235
|
+
*
|
|
236
|
+
* @param expression - Expression source or a previously parsed AST.
|
|
237
|
+
* @param options - Function libraries to add to each evaluation context.
|
|
238
|
+
* @returns A function that asynchronously evaluates the expression.
|
|
239
|
+
*/
|
|
240
|
+
export function compileAsync(expression, options) {
|
|
241
|
+
const ast = parse(expression);
|
|
242
|
+
return (context) => evalAsync(ast, context, options);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Registers a custom unary operator with the parser and evaluator.
|
|
246
|
+
*
|
|
247
|
+
* @param operator - Operator token to register.
|
|
248
|
+
* @param fn - Evaluator implementation for the operator.
|
|
249
|
+
*
|
|
250
|
+
* @remarks
|
|
251
|
+
* Registration changes module-global parser state and affects subsequent
|
|
252
|
+
* calls to {@link parse}.
|
|
253
|
+
*/
|
|
254
|
+
export function addUnaryOp(operator, fn) {
|
|
255
|
+
jsep.addUnaryOp(operator);
|
|
256
|
+
unops[operator] = fn;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Registers a custom binary operator with the parser and evaluator.
|
|
260
|
+
*
|
|
261
|
+
* @param operator - Operator token to register.
|
|
262
|
+
* @param precedenceOrFn - Parser precedence, or the evaluator implementation
|
|
263
|
+
* when using the default precedence for a built-in operator.
|
|
264
|
+
* @param fn - Evaluator implementation when an explicit precedence is given.
|
|
265
|
+
*
|
|
266
|
+
* @remarks
|
|
267
|
+
* Registration changes module-global parser state and affects subsequent
|
|
268
|
+
* calls to {@link parse}. New operators should provide explicit precedence.
|
|
269
|
+
*/
|
|
270
|
+
export function addBinaryOp(operator, precedenceOrFn, fn) {
|
|
271
|
+
if (fn) {
|
|
272
|
+
jsep.addBinaryOp(operator, precedenceOrFn);
|
|
273
|
+
binops[operator] = fn;
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
jsep.addBinaryOp(operator, DEFAULT_PRECEDENCE[operator] || 1);
|
|
277
|
+
binops[operator] = precedenceOrFn;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Parses expression source into a JSEP abstract syntax tree.
|
|
281
|
+
*
|
|
282
|
+
* @param expression - Expression source or an existing AST.
|
|
283
|
+
* @returns A parsed AST, or the supplied AST unchanged.
|
|
284
|
+
* @throws If the expression string is not valid JSEP syntax.
|
|
285
|
+
*/
|
|
286
|
+
export function parse(expression) {
|
|
287
|
+
return typeof expression === 'string' ? jsep(expression) : expression;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Evaluates a parsed expression synchronously.
|
|
291
|
+
*
|
|
292
|
+
* @param node - Expression AST to evaluate.
|
|
293
|
+
* @param context - Named values and functions available to the expression.
|
|
294
|
+
* @param options - Function libraries to add to the context.
|
|
295
|
+
* @returns The expression value.
|
|
296
|
+
*/
|
|
297
|
+
export { evaluateExpression as eval };
|
|
298
|
+
//# sourceMappingURL=expression-eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-eval.js","sourceRoot":"","sources":["../src/expression-eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { ExpressionFunctionRegistry } from "./function-registry.js";
|
|
2
|
+
/**
|
|
3
|
+
* A function that can be exposed to evaluated expressions.
|
|
4
|
+
*
|
|
5
|
+
* @param args - Arguments supplied by a call expression.
|
|
6
|
+
* @returns The value made available to the expression.
|
|
7
|
+
*/
|
|
8
|
+
export type ExpressionFunction = (...args: any[]) => any;
|
|
9
|
+
/**
|
|
10
|
+
* A named collection of functions that can be supplied to an expression
|
|
11
|
+
* evaluator through {@link ExpressionEvaluationOptions}.
|
|
12
|
+
*/
|
|
13
|
+
export type ExpressionFunctionLibrary = Record<string, ExpressionFunction>;
|
|
14
|
+
/**
|
|
15
|
+
* Options shared by the synchronous and asynchronous expression evaluators.
|
|
16
|
+
*/
|
|
17
|
+
export type ExpressionEvaluationOptions = {
|
|
18
|
+
/**
|
|
19
|
+
* Instance-scoped registry of named functions available to the expression.
|
|
20
|
+
*/
|
|
21
|
+
registry?: ExpressionFunctionRegistry;
|
|
22
|
+
/**
|
|
23
|
+
* Function libraries to add to the evaluation context.
|
|
24
|
+
*
|
|
25
|
+
* Libraries are merged from left to right. Functions in later libraries
|
|
26
|
+
* replace functions with the same name in earlier libraries. Values in the
|
|
27
|
+
* expression context replace functions with the same name in any library.
|
|
28
|
+
*/
|
|
29
|
+
libraries?: ExpressionFunctionLibrary[];
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* General-purpose mathematical functions for expression evaluation.
|
|
33
|
+
*
|
|
34
|
+
* Includes JavaScript `Math` functions and math.gl helpers such as `clamp`,
|
|
35
|
+
* `lerp`, `normalizeAngle`, `safeMod`, `toDegrees`, and `toRadians`.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const evaluate = compile("clamp(sin(angle), 0, 1)", {
|
|
40
|
+
* libraries: [BASIC_MATH_FUNCTION_LIBRARY]
|
|
41
|
+
* });
|
|
42
|
+
* evaluate({angle: Math.PI / 2});
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare const BASIC_MATH_FUNCTION_LIBRARY: ExpressionFunctionLibrary;
|
|
46
|
+
/**
|
|
47
|
+
* WGS84 ellipsoid functions for expression evaluation.
|
|
48
|
+
*
|
|
49
|
+
* Includes cartographic and Cartesian coordinate conversion, surface
|
|
50
|
+
* projection, local east-north-up frame generation, and WGS84 inspection.
|
|
51
|
+
* Angular arguments use radians unless the selected function states otherwise.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* const evaluate = compile("cartographicToCartesian(position)", {
|
|
56
|
+
* libraries: [GEOSPATIAL_FUNCTION_LIBRARY]
|
|
57
|
+
* });
|
|
58
|
+
* evaluate({position: [0, 0, 0]});
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare const GEOSPATIAL_FUNCTION_LIBRARY: ExpressionFunctionLibrary;
|
|
62
|
+
/**
|
|
63
|
+
* Adds configured function libraries to an expression context.
|
|
64
|
+
*
|
|
65
|
+
* @param context - Values available to the expression.
|
|
66
|
+
* @param options - Function libraries to merge into the context.
|
|
67
|
+
* @returns The original context when no libraries are supplied, or a new
|
|
68
|
+
* context containing the libraries and context values.
|
|
69
|
+
*
|
|
70
|
+
* @remarks
|
|
71
|
+
* Libraries are merged from left to right, then overlaid with `context`.
|
|
72
|
+
* Registry functions have the lowest precedence. The input objects are not modified.
|
|
73
|
+
*/
|
|
74
|
+
export declare function mergeFunctionLibraries(context: Record<string, unknown>, options?: ExpressionEvaluationOptions): Record<string, unknown>;
|
|
75
|
+
//# sourceMappingURL=function-libraries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-libraries.d.ts","sourceRoot":"","sources":["../src/function-libraries.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAC,0BAA0B,EAAC,+BAA4B;AAEpE;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC;;OAEG;IACH,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IAEtC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,yBAAyB,EAAE,CAAC;CACzC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,EAAE,yBA2BzC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,EAAE,yBAsBzC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,2BAA2B,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// math.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return */
|
|
5
|
+
import { acos, asin, atan, clamp, cos, degrees, lerp, normalizeAngle, radians, safeMod, sin, tan, toDegrees, toRadians } from '@math.gl/core';
|
|
6
|
+
import { Ellipsoid, isWGS84 } from '@math.gl/geospatial';
|
|
7
|
+
/**
|
|
8
|
+
* General-purpose mathematical functions for expression evaluation.
|
|
9
|
+
*
|
|
10
|
+
* Includes JavaScript `Math` functions and math.gl helpers such as `clamp`,
|
|
11
|
+
* `lerp`, `normalizeAngle`, `safeMod`, `toDegrees`, and `toRadians`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const evaluate = compile("clamp(sin(angle), 0, 1)", {
|
|
16
|
+
* libraries: [BASIC_MATH_FUNCTION_LIBRARY]
|
|
17
|
+
* });
|
|
18
|
+
* evaluate({angle: Math.PI / 2});
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export const BASIC_MATH_FUNCTION_LIBRARY = {
|
|
22
|
+
abs: Math.abs,
|
|
23
|
+
acos,
|
|
24
|
+
asin,
|
|
25
|
+
atan,
|
|
26
|
+
ceil: Math.ceil,
|
|
27
|
+
clamp,
|
|
28
|
+
cos,
|
|
29
|
+
degrees,
|
|
30
|
+
exp: Math.exp,
|
|
31
|
+
floor: Math.floor,
|
|
32
|
+
lerp,
|
|
33
|
+
log: Math.log,
|
|
34
|
+
max: Math.max,
|
|
35
|
+
min: Math.min,
|
|
36
|
+
normalizeAngle,
|
|
37
|
+
pow: Math.pow,
|
|
38
|
+
radians,
|
|
39
|
+
round: Math.round,
|
|
40
|
+
safeMod,
|
|
41
|
+
sign: Math.sign,
|
|
42
|
+
sin,
|
|
43
|
+
sqrt: Math.sqrt,
|
|
44
|
+
tan,
|
|
45
|
+
toDegrees,
|
|
46
|
+
toRadians,
|
|
47
|
+
trunc: Math.trunc
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* WGS84 ellipsoid functions for expression evaluation.
|
|
51
|
+
*
|
|
52
|
+
* Includes cartographic and Cartesian coordinate conversion, surface
|
|
53
|
+
* projection, local east-north-up frame generation, and WGS84 inspection.
|
|
54
|
+
* Angular arguments use radians unless the selected function states otherwise.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* const evaluate = compile("cartographicToCartesian(position)", {
|
|
59
|
+
* libraries: [GEOSPATIAL_FUNCTION_LIBRARY]
|
|
60
|
+
* });
|
|
61
|
+
* evaluate({position: [0, 0, 0]});
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export const GEOSPATIAL_FUNCTION_LIBRARY = {
|
|
65
|
+
cartesianToCartographic: (cartesian, result) => Ellipsoid.WGS84.cartesianToCartographic(cartesian, result),
|
|
66
|
+
cartographicToCartesian: (cartographic, result) => Ellipsoid.WGS84.cartographicToCartesian(cartographic, result),
|
|
67
|
+
eastNorthUpToFixedFrame: (origin, result) => Ellipsoid.WGS84.eastNorthUpToFixedFrame(origin, result),
|
|
68
|
+
geodeticSurfaceNormal: (cartesian, result) => Ellipsoid.WGS84.geodeticSurfaceNormal(cartesian, result),
|
|
69
|
+
geodeticSurfaceNormalCartographic: (cartographic, result) => Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(cartographic, result),
|
|
70
|
+
isWGS84,
|
|
71
|
+
scaleToGeocentricSurface: (cartesian, result) => Ellipsoid.WGS84.scaleToGeocentricSurface(cartesian, result),
|
|
72
|
+
scaleToGeodeticSurface: (cartesian, result) => Ellipsoid.WGS84.scaleToGeodeticSurface(cartesian, result),
|
|
73
|
+
toDegrees,
|
|
74
|
+
toRadians,
|
|
75
|
+
transformPositionFromScaledSpace: (position, result) => Ellipsoid.WGS84.transformPositionFromScaledSpace(position, result),
|
|
76
|
+
transformPositionToScaledSpace: (position, result) => Ellipsoid.WGS84.transformPositionToScaledSpace(position, result)
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Adds configured function libraries to an expression context.
|
|
80
|
+
*
|
|
81
|
+
* @param context - Values available to the expression.
|
|
82
|
+
* @param options - Function libraries to merge into the context.
|
|
83
|
+
* @returns The original context when no libraries are supplied, or a new
|
|
84
|
+
* context containing the libraries and context values.
|
|
85
|
+
*
|
|
86
|
+
* @remarks
|
|
87
|
+
* Libraries are merged from left to right, then overlaid with `context`.
|
|
88
|
+
* Registry functions have the lowest precedence. The input objects are not modified.
|
|
89
|
+
*/
|
|
90
|
+
export function mergeFunctionLibraries(context, options) {
|
|
91
|
+
if (!options?.libraries?.length) {
|
|
92
|
+
if (!options?.registry) {
|
|
93
|
+
return context;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return Object.assign({}, options.registry?.getFunctionTable(), ...(options.libraries || []), context);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=function-libraries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-libraries.js","sourceRoot":"","sources":["../src/function-libraries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { ExpressionFunction, ExpressionFunctionLibrary } from "./function-libraries.js";
|
|
2
|
+
/**
|
|
3
|
+
* Options for registering functions with an {@link ExpressionFunctionRegistry}.
|
|
4
|
+
*/
|
|
5
|
+
export type FunctionRegistrationOptions = {
|
|
6
|
+
/**
|
|
7
|
+
* Replace an existing function with the same name.
|
|
8
|
+
*
|
|
9
|
+
* @defaultValue false
|
|
10
|
+
*/
|
|
11
|
+
replace?: boolean;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* An isolated collection of named functions available to expression evaluators.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* Registries are instance scoped. Registering a function does not affect other
|
|
18
|
+
* registries or evaluators that do not receive the registry.
|
|
19
|
+
*
|
|
20
|
+
* Function names must be valid JavaScript-style identifiers so they can be
|
|
21
|
+
* called directly from JSEP expressions.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const registry = new ExpressionFunctionRegistry()
|
|
26
|
+
* .registerFunction('double', (value) => value * 2)
|
|
27
|
+
* .registerFunctions(BASIC_MATH_FUNCTION_LIBRARY);
|
|
28
|
+
*
|
|
29
|
+
* const evaluate = compile('double(round(value))', {registry});
|
|
30
|
+
* evaluate({value: 2.4});
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare class ExpressionFunctionRegistry {
|
|
34
|
+
private readonly functions;
|
|
35
|
+
/**
|
|
36
|
+
* Creates a function registry.
|
|
37
|
+
*
|
|
38
|
+
* @param functionTables - Function tables to register in order.
|
|
39
|
+
* @throws If a table contains an invalid or duplicate function name.
|
|
40
|
+
*/
|
|
41
|
+
constructor(functionTables?: readonly ExpressionFunctionLibrary[]);
|
|
42
|
+
/**
|
|
43
|
+
* Registers one named function.
|
|
44
|
+
*
|
|
45
|
+
* @param name - Identifier used to call the function from an expression.
|
|
46
|
+
* @param fn - JavaScript function invoked with evaluated expression arguments.
|
|
47
|
+
* @param options - Duplicate registration behavior.
|
|
48
|
+
* @returns This registry.
|
|
49
|
+
* @throws If the name is invalid, the value is not a function, or the name is
|
|
50
|
+
* already registered and replacement was not requested.
|
|
51
|
+
*/
|
|
52
|
+
registerFunction(name: string, fn: ExpressionFunction, options?: FunctionRegistrationOptions): this;
|
|
53
|
+
/**
|
|
54
|
+
* Registers all entries in a function table.
|
|
55
|
+
*
|
|
56
|
+
* @param functionTable - Map from expression identifiers to JavaScript functions.
|
|
57
|
+
* @param options - Duplicate registration behavior.
|
|
58
|
+
* @returns This registry.
|
|
59
|
+
* @throws If any entry is invalid or conflicts with an existing registration.
|
|
60
|
+
*
|
|
61
|
+
* @remarks
|
|
62
|
+
* Validation is atomic: no entries are registered when any entry is invalid.
|
|
63
|
+
*/
|
|
64
|
+
registerFunctions(functionTable: ExpressionFunctionLibrary, options?: FunctionRegistrationOptions): this;
|
|
65
|
+
/**
|
|
66
|
+
* Removes a registered function.
|
|
67
|
+
*
|
|
68
|
+
* @param name - Function name to remove.
|
|
69
|
+
* @returns `true` when a function was removed.
|
|
70
|
+
*/
|
|
71
|
+
unregisterFunction(name: string): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Tests whether a function is registered.
|
|
74
|
+
*
|
|
75
|
+
* @param name - Function name to inspect.
|
|
76
|
+
* @returns `true` when the registry contains the name.
|
|
77
|
+
*/
|
|
78
|
+
hasFunction(name: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Returns a registered function.
|
|
81
|
+
*
|
|
82
|
+
* @param name - Function name to retrieve.
|
|
83
|
+
* @returns The registered function, or `undefined`.
|
|
84
|
+
*/
|
|
85
|
+
getFunction(name: string): ExpressionFunction | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* Returns an immutable snapshot of all registered functions.
|
|
88
|
+
*
|
|
89
|
+
* @returns A frozen function table.
|
|
90
|
+
*/
|
|
91
|
+
getFunctionTable(): Readonly<ExpressionFunctionLibrary>;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=function-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-registry.d.ts","sourceRoot":"","sources":["../src/function-registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,kBAAkB,EAAE,yBAAyB,EAAC,gCAA6B;AAKxF;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoD;IAE9E;;;;;OAKG;gBACS,cAAc,GAAE,SAAS,yBAAyB,EAAO;IAMrE;;;;;;;;;OASG;IACH,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,kBAAkB,EACtB,OAAO,GAAE,2BAAgC,GACxC,IAAI;IASP;;;;;;;;;;OAUG;IACH,iBAAiB,CACf,aAAa,EAAE,yBAAyB,EACxC,OAAO,GAAE,2BAAgC,GACxC,IAAI;IAkBP;;;;;OAKG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOzC;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIlC;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIzD;;;;OAIG;IACH,gBAAgB,IAAI,QAAQ,CAAC,yBAAyB,CAAC;CAGxD"}
|