fig-tree-evaluator 2.14.1 → 2.15.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 +194 -28
- package/build/index.cjs.js +1 -1
- package/build/index.d.ts +65 -10
- package/build/index.esm.js +1 -1
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -40,10 +40,11 @@ A range of built-in operators are available, from simple logic, arithmetic and s
|
|
|
40
40
|
- [OBJECT\_PROPERTIES](#object_properties)
|
|
41
41
|
- [STRING\_SUBSTITUTION](#string_substitution)
|
|
42
42
|
- [SPLIT](#split)
|
|
43
|
+
- [HTTP requests](#http-requests)
|
|
43
44
|
- [GET](#get)
|
|
44
45
|
- [POST](#post)
|
|
45
46
|
- [GRAPHQL](#graphql)
|
|
46
|
-
- [
|
|
47
|
+
- [SQL](#sql)
|
|
47
48
|
- [BUILD\_OBJECT](#build_object)
|
|
48
49
|
- [MATCH](#match)
|
|
49
50
|
- [PASSTHRU](#passthru)
|
|
@@ -150,8 +151,9 @@ The `options` parameter is an object with the following available properties (al
|
|
|
150
151
|
- `data` -- a single object containing any *objects* in your application that may wish to be inspected using the [objectProperties](#object_properties) operator. (See [playground](LINK) for examples). If these objects are regularly changing, you'll probably want to pass them into each separate evaluation rather than with the initial constructor.
|
|
151
152
|
- `functions` -- a single object containing any *custom functions* available for use by the [customFunctions](#custom_functions) operator.
|
|
152
153
|
- `fragments` -- commonly-used expressions (with optional parameters) that can be re-used in any other expression. See [Fragments](#fragments)
|
|
153
|
-
- `
|
|
154
|
+
- `httpClient` -- pass your http client in here in order to use the HTTP-based operators ([`GET`](#get), [`POST`](#post), [`GraphQL`](#graphql)) (uses browser's native `fetch` by default).
|
|
154
155
|
- `graphQLConnection` -- a GraphQL connection object, if using the [`graphQL` operator](#graphql). See operator details below.
|
|
156
|
+
- `sqlConnection` -- if you wish to make calls to an SQL database using the [`SQL` operator](#sql), pass a connection to the database here. See operator details below.
|
|
155
157
|
- `baseEndpoint` -- A general http headers object that will be passed to *all* http-based operators (`GET`, `POST`, `GraphQL`). Useful if all http queries are to a common server -- then each individual node will only require a relative url. See specific operator for more details.
|
|
156
158
|
- `headers` -- A general http headers object that will be passed to *all* http-based operators. Useful for authentication headers, for example. Each operator and instance can have its own headers, though, so see specific operator reference for details.
|
|
157
159
|
- `returnErrorAsString` -- by default the evaluator will throw errors with invalid evaluation expressions (with helpful error messages indicating the node which threw the error and what the problem was). But if you have `returnErrorAsString: true` set, the evaluator will never throw, but instead return error messages as a valid string output. (See also the [`fallback`](#other-common-properties) parameter below)
|
|
@@ -1000,12 +1002,85 @@ e.g.
|
|
|
1000
1002
|
(`trimWhiteSpace` and `excludeTrailing` not available, since array can only support one optional parameter)
|
|
1001
1003
|
|
|
1002
1004
|
---
|
|
1005
|
+
|
|
1006
|
+
### HTTP requests
|
|
1007
|
+
|
|
1008
|
+
The following three operators (`GET`, `POST`, `GraphQL`) make http requests, so require an http client. If using fig-tree in the browser, it will use the native `fetch()` method by default, *so no configuration is required*. However, if using in `node`, or you wish to use a different http client (if your project is already using [`axios`](https://www.npmjs.com/package/axios), say), you can specify it with the `httpClient` option.
|
|
1009
|
+
|
|
1010
|
+
The `httpClient` object is an abstraction around an http package in order to standardise the implementation for use in fig-tree. Two such "wrappers" are provided in the FigTree package, for:
|
|
1011
|
+
|
|
1012
|
+
- [`axios`](https://www.npmjs.com/package/axios)
|
|
1013
|
+
- [`node-fetch`](https://www.npmjs.com/package/node-fetch) (same API as browser `fetch`, but for `node`)
|
|
1014
|
+
|
|
1015
|
+
To specify one of these for use, just pass the client directly to the `httpClient` option, like so:
|
|
1016
|
+
|
|
1017
|
+
#### Axios
|
|
1018
|
+
|
|
1019
|
+
```js
|
|
1020
|
+
import axios from 'axios'
|
|
1021
|
+
import { FigTreeEvaluator } from 'fig-tree-evaluator'
|
|
1022
|
+
|
|
1023
|
+
const fig = new FigTreeEvaluator({
|
|
1024
|
+
httpClient: axios,
|
|
1025
|
+
...otherOptions
|
|
1026
|
+
})
|
|
1027
|
+
```
|
|
1028
|
+
|
|
1029
|
+
#### Node-Fetch
|
|
1030
|
+
|
|
1031
|
+
```js
|
|
1032
|
+
import fetch from 'node-fetch'
|
|
1033
|
+
import { FigTreeEvaluator } from 'fig-tree-evaluator'
|
|
1034
|
+
|
|
1035
|
+
const fig = new FigTreeEvaluator({
|
|
1036
|
+
httpClient: fetch,
|
|
1037
|
+
...otherOptions
|
|
1038
|
+
})
|
|
1039
|
+
```
|
|
1040
|
+
|
|
1041
|
+
If you wish to use a client other than these two, you must provide an function that takes the client as a parameter and returns an object of the following type structure:
|
|
1042
|
+
|
|
1043
|
+
```ts
|
|
1044
|
+
interface HttpClient {
|
|
1045
|
+
get: (req: Omit<HttpRequest, 'method'>) => Promise<unknown>
|
|
1046
|
+
post: (req: Omit<HttpRequest, 'method'>) => Promise<unknown>
|
|
1047
|
+
throwError: (err: unknown) => void
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
// where HttpRequest is an input of the following shape:
|
|
1051
|
+
interface HttpRequest {
|
|
1052
|
+
url: string
|
|
1053
|
+
params?: { [key: string]: string }
|
|
1054
|
+
data?: Record<string, unknown>
|
|
1055
|
+
headers?: Record<string, unknown>
|
|
1056
|
+
method?: 'get' | 'post'
|
|
1057
|
+
}
|
|
1058
|
+
```
|
|
1059
|
+
|
|
1060
|
+
And then in FigTree, for example:
|
|
1061
|
+
|
|
1062
|
+
```js
|
|
1063
|
+
import { MyHttpWrapper } from './customWrappers'
|
|
1064
|
+
import { someClient } from 'some-library'
|
|
1065
|
+
|
|
1066
|
+
const fig = new FigTreeEvaluator({
|
|
1067
|
+
httpClient: MyHttpWrapper(someClient),
|
|
1068
|
+
...otherOptions
|
|
1069
|
+
})
|
|
1070
|
+
|
|
1071
|
+
```
|
|
1072
|
+
|
|
1073
|
+
See the implementation for `axios` and `node-fetch` [in the repo](https://github.com/CarlosNZ/fig-tree-evaluator/blob/main/src/httpClients.ts) for specific details.
|
|
1074
|
+
|
|
1075
|
+
|
|
1003
1076
|
### GET
|
|
1004
1077
|
|
|
1005
1078
|
*Http GET request*
|
|
1006
1079
|
|
|
1007
1080
|
Aliases: `get`, `api`
|
|
1008
1081
|
|
|
1082
|
+
*Note: if used in `node`, or you're using an http client other than `fetch`, you will need to explicitly provide an `httpClient` option. [See details](#http-requests)*
|
|
1083
|
+
|
|
1009
1084
|
#### Properties
|
|
1010
1085
|
|
|
1011
1086
|
- `url` (or `endpoint`)<sup>*</sup>: (string) -- url to be queried
|
|
@@ -1070,6 +1145,8 @@ Aliases: `post`
|
|
|
1070
1145
|
|
|
1071
1146
|
The "POST" operator is basically structurally the same as [GET](#get).
|
|
1072
1147
|
|
|
1148
|
+
*Note: if used in `node`, or you're using an http client other than `fetch`, you will need to explicitly provide an `httpClient` option. [See details](#http-requests)*
|
|
1149
|
+
|
|
1073
1150
|
#### Properties
|
|
1074
1151
|
|
|
1075
1152
|
- `url`/`endpoint`<sup>*</sup>, `headers`, `returnProperty`/`outputProperty` -- same as "GET" operator.
|
|
@@ -1103,6 +1180,8 @@ Aliases: `graphQl`, `graphql`, `gql`
|
|
|
1103
1180
|
|
|
1104
1181
|
This operator is essentially a special case of the "POST" operator, but structured specifically for [GraphQL](https://graphql.org/) requests.
|
|
1105
1182
|
|
|
1183
|
+
*Note: if used in `node`, or you're using an http client other than `fetch`, you will need to explicitly provide an `httpClient` option. [See details](#http-requests)*
|
|
1184
|
+
|
|
1106
1185
|
#### Properties
|
|
1107
1186
|
|
|
1108
1187
|
- `query`<sup>*</sup>: (string) -- the GraphQL query string
|
|
@@ -1170,58 +1249,140 @@ e.g.
|
|
|
1170
1249
|
```
|
|
1171
1250
|
|
|
1172
1251
|
----
|
|
1173
|
-
###
|
|
1252
|
+
### SQL
|
|
1174
1253
|
|
|
1175
|
-
*Query
|
|
1254
|
+
*Query an SQL database*
|
|
1176
1255
|
|
|
1177
|
-
Aliases: `
|
|
1256
|
+
Aliases: `sql`, `pgSql`, `postgres`, `pg`, `sqlLite`, `sqlite`, `mySql`
|
|
1178
1257
|
|
|
1179
1258
|
#### Properties
|
|
1180
1259
|
|
|
1181
1260
|
- `query`<sup>*</sup>: (string) -- SQL query string, with parameterised replacements (i.e. `$1`, `$2`, etc)
|
|
1182
|
-
- `values` (or `replacements`): (array) -- replacements for the `query` parameters
|
|
1183
|
-
- `
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
We extend this a step further by flattening the array, and (if `"string"` or `"number"`) converting the result to a concatenated string or (if possible) number.
|
|
1187
|
-
|
|
1188
|
-
In order to query a postgres database, fig-tree must be provided with a database connection object -- specifically, a [`node-postgres`](https://node-postgres.com/) `Client` object:
|
|
1189
|
-
|
|
1190
|
-
```js
|
|
1191
|
-
import { Client } from 'pg'
|
|
1192
|
-
const pgConnect = new Client(pgConfig) // pgConfig = database details, see node-postgres documentation
|
|
1193
|
-
|
|
1194
|
-
pgConnect.connect()
|
|
1261
|
+
- `values` (or `replacements`): (array / object) -- replacements for the `query` parameters
|
|
1262
|
+
- `single` (or `singleRecord`): (boolean) -- by default, results are returned as an array of objects. However, if your query is expected to just return a single record, you can set `single: true` and just the record object will be returned (i.e. not in an array). Note that if the query *does* fetch multiple records, only the first will be returned.
|
|
1263
|
+
- `flatten` (or `flat`): (boolean) -- Instead of returning an object, `flatten: true` will just return an array of values. e.g, instead of `{name: "Tom", age: 49}`, it will return `["Tom", 49]`. This would usually be used in conjunction with the `single` property -- if not, it will return an array of flattened arrays.
|
|
1195
1264
|
|
|
1196
|
-
|
|
1197
|
-
```
|
|
1265
|
+
#### Examples
|
|
1198
1266
|
|
|
1199
|
-
The following examples query a default installation of the [Northwind](https://github.com/pthom/northwind_psql) demo database.
|
|
1267
|
+
The following additional examples query a default installation of the [Northwind](https://github.com/pthom/northwind_psql) demo database.
|
|
1200
1268
|
|
|
1201
|
-
e.g.
|
|
1202
1269
|
```js
|
|
1203
1270
|
{
|
|
1204
|
-
operator: '
|
|
1271
|
+
operator: 'sql',
|
|
1205
1272
|
query: "SELECT contact_name FROM customers where customer_id = 'FAMIA';",
|
|
1206
|
-
|
|
1273
|
+
single: true,
|
|
1274
|
+
flatten: true
|
|
1207
1275
|
}
|
|
1208
1276
|
// => "Aria Cruz"
|
|
1209
1277
|
|
|
1210
1278
|
{
|
|
1211
|
-
operator: '
|
|
1212
|
-
query:
|
|
1279
|
+
operator: 'sql',
|
|
1280
|
+
query: `SELECT product_name FROM public.products
|
|
1281
|
+
WHERE category_id = $1 AND supplier_id != $2`,
|
|
1213
1282
|
values: [1, 16],
|
|
1214
|
-
|
|
1283
|
+
flatten: true,
|
|
1215
1284
|
}
|
|
1216
1285
|
// => ["Chai","Chang","Guaraná Fantástica","Côte de Blaye","Chartreuse verte",
|
|
1217
1286
|
// "Ipoh Coffee","Outback Lager","Rhönbräu Klosterbier","Lakkalikööri"]
|
|
1218
1287
|
|
|
1288
|
+
{
|
|
1289
|
+
operator: 'sql',
|
|
1290
|
+
query: 'SELECT COUNT(*) FROM employees',
|
|
1291
|
+
flatten: true,
|
|
1292
|
+
type: 'number',
|
|
1293
|
+
}
|
|
1294
|
+
// => 9
|
|
1295
|
+
|
|
1219
1296
|
```
|
|
1220
1297
|
|
|
1221
1298
|
`children` array: `[queryString, ...substitutions]`
|
|
1222
1299
|
|
|
1223
|
-
(`
|
|
1300
|
+
(`single` and `flatten` can not be part of `children` array)
|
|
1301
|
+
|
|
1302
|
+
#### Connecting to the database
|
|
1303
|
+
|
|
1304
|
+
In order to query the SQL database, fig-tree must be provided with a database connection object in its `sqlConnection` option. An `SQLConnection` is an abstraction around a specific database connection in order to standardise the implementation for use in fig-tree. Two such "wrappers" are provided in the FigTree package for the following database connections:
|
|
1305
|
+
|
|
1306
|
+
- **PostgreSQL** using [`node-postgres`](https://node-postgres.com/): `SQLNodePostgres` wrapper
|
|
1307
|
+
- **SQLite** using[`sqlite`/`sqlite3`](https://www.npmjs.com/package/sqlite): `SQLite` wrapper
|
|
1308
|
+
|
|
1309
|
+
You will need to have the appropriate package installed separately, and they can be implemented as follows:
|
|
1310
|
+
|
|
1311
|
+
##### PostgreSQL
|
|
1312
|
+
|
|
1313
|
+
```js
|
|
1314
|
+
import { Client } from 'pg' // node-postgres
|
|
1315
|
+
import { FigTreeEvaluator, SQLNodePostgres } from 'fig-tree-evaluator'
|
|
1316
|
+
|
|
1317
|
+
const pgConfig = {
|
|
1318
|
+
// database config, see node-postgres documentation
|
|
1319
|
+
user: 'postgres',
|
|
1320
|
+
host: 'localhost',
|
|
1321
|
+
database: 'northwind',
|
|
1322
|
+
port: 5432,
|
|
1323
|
+
...etc
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
const pgConnect = new Client(pgConfig)
|
|
1327
|
+
|
|
1328
|
+
pgConnect.connect()
|
|
1329
|
+
|
|
1330
|
+
const fig = new FigTreeEvaluator({
|
|
1331
|
+
sqlConnection: SQLNodePostgres(pgConnect),
|
|
1332
|
+
...otherOptions
|
|
1333
|
+
})
|
|
1334
|
+
|
|
1335
|
+
fig.evaluate({
|
|
1336
|
+
operator: "SQL",
|
|
1337
|
+
query: "SELECT contact_name FROM customers where customer_id = 'FAMIA';",
|
|
1338
|
+
single: true,
|
|
1339
|
+
flatten: true
|
|
1340
|
+
})
|
|
1341
|
+
.then((result) => console.log(result)) // => "Aria Cruz"
|
|
1342
|
+
```
|
|
1343
|
+
|
|
1344
|
+
##### SQLite
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
```js
|
|
1348
|
+
import sqlite3 from 'sqlite3'
|
|
1349
|
+
import { open, Database } from 'sqlite'
|
|
1350
|
+
import { FigTreeEvaluator, SQLite } from 'fig-tree-evaluator'
|
|
1351
|
+
|
|
1352
|
+
open({
|
|
1353
|
+
filename: '/path/to/sqlite.db',
|
|
1354
|
+
driver: sqlite3.Database
|
|
1355
|
+
}).then((db) => {
|
|
1356
|
+
const fig = new FigTreeEvaluator({
|
|
1357
|
+
sqlConnection: SQLite(db),
|
|
1358
|
+
...otherOptions
|
|
1359
|
+
})
|
|
1360
|
+
|
|
1361
|
+
fig.evaluate(...) // Continue app operations
|
|
1362
|
+
})
|
|
1363
|
+
```
|
|
1364
|
+
|
|
1365
|
+
To create additional abstractions for other database connections, you need to provide a function that takes the library's connection object as a parameter and returns an object with a `.query()` method with the following type structure:
|
|
1366
|
+
|
|
1367
|
+
```ts
|
|
1368
|
+
interface SQLConnection {
|
|
1369
|
+
query: (input: QueryInput) => Promise<QueryOutput>
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
// where `QueryInput` is:
|
|
1373
|
+
interface QueryInput {
|
|
1374
|
+
query: string
|
|
1375
|
+
values?: (string | number | boolean)[] | object
|
|
1376
|
+
single?: boolean
|
|
1377
|
+
flatten?: boolean
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
// and `QueryOutput` is any FigTree output
|
|
1381
|
+
```
|
|
1382
|
+
|
|
1383
|
+
You then implement in FigTree options the same way as the two described above.
|
|
1224
1384
|
|
|
1385
|
+
Check out `SQLNodePostgres` and `SQLite` [in the repo](https://github.com/CarlosNZ/fig-tree-evaluator/blob/main/src/databaseConnections.ts) for specific details.
|
|
1225
1386
|
|
|
1226
1387
|
----
|
|
1227
1388
|
### BUILD_OBJECT
|
|
@@ -1828,6 +1989,11 @@ Please open an issue: https://github.com/CarlosNZ/fig-tree-evaluator/issues
|
|
|
1828
1989
|
|
|
1829
1990
|
*Trivial upgrades (e.g. documentation, small re-factors, types, etc.) not included*
|
|
1830
1991
|
|
|
1992
|
+
- **v2.15.0**:
|
|
1993
|
+
- Remove `axios` package dependency and create HTTP client abstraction (with built-in wrappers for `axios` and `fetch`). *Results in significantly smaller bundle size.*
|
|
1994
|
+
- Generalise `PG_SQL` operator to a client-agnostic `SQL` operator (with built-in abstractions for `node-postgres` and `SQLite`)
|
|
1995
|
+
- ***Breaking changes*** as a result of the above: SQL client and HTTP client must be specified differently. See relevant operator details.
|
|
1996
|
+
- Changes to `SQL` parameters to reflect the aforementioned agnosticism.
|
|
1831
1997
|
- **v2.14.0**: Improvements to `stringSubstitution` operator:
|
|
1832
1998
|
- Can accept nested property references (e.g. `{{user.name}}`)
|
|
1833
1999
|
- Will also search for replacements from `data` object
|
package/build/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("change-case"),t=require("axios"),r=require("object-property-extractor"),a=require("dequal/lite");function i(e,t,r,a){return new(r||(r=Promise))((function(i,s){function n(e){try{l(a.next(e))}catch(e){s(e)}}function o(e){try{l(a.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,o)}l((a=a.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const s=e=>e instanceof Object&&"operator"in e,n=e=>e instanceof Object&&"fragment"in e,o=t=>{const r=e.camelCase(t);return r||t},l=(e,t)=>t[o(e)],u=(e,t,r)=>{const a=Object.assign({},e);return t.forEach((e=>{r[o(e)]||console.warn(`Invalid operator exclusion: ${e}`),delete a[r[o(e)]]})),a},d=(e,t=200)=>e.length<t?e:`${e.slice(0,t-2).trim()}...`,c=(e,t,r=!1)=>{if(void 0!==e)return e;if(r)return d(t);throw new Error(d(t))},p=(e,t)=>{const r=Object.entries(e).map((([e,r])=>[t(e),r]));return Object.fromEntries(r)},h=e=>/^\$.+/.test(e),v=(e,{resolvedAliasNodes:t})=>{var r;return"string"==typeof e&&h(e)&&null!==(r=null==t?void 0:t[e])&&void 0!==r?r:e},m=(e,t)=>{const r=Object.assign(Object.assign({},e),t);return(e.data||t.data)&&(r.data=Object.assign(Object.assign({},e.data),t.data)),(e.functions||t.functions)&&(r.functions=Object.assign(Object.assign({},e.functions),t.functions)),(e.fragments||t.fragments)&&(r.fragments=Object.assign(Object.assign({},e.fragments),t.fragments)),(e.headers||t.headers)&&(r.headers=Object.assign(Object.assign({},e.headers),t.headers)),r},y={number:e=>g(e),string:e=>String(e),array:e=>Array.isArray(e)?e:[e],boolean:e=>Boolean(e),bool:e=>Boolean(e)},f=e=>e.message,g=e=>{if("string"!=typeof e)return Number.isNaN(Number(e))?e:Number(e);const t=new RegExp(/-?\d*\.?\d+/gm),r=e.match(t);return r?Number(r[0]):0},b=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),T={and:"AND","&":"AND","&&":"AND",or:"OR","|":"OR","||":"OR","=":"EQUAL",eq:"EQUAL",equal:"EQUAL",equals:"EQUAL","!=":"NOT_EQUAL","!":"NOT_EQUAL",ne:"NOT_EQUAL",notEqual:"NOT_EQUAL","+":"PLUS",plus:"PLUS",add:"PLUS",concat:"PLUS",join:"PLUS",merge:"PLUS","-":"SUBTRACT",subtract:"SUBTRACT",minus:"SUBTRACT",takeaway:"SUBTRACT","*":"MULTIPLY",x:"MULTIPLY",multiply:"MULTIPLY",times:"MULTIPLY","/":"DIVIDE",divide:"DIVIDE","÷":"DIVIDE",">":"GREATER_THAN",greaterThan:"GREATER_THAN",higher:"GREATER_THAN",larger:"GREATER_THAN","<":"LESS_THAN",lessThan:"LESS_THAN",lower:"LESS_THAN",smaller:"LESS_THAN","?":"CONDITIONAL",conditional:"CONDITIONAL",ifThen:"CONDITIONAL",regex:"REGEX",patternMatch:"REGEX",regexp:"REGEX",matchPattern:"REGEX",dataProperties:"OBJECT_PROPERTIES",data:"OBJECT_PROPERTIES",getData:"OBJECT_PROPERTIES",objectProperties:"OBJECT_PROPERTIES",objProps:"OBJECT_PROPERTIES",getProperty:"OBJECT_PROPERTIES",getObjProp:"OBJECT_PROPERTIES",stringSubstitution:"STRING_SUBSTITUTION",substitute:"STRING_SUBSTITUTION",stringSub:"STRING_SUBSTITUTION",replace:"STRING_SUBSTITUTION",split:"SPLIT",arraySplit:"SPLIT",count:"COUNT",length:"COUNT",get:"GET",api:"GET",post:"POST",pgSql:"PG_SQL",sql:"PG_SQL",postgres:"PG_SQL",pg:"PG_SQL",pgDb:"PG_SQL",graphQl:"GRAPHQL",graphql:"GRAPHQL",gql:"GRAPHQL",buildObject:"BUILD_OBJECT",build:"BUILD_OBJECT",object:"BUILD_OBJECT",match:"MATCH",switch:"MATCH",customFunctions:"CUSTOM_FUNCTIONS",customFunction:"CUSTOM_FUNCTIONS",objectFunctions:"CUSTOM_FUNCTIONS",function:"CUSTOM_FUNCTIONS",functions:"CUSTOM_FUNCTIONS",runFunction:"CUSTOM_FUNCTIONS",_:"PASSTHRU",passThru:"PASSTHRU",passthru:"PASSTHRU",pass:"PASSTHRU",ignore:"PASSTHRU",coerce:"PASSTHRU",convert:"PASSTHRU"},O=T,C=/(\$[^()]+)\((.*)\)/,q=(e,t={},r=!0)=>r?"string"==typeof e?j(e,t):b(e)?A(e,t):e:e,j=(e,t)=>{const r=C.exec(e);if(!r)return e;const a=r[1].trim(),i=r[2].split(",").map((e=>q(e.trim(),t)));return E(a,i,t)},A=(e,t)=>{if(s(e)||n(e))return e;const r=Object.entries(e),a=r.filter((([e])=>h(e))),i=r.filter((([e])=>!h(e))),o=a.reduce(((e,[r,a])=>e=Object.assign(Object.assign({},e),E(r,a,t))),{});return Object.assign(Object.assign({},o),Object.fromEntries(i))},E=(e,t,r)=>{const a=e.slice(1),i=l(a,O);return i?Array.isArray(t)?{operator:i,children:t}:b(t)&&!Object.keys(t).some((e=>h(e)))?Object.assign({operator:i},t):{operator:i,children:[t]}:a in r?{fragment:a,parameters:Object.assign({},t)}:{[e]:t}},S=e=>b(e)&&"literal"in e,N=({value:e,name:t,expectedType:r})=>{if(S(r)){const{literal:a}=r;return!!a.includes(e)||w(t,e,`Literal(${a.map((e=>void 0===e?"undefined":`"${e}"`)).join(", ")})`)}if(Array.isArray(r))return!!r.some((r=>!0===N({value:e,name:t,expectedType:r})))||w(t,e,r.join("|"));return!!(0,x[r])(e)||w(t,e,r)},P=(...e)=>{const t=[];return e.forEach((e=>{const r=N(e);!0!==r&&t.push(r)})),!(t.length>0)||t.join("\n")},x={any:e=>void 0!==e,string:e=>"string"==typeof e,number:e=>"number"==typeof e,boolean:e=>"boolean"==typeof e,array:e=>Array.isArray(e),null:e=>null===e,object:e=>b(e),undefined:e=>void 0===e},w=(e,t,r)=>void 0===t&&e?`- Missing required property "${e}" (type: ${r})`:void 0!==e?`- Property "${e}" (value: ${I(t)}) is not of type: ${r}`:`- ${I(t)} is not of type: ${r}`,I=e=>{const t=void 0===e||Number.isNaN(e)?String(e):JSON.stringify(e);return d(t,50)},U=e=>{const t={};return e.forEach((e=>{e.aliases.forEach((r=>t[r]=e.name))})),t},R=(e,t)=>e.map((({name:e,required:r,type:a})=>{if(S(a)){const i=[...a.literal];return r||i.push(void 0),{name:e,value:t[e],expectedType:{literal:i}}}const i=Array.isArray(a)?a:[a];r||i.push("undefined");const s=1===i.length?i[0]:i;return{name:e,value:t[e],expectedType:s}})),L=(e,t)=>{const r=e.map(((e,r)=>[e,t[r]]));return Object.fromEntries(r)},k=e=>{if(e.length%2!=0)throw new Error("Even number of children required to make key/value pairs");const t=e.filter(((e,t)=>t%2==0)),r=P(...t.map((e=>({value:e,expectedType:["string","number","boolean"]}))));if(!0!==r)throw new Error(r);const a=e.filter(((e,t)=>t%2==1)),i={};return t.forEach(((e,t)=>{i[e]=a[t]})),i},D=e=>b(e)&&1===Object.keys(e).length?Object.values(e)[0]:e,_=(e,t,a=void 0)=>{const i=t?r(e,t,a):e;return Array.isArray(i)?i.map((e=>D(e))):t?null===i?null:D(i):i},M=e=>/^https?:\/\/.+/.test(e),F=(...e)=>e.reduce(((e,t,r)=>{const a="/"===t[0]?1:0,i="/"===t.slice(-1)?-1:void 0,s=t.slice(a,i);return""===s?e:e+(0===r?"":"/")+s}),""),H=({url:e,params:r={},data:a={},headers:s={},method:n="get"})=>i(void 0,void 0,void 0,(function*(){var i;try{return(yield t({method:n,url:e,headers:Object.assign({"Content-Type":"application/json",Accept:"application/json"},s),params:r,data:a})).data}catch(e){if(t.isAxiosError(e)){if(!(null==e?void 0:e.response))throw new Error("Network Error");console.log(null===(i=e.response)||void 0===i?void 0:i.data)}throw e}})),$=(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,i,o;const{options:u,operators:d,operatorAliases:h}=t;let m=(null==u?void 0:u.allowJSONStringInput)?(e=>{if("string"!=typeof e)return e;try{const t=JSON.parse(e);return s(t)?t:e}catch(t){return e}})(e):e;m=q(m,null===(r=t.options)||void 0===r?void 0:r.fragments,!u.noShorthand),Array.isArray(m)&&(m=yield B(m,t));const g=s(m),T=n(m);if(u.evaluateFullObject&&!g&&!T)return v(yield Q(m,t),t);if(!g&&!T)return u.supportDeprecatedValueNodes&&b(m)&&"value"in m?m.value:v(m,t);const{fallback:O}=m,C=null!==(a=null==u?void 0:u.returnErrorAsString)&&void 0!==a&&a;if(T){const[e,r]=yield B([m.fragment,m.parameters],t),a=q(null===(i=null==u?void 0:u.fragments)||void 0===i?void 0:i[e],u.fragments,!u.noShorthand);if(void 0===a)return c(yield $(O,t),`Fragment not defined: ${e}`,C);if(!s(a))return v(a,t);m=Object.assign(Object.assign(Object.assign({},m),a),r),delete m.fragment}try{const e=l(m.operator,h);if(!e)return c(yield $(O,t),`Invalid operator: ${m.operator}`,C);if(!t.operators[e])return c(yield $(O,t),`Excluded operator: ${m.operator}`,C);const{propertyAliases:r,evaluate:a,parseChildren:i}=d[e];m=((e,t)=>p(t,(t=>t in e?e[t]:t)))(r,m);const s=yield G(m,t);T||Object.entries(s).forEach((([e,r])=>t.resolvedAliasNodes[e]=r));const n=T?Object.assign(Object.assign({},t),{resolvedAliasNodes:Object.assign(Object.assign({},t.resolvedAliasNodes),s)}):t;if("children"in m){if(Array.isArray(m.children)||(m.children=yield $(m.children,n)),!Array.isArray(m.children))return c(yield $(O,t),`Operator: ${e}\n- Property "children" is not of type: array`,C);m=yield i(m,n),delete m.children}let u;try{u=yield a(m,n)}catch(r){return c(yield $(m.fallback,t),`Operator: ${e}\n${f(r)}`,C)}const v=null!==(o=null==m?void 0:m.outputType)&&void 0!==o?o:null==m?void 0:m.type;if(!v)return u;const g=yield $(v,t);return g in y?y[g](u):c(yield $(O,t),`Operator: ${e}\n- Invalid output type: ${g}`,C)}catch(e){return c(yield $(O,t),f(e),C)}})),B=(e,t)=>i(void 0,void 0,void 0,(function*(){return Array.isArray(e)?yield Promise.all(e.map((e=>$(e,t)))):yield $(e,t)})),G=(e,t)=>i(void 0,void 0,void 0,(function*(){const r=Object.keys(e).filter(h);if(0===r.length)return{};const a=[];return r.forEach((r=>a.push($(e[r],t)))),L(r,yield Promise.all(a))})),Q=(e,t)=>i(void 0,void 0,void 0,(function*(){if(!b(e))return e;const r=[],a=[];Object.entries(e).forEach((([r,i])=>{h(r)&&(a.push(r,$(i,t)),delete e[r])}));const i=yield Promise.all(a);t.resolvedAliasNodes=Object.assign(Object.assign({},t.resolvedAliasNodes),k(i)),Object.entries(e).forEach((([e,a])=>{r.push(e,$(a,t))}));const s=yield Promise.all(r);return v(k(s),t)})),W=[{name:"values",description:"Returns true if all values are true",aliases:[],required:!0,type:"array",default:[!0,!0]}],z=U(W),J={description:"Logical AND",aliases:["and","&","&&"],parameters:W},V=e=>{const t=e.children;return Object.assign(Object.assign({},e),{values:t})},Y={propertyAliases:z,operatorData:J,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);return t.typeChecker(R(J.parameters,{values:r})),r.reduce(((e,t)=>e&&!!t),!0)})),parseChildren:V},X=[{name:"values",description:"Returns true if any values are true",aliases:[],required:!0,type:"array",default:[!0,!1]}],K=U(X),Z={description:"Logical OR",aliases:["or","|","||"],parameters:X},ee={propertyAliases:K,operatorData:Z,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);return t.typeChecker(R(Z.parameters,{values:r})),r.reduce(((e,t)=>e||!!t),!1)})),parseChildren:V},te=[{name:"values",description:"Array of values to check for equality",aliases:[],required:!0,type:"array",default:["These are equal","These are equal"]},{name:"caseInsensitive",description:"If the values are strings, ignore the case (default: false)",aliases:[],required:!1,type:"boolean",default:!1},{name:"nullEqualsUndefined",description:"Whether a null value should be considered equal to an undefined value (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],re=U(te),ae={description:"Test multiple values are equal",aliases:["=","eq","equal","equals"],parameters:te},ie={propertyAliases:re,operatorData:ae,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,i,s;const[n,o,l]=yield B([e.values,e.caseInsensitive,e.nullEqualsUndefined],t);t.typeChecker(R(ae.parameters,{values:n,caseInsensitive:o,nullEqualsUndefined:l}));const u=(void 0!==o?o:null!==(i=null===(r=t.options)||void 0===r?void 0:r.caseInsensitive)&&void 0!==i&&i)&&n.every((e=>"string"==typeof e))?n.map((e=>e.toLowerCase())):n;return!(void 0!==l?l:void 0!==(null===(s=t.options)||void 0===s?void 0:s.nullEqualsUndefined)&&t.options.nullEqualsUndefined)||null!==u[0]&&void 0!==u[0]?u.every((e=>a.dequal(e,u[0]))):u.every((e=>null==e))})),parseChildren:V},se=[{name:"values",description:"Array of values to check for inequality",aliases:[],required:!0,type:"array",default:["These items","don't match"]},{name:"caseInsensitive",description:"If the values are strings, ignore the case (default: false)",aliases:[],required:!1,type:"boolean",default:!1},{name:"nullEqualsUndefined",description:"Whether a null value should be considered equal to an undefined value (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],ne=U(se),oe={description:"Test if any values are different",aliases:["!=","!","ne","notEqual"],parameters:se},le={propertyAliases:ne,operatorData:oe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,i,s;const[n,o,l]=yield B([e.values,e.caseInsensitive,e.nullEqualsUndefined],t);t.typeChecker(R(oe.parameters,{values:n,caseInsensitive:o,nullEqualsUndefined:l}));const u=(void 0!==o?o:null!==(i=null===(r=t.options)||void 0===r?void 0:r.caseInsensitive)&&void 0!==i&&i)&&n.every((e=>"string"==typeof e))?n.map((e=>e.toLowerCase())):n;return!(void 0!==l?l:void 0!==(null===(s=t.options)||void 0===s?void 0:s.nullEqualsUndefined)&&t.options.nullEqualsUndefined)||null!==u[0]&&void 0!==u[0]?u.some((e=>!a.dequal(e,u[0]))):u.some((e=>null===e&&void 0===e))})),parseChildren:V},ue=[{name:"values",description:"Array of values to check to add together",aliases:[],required:!0,type:"array",default:[1,2,3]},{name:"type",description:"Data type to coerce input values to before addition",aliases:[],required:!1,type:{literal:["string","array","number","boolean","bool"]},default:"string"}],de=U(ue),ce={description:"Add, concatenate or merge multiple values",aliases:["+","plus","add","concat","join","merge"],parameters:ue},pe={propertyAliases:de,operatorData:ce,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);return t.typeChecker(R(ce.parameters,{values:r,type:e.type})),0===r.length?r:"string"===(null==e?void 0:e.type)?r.reduce(((e,t)=>e.concat(t)),""):"array"===(null==e?void 0:e.type)?r.reduce(((e,t)=>e.concat(t)),[]):r.every((e=>"string"==typeof e||Array.isArray(e)))?r.reduce(((e,t)=>e.concat(t))):r.every((e=>b(e)))?r.reduce(((e,t)=>Object.assign(Object.assign({},e),t)),{}):r.reduce(((e,t)=>e+t))})),parseChildren:V},he=[{name:"values",description:"Array of values - 2nd element will be subtracted from the first",aliases:[],required:!1,type:"array",default:[10,5]},{name:"from",description:"Numerical value that will be subtracted from",aliases:["subtractFrom"],required:!1,type:"number",default:100},{name:"subtract",description:"Numerical value to subtract",aliases:[],required:!1,type:"number",default:50}],ve=U(he),me={description:"Subtract one numerical value from another",aliases:["-","subtract","minus","takeaway"],parameters:he},ye={propertyAliases:ve,operatorData:me,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a,i]=yield B([e.values,e.from,e.subtract],t);t.typeChecker(R(me.parameters,{values:r,from:a,subtract:i}));const s=null!=r?r:[a,i].filter((e=>void 0!==e));if(s.length<2)throw new Error("- Not enough values provided");if(s.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");return s[0]-s[1]})),parseChildren:V},fe=[{name:"values",description:"Array of values whose product will be calculated",aliases:[],required:!0,type:"array",default:[5,5]}],ge=U(fe),be={description:"Multiply several numerical values together",aliases:["*","x","multiply","times"],parameters:fe},Te={propertyAliases:ge,operatorData:be,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);if(t.typeChecker(R(be.parameters,{values:r})),0===r.length)return 0;if(r.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");return r.reduce(((e,t)=>e*t))})),parseChildren:V},Oe=[{name:"values",description:"Array of values - 1st element will be divided by the first",aliases:[],required:!1,type:"array",default:[100,10]},{name:"dividend",description:"The number that will be divided",aliases:["divide"],required:!1,type:"number",default:99},{name:"divisor",description:"The number that dividend will be divided by",aliases:["by","divideBy"],required:!1,type:"number",default:3},{name:"output",description:"Whether to output a quotient, remainder or decimal",aliases:[],required:!1,type:{literal:["quotient","remainder"]},default:"quotient"}],Ce=U(Oe),qe={description:"Divide one numerical value by another",aliases:["/","divide","÷"],parameters:Oe},je={propertyAliases:Ce,operatorData:qe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a,i,s]=yield B([e.values,e.dividend,e.divisor,e.output],t);t.typeChecker(R(qe.parameters,{values:r,dividend:a,divisor:i,output:s}));const n=null!=r?r:[a,i].filter((e=>void 0!==e));if(n.length<2)throw new Error("- Not enough values provided");if(n.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");if(0===n[1])throw new Error("Division by zero!");switch(s){case"quotient":return Math.floor(n[0]/n[1]);case"remainder":return n[0]%n[1];default:return n[0]/n[1]}})),parseChildren:V},Ae=[{name:"values",description:"Array of values - 1st element will be compared to the second",aliases:[],required:!0,type:"array",default:[10,9]},{name:"strict",description:"Whether value must be strictly greater than (i.e. not equal) (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],Ee=U(Ae),Se={description:"Test if a value is greater than (or equal to) another value",aliases:[">","greaterThan","higher","larger"],parameters:Ae},Ne={propertyAliases:Ee,operatorData:Se,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a=!0]=yield B([e.values,e.strict],t);if(t.typeChecker(R(Se.parameters,{values:r,strict:a})),r.length<2)throw new Error("- Not enough values provided");const[i,s]=r;return i===s&&!a||i>s})),parseChildren:V},Pe=[{name:"values",description:"Array of values - 1st element will be compared to the second",aliases:[],required:!0,type:"array",default:[9,10]},{name:"strict",description:"Whether value must be strictly smaller than (i.e. not equal) (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],xe=U(Pe),we={description:"Test if a value is smaller than (or equal to) another value",aliases:["<","lessThan","lower","smaller"],parameters:Pe},Ie={propertyAliases:xe,operatorData:we,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a=!0]=yield B([e.values,e.strict],t);if(t.typeChecker(R(we.parameters,{values:r,strict:a})),r.length<2)throw new Error("- Not enough values provided");const[i,s]=r;return i===s&&!a||i<s})),parseChildren:V},Ue=[{name:"condition",description:"The expression to check for truthiness",aliases:[],required:!0,type:"any",default:!0},{name:"valueIfTrue",description:"Value to return if condition is true",aliases:["ifTrue"],required:!0,type:"any",default:"The condition is true"},{name:"valueIfFalse",description:"Value to return if condition is false",aliases:["ifFalse","ifNot"],required:!0,type:"any",default:"The condition is false"}],Re=U(Ue),Le={description:"Return a value based on a condition",aliases:["?","conditional","ifThen"],parameters:Ue},ke={propertyAliases:Re,operatorData:Le,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){t.typeChecker(R(Le.parameters,{condition:e.condition,valueIfTrue:e.valueIfTrue,valueIfFalse:e.valueIfFalse}));return(yield $(e.condition,t))?yield $(e.valueIfTrue,t):yield $(e.valueIfFalse,t)})),parseChildren:e=>{const[t,r,a]=e.children;return Object.assign(Object.assign({},e),{condition:t,valueIfTrue:r,valueIfFalse:a})}},De=[{name:"testString",description:"The string to test",aliases:["string","value"],required:!0,type:"string",default:"test-this"},{name:"pattern",description:"The regular expression pattern",aliases:["regex","regexp","regExp","re"],required:!0,type:"string",default:"^[a-z]{4}-[a-z]{4}$"}],_e=U(De),Me={description:"Compare a string against a regex pattern",aliases:["regex","patternMatch","regexp","matchPattern"],parameters:De},Fe={propertyAliases:_e,operatorData:Me,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a]=yield B([e.testString,e.pattern],t);t.typeChecker(R(Me.parameters,{testString:r,pattern:a}));try{return new RegExp(a).test(r)}catch(e){throw new Error("Regex error:"+f(e))}})),parseChildren:e=>{const[t,r]=e.children;return Object.assign(Object.assign({},e),{testString:t,pattern:r})}},He=[{name:"property",description:'The path to the required property (e.g. "user.firstName")',aliases:["path","propertyName"],required:!0,type:"string",default:"path.to[0].my.data"},{name:"additionalData",description:"Additional data objects to be considered",aliases:["additional","objects","data","additionalObjects"],required:!1,type:"object",default:{}}],$e=U(He),Be={description:"Extract values from data objects",aliases:["dataProperties","data","getData","objectProperties","objProps","getProperty","getObjProp"],parameters:He},Ge={propertyAliases:$e,operatorData:Be,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var a,i;const[s,n={}]=yield B([e.property,e.additionalData],t);t.typeChecker(R(Be.parameters,{property:s,additionalData:n}));const o=Object.assign(Object.assign({},null!==(i=null===(a=t.options)||void 0===a?void 0:a.data)&&void 0!==i?i:{}),n);return r(o,s)})),parseChildren:e=>{const[t,r]=e.children,a=Object.assign(Object.assign({},e),{property:t});return void 0!==r&&(a.fallback=r),a}},Qe=[{name:"string",description:"A parameterised (%1, %2) string where the parameters are to be replaced",aliases:[],required:!0,type:"string",default:"Hello, %1"},{name:"substitutions",description:"An array of substitution values for the parameterised string",aliases:["replacements","values"],required:!1,type:["array","object"],default:["friend"]},{name:"trimWhiteSpace",description:"Whether or not to trim white space from either end of the substituted strings (default: true)",aliases:["trim","trimWhitespace"],required:!1,type:"boolean",default:!0},{name:"substitutionCharacter",description:'Which character to search for in original string for replacement -- can be "%" or "$" (default: "%")',aliases:["subCharacter","subChar"],required:!1,type:"string",default:"$"},{name:"numberMapping",description:"Rules for mapping number values to text strings, such as pluralisation.",aliases:["numMap","numberMap","pluralisation","pluralization","plurals"],required:!1,type:"object",default:{}}],We=U(Qe),ze={description:"Replace values in a string using simple parameter substitution",aliases:["stringSubstitution","substitute","stringSub","replace"],parameters:Qe},Je={propertyAliases:We,operatorData:ze,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a={},i=!0,s="%",n={}]=yield B([e.string,e.substitutions,e.trimWhiteSpace,e.substitutionCharacter,e.numberMapping],t);if(t.typeChecker(R(ze.parameters,{string:r,substitutions:a,trimWhiteSpace:i,substitutionCharacter:s,numberMapping:n})),Array.isArray(a)){const e="$"===s?"$":"%",t=new RegExp(`(?<!\\\\)(${"%"===e?"%":"\\$"}[\\d]+)`,"g"),n=(r.match(t)||[]).sort(((e,t)=>Number(e.slice(1))-Number(t.slice(1)))),o=new Set(n),l=L(Array.from(o),a.map((e=>i?String(e).trim():e)));return r.split(t).map((e=>e in l?l[e]:e)).join("").replace(`\\${e}`,e)}return r.split(/(?<!\\)({{(?:[A-Za-z0-9_.]|\[[0-9]+\])+}})/g).map((e=>{if(!/(?<!\\){{(.+)}}/.exec(e))return e.replace("\\{{","{{");const r=Ve(e,a,n,t.options.data);return i?String(r).trim():r})).join("")})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{string:t,substitutions:r})}},Ve=(e,t,a,i={})=>{const s=e.replace(/{{(.+)}}/,"$1"),n=r(t,s,r(i,s,""));if("number"!=typeof n)return n;if(!(s in a))return n;const o=a[s];if(n in o)return o[n].replace("{}",String(n));const l=Object.keys(a[s]),u=l.find((e=>e.startsWith(">")));if(u){if(n>Number(u.slice(1)))return null==o?void 0:o[u]}const d=l.find((e=>e.startsWith("<")));if(d){if(n<Number(d.slice(1)))return null==o?void 0:o[d]}return o.other?o.other.replace("{}",String(n)):n},Ye=[{name:"values",description:"An array to count",aliases:[],required:!0,type:"array",default:[1,2,3,4,5]}],Xe=U(Ye),Ke={description:"Count elements in an array",aliases:["count","length"],parameters:Ye},Ze={propertyAliases:Xe,operatorData:Ke,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);return t.typeChecker(R(Ke.parameters,{values:r})),r.length})),parseChildren:e=>{const[t]=e.children;return Object.assign(Object.assign({},e),{values:t})}},et=[{name:"value",description:"The string to be split",aliases:["string"],required:!0,type:"string",default:"Alpha, Bravo, Charlie"},{name:"delimiter",description:"The value to split the string on (default is white space)",aliases:["separator"],required:!1,type:"string",default:","},{name:"trimWhiteSpace",description:"Whether to trim white space from around the resulting elements (default: true)",aliases:["trim","trimWhitespace"],required:!1,type:"boolean",default:!0},{name:"excludeTrailing",description:"If the input string ends in a delimiter, there will be an additional blank element if this value is false (default: true)",aliases:["removeTrailing","excludeTrailingDelimiter"],required:!1,type:"boolean",default:!0}],tt=U(et),rt={description:"Split a string into an array",aliases:["split","arraySplit"],parameters:et},at=" ",it={propertyAliases:tt,operatorData:rt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,i;const[s,n,o,l]=yield B([e.value,null!==(r=e.delimiter)&&void 0!==r?r:at,null===(a=e.trimWhiteSpace)||void 0===a||a,null===(i=e.excludeTrailing)||void 0===i||i],t);t.typeChecker(R(rt.parameters,{value:s,delimiter:n,trimWhiteSpace:o,excludeTrailing:l}));let u=s.split(n);return o&&(u=u.map((e=>e.trim()))),l&&""===u[u.length-1]&&u.pop(),u})),parseChildren:e=>{const[t,r=at]=e.children;return Object.assign(Object.assign({},e),{value:t,delimiter:r})}},st=[{name:"query",description:"A SQL query string, with parameterised replacements (i.e. $1, $2, etc)",aliases:[],required:!0,type:"string",default:"SELECT contact_name FROM customers;"},{name:"values",description:"An array of values to replace in the SQL string parameters",aliases:["replacements"],required:!1,type:"array",default:[]},{name:"type",description:"Determines the shape of the resulting data (see documentation)",aliases:["queryType"],required:!1,type:{literal:["array","string","number"]},default:"array"},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],nt=U(st),ot={description:"Query a Postgres database using node-postgres",aliases:["pgSql","sql","postgres","pg","pgDb"],parameters:st},lt=(e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i={text:e,values:t,rowMode:a?"array":""},s=yield r.query(i);if(null==s?void 0:s.error)throw new Error(s.error);switch(a){case"array":return s.rows.flat();case"string":return s.rows.flat().join(" ");case"number":{const e=s.rows.flat();return Number.isNaN(Number(e))?e:Number(e)}default:return s.rows}})),ut={propertyAliases:nt,operatorData:ot,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const[n,o,l,u]=yield B([e.query,e.type,e.values||[],e.useCache],t);if(t.typeChecker(R(ot.parameters,{query:n,type:o,values:l,useCache:u})),!(null===(r=t.options)||void 0===r?void 0:r.pgConnection))throw new Error("No Postgres database connection provided");const d=null===(s=null!==(a=e.useCache)&&void 0!==a?a:t.options.useCache)||void 0===s||s;return t.cache.useCache(d,((e,r,a)=>i(void 0,void 0,void 0,(function*(){return yield lt(e,a,t.options.pgConnection,r)}))),n,o,l)})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{query:t,values:r})}},dt=[{name:"query",description:"GraphQL query string",aliases:[],required:!0,type:"string",default:'query getCountries {\n countries(filter: {continent: {eq: "OC"}}) {\n name\n }\n }'},{name:"url",description:"Endpoint for the GraphQL request (if not already provided in options)",aliases:["endpoint"],required:!1,type:["string","null"],default:"https://countries.trevorblades.com/"},{name:"headers",description:"HTTP Headers (if not already provided in options)",aliases:[],required:!1,type:"object",default:{}},{name:"variables",description:"Values for the variables used in query (key-value pairs)",aliases:[],required:!1,type:"object",default:{}},{name:"returnNode",description:"Property path to extract from the query response",aliases:["outputNode","returnProperty"],required:!1,type:"string",default:"data.countries[1].name"},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],ct=U(dt),pt={description:"GraphQL request",aliases:["graphQl","graphql","gql"],parameters:dt},ht={propertyAliases:ct,operatorData:pt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s,n,o,l;const[u,d,c,p,h,v]=yield B([e.query,e.url,e.variables,e.returnNode,e.headers,e.useCache],t),{url:m,headers:y}=d instanceof Object?d:{url:d,headers:null};t.typeChecker([...R(pt.parameters,{url:m,query:u,variables:c,returnNode:p,headers:h,useCache:v}),{name:"headers",value:y,expectedType:["object","null"]}]);const f=m&&"graphqlendpoint"!==m.toLowerCase()?m:"",g=null!==(s=null!==(a=null===(r=t.options.graphQLConnection)||void 0===r?void 0:r.endpoint)&&void 0!==a?a:t.options.baseEndpoint)&&void 0!==s?s:"",b=M(f)?f:F(g,f),T={query:u,variables:c},O=null===(n=null!=v?v:t.options.useCache)||void 0===n||n,C=yield t.cache.useCache(O,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield H({url:e,method:"post",data:t,headers:r});return _(i.data,a)}))),b,T,Object.assign(Object.assign(Object.assign(Object.assign({},null===(o=t.options.graphQLConnection)||void 0===o?void 0:o.headers),null===(l=t.options)||void 0===l?void 0:l.headers),y),h),p);return C})),parseChildren:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a="",i,...s]=yield B(e.children,t),n=Array.isArray(i)?i:[i],o=s.slice(0,n.length),l=L(n,o),u=Object.assign(Object.assign({},e),{query:r,url:a,variables:l});return s.length>n.length&&(u.returnNode=s.pop()),u}))},vt=[{name:"url",description:"Endpoint URL",aliases:["endpoint"],required:!0,type:"string",default:"https://restcountries.com/v3.1/name/zealand"},{name:"returnProperty",description:"Property from request result",aliases:["outputProperty"],required:!1,type:"string",default:"result.path"},{name:"headers",description:"HTTP Headers",aliases:[],required:!1,type:"object",default:{}},{name:"parameters",description:"Query parameters (key-value)",aliases:["queryParams","queryParameters","urlQueries"],required:!1,type:"object",default:{}},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],mt=U(vt),yt={description:"HTTP GET Request",aliases:["get","api"],parameters:vt},ft=(e,t)=>i(void 0,void 0,void 0,(function*(){const[r="",a,...i]=yield B(e.children,t),s=Array.isArray(a)?a:[a],n=i.slice(0,s.length),o=L(s,n),l=Object.assign(Object.assign({},e),{url:r,parameters:o});return i.length>s.length&&(l.returnProperty=i.pop()),l})),gt=ft,bt={propertyAliases:mt,operatorData:yt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const[n,o,l,u,d]=yield B([e.url,e.parameters,e.returnProperty,e.headers,e.useCache],t),{url:c,headers:p}=n instanceof Object?n:{url:n,headers:null};t.typeChecker([...R(yt.parameters,{url:c,returnProperty:l,headers:u,parameters:o,useCache:d}),{name:"headers",value:p,expectedType:["object","null"]}]);const h=null!==(r=t.options.baseEndpoint)&&void 0!==r?r:"",v=Object.assign(Object.assign(Object.assign({},null===(a=t.options)||void 0===a?void 0:a.headers),p),u),m=null===(s=null!=d?d:t.options.useCache)||void 0===s||s,y=yield t.cache.useCache(m,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield H({url:e,params:t,headers:r});return _(i,a)}))),M(c)?c:F(h,c),o,v,l);return y})),parseChildren:ft},Tt=[{name:"url",description:"Endpoint URL",aliases:["endpoint"],required:!0,type:"string",default:"https://jsonplaceholder.typicode.com/posts"},{name:"returnProperty",description:"Property path from request result",aliases:["outputProperty"],required:!1,type:"string",default:"result.path"},{name:"headers",description:"HTTP Headers",aliases:[],required:!1,type:"object",default:{}},{name:"parameters",description:"JSON Body parameters (key-value)",aliases:["bodyJson","data"],required:!1,type:"object",default:{}},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],Ot=U(Tt),Ct={description:"HTTP POST Request",aliases:["post"],parameters:Tt},qt={propertyAliases:Ot,operatorData:Ct,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const[n,o,l,u,d]=yield B([e.url,e.parameters,e.returnProperty,e.headers,e.useCache],t),{url:c,headers:p}=n instanceof Object?n:{url:n,headers:null};t.typeChecker([...R(Ct.parameters,{url:c,headers:u,data:o,returnProperty:l,useCache:d}),{name:"headers",value:p,expectedType:["object","null"]}]);const h=null!==(r=t.options.baseEndpoint)&&void 0!==r?r:"",v=Object.assign(Object.assign(Object.assign({},null===(a=t.options)||void 0===a?void 0:a.headers),p),u),m=null!==(s=null!=d?d:t.options.useCache)&&void 0!==s&&s;return yield t.cache.useCache(m,(()=>i(void 0,void 0,void 0,(function*(){const e=yield H({url:c,data:o,headers:u,method:"post"});return _(e,l)}))),M(c)?c:F(h,c),o,v,l)})),parseChildren:gt},jt=[{name:"properties",description:'An array of objects, each with a "key" property and a "value" property',aliases:["values","keyValPairs","keyValuePairs"],required:!0,type:"array",default:["firstKey","firstValue","secondKey","secondValue"]}],At=U(jt),Et={description:"Construct an object using objects defining keys and values",aliases:["buildObject","build","object"],parameters:jt},St={propertyAliases:At,operatorData:Et,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){t.typeChecker(R(Et.parameters,{properties:e.properties}));const r=e.properties.filter((e=>e instanceof Object&&"key"in e&&"value"in e)).map((({key:e,value:r})=>{return a=[e,r],i(void 0,void 0,void 0,(function*(){const[e,r]=yield B(a,t);return t.typeChecker({name:"key",value:e,expectedType:["string","number","boolean"]}),[e,r]}));var a}));return Object.fromEntries(yield Promise.all(r))})),parseChildren:e=>{const t=e.children;if(t.length%2!=0)throw new Error("Even number of children required to make key/value pairs");const r=t.filter(((e,t)=>t%2==0)),a=t.filter(((e,t)=>t%2==1)),i=r.map(((e,t)=>({key:e,value:a[t]})));return Object.assign(Object.assign({},e),{properties:i})}},Nt=[{name:"matchExpression",description:"Expression to match against",aliases:["match"],required:!0,type:["string","number","boolean"],default:"matchMe"},{name:"branches",description:"Object whose keys are compared against the match expression. The value of the matching key is returned",aliases:["arms","cases"],required:!1,type:["object","array"],default:{matchMe:"YES",nonMatch:"NO"}},{name:"[...branches]",description:"Branch properties can optionally be placed at the operator root",aliases:[],required:!1,type:["object","array"]}],Pt={propertyAliases:U(Nt),operatorData:{description:"Return different values depending on a matching expression",aliases:["match","switch"],parameters:Nt},evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r;const a=yield $(e.matchExpression,t);t.typeChecker({name:"matchExpression",value:a,expectedType:["string","number","boolean"]});const i=Array.isArray(e.branches)?k(e.branches):null!==(r=e.branches)&&void 0!==r?r:{},n=s(i)?yield $(i,t):i;if(!b(n))throw new Error("Branches don't evaluate to an object");if(a in n)return yield $(n[a],t);if("fallback"in n)return yield $(n.fallback,t);if(a in e)return yield $(e[a],t);throw new Error(`No match found for ${a}`)})),parseChildren:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,...a]=e.children,i=k(yield B(a,t));return Object.assign(Object.assign({},e),{matchExpression:r,branches:i})}))},xt=[{name:"functionPath",description:"Path (in options.functions) to the required function",aliases:["functionsPath","functionName","funcName","path","name"],required:!0,type:"string",default:null},{name:"args",description:"Arguments for the function",aliases:["arguments","variables"],required:!1,type:"array",default:[]},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!1}],wt=U(xt),It={description:"Call a custom function (defined in options)",aliases:["customFunctions","customFunction","objectFunctions","function","functions","runFunction"],parameters:xt},Ut={propertyAliases:wt,operatorData:It,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var a,s,n;const[o,l=[],u]=yield B([e.functionPath,e.args,e.useCache],t);t.typeChecker(R(It.parameters,{functionPath:o,args:l}));const{data:d,functions:c}=t.options,p=null!==(s=null!==(a=r(c,o,null))&&void 0!==a?a:r(d,o,null))&&void 0!==s?s:r(t.options,o,null);if(!p||"function"!=typeof p)throw new Error(`- No function found: "${o}"`);const h=null!==(n=null!=u?u:t.options.useCache)&&void 0!==n&&n;return yield t.cache.useCache(h,((e,...t)=>i(void 0,void 0,void 0,(function*(){return yield p(...t)}))),o,...l)})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{functionPath:t,args:r})}},Rt=[{name:"value",description:"Value to pass through",aliases:["_","data"],required:!0,type:"any",default:null}],Lt=U(Rt),kt={description:"Pass through a value unchanged (or change its type)",aliases:["_","passThru","passthru","pass","ignore","coerce","convert"],parameters:Rt},Dt={propertyAliases:Lt,operatorData:kt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){return t.typeChecker(R(kt.parameters,{value:e.value})),yield $(e.value,t)})),parseChildren:e=>{const[...t]=e.children,r=1===(null==t?void 0:t.length)?t[0]:t;return Object.assign(Object.assign({},e),{value:r})}};var _t=Object.freeze({__proto__:null,AND:Y,BUILD_OBJECT:St,CONDITIONAL:ke,COUNT:Ze,CUSTOM_FUNCTIONS:Ut,DIVIDE:je,EQUAL:ie,GET:bt,GRAPHQL:ht,GREATER_THAN:Ne,LESS_THAN:Ie,MATCH:Pt,MULTIPLY:Te,NOT_EQUAL:le,OBJECT_PROPERTIES:Ge,OR:ee,PASSTHRU:Dt,PG_SQL:ut,PLUS:pe,POST:qt,REGEX:Fe,SPLIT:it,STRING_SUBSTITUTION:Je,SUBTRACT:ye});class Mt{constructor(e){var t,r;this.useCache=(e,t,...r)=>i(this,void 0,void 0,(function*(){if(!e)return yield t(...r);const a=Ft(r),i=a in this.store,s=Date.now(),n=i&&s-this.store[a].timestamp>1e3*this.maxTime;if(i)return this.queue=this.queue.filter((e=>e!==a)),this.queue.unshift(a),this.store[a].timestamp=s,n&&(this.store[a].result=yield t(...r)),this.store[a].result;const o=yield t(...r);return this.store[a]={result:o,timestamp:s},this.queue.unshift(a),this.resizeCache(),o})),this.getMax=()=>this.maxSize,this.setMax=e=>{this.maxSize=e,this.resizeCache()},this.getMaxTime=()=>this.maxTime,this.setMaxTime=e=>{this.maxTime=e},this.getCache=()=>this.store,this.setCache=e=>this.store=e,this.resizeCache=()=>{if(this.queue.length>this.maxSize){this.queue.slice(this.maxSize).forEach((e=>delete this.store[e])),this.queue=this.queue.slice(0,this.maxSize)}},this.store={},this.queue=[],this.maxSize=null!==(t=null==e?void 0:e.maxSize)&&void 0!==t?t:50,this.maxTime=null!==(r=null==e?void 0:e.maxTime)&&void 0!==r?r:1800}}const Ft=e=>e.map((e=>"object"==typeof e?JSON.stringify(e):e)).join("_");class Ht{constructor(e={}){var t,r;this.typeChecker=(...e)=>{const t=1===e.length&&Array.isArray(e[0])?e[0]:e,r=P(...t);if(!0!==r)throw new Error(r)},this.getCache=()=>this.cache.getCache(),this.setCache=e=>this.cache.setCache(e),this.getVersion=()=>"2.14.1",this.options=$t(e),this.operators=u(_t,null!==(r=null===(t=this.options)||void 0===t?void 0:t.excludeOperators)&&void 0!==r?r:[],T),this.operatorAliases=T,this.cache=new Mt({maxSize:e.maxCacheSize,maxTime:e.maxCacheTime})}evaluate(e,t={}){return i(this,void 0,void 0,(function*(){const r=m(this.options,$t(t));return r.maxCacheSize&&r.maxCacheSize!==this.cache.getMax()&&this.cache.setMax(r.maxCacheSize),r.maxCacheTime&&r.maxCacheTime!==this.cache.getMaxTime()&&this.cache.setMaxTime(r.maxCacheTime),yield $(e,{options:r,operators:t.excludeOperators?u(_t,t.excludeOperators,T):this.operators,operatorAliases:this.operatorAliases,typeChecker:r.skipRuntimeTypeCheck?()=>{}:this.typeChecker,resolvedAliasNodes:{},cache:this.cache})}))}getOptions(){return this.options}updateOptions(e){this.options=m(this.options,$t(e)),this.options.excludeOperators&&(this.operators=u(_t,this.options.excludeOperators,T))}getOperators(){const e=this.options.excludeOperators?u(_t,this.options.excludeOperators,T):this.operators,t=Object.entries(e).map((([e,t])=>Object.assign({name:e},t.operatorData))),r=[...new Set(Object.values(T))];return t.sort(((e,t)=>r.indexOf(e.name)-r.indexOf(t.name)))}getFragments(){var e;return Object.entries(null!==(e=this.options.fragments)&&void 0!==e?e:{}).map((([e,t])=>Object.assign({name:e},null==t?void 0:t.metadata)))}getCustomFunctions(){var e;return Object.entries(null!==(e=this.options.functions)&&void 0!==e?e:{}).map((([e,t])=>({name:e,numRequiredArgs:t.length})))}}const $t=e=>"objects"in e?Object.assign(Object.assign({},e),{data:e.objects}):e;exports.FigTreeEvaluator=Ht,exports.evaluateExpression=(e,t)=>new Ht(t).evaluate(e),exports.isAliasString=h,exports.isFragmentNode=n,exports.isObject=b,exports.isOperatorNode=s,exports.preProcessShorthand=q,exports.standardiseOperatorName=o,exports.truncateString=d;
|
|
1
|
+
"use strict";var e=require("change-case"),t=require("object-property-extractor"),r=require("dequal/lite"),a=require("querystring");function i(e,t,r,a){return new(r||(r=Promise))((function(i,s){function n(e){try{l(a.next(e))}catch(e){s(e)}}function o(e){try{l(a.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,o)}l((a=a.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const s=e=>e instanceof Object&&"operator"in e,n=e=>e instanceof Object&&"fragment"in e,o=t=>{const r=e.camelCase(t);return r||t},l=(e,t)=>t[o(e)],u=(e,t,r)=>{const a=Object.assign({},e);return t.forEach((e=>{r[o(e)]||console.warn(`Invalid operator exclusion: ${e}`),delete a[r[o(e)]]})),a},d=(e,t=200)=>e.length<t?e:`${e.slice(0,t-2).trim()}...`,c=(e,t,r=!1)=>{if(void 0!==e)return e;if(r)return d(t);throw new Error(d(t))},p=(e,t)=>{const r=Object.entries(e).map((([e,r])=>[t(e),r]));return Object.fromEntries(r)},h=e=>/^\$.+/.test(e),v=(e,{resolvedAliasNodes:t})=>{var r;return"string"==typeof e&&h(e)&&null!==(r=null==t?void 0:t[e])&&void 0!==r?r:e},y=(e,t)=>{const r=Object.assign(Object.assign({},e),t);return(e.data||t.data)&&(r.data=Object.assign(Object.assign({},e.data),t.data)),(e.functions||t.functions)&&(r.functions=Object.assign(Object.assign({},e.functions),t.functions)),(e.fragments||t.fragments)&&(r.fragments=Object.assign(Object.assign({},e.fragments),t.fragments)),(e.headers||t.headers)&&(r.headers=Object.assign(Object.assign({},e.headers),t.headers)),r},m={number:e=>g(e),string:e=>String(e),array:e=>Array.isArray(e)?e:[e],boolean:e=>Boolean(e),bool:e=>Boolean(e)},f=e=>e.message,g=e=>{if("string"!=typeof e)return Number.isNaN(Number(e))?e:Number(e);const t=new RegExp(/-?\d*\.?\d+/gm),r=e.match(t);return r?Number(r[0]):0},b=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),T={and:"AND","&":"AND","&&":"AND",or:"OR","|":"OR","||":"OR","=":"EQUAL",eq:"EQUAL",equal:"EQUAL",equals:"EQUAL","!=":"NOT_EQUAL","!":"NOT_EQUAL",ne:"NOT_EQUAL",notEqual:"NOT_EQUAL","+":"PLUS",plus:"PLUS",add:"PLUS",concat:"PLUS",join:"PLUS",merge:"PLUS","-":"SUBTRACT",subtract:"SUBTRACT",minus:"SUBTRACT",takeaway:"SUBTRACT","*":"MULTIPLY",x:"MULTIPLY",multiply:"MULTIPLY",times:"MULTIPLY","/":"DIVIDE",divide:"DIVIDE","÷":"DIVIDE",">":"GREATER_THAN",greaterThan:"GREATER_THAN",higher:"GREATER_THAN",larger:"GREATER_THAN","<":"LESS_THAN",lessThan:"LESS_THAN",lower:"LESS_THAN",smaller:"LESS_THAN","?":"CONDITIONAL",conditional:"CONDITIONAL",ifThen:"CONDITIONAL",regex:"REGEX",patternMatch:"REGEX",regexp:"REGEX",matchPattern:"REGEX",dataProperties:"OBJECT_PROPERTIES",data:"OBJECT_PROPERTIES",getData:"OBJECT_PROPERTIES",objectProperties:"OBJECT_PROPERTIES",objProps:"OBJECT_PROPERTIES",getProperty:"OBJECT_PROPERTIES",getObjProp:"OBJECT_PROPERTIES",stringSubstitution:"STRING_SUBSTITUTION",substitute:"STRING_SUBSTITUTION",stringSub:"STRING_SUBSTITUTION",replace:"STRING_SUBSTITUTION",split:"SPLIT",arraySplit:"SPLIT",count:"COUNT",length:"COUNT",get:"GET",api:"GET",post:"POST",sql:"SQL",pgSql:"SQL",postgres:"SQL",pg:"SQL",sqLite:"SQL",sqlite:"SQL",mySql:"SQL",graphQl:"GRAPHQL",graphql:"GRAPHQL",gql:"GRAPHQL",buildObject:"BUILD_OBJECT",build:"BUILD_OBJECT",object:"BUILD_OBJECT",match:"MATCH",switch:"MATCH",customFunctions:"CUSTOM_FUNCTIONS",customFunction:"CUSTOM_FUNCTIONS",objectFunctions:"CUSTOM_FUNCTIONS",function:"CUSTOM_FUNCTIONS",functions:"CUSTOM_FUNCTIONS",runFunction:"CUSTOM_FUNCTIONS",_:"PASSTHRU",passThru:"PASSTHRU",passthru:"PASSTHRU",pass:"PASSTHRU",ignore:"PASSTHRU",coerce:"PASSTHRU",convert:"PASSTHRU"},O=T,C=/(\$[^()]+)\((.*)\)/,q=(e,t={},r=!0)=>r?"string"==typeof e?j(e,t):b(e)?S(e,t):e:e,j=(e,t)=>{const r=C.exec(e);if(!r)return e;const a=r[1].trim(),i=r[2].split(",").map((e=>q(e.trim(),t)));return E(a,i,t)},S=(e,t)=>{if(s(e)||n(e))return e;const r=Object.entries(e),a=r.filter((([e])=>h(e))),i=r.filter((([e])=>!h(e))),o=a.reduce(((e,[r,a])=>e=Object.assign(Object.assign({},e),E(r,a,t))),{});return Object.assign(Object.assign({},o),Object.fromEntries(i))},E=(e,t,r)=>{const a=e.slice(1),i=l(a,O);return i?Array.isArray(t)?{operator:i,children:t}:b(t)&&!Object.keys(t).some((e=>h(e)))?Object.assign({operator:i},t):{operator:i,children:[t]}:a in r?{fragment:a,parameters:Object.assign({},t)}:{[e]:t}},A=e=>b(e)&&"literal"in e,w=({value:e,name:t,expectedType:r})=>{if(A(r)){const{literal:a}=r;return!!a.includes(e)||P(t,e,`Literal(${a.map((e=>void 0===e?"undefined":`"${e}"`)).join(", ")})`)}if(Array.isArray(r))return!!r.some((r=>!0===w({value:e,name:t,expectedType:r})))||P(t,e,r.join("|"));return!!(0,x[r])(e)||P(t,e,r)},N=(...e)=>{const t=[];return e.forEach((e=>{const r=w(e);!0!==r&&t.push(r)})),!(t.length>0)||t.join("\n")},x={any:e=>void 0!==e,string:e=>"string"==typeof e,number:e=>"number"==typeof e,boolean:e=>"boolean"==typeof e,array:e=>Array.isArray(e),null:e=>null===e,object:e=>b(e),undefined:e=>void 0===e},P=(e,t,r)=>void 0===t&&e?`- Missing required property "${e}" (type: ${r})`:void 0!==e?`- Property "${e}" (value: ${L(t)}) is not of type: ${r}`:`- ${L(t)} is not of type: ${r}`,L=e=>{const t=void 0===e||Number.isNaN(e)?String(e):JSON.stringify(e);return d(t,50)},I=e=>{const t={};return e.forEach((e=>{e.aliases.forEach((r=>t[r]=e.name))})),t},U=(e,t)=>e.map((({name:e,required:r,type:a})=>{if(A(a)){const i=[...a.literal];return r||i.push(void 0),{name:e,value:t[e],expectedType:{literal:i}}}const i=Array.isArray(a)?a:[a];r||i.push("undefined");const s=1===i.length?i[0]:i;return{name:e,value:t[e],expectedType:s}})),R=(e,t)=>{const r=e.map(((e,r)=>[e,t[r]]));return Object.fromEntries(r)},k=e=>{if(e.length%2!=0)throw new Error("Even number of children required to make key/value pairs");const t=e.filter(((e,t)=>t%2==0)),r=N(...t.map((e=>({value:e,expectedType:["string","number","boolean"]}))));if(!0!==r)throw new Error(r);const a=e.filter(((e,t)=>t%2==1)),i={};return t.forEach(((e,t)=>{i[e]=a[t]})),i},D=e=>b(e)&&1===Object.keys(e).length?Object.values(e)[0]:e,Q=(e,r,a=void 0)=>{const i=r?t(e,r,a):e;return Array.isArray(i)?i.map((e=>D(e))):r?null===i?null:D(i):i},_=e=>/^https?:\/\/.+/.test(e),$=(...e)=>e.reduce(((e,t,r)=>{const a="/"===t[0]?1:0,i="/"===t.slice(-1)?-1:void 0,s=t.slice(a,i);return""===s?e:e+(0===r?"":"/")+s}),""),H=(e,t)=>i(void 0,void 0,void 0,(function*(){const{url:r,params:a={},data:i={},headers:s={},method:n="get"}=t;if(!r||""===r)throw new Error("Invalid url");try{return yield e[n]({url:r,headers:Object.assign({"Content-Type":"application/json",Accept:"application/json"},s),params:a,data:i})}catch(t){e.throwError(t)}})),M=(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,i,o;const{options:u,operators:d,operatorAliases:h}=t;let y=(null==u?void 0:u.allowJSONStringInput)?(e=>{if("string"!=typeof e)return e;try{const t=JSON.parse(e);return s(t)?t:e}catch(t){return e}})(e):e;y=q(y,null===(r=t.options)||void 0===r?void 0:r.fragments,!u.noShorthand),Array.isArray(y)&&(y=yield F(y,t));const g=s(y),T=n(y);if(u.evaluateFullObject&&!g&&!T)return v(yield G(y,t),t);if(!g&&!T)return u.supportDeprecatedValueNodes&&b(y)&&"value"in y?y.value:v(y,t);const{fallback:O}=y,C=null!==(a=null==u?void 0:u.returnErrorAsString)&&void 0!==a&&a;if(T){const[e,r]=yield F([y.fragment,y.parameters],t),a=q(null===(i=null==u?void 0:u.fragments)||void 0===i?void 0:i[e],u.fragments,!u.noShorthand);if(void 0===a)return c(yield M(O,t),`Fragment not defined: ${e}`,C);if(!s(a))return v(a,t);y=Object.assign(Object.assign(Object.assign({},y),a),r),delete y.fragment}try{const e=l(y.operator,h);if(!e)return c(yield M(O,t),`Invalid operator: ${y.operator}`,C);if(!t.operators[e])return c(yield M(O,t),`Excluded operator: ${y.operator}`,C);const{propertyAliases:r,evaluate:a,parseChildren:i}=d[e];y=((e,t)=>p(t,(t=>t in e?e[t]:t)))(r,y);const s=yield B(y,t);T||Object.entries(s).forEach((([e,r])=>t.resolvedAliasNodes[e]=r));const n=T?Object.assign(Object.assign({},t),{resolvedAliasNodes:Object.assign(Object.assign({},t.resolvedAliasNodes),s)}):t;if("children"in y){if(Array.isArray(y.children)||(y.children=yield M(y.children,n)),!Array.isArray(y.children))return c(yield M(O,t),`Operator: ${e}\n- Property "children" is not of type: array`,C);y=yield i(y,n),delete y.children}let u;try{u=yield a(y,n)}catch(r){return c(yield M(y.fallback,t),`Operator: ${e}\n${f(r)}`,C)}const v=null!==(o=null==y?void 0:y.outputType)&&void 0!==o?o:null==y?void 0:y.type;if(!v)return u;const g=yield M(v,t);return g in m?m[g](u):c(yield M(O,t),`Operator: ${e}\n- Invalid output type: ${g}`,C)}catch(e){return c(yield M(O,t),f(e),C)}})),F=(e,t)=>i(void 0,void 0,void 0,(function*(){return Array.isArray(e)?yield Promise.all(e.map((e=>M(e,t)))):yield M(e,t)})),B=(e,t)=>i(void 0,void 0,void 0,(function*(){const r=Object.keys(e).filter(h);if(0===r.length)return{};const a=[];return r.forEach((r=>a.push(M(e[r],t)))),R(r,yield Promise.all(a))})),G=(e,t)=>i(void 0,void 0,void 0,(function*(){if(!b(e))return e;const r=[],a=[];Object.entries(e).forEach((([r,i])=>{h(r)&&(a.push(r,M(i,t)),delete e[r])}));const i=yield Promise.all(a);t.resolvedAliasNodes=Object.assign(Object.assign({},t.resolvedAliasNodes),k(i)),Object.entries(e).forEach((([e,a])=>{r.push(e,M(a,t))}));const s=yield Promise.all(r);return v(k(s),t)})),z=[{name:"values",description:"Returns true if all values are true",aliases:[],required:!0,type:"array",default:[!0,!0]}],W=I(z),J={description:"Logical AND",aliases:["and","&","&&"],parameters:z},V=e=>{const t=e.children;return Object.assign(Object.assign({},e),{values:t})},Y={propertyAliases:W,operatorData:J,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);return t.typeChecker(U(J.parameters,{values:r})),r.reduce(((e,t)=>e&&!!t),!0)})),parseChildren:V},X=[{name:"values",description:"Returns true if any values are true",aliases:[],required:!0,type:"array",default:[!0,!1]}],K=I(X),Z={description:"Logical OR",aliases:["or","|","||"],parameters:X},ee={propertyAliases:K,operatorData:Z,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);return t.typeChecker(U(Z.parameters,{values:r})),r.reduce(((e,t)=>e||!!t),!1)})),parseChildren:V},te=[{name:"values",description:"Array of values to check for equality",aliases:[],required:!0,type:"array",default:["These are equal","These are equal"]},{name:"caseInsensitive",description:"If the values are strings, ignore the case (default: false)",aliases:[],required:!1,type:"boolean",default:!1},{name:"nullEqualsUndefined",description:"Whether a null value should be considered equal to an undefined value (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],re=I(te),ae={description:"Test multiple values are equal",aliases:["=","eq","equal","equals"],parameters:te},ie={propertyAliases:re,operatorData:ae,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var a,i,s;const[n,o,l]=yield F([e.values,e.caseInsensitive,e.nullEqualsUndefined],t);t.typeChecker(U(ae.parameters,{values:n,caseInsensitive:o,nullEqualsUndefined:l}));const u=(void 0!==o?o:null!==(i=null===(a=t.options)||void 0===a?void 0:a.caseInsensitive)&&void 0!==i&&i)&&n.every((e=>"string"==typeof e))?n.map((e=>e.toLowerCase())):n;return!(void 0!==l?l:void 0!==(null===(s=t.options)||void 0===s?void 0:s.nullEqualsUndefined)&&t.options.nullEqualsUndefined)||null!==u[0]&&void 0!==u[0]?u.every((e=>r.dequal(e,u[0]))):u.every((e=>null==e))})),parseChildren:V},se=[{name:"values",description:"Array of values to check for inequality",aliases:[],required:!0,type:"array",default:["These items","don't match"]},{name:"caseInsensitive",description:"If the values are strings, ignore the case (default: false)",aliases:[],required:!1,type:"boolean",default:!1},{name:"nullEqualsUndefined",description:"Whether a null value should be considered equal to an undefined value (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],ne=I(se),oe={description:"Test if any values are different",aliases:["!=","!","ne","notEqual"],parameters:se},le={propertyAliases:ne,operatorData:oe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var a,i,s;const[n,o,l]=yield F([e.values,e.caseInsensitive,e.nullEqualsUndefined],t);t.typeChecker(U(oe.parameters,{values:n,caseInsensitive:o,nullEqualsUndefined:l}));const u=(void 0!==o?o:null!==(i=null===(a=t.options)||void 0===a?void 0:a.caseInsensitive)&&void 0!==i&&i)&&n.every((e=>"string"==typeof e))?n.map((e=>e.toLowerCase())):n;return!(void 0!==l?l:void 0!==(null===(s=t.options)||void 0===s?void 0:s.nullEqualsUndefined)&&t.options.nullEqualsUndefined)||null!==u[0]&&void 0!==u[0]?u.some((e=>!r.dequal(e,u[0]))):u.some((e=>null===e&&void 0===e))})),parseChildren:V},ue=[{name:"values",description:"Array of values to check to add together",aliases:[],required:!0,type:"array",default:[1,2,3]},{name:"type",description:"Data type to coerce input values to before addition",aliases:[],required:!1,type:{literal:["string","array","number","boolean","bool"]},default:"string"}],de=I(ue),ce={description:"Add, concatenate or merge multiple values",aliases:["+","plus","add","concat","join","merge"],parameters:ue},pe={propertyAliases:de,operatorData:ce,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);return t.typeChecker(U(ce.parameters,{values:r,type:e.type})),0===r.length?r:"string"===(null==e?void 0:e.type)?r.reduce(((e,t)=>e.concat(t)),""):"array"===(null==e?void 0:e.type)?r.reduce(((e,t)=>e.concat(t)),[]):r.every((e=>"string"==typeof e||Array.isArray(e)))?r.reduce(((e,t)=>e.concat(t))):r.every((e=>b(e)))?r.reduce(((e,t)=>Object.assign(Object.assign({},e),t)),{}):r.reduce(((e,t)=>e+t))})),parseChildren:V},he=[{name:"values",description:"Array of values - 2nd element will be subtracted from the first",aliases:[],required:!1,type:"array",default:[10,5]},{name:"from",description:"Numerical value that will be subtracted from",aliases:["subtractFrom"],required:!1,type:"number",default:100},{name:"subtract",description:"Numerical value to subtract",aliases:[],required:!1,type:"number",default:50}],ve=I(he),ye={description:"Subtract one numerical value from another",aliases:["-","subtract","minus","takeaway"],parameters:he},me={propertyAliases:ve,operatorData:ye,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a,i]=yield F([e.values,e.from,e.subtract],t);t.typeChecker(U(ye.parameters,{values:r,from:a,subtract:i}));const s=null!=r?r:[a,i].filter((e=>void 0!==e));if(s.length<2)throw new Error("- Not enough values provided");if(s.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");return s[0]-s[1]})),parseChildren:V},fe=[{name:"values",description:"Array of values whose product will be calculated",aliases:[],required:!0,type:"array",default:[5,5]}],ge=I(fe),be={description:"Multiply several numerical values together",aliases:["*","x","multiply","times"],parameters:fe},Te={propertyAliases:ge,operatorData:be,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);if(t.typeChecker(U(be.parameters,{values:r})),0===r.length)return 0;if(r.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");return r.reduce(((e,t)=>e*t))})),parseChildren:V},Oe=[{name:"values",description:"Array of values - 1st element will be divided by the first",aliases:[],required:!1,type:"array",default:[100,10]},{name:"dividend",description:"The number that will be divided",aliases:["divide"],required:!1,type:"number",default:99},{name:"divisor",description:"The number that dividend will be divided by",aliases:["by","divideBy"],required:!1,type:"number",default:3},{name:"output",description:"Whether to output a quotient, remainder or decimal",aliases:[],required:!1,type:{literal:["quotient","remainder"]},default:"quotient"}],Ce=I(Oe),qe={description:"Divide one numerical value by another",aliases:["/","divide","÷"],parameters:Oe},je={propertyAliases:Ce,operatorData:qe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a,i,s]=yield F([e.values,e.dividend,e.divisor,e.output],t);t.typeChecker(U(qe.parameters,{values:r,dividend:a,divisor:i,output:s}));const n=null!=r?r:[a,i].filter((e=>void 0!==e));if(n.length<2)throw new Error("- Not enough values provided");if(n.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");if(0===n[1])throw new Error("Division by zero!");switch(s){case"quotient":return Math.floor(n[0]/n[1]);case"remainder":return n[0]%n[1];default:return n[0]/n[1]}})),parseChildren:V},Se=[{name:"values",description:"Array of values - 1st element will be compared to the second",aliases:[],required:!0,type:"array",default:[10,9]},{name:"strict",description:"Whether value must be strictly greater than (i.e. not equal) (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],Ee=I(Se),Ae={description:"Test if a value is greater than (or equal to) another value",aliases:[">","greaterThan","higher","larger"],parameters:Se},we={propertyAliases:Ee,operatorData:Ae,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a=!0]=yield F([e.values,e.strict],t);if(t.typeChecker(U(Ae.parameters,{values:r,strict:a})),r.length<2)throw new Error("- Not enough values provided");const[i,s]=r;return i===s&&!a||i>s})),parseChildren:V},Ne=[{name:"values",description:"Array of values - 1st element will be compared to the second",aliases:[],required:!0,type:"array",default:[9,10]},{name:"strict",description:"Whether value must be strictly smaller than (i.e. not equal) (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],xe=I(Ne),Pe={description:"Test if a value is smaller than (or equal to) another value",aliases:["<","lessThan","lower","smaller"],parameters:Ne},Le={propertyAliases:xe,operatorData:Pe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a=!0]=yield F([e.values,e.strict],t);if(t.typeChecker(U(Pe.parameters,{values:r,strict:a})),r.length<2)throw new Error("- Not enough values provided");const[i,s]=r;return i===s&&!a||i<s})),parseChildren:V},Ie=[{name:"condition",description:"The expression to check for truthiness",aliases:[],required:!0,type:"any",default:!0},{name:"valueIfTrue",description:"Value to return if condition is true",aliases:["ifTrue"],required:!0,type:"any",default:"The condition is true"},{name:"valueIfFalse",description:"Value to return if condition is false",aliases:["ifFalse","ifNot"],required:!0,type:"any",default:"The condition is false"}],Ue=I(Ie),Re={description:"Return a value based on a condition",aliases:["?","conditional","ifThen"],parameters:Ie},ke={propertyAliases:Ue,operatorData:Re,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){t.typeChecker(U(Re.parameters,{condition:e.condition,valueIfTrue:e.valueIfTrue,valueIfFalse:e.valueIfFalse}));return(yield M(e.condition,t))?yield M(e.valueIfTrue,t):yield M(e.valueIfFalse,t)})),parseChildren:e=>{const[t,r,a]=e.children;return Object.assign(Object.assign({},e),{condition:t,valueIfTrue:r,valueIfFalse:a})}},De=[{name:"testString",description:"The string to test",aliases:["string","value"],required:!0,type:"string",default:"test-this"},{name:"pattern",description:"The regular expression pattern",aliases:["regex","regexp","regExp","re"],required:!0,type:"string",default:"^[a-z]{4}-[a-z]{4}$"}],Qe=I(De),_e={description:"Compare a string against a regex pattern",aliases:["regex","patternMatch","regexp","matchPattern"],parameters:De},$e={propertyAliases:Qe,operatorData:_e,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a]=yield F([e.testString,e.pattern],t);t.typeChecker(U(_e.parameters,{testString:r,pattern:a}));try{return new RegExp(a).test(r)}catch(e){throw new Error("Regex error:"+f(e))}})),parseChildren:e=>{const[t,r]=e.children;return Object.assign(Object.assign({},e),{testString:t,pattern:r})}},He=[{name:"property",description:'The path to the required property (e.g. "user.firstName")',aliases:["path","propertyName"],required:!0,type:"string",default:"path.to[0].my.data"},{name:"additionalData",description:"Additional data objects to be considered",aliases:["additional","objects","data","additionalObjects"],required:!1,type:"object",default:{}}],Me=I(He),Fe={description:"Extract values from data objects",aliases:["dataProperties","data","getData","objectProperties","objProps","getProperty","getObjProp"],parameters:He},Be={propertyAliases:Me,operatorData:Fe,evaluate:(e,r)=>i(void 0,void 0,void 0,(function*(){var a,i;const[s,n={}]=yield F([e.property,e.additionalData],r);r.typeChecker(U(Fe.parameters,{property:s,additionalData:n}));const o=Object.assign(Object.assign({},null!==(i=null===(a=r.options)||void 0===a?void 0:a.data)&&void 0!==i?i:{}),n);return t(o,s)})),parseChildren:e=>{const[t,r]=e.children,a=Object.assign(Object.assign({},e),{property:t});return void 0!==r&&(a.fallback=r),a}},Ge=[{name:"string",description:"A parameterised (%1, %2) string where the parameters are to be replaced",aliases:[],required:!0,type:"string",default:"Hello, %1"},{name:"substitutions",description:"An array of substitution values for the parameterised string",aliases:["replacements","values"],required:!1,type:["array","object"],default:["friend"]},{name:"trimWhiteSpace",description:"Whether or not to trim white space from either end of the substituted strings (default: true)",aliases:["trim","trimWhitespace"],required:!1,type:"boolean",default:!0},{name:"substitutionCharacter",description:'Which character to search for in original string for replacement -- can be "%" or "$" (default: "%")',aliases:["subCharacter","subChar"],required:!1,type:"string",default:"$"},{name:"numberMapping",description:"Rules for mapping number values to text strings, such as pluralisation.",aliases:["numMap","numberMap","pluralisation","pluralization","plurals"],required:!1,type:"object",default:{}}],ze=I(Ge),We={description:"Replace values in a string using simple parameter substitution",aliases:["stringSubstitution","substitute","stringSub","replace"],parameters:Ge},Je={propertyAliases:ze,operatorData:We,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a={},i=!0,s="%",n={}]=yield F([e.string,e.substitutions,e.trimWhiteSpace,e.substitutionCharacter,e.numberMapping],t);if(t.typeChecker(U(We.parameters,{string:r,substitutions:a,trimWhiteSpace:i,substitutionCharacter:s,numberMapping:n})),Array.isArray(a)){const e="$"===s?"$":"%",t=new RegExp(`(?<!\\\\)(${"%"===e?"%":"\\$"}[\\d]+)`,"g"),n=(r.match(t)||[]).sort(((e,t)=>Number(e.slice(1))-Number(t.slice(1)))),o=new Set(n),l=R(Array.from(o),a.map((e=>i?String(e).trim():e)));return r.split(t).map((e=>e in l?l[e]:e)).join("").replace(`\\${e}`,e)}return r.split(/(?<!\\)({{(?:[A-Za-z0-9_.]|\[[0-9]+\])+}})/g).map((e=>{if(!/(?<!\\){{(.+)}}/.exec(e))return e.replace("\\{{","{{");const r=Ve(e,a,n,t.options.data);return i?String(r).trim():r})).join("")})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{string:t,substitutions:r})}},Ve=(e,r,a,i={})=>{const s=e.replace(/{{(.+)}}/,"$1"),n=t(r,s,t(i,s,""));if("number"!=typeof n)return n;if(!(s in a))return n;const o=a[s];if(n in o)return o[n].replace("{}",String(n));const l=Object.keys(a[s]),u=l.find((e=>e.startsWith(">")));if(u){if(n>Number(u.slice(1)))return null==o?void 0:o[u]}const d=l.find((e=>e.startsWith("<")));if(d){if(n<Number(d.slice(1)))return null==o?void 0:o[d]}return o.other?o.other.replace("{}",String(n)):n},Ye=[{name:"values",description:"An array to count",aliases:[],required:!0,type:"array",default:[1,2,3,4,5]}],Xe=I(Ye),Ke={description:"Count elements in an array",aliases:["count","length"],parameters:Ye},Ze={propertyAliases:Xe,operatorData:Ke,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);return t.typeChecker(U(Ke.parameters,{values:r})),r.length})),parseChildren:e=>{const[t]=e.children;return Object.assign(Object.assign({},e),{values:t})}},et=[{name:"value",description:"The string to be split",aliases:["string"],required:!0,type:"string",default:"Alpha, Bravo, Charlie"},{name:"delimiter",description:"The value to split the string on (default is white space)",aliases:["separator"],required:!1,type:"string",default:","},{name:"trimWhiteSpace",description:"Whether to trim white space from around the resulting elements (default: true)",aliases:["trim","trimWhitespace"],required:!1,type:"boolean",default:!0},{name:"excludeTrailing",description:"If the input string ends in a delimiter, there will be an additional blank element if this value is false (default: true)",aliases:["removeTrailing","excludeTrailingDelimiter"],required:!1,type:"boolean",default:!0}],tt=I(et),rt={description:"Split a string into an array",aliases:["split","arraySplit"],parameters:et},at=" ",it={propertyAliases:tt,operatorData:rt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,i;const[s,n,o,l]=yield F([e.value,null!==(r=e.delimiter)&&void 0!==r?r:at,null===(a=e.trimWhiteSpace)||void 0===a||a,null===(i=e.excludeTrailing)||void 0===i||i],t);t.typeChecker(U(rt.parameters,{value:s,delimiter:n,trimWhiteSpace:o,excludeTrailing:l}));let u=s.split(n);return o&&(u=u.map((e=>e.trim()))),l&&""===u[u.length-1]&&u.pop(),u})),parseChildren:e=>{const[t,r=at]=e.children;return Object.assign(Object.assign({},e),{value:t,delimiter:r})}},st=[{name:"query",description:"SQL query string, with parameterised replacements (e.g. $1, $2, etc)",aliases:["text"],required:!0,type:"string"},{name:"values",description:"An array/object of values to replace the SQL string parameters, as per SQL connection specifications ",aliases:["replacements"],required:!1,type:["array","object"]},{name:"single",description:"Specify if returning a single record",aliases:["singleRecord"],required:!1,type:"boolean"},{name:"flatten",description:"Specify whether to flatten resulting record objects to arrays of values",aliases:["flat","array"],required:!1,type:"boolean"},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean"}],nt=I(st),ot={description:"Query an SQL database",aliases:["sql","pgSql","postgres","pg","sqLite","sqlite","mySql"],parameters:st},lt={propertyAliases:nt,operatorData:ot,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const n=null===(r=t.options)||void 0===r?void 0:r.sqlConnection;if(!n)throw new Error("No SQL database connection provided");const[o,l,u,d,c,p]=yield F([e.query,e.values||[],e.single,e.flatten,e.useCache,e.type],t);t.typeChecker(U(ot.parameters,{query:o,single:u,flatten:d,values:l,useCache:c}));const h=null===(s=null!==(a=e.useCache)&&void 0!==a?a:t.options.useCache)||void 0===s||s;{const e=t.cache.useCache(h,((e,t,r,a,s)=>i(void 0,void 0,void 0,(function*(){const i=(yield n.query({query:e,values:t}))||[];["array","string","number"].includes(null!=s?s:"")&&(a=!0);const o=a?i.map((e=>{const t=Object.values(e);return t.length<=1?t[0]:t})):i;return r?o[0]:o}))),o,l,u,d,p);return e}})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{query:t,values:r})}},ut=[{name:"query",description:"GraphQL query string",aliases:[],required:!0,type:"string",default:'query getCountries {\n countries(filter: {continent: {eq: "OC"}}) {\n name\n }\n }'},{name:"url",description:"Endpoint for the GraphQL request (if not already provided in options)",aliases:["endpoint"],required:!1,type:["string","null"],default:"https://countries.trevorblades.com/"},{name:"headers",description:"HTTP Headers (if not already provided in options)",aliases:[],required:!1,type:"object",default:{}},{name:"variables",description:"Values for the variables used in query (key-value pairs)",aliases:[],required:!1,type:"object",default:{}},{name:"returnNode",description:"Property path to extract from the query response",aliases:["outputNode","returnProperty"],required:!1,type:"string",default:"data.countries[1].name"},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],dt=I(ut),ct={description:"GraphQL request",aliases:["graphQl","graphql","gql"],parameters:ut},pt={propertyAliases:dt,operatorData:ct,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s,n,o,l,u;const d=null!==(r=t.graphQLClient)&&void 0!==r?r:t.httpClient;if(!d)throw new Error("No HTTP client provided for GraphQL connection");const[c,p,h,v,y,m]=yield F([e.query,e.url,e.variables,e.returnNode,e.headers,e.useCache],t),{url:f,headers:g}=p instanceof Object?p:{url:p,headers:null};t.typeChecker([...U(ct.parameters,{url:f,query:c,variables:h,returnNode:v,headers:y,useCache:m}),{name:"headers",value:g,expectedType:["object","null"]}]);const b=f&&"graphqlendpoint"!==f.toLowerCase()?f:"",T=null!==(n=null!==(s=null===(a=t.options.graphQLConnection)||void 0===a?void 0:a.endpoint)&&void 0!==s?s:t.options.baseEndpoint)&&void 0!==n?n:"",O=_(b)?b:$(T,b),C={query:c,variables:h},q=null===(o=null!=m?m:t.options.useCache)||void 0===o||o,j=yield t.cache.useCache(q,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield H(d,{url:e,method:"post",data:t,headers:r});return Q(null==i?void 0:i.data,a)}))),O,C,Object.assign(Object.assign(Object.assign(Object.assign({},null===(l=t.options.graphQLConnection)||void 0===l?void 0:l.headers),null===(u=t.options)||void 0===u?void 0:u.headers),g),y),v);return j})),parseChildren:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a="",i,...s]=yield F(e.children,t),n=Array.isArray(i)?i:[i],o=s.slice(0,n.length),l=R(n,o),u=Object.assign(Object.assign({},e),{query:r,url:a,variables:l});return s.length>n.length&&(u.returnNode=s.pop()),u}))},ht=[{name:"url",description:"Endpoint URL",aliases:["endpoint"],required:!0,type:"string",default:"https://restcountries.com/v3.1/name/zealand"},{name:"returnProperty",description:"Property from request result",aliases:["outputProperty"],required:!1,type:"string",default:"result.path"},{name:"headers",description:"HTTP Headers",aliases:[],required:!1,type:"object",default:{}},{name:"parameters",description:"Query parameters (key-value)",aliases:["queryParams","queryParameters","urlQueries"],required:!1,type:"object",default:{}},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],vt=I(ht),yt={description:"HTTP GET Request",aliases:["get","api"],parameters:ht},mt=(e,t)=>i(void 0,void 0,void 0,(function*(){const[r="",a,...i]=yield F(e.children,t),s=Array.isArray(a)?a:[a],n=i.slice(0,s.length),o=R(s,n),l=Object.assign(Object.assign({},e),{url:r,parameters:o});return i.length>s.length&&(l.returnProperty=i.pop()),l})),ft=mt,gt={propertyAliases:vt,operatorData:yt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const n=t.httpClient;if(!n)throw new Error("No HTTP client provided");const[o,l,u,d,c]=yield F([e.url,e.parameters,e.returnProperty,e.headers,e.useCache],t),{url:p,headers:h}=o instanceof Object?o:{url:o,headers:null};t.typeChecker([...U(yt.parameters,{url:p,returnProperty:u,headers:d,parameters:l,useCache:c}),{name:"headers",value:h,expectedType:["object","null"]}]);const v=null!==(r=t.options.baseEndpoint)&&void 0!==r?r:"",y=Object.assign(Object.assign(Object.assign({},null===(a=t.options)||void 0===a?void 0:a.headers),h),d),m=null===(s=null!=c?c:t.options.useCache)||void 0===s||s,f=yield t.cache.useCache(m,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield H(n,{url:e,params:t,headers:r});return Q(i,a)}))),_(p)?p:$(v,p),l,y,u);return f})),parseChildren:mt},bt=[{name:"url",description:"Endpoint URL",aliases:["endpoint"],required:!0,type:"string",default:"https://jsonplaceholder.typicode.com/posts"},{name:"returnProperty",description:"Property path from request result",aliases:["outputProperty"],required:!1,type:"string",default:"result.path"},{name:"headers",description:"HTTP Headers",aliases:[],required:!1,type:"object",default:{}},{name:"parameters",description:"JSON Body parameters (key-value)",aliases:["bodyJson","data"],required:!1,type:"object",default:{}},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],Tt=I(bt),Ot={description:"HTTP POST Request",aliases:["post"],parameters:bt},Ct={propertyAliases:Tt,operatorData:Ot,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const n=t.httpClient;if(!n)throw new Error("No HTTP client provided");const[o,l,u,d,c]=yield F([e.url,e.parameters,e.returnProperty,e.headers,e.useCache],t),{url:p,headers:h}=o instanceof Object?o:{url:o,headers:null};t.typeChecker([...U(Ot.parameters,{url:p,headers:d,data:l,returnProperty:u,useCache:c}),{name:"headers",value:h,expectedType:["object","null"]}]);const v=null!==(r=t.options.baseEndpoint)&&void 0!==r?r:"",y=Object.assign(Object.assign(Object.assign({},null===(a=t.options)||void 0===a?void 0:a.headers),h),d),m=null!==(s=null!=c?c:t.options.useCache)&&void 0!==s&&s,f=yield t.cache.useCache(m,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield H(n,{url:e,data:t,headers:r,method:"post"});return Q(i,a)}))),_(p)?p:$(v,p),l,y,u);return f})),parseChildren:ft},qt=[{name:"properties",description:'An array of objects, each with a "key" property and a "value" property',aliases:["values","keyValPairs","keyValuePairs"],required:!0,type:"array",default:["firstKey","firstValue","secondKey","secondValue"]}],jt=I(qt),St={description:"Construct an object using objects defining keys and values",aliases:["buildObject","build","object"],parameters:qt},Et={propertyAliases:jt,operatorData:St,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){t.typeChecker(U(St.parameters,{properties:e.properties}));const r=e.properties.filter((e=>e instanceof Object&&"key"in e&&"value"in e)).map((({key:e,value:r})=>{return a=[e,r],i(void 0,void 0,void 0,(function*(){const[e,r]=yield F(a,t);return t.typeChecker({name:"key",value:e,expectedType:["string","number","boolean"]}),[e,r]}));var a}));return Object.fromEntries(yield Promise.all(r))})),parseChildren:e=>{const t=e.children;if(t.length%2!=0)throw new Error("Even number of children required to make key/value pairs");const r=t.filter(((e,t)=>t%2==0)),a=t.filter(((e,t)=>t%2==1)),i=r.map(((e,t)=>({key:e,value:a[t]})));return Object.assign(Object.assign({},e),{properties:i})}},At=[{name:"matchExpression",description:"Expression to match against",aliases:["match"],required:!0,type:["string","number","boolean"],default:"matchMe"},{name:"branches",description:"Object whose keys are compared against the match expression. The value of the matching key is returned",aliases:["arms","cases"],required:!1,type:["object","array"],default:{matchMe:"YES",nonMatch:"NO"}},{name:"[...branches]",description:"Branch properties can optionally be placed at the operator root",aliases:[],required:!1,type:["object","array"]}],wt={propertyAliases:I(At),operatorData:{description:"Return different values depending on a matching expression",aliases:["match","switch"],parameters:At},evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r;const a=yield M(e.matchExpression,t);t.typeChecker({name:"matchExpression",value:a,expectedType:["string","number","boolean"]});const i=Array.isArray(e.branches)?k(e.branches):null!==(r=e.branches)&&void 0!==r?r:{},n=s(i)?yield M(i,t):i;if(!b(n))throw new Error("Branches don't evaluate to an object");if(a in n)return yield M(n[a],t);if("fallback"in n)return yield M(n.fallback,t);if(a in e)return yield M(e[a],t);throw new Error(`No match found for ${a}`)})),parseChildren:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,...a]=e.children,i=k(yield F(a,t));return Object.assign(Object.assign({},e),{matchExpression:r,branches:i})}))},Nt=[{name:"functionPath",description:"Path (in options.functions) to the required function",aliases:["functionsPath","functionName","funcName","path","name"],required:!0,type:"string",default:null},{name:"args",description:"Arguments for the function",aliases:["arguments","variables"],required:!1,type:"array",default:[]},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!1}],xt=I(Nt),Pt={description:"Call a custom function (defined in options)",aliases:["customFunctions","customFunction","objectFunctions","function","functions","runFunction"],parameters:Nt},Lt={propertyAliases:xt,operatorData:Pt,evaluate:(e,r)=>i(void 0,void 0,void 0,(function*(){var a,s,n;const[o,l=[],u]=yield F([e.functionPath,e.args,e.useCache],r);r.typeChecker(U(Pt.parameters,{functionPath:o,args:l}));const{data:d,functions:c}=r.options,p=null!==(s=null!==(a=t(c,o,null))&&void 0!==a?a:t(d,o,null))&&void 0!==s?s:t(r.options,o,null);if(!p||"function"!=typeof p)throw new Error(`- No function found: "${o}"`);const h=null!==(n=null!=u?u:r.options.useCache)&&void 0!==n&&n;return yield r.cache.useCache(h,((e,...t)=>i(void 0,void 0,void 0,(function*(){return yield p(...t)}))),o,...l)})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{functionPath:t,args:r})}},It=[{name:"value",description:"Value to pass through",aliases:["_","data"],required:!0,type:"any",default:null}],Ut=I(It),Rt={description:"Pass through a value unchanged (or change its type)",aliases:["_","passThru","passthru","pass","ignore","coerce","convert"],parameters:It},kt={propertyAliases:Ut,operatorData:Rt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){return t.typeChecker(U(Rt.parameters,{value:e.value})),yield M(e.value,t)})),parseChildren:e=>{const[...t]=e.children,r=1===(null==t?void 0:t.length)?t[0]:t;return Object.assign(Object.assign({},e),{value:r})}};var Dt=Object.freeze({__proto__:null,AND:Y,BUILD_OBJECT:Et,CONDITIONAL:ke,COUNT:Ze,CUSTOM_FUNCTIONS:Lt,DIVIDE:je,EQUAL:ie,GET:gt,GRAPHQL:pt,GREATER_THAN:we,LESS_THAN:Le,MATCH:wt,MULTIPLY:Te,NOT_EQUAL:le,OBJECT_PROPERTIES:Be,OR:ee,PASSTHRU:kt,PLUS:pe,POST:Ct,REGEX:$e,SPLIT:it,SQL:lt,STRING_SUBSTITUTION:Je,SUBTRACT:me});class Qt{constructor(e){var t,r;this.useCache=(e,t,...r)=>i(this,void 0,void 0,(function*(){if(!e)return yield t(...r);const a=_t(r),i=a in this.store,s=Date.now(),n=i&&s-this.store[a].timestamp>1e3*this.maxTime;if(i)return this.queue=this.queue.filter((e=>e!==a)),this.queue.unshift(a),this.store[a].timestamp=s,n&&(this.store[a].result=yield t(...r)),this.store[a].result;const o=yield t(...r);return this.store[a]={result:o,timestamp:s},this.queue.unshift(a),this.resizeCache(),o})),this.getMax=()=>this.maxSize,this.setMax=e=>{this.maxSize=e,this.resizeCache()},this.getMaxTime=()=>this.maxTime,this.setMaxTime=e=>{this.maxTime=e},this.getCache=()=>this.store,this.setCache=e=>this.store=e,this.resizeCache=()=>{if(this.queue.length>this.maxSize){this.queue.slice(this.maxSize).forEach((e=>delete this.store[e])),this.queue=this.queue.slice(0,this.maxSize)}},this.store={},this.queue=[],this.maxSize=null!==(t=null==e?void 0:e.maxSize)&&void 0!==t?t:50,this.maxTime=null!==(r=null==e?void 0:e.maxTime)&&void 0!==r?r:1800}}const _t=e=>e.map((e=>"object"==typeof e?JSON.stringify(e):e)).join("_"),$t=e=>e?"name"in e&&"fetch"===e.name?Mt(e):"Axios"in e&&"Axios"===e.Axios.name?Ht(e):e:"undefined"!=typeof window&&"document"in window&&"fetch"in window?Mt(window.fetch):void 0,Ht=e=>({get:t=>i(void 0,void 0,void 0,(function*(){return(yield e(Object.assign(Object.assign({},t),{method:"get"}))).data})),post:t=>i(void 0,void 0,void 0,(function*(){return(yield e(Object.assign(Object.assign({},t),{method:"post"}))).data})),throwError:t=>{var r;if(e.isAxiosError(t)){if(!(null==t?void 0:t.response))throw new Error("Network Error");console.log(null===(r=t.response)||void 0===r?void 0:r.data)}throw t}}),Mt=e=>({get:t=>i(void 0,void 0,void 0,(function*(){const{url:r,headers:i,params:s={}}=t,n=Object.keys(s).length>0?`?${a.stringify(s)}`:"",o=yield e(r+n,{headers:i,method:"GET"}),l=yield o.json();if(!o.ok)throw console.log(l),new Error(`Request failed with status code ${o.status}`);return l})),post:t=>i(void 0,void 0,void 0,(function*(){const{url:r,headers:a,params:i,data:s}=t,n=new URLSearchParams(i),o=n.size>0?`?${n.toString()}`:"",l=yield e(r+o,{headers:a,body:JSON.stringify(s),method:"POST"}),u=yield l.json();if(!l.ok)throw console.log(u),new Error(`Request failed with status code ${l.status}`);return u})),throwError:e=>{throw new Error(`${f(e)}`)}});class Ft{constructor(e={}){var t,r,a;this.typeChecker=(...e)=>{const t=1===e.length&&Array.isArray(e[0])?e[0]:e,r=N(...t);if(!0!==r)throw new Error(r)},this.getCache=()=>this.cache.getCache(),this.setCache=e=>this.cache.setCache(e),this.getVersion=()=>"2.15.2",this.options=Bt(e),this.operators=u(Dt,null!==(r=null===(t=this.options)||void 0===t?void 0:t.excludeOperators)&&void 0!==r?r:[],T),this.operatorAliases=T,this.cache=new Qt({maxSize:e.maxCacheSize,maxTime:e.maxCacheTime}),this.graphQLClient=$t(null===(a=e.graphQLConnection)||void 0===a?void 0:a.httpClient),this.httpClient=$t(e.httpClient)}evaluate(e,t={}){var r;return i(this,void 0,void 0,(function*(){const a=y(this.options,Bt(t));return t.httpClient&&(this.httpClient=$t(t.httpClient)),(null===(r=t.graphQLConnection)||void 0===r?void 0:r.httpClient)&&(this.graphQLClient=$t(t.graphQLConnection.httpClient)),a.maxCacheSize&&a.maxCacheSize!==this.cache.getMax()&&this.cache.setMax(a.maxCacheSize),a.maxCacheTime&&a.maxCacheTime!==this.cache.getMaxTime()&&this.cache.setMaxTime(a.maxCacheTime),yield M(e,{options:a,operators:t.excludeOperators?u(Dt,t.excludeOperators,T):this.operators,operatorAliases:this.operatorAliases,typeChecker:a.skipRuntimeTypeCheck?()=>{}:this.typeChecker,resolvedAliasNodes:{},cache:this.cache,graphQLClient:this.graphQLClient,httpClient:this.httpClient})}))}getOptions(){return this.options}updateOptions(e){this.options=y(this.options,Bt(e)),this.options.excludeOperators&&(this.operators=u(Dt,this.options.excludeOperators,T))}getOperators(){const e=this.options.excludeOperators?u(Dt,this.options.excludeOperators,T):this.operators,t=Object.entries(e).map((([e,t])=>Object.assign({name:e},t.operatorData))),r=[...new Set(Object.values(T))];return t.sort(((e,t)=>r.indexOf(e.name)-r.indexOf(t.name)))}getFragments(){var e;return Object.entries(null!==(e=this.options.fragments)&&void 0!==e?e:{}).map((([e,t])=>Object.assign({name:e},null==t?void 0:t.metadata)))}getCustomFunctions(){var e;return Object.entries(null!==(e=this.options.functions)&&void 0!==e?e:{}).map((([e,t])=>({name:e,numRequiredArgs:t.length})))}}const Bt=e=>"objects"in e?Object.assign(Object.assign({},e),{data:e.objects}):e;exports.AxiosClient=Ht,exports.FetchClient=Mt,exports.FigTreeEvaluator=Ft,exports.SQLNodePostgres=e=>({query:({query:t,values:r=[]})=>i(void 0,void 0,void 0,(function*(){const a={text:t,values:null!=r?r:[]},i=yield e.query(a);if(null==i?void 0:i.error)throw new Error(i.error);return i.rows}))}),exports.SQLite=e=>({query:({query:t,values:r=[]})=>i(void 0,void 0,void 0,(function*(){try{return yield e.all(t,r)}catch(e){throw`SQLite error: ${null==e?void 0:e.message}`}}))}),exports.evaluateExpression=(e,t)=>new Ft(t).evaluate(e),exports.isAliasString=h,exports.isFragmentNode=n,exports.isObject=b,exports.isOperatorNode=s,exports.preProcessShorthand=q,exports.standardiseOperatorName=o,exports.truncateString=d;
|
package/build/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { AxiosStatic } from 'axios';
|
|
3
|
+
import { RequestInfo, RequestInit, Response } from 'node-fetch';
|
|
1
4
|
import { Client } from 'pg';
|
|
5
|
+
import { Database } from 'sqlite';
|
|
2
6
|
|
|
3
7
|
interface CacheOptions {
|
|
4
8
|
maxSize?: number;
|
|
@@ -26,14 +30,16 @@ declare class FigTreeCache {
|
|
|
26
30
|
private resizeCache;
|
|
27
31
|
}
|
|
28
32
|
|
|
29
|
-
interface
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
interface QueryInput {
|
|
34
|
+
query: string;
|
|
35
|
+
values?: (string | number | boolean)[] | object;
|
|
36
|
+
single?: boolean;
|
|
37
|
+
flatten?: boolean;
|
|
38
|
+
}
|
|
39
|
+
type QueryOutput = Exclude<EvaluatorOutput, undefined>;
|
|
40
|
+
interface SQLConnection {
|
|
41
|
+
query: (input: QueryInput) => Promise<QueryOutput>;
|
|
34
42
|
}
|
|
35
|
-
|
|
36
|
-
declare const operatorAliases: OperatorAliases;
|
|
37
43
|
|
|
38
44
|
type BasicType = 'any' | 'string' | 'boolean' | 'number' | 'array' | 'object' | 'null' | 'undefined';
|
|
39
45
|
type LiteralType = {
|
|
@@ -46,7 +52,44 @@ type TypeCheckInput = {
|
|
|
46
52
|
expectedType: ExpectedType;
|
|
47
53
|
};
|
|
48
54
|
|
|
49
|
-
|
|
55
|
+
interface HttpClient {
|
|
56
|
+
get: (req: Omit<HttpRequest, 'method'>) => Promise<unknown>;
|
|
57
|
+
post: (req: Omit<HttpRequest, 'method'>) => Promise<unknown>;
|
|
58
|
+
throwError: (err: unknown) => void;
|
|
59
|
+
}
|
|
60
|
+
interface HttpRequest {
|
|
61
|
+
url: string;
|
|
62
|
+
params?: {
|
|
63
|
+
[key: string]: string;
|
|
64
|
+
};
|
|
65
|
+
data?: Record<string, unknown>;
|
|
66
|
+
headers?: Record<string, unknown>;
|
|
67
|
+
method?: 'get' | 'post';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
type Fetch = (input: URL | string | RequestInfo, init?: RequestInit | undefined) => Promise<Response>;
|
|
71
|
+
declare const AxiosClient: (axios: AxiosStatic) => {
|
|
72
|
+
get: (req: Omit<HttpRequest, 'method'>) => Promise<any>;
|
|
73
|
+
post: (req: Omit<HttpRequest, 'method'>) => Promise<any>;
|
|
74
|
+
throwError: (err: unknown) => never;
|
|
75
|
+
};
|
|
76
|
+
declare const FetchClient: (fetch: Fetch) => {
|
|
77
|
+
get: (req: Omit<HttpRequest, 'method'>) => Promise<any>;
|
|
78
|
+
post: (req: Omit<HttpRequest, 'method'>) => Promise<any>;
|
|
79
|
+
throwError: (err: unknown) => never;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
interface GraphQLConnection {
|
|
83
|
+
endpoint: string;
|
|
84
|
+
headers?: {
|
|
85
|
+
[key: string]: string;
|
|
86
|
+
};
|
|
87
|
+
httpClient?: HttpClient | AxiosStatic | Fetch;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
declare const operatorAliases: OperatorAliases;
|
|
91
|
+
|
|
92
|
+
declare const Operators: readonly ["AND", "OR", "EQUAL", "NOT_EQUAL", "PLUS", "SUBTRACT", "MULTIPLY", "DIVIDE", "GREATER_THAN", "LESS_THAN", "CONDITIONAL", "REGEX", "OBJECT_PROPERTIES", "STRING_SUBSTITUTION", "SPLIT", "COUNT", "GET", "POST", "SQL", "GRAPHQL", "BUILD_OBJECT", "MATCH", "CUSTOM_FUNCTIONS", "PASSTHRU"];
|
|
50
93
|
type Operator = (typeof Operators)[number];
|
|
51
94
|
type OperatorAlias = keyof typeof operatorAliases;
|
|
52
95
|
type OperatorAliases = Record<string, Operator>;
|
|
@@ -57,8 +100,9 @@ interface FigTreeOptions {
|
|
|
57
100
|
objects?: object;
|
|
58
101
|
functions?: Record<string, UnknownFunction>;
|
|
59
102
|
fragments?: Fragments;
|
|
60
|
-
|
|
103
|
+
httpClient?: HttpClient | AxiosStatic | Fetch;
|
|
61
104
|
graphQLConnection?: GraphQLConnection;
|
|
105
|
+
sqlConnection?: SQLConnection;
|
|
62
106
|
baseEndpoint?: string;
|
|
63
107
|
headers?: {
|
|
64
108
|
[key: string]: string;
|
|
@@ -85,6 +129,8 @@ interface FigTreeConfig {
|
|
|
85
129
|
[key: string]: EvaluatorOutput;
|
|
86
130
|
};
|
|
87
131
|
cache: FigTreeCache;
|
|
132
|
+
httpClient?: HttpClient;
|
|
133
|
+
graphQLClient?: HttpClient;
|
|
88
134
|
}
|
|
89
135
|
type OutputType = 'string' | 'number' | 'boolean' | 'bool' | 'array';
|
|
90
136
|
interface OperatorNode {
|
|
@@ -156,6 +202,8 @@ declare class FigTreeEvaluator {
|
|
|
156
202
|
private operators;
|
|
157
203
|
private operatorAliases;
|
|
158
204
|
private cache;
|
|
205
|
+
private graphQLClient?;
|
|
206
|
+
private httpClient?;
|
|
159
207
|
constructor(options?: FigTreeOptions);
|
|
160
208
|
private typeChecker;
|
|
161
209
|
evaluate(expression: EvaluatorNode, options?: FigTreeOptions): Promise<EvaluatorOutput>;
|
|
@@ -171,6 +219,13 @@ declare class FigTreeEvaluator {
|
|
|
171
219
|
|
|
172
220
|
declare const evaluateExpression: (expression: EvaluatorNode, options?: FigTreeOptions) => Promise<EvaluatorOutput>;
|
|
173
221
|
|
|
222
|
+
declare const SQLNodePostgres: (client: Client) => {
|
|
223
|
+
query: ({ query, values }: QueryInput) => Promise<QueryOutput>;
|
|
224
|
+
};
|
|
225
|
+
declare const SQLite: (db: Database) => {
|
|
226
|
+
query: ({ query, values }: QueryInput) => Promise<any[]>;
|
|
227
|
+
};
|
|
228
|
+
|
|
174
229
|
declare const preProcessShorthand: (expression: EvaluatorNode, fragments?: Fragments, useShorthand?: boolean) => EvaluatorNode | FragmentNode;
|
|
175
230
|
|
|
176
231
|
declare const isOperatorNode: (input: EvaluatorNode) => boolean;
|
|
@@ -180,4 +235,4 @@ declare const truncateString: (string: string, length?: number) => string;
|
|
|
180
235
|
declare const isAliasString: (value: string) => boolean;
|
|
181
236
|
declare const isObject: (input: unknown) => input is object;
|
|
182
237
|
|
|
183
|
-
export { type BasicType, type CustomFunctionMetadata, type EvaluatorNode, type EvaluatorOutput, type ExpectedType, type FigTreeConfig, FigTreeEvaluator, type FigTreeOptions, type FragmentMetadata, type FragmentNode, type GraphQLConnection, type LiteralType, type Operator, type OperatorAlias, type OperatorData, type OperatorMetadata, type OperatorNode, type OperatorParameterMetadata, type OutputType, evaluateExpression, isAliasString, isFragmentNode, isObject, isOperatorNode, preProcessShorthand, standardiseOperatorName, truncateString };
|
|
238
|
+
export { AxiosClient, type BasicType, type CustomFunctionMetadata, type EvaluatorNode, type EvaluatorOutput, type ExpectedType, FetchClient, type FigTreeConfig, FigTreeEvaluator, type FigTreeOptions, type FragmentMetadata, type FragmentNode, type FragmentParameterMetadata, type GraphQLConnection, type LiteralType, type Operator, type OperatorAlias, type OperatorData, type OperatorMetadata, type OperatorNode, type OperatorParameterMetadata, type OutputType, SQLNodePostgres, SQLite, evaluateExpression, isAliasString, isFragmentNode, isObject, isOperatorNode, preProcessShorthand, standardiseOperatorName, truncateString };
|
package/build/index.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{camelCase as e}from"change-case";import t from"axios";import r from"object-property-extractor";import{dequal as a}from"dequal/lite";function i(e,t,r,a){return new(r||(r=Promise))((function(i,s){function n(e){try{l(a.next(e))}catch(e){s(e)}}function o(e){try{l(a.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,o)}l((a=a.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const s=e=>e instanceof Object&&"operator"in e,n=e=>e instanceof Object&&"fragment"in e,o=t=>{const r=e(t);return r||t},l=(e,t)=>t[o(e)],u=(e,t,r)=>{const a=Object.assign({},e);return t.forEach((e=>{r[o(e)]||console.warn(`Invalid operator exclusion: ${e}`),delete a[r[o(e)]]})),a},d=(e,t=200)=>e.length<t?e:`${e.slice(0,t-2).trim()}...`,c=(e,t,r=!1)=>{if(void 0!==e)return e;if(r)return d(t);throw new Error(d(t))},p=(e,t)=>{const r=Object.entries(e).map((([e,r])=>[t(e),r]));return Object.fromEntries(r)},h=e=>/^\$.+/.test(e),v=(e,{resolvedAliasNodes:t})=>{var r;return"string"==typeof e&&h(e)&&null!==(r=null==t?void 0:t[e])&&void 0!==r?r:e},m=(e,t)=>{const r=Object.assign(Object.assign({},e),t);return(e.data||t.data)&&(r.data=Object.assign(Object.assign({},e.data),t.data)),(e.functions||t.functions)&&(r.functions=Object.assign(Object.assign({},e.functions),t.functions)),(e.fragments||t.fragments)&&(r.fragments=Object.assign(Object.assign({},e.fragments),t.fragments)),(e.headers||t.headers)&&(r.headers=Object.assign(Object.assign({},e.headers),t.headers)),r},y={number:e=>g(e),string:e=>String(e),array:e=>Array.isArray(e)?e:[e],boolean:e=>Boolean(e),bool:e=>Boolean(e)},f=e=>e.message,g=e=>{if("string"!=typeof e)return Number.isNaN(Number(e))?e:Number(e);const t=new RegExp(/-?\d*\.?\d+/gm),r=e.match(t);return r?Number(r[0]):0},b=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),T={and:"AND","&":"AND","&&":"AND",or:"OR","|":"OR","||":"OR","=":"EQUAL",eq:"EQUAL",equal:"EQUAL",equals:"EQUAL","!=":"NOT_EQUAL","!":"NOT_EQUAL",ne:"NOT_EQUAL",notEqual:"NOT_EQUAL","+":"PLUS",plus:"PLUS",add:"PLUS",concat:"PLUS",join:"PLUS",merge:"PLUS","-":"SUBTRACT",subtract:"SUBTRACT",minus:"SUBTRACT",takeaway:"SUBTRACT","*":"MULTIPLY",x:"MULTIPLY",multiply:"MULTIPLY",times:"MULTIPLY","/":"DIVIDE",divide:"DIVIDE","÷":"DIVIDE",">":"GREATER_THAN",greaterThan:"GREATER_THAN",higher:"GREATER_THAN",larger:"GREATER_THAN","<":"LESS_THAN",lessThan:"LESS_THAN",lower:"LESS_THAN",smaller:"LESS_THAN","?":"CONDITIONAL",conditional:"CONDITIONAL",ifThen:"CONDITIONAL",regex:"REGEX",patternMatch:"REGEX",regexp:"REGEX",matchPattern:"REGEX",dataProperties:"OBJECT_PROPERTIES",data:"OBJECT_PROPERTIES",getData:"OBJECT_PROPERTIES",objectProperties:"OBJECT_PROPERTIES",objProps:"OBJECT_PROPERTIES",getProperty:"OBJECT_PROPERTIES",getObjProp:"OBJECT_PROPERTIES",stringSubstitution:"STRING_SUBSTITUTION",substitute:"STRING_SUBSTITUTION",stringSub:"STRING_SUBSTITUTION",replace:"STRING_SUBSTITUTION",split:"SPLIT",arraySplit:"SPLIT",count:"COUNT",length:"COUNT",get:"GET",api:"GET",post:"POST",pgSql:"PG_SQL",sql:"PG_SQL",postgres:"PG_SQL",pg:"PG_SQL",pgDb:"PG_SQL",graphQl:"GRAPHQL",graphql:"GRAPHQL",gql:"GRAPHQL",buildObject:"BUILD_OBJECT",build:"BUILD_OBJECT",object:"BUILD_OBJECT",match:"MATCH",switch:"MATCH",customFunctions:"CUSTOM_FUNCTIONS",customFunction:"CUSTOM_FUNCTIONS",objectFunctions:"CUSTOM_FUNCTIONS",function:"CUSTOM_FUNCTIONS",functions:"CUSTOM_FUNCTIONS",runFunction:"CUSTOM_FUNCTIONS",_:"PASSTHRU",passThru:"PASSTHRU",passthru:"PASSTHRU",pass:"PASSTHRU",ignore:"PASSTHRU",coerce:"PASSTHRU",convert:"PASSTHRU"},O=T,C=/(\$[^()]+)\((.*)\)/,j=(e,t={},r=!0)=>r?"string"==typeof e?q(e,t):b(e)?A(e,t):e:e,q=(e,t)=>{const r=C.exec(e);if(!r)return e;const a=r[1].trim(),i=r[2].split(",").map((e=>j(e.trim(),t)));return E(a,i,t)},A=(e,t)=>{if(s(e)||n(e))return e;const r=Object.entries(e),a=r.filter((([e])=>h(e))),i=r.filter((([e])=>!h(e))),o=a.reduce(((e,[r,a])=>e=Object.assign(Object.assign({},e),E(r,a,t))),{});return Object.assign(Object.assign({},o),Object.fromEntries(i))},E=(e,t,r)=>{const a=e.slice(1),i=l(a,O);return i?Array.isArray(t)?{operator:i,children:t}:b(t)&&!Object.keys(t).some((e=>h(e)))?Object.assign({operator:i},t):{operator:i,children:[t]}:a in r?{fragment:a,parameters:Object.assign({},t)}:{[e]:t}},S=e=>b(e)&&"literal"in e,N=({value:e,name:t,expectedType:r})=>{if(S(r)){const{literal:a}=r;return!!a.includes(e)||w(t,e,`Literal(${a.map((e=>void 0===e?"undefined":`"${e}"`)).join(", ")})`)}if(Array.isArray(r))return!!r.some((r=>!0===N({value:e,name:t,expectedType:r})))||w(t,e,r.join("|"));return!!(0,x[r])(e)||w(t,e,r)},P=(...e)=>{const t=[];return e.forEach((e=>{const r=N(e);!0!==r&&t.push(r)})),!(t.length>0)||t.join("\n")},x={any:e=>void 0!==e,string:e=>"string"==typeof e,number:e=>"number"==typeof e,boolean:e=>"boolean"==typeof e,array:e=>Array.isArray(e),null:e=>null===e,object:e=>b(e),undefined:e=>void 0===e},w=(e,t,r)=>void 0===t&&e?`- Missing required property "${e}" (type: ${r})`:void 0!==e?`- Property "${e}" (value: ${I(t)}) is not of type: ${r}`:`- ${I(t)} is not of type: ${r}`,I=e=>{const t=void 0===e||Number.isNaN(e)?String(e):JSON.stringify(e);return d(t,50)},U=e=>{const t={};return e.forEach((e=>{e.aliases.forEach((r=>t[r]=e.name))})),t},R=(e,t)=>e.map((({name:e,required:r,type:a})=>{if(S(a)){const i=[...a.literal];return r||i.push(void 0),{name:e,value:t[e],expectedType:{literal:i}}}const i=Array.isArray(a)?a:[a];r||i.push("undefined");const s=1===i.length?i[0]:i;return{name:e,value:t[e],expectedType:s}})),L=(e,t)=>{const r=e.map(((e,r)=>[e,t[r]]));return Object.fromEntries(r)},k=e=>{if(e.length%2!=0)throw new Error("Even number of children required to make key/value pairs");const t=e.filter(((e,t)=>t%2==0)),r=P(...t.map((e=>({value:e,expectedType:["string","number","boolean"]}))));if(!0!==r)throw new Error(r);const a=e.filter(((e,t)=>t%2==1)),i={};return t.forEach(((e,t)=>{i[e]=a[t]})),i},D=e=>b(e)&&1===Object.keys(e).length?Object.values(e)[0]:e,_=(e,t,a=void 0)=>{const i=t?r(e,t,a):e;return Array.isArray(i)?i.map((e=>D(e))):t?null===i?null:D(i):i},M=e=>/^https?:\/\/.+/.test(e),H=(...e)=>e.reduce(((e,t,r)=>{const a="/"===t[0]?1:0,i="/"===t.slice(-1)?-1:void 0,s=t.slice(a,i);return""===s?e:e+(0===r?"":"/")+s}),""),$=({url:e,params:r={},data:a={},headers:s={},method:n="get"})=>i(void 0,void 0,void 0,(function*(){var i;try{return(yield t({method:n,url:e,headers:Object.assign({"Content-Type":"application/json",Accept:"application/json"},s),params:r,data:a})).data}catch(e){if(t.isAxiosError(e)){if(!(null==e?void 0:e.response))throw new Error("Network Error");console.log(null===(i=e.response)||void 0===i?void 0:i.data)}throw e}})),B=(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,i,o;const{options:u,operators:d,operatorAliases:h}=t;let m=(null==u?void 0:u.allowJSONStringInput)?(e=>{if("string"!=typeof e)return e;try{const t=JSON.parse(e);return s(t)?t:e}catch(t){return e}})(e):e;m=j(m,null===(r=t.options)||void 0===r?void 0:r.fragments,!u.noShorthand),Array.isArray(m)&&(m=yield F(m,t));const g=s(m),T=n(m);if(u.evaluateFullObject&&!g&&!T)return v(yield Q(m,t),t);if(!g&&!T)return u.supportDeprecatedValueNodes&&b(m)&&"value"in m?m.value:v(m,t);const{fallback:O}=m,C=null!==(a=null==u?void 0:u.returnErrorAsString)&&void 0!==a&&a;if(T){const[e,r]=yield F([m.fragment,m.parameters],t),a=j(null===(i=null==u?void 0:u.fragments)||void 0===i?void 0:i[e],u.fragments,!u.noShorthand);if(void 0===a)return c(yield B(O,t),`Fragment not defined: ${e}`,C);if(!s(a))return v(a,t);m=Object.assign(Object.assign(Object.assign({},m),a),r),delete m.fragment}try{const e=l(m.operator,h);if(!e)return c(yield B(O,t),`Invalid operator: ${m.operator}`,C);if(!t.operators[e])return c(yield B(O,t),`Excluded operator: ${m.operator}`,C);const{propertyAliases:r,evaluate:a,parseChildren:i}=d[e];m=((e,t)=>p(t,(t=>t in e?e[t]:t)))(r,m);const s=yield G(m,t);T||Object.entries(s).forEach((([e,r])=>t.resolvedAliasNodes[e]=r));const n=T?Object.assign(Object.assign({},t),{resolvedAliasNodes:Object.assign(Object.assign({},t.resolvedAliasNodes),s)}):t;if("children"in m){if(Array.isArray(m.children)||(m.children=yield B(m.children,n)),!Array.isArray(m.children))return c(yield B(O,t),`Operator: ${e}\n- Property "children" is not of type: array`,C);m=yield i(m,n),delete m.children}let u;try{u=yield a(m,n)}catch(r){return c(yield B(m.fallback,t),`Operator: ${e}\n${f(r)}`,C)}const v=null!==(o=null==m?void 0:m.outputType)&&void 0!==o?o:null==m?void 0:m.type;if(!v)return u;const g=yield B(v,t);return g in y?y[g](u):c(yield B(O,t),`Operator: ${e}\n- Invalid output type: ${g}`,C)}catch(e){return c(yield B(O,t),f(e),C)}})),F=(e,t)=>i(void 0,void 0,void 0,(function*(){return Array.isArray(e)?yield Promise.all(e.map((e=>B(e,t)))):yield B(e,t)})),G=(e,t)=>i(void 0,void 0,void 0,(function*(){const r=Object.keys(e).filter(h);if(0===r.length)return{};const a=[];return r.forEach((r=>a.push(B(e[r],t)))),L(r,yield Promise.all(a))})),Q=(e,t)=>i(void 0,void 0,void 0,(function*(){if(!b(e))return e;const r=[],a=[];Object.entries(e).forEach((([r,i])=>{h(r)&&(a.push(r,B(i,t)),delete e[r])}));const i=yield Promise.all(a);t.resolvedAliasNodes=Object.assign(Object.assign({},t.resolvedAliasNodes),k(i)),Object.entries(e).forEach((([e,a])=>{r.push(e,B(a,t))}));const s=yield Promise.all(r);return v(k(s),t)})),W=[{name:"values",description:"Returns true if all values are true",aliases:[],required:!0,type:"array",default:[!0,!0]}],z=U(W),J={description:"Logical AND",aliases:["and","&","&&"],parameters:W},V=e=>{const t=e.children;return Object.assign(Object.assign({},e),{values:t})},Y={propertyAliases:z,operatorData:J,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);return t.typeChecker(R(J.parameters,{values:r})),r.reduce(((e,t)=>e&&!!t),!0)})),parseChildren:V},X=[{name:"values",description:"Returns true if any values are true",aliases:[],required:!0,type:"array",default:[!0,!1]}],K=U(X),Z={description:"Logical OR",aliases:["or","|","||"],parameters:X},ee={propertyAliases:K,operatorData:Z,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);return t.typeChecker(R(Z.parameters,{values:r})),r.reduce(((e,t)=>e||!!t),!1)})),parseChildren:V},te=[{name:"values",description:"Array of values to check for equality",aliases:[],required:!0,type:"array",default:["These are equal","These are equal"]},{name:"caseInsensitive",description:"If the values are strings, ignore the case (default: false)",aliases:[],required:!1,type:"boolean",default:!1},{name:"nullEqualsUndefined",description:"Whether a null value should be considered equal to an undefined value (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],re=U(te),ae={description:"Test multiple values are equal",aliases:["=","eq","equal","equals"],parameters:te},ie={propertyAliases:re,operatorData:ae,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,i,s;const[n,o,l]=yield F([e.values,e.caseInsensitive,e.nullEqualsUndefined],t);t.typeChecker(R(ae.parameters,{values:n,caseInsensitive:o,nullEqualsUndefined:l}));const u=(void 0!==o?o:null!==(i=null===(r=t.options)||void 0===r?void 0:r.caseInsensitive)&&void 0!==i&&i)&&n.every((e=>"string"==typeof e))?n.map((e=>e.toLowerCase())):n;return!(void 0!==l?l:void 0!==(null===(s=t.options)||void 0===s?void 0:s.nullEqualsUndefined)&&t.options.nullEqualsUndefined)||null!==u[0]&&void 0!==u[0]?u.every((e=>a(e,u[0]))):u.every((e=>null==e))})),parseChildren:V},se=[{name:"values",description:"Array of values to check for inequality",aliases:[],required:!0,type:"array",default:["These items","don't match"]},{name:"caseInsensitive",description:"If the values are strings, ignore the case (default: false)",aliases:[],required:!1,type:"boolean",default:!1},{name:"nullEqualsUndefined",description:"Whether a null value should be considered equal to an undefined value (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],ne=U(se),oe={description:"Test if any values are different",aliases:["!=","!","ne","notEqual"],parameters:se},le={propertyAliases:ne,operatorData:oe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,i,s;const[n,o,l]=yield F([e.values,e.caseInsensitive,e.nullEqualsUndefined],t);t.typeChecker(R(oe.parameters,{values:n,caseInsensitive:o,nullEqualsUndefined:l}));const u=(void 0!==o?o:null!==(i=null===(r=t.options)||void 0===r?void 0:r.caseInsensitive)&&void 0!==i&&i)&&n.every((e=>"string"==typeof e))?n.map((e=>e.toLowerCase())):n;return!(void 0!==l?l:void 0!==(null===(s=t.options)||void 0===s?void 0:s.nullEqualsUndefined)&&t.options.nullEqualsUndefined)||null!==u[0]&&void 0!==u[0]?u.some((e=>!a(e,u[0]))):u.some((e=>null===e&&void 0===e))})),parseChildren:V},ue=[{name:"values",description:"Array of values to check to add together",aliases:[],required:!0,type:"array",default:[1,2,3]},{name:"type",description:"Data type to coerce input values to before addition",aliases:[],required:!1,type:{literal:["string","array","number","boolean","bool"]},default:"string"}],de=U(ue),ce={description:"Add, concatenate or merge multiple values",aliases:["+","plus","add","concat","join","merge"],parameters:ue},pe={propertyAliases:de,operatorData:ce,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);return t.typeChecker(R(ce.parameters,{values:r,type:e.type})),0===r.length?r:"string"===(null==e?void 0:e.type)?r.reduce(((e,t)=>e.concat(t)),""):"array"===(null==e?void 0:e.type)?r.reduce(((e,t)=>e.concat(t)),[]):r.every((e=>"string"==typeof e||Array.isArray(e)))?r.reduce(((e,t)=>e.concat(t))):r.every((e=>b(e)))?r.reduce(((e,t)=>Object.assign(Object.assign({},e),t)),{}):r.reduce(((e,t)=>e+t))})),parseChildren:V},he=[{name:"values",description:"Array of values - 2nd element will be subtracted from the first",aliases:[],required:!1,type:"array",default:[10,5]},{name:"from",description:"Numerical value that will be subtracted from",aliases:["subtractFrom"],required:!1,type:"number",default:100},{name:"subtract",description:"Numerical value to subtract",aliases:[],required:!1,type:"number",default:50}],ve=U(he),me={description:"Subtract one numerical value from another",aliases:["-","subtract","minus","takeaway"],parameters:he},ye={propertyAliases:ve,operatorData:me,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a,i]=yield F([e.values,e.from,e.subtract],t);t.typeChecker(R(me.parameters,{values:r,from:a,subtract:i}));const s=null!=r?r:[a,i].filter((e=>void 0!==e));if(s.length<2)throw new Error("- Not enough values provided");if(s.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");return s[0]-s[1]})),parseChildren:V},fe=[{name:"values",description:"Array of values whose product will be calculated",aliases:[],required:!0,type:"array",default:[5,5]}],ge=U(fe),be={description:"Multiply several numerical values together",aliases:["*","x","multiply","times"],parameters:fe},Te={propertyAliases:ge,operatorData:be,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);if(t.typeChecker(R(be.parameters,{values:r})),0===r.length)return 0;if(r.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");return r.reduce(((e,t)=>e*t))})),parseChildren:V},Oe=[{name:"values",description:"Array of values - 1st element will be divided by the first",aliases:[],required:!1,type:"array",default:[100,10]},{name:"dividend",description:"The number that will be divided",aliases:["divide"],required:!1,type:"number",default:99},{name:"divisor",description:"The number that dividend will be divided by",aliases:["by","divideBy"],required:!1,type:"number",default:3},{name:"output",description:"Whether to output a quotient, remainder or decimal",aliases:[],required:!1,type:{literal:["quotient","remainder"]},default:"quotient"}],Ce=U(Oe),je={description:"Divide one numerical value by another",aliases:["/","divide","÷"],parameters:Oe},qe={propertyAliases:Ce,operatorData:je,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a,i,s]=yield F([e.values,e.dividend,e.divisor,e.output],t);t.typeChecker(R(je.parameters,{values:r,dividend:a,divisor:i,output:s}));const n=null!=r?r:[a,i].filter((e=>void 0!==e));if(n.length<2)throw new Error("- Not enough values provided");if(n.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");if(0===n[1])throw new Error("Division by zero!");switch(s){case"quotient":return Math.floor(n[0]/n[1]);case"remainder":return n[0]%n[1];default:return n[0]/n[1]}})),parseChildren:V},Ae=[{name:"values",description:"Array of values - 1st element will be compared to the second",aliases:[],required:!0,type:"array",default:[10,9]},{name:"strict",description:"Whether value must be strictly greater than (i.e. not equal) (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],Ee=U(Ae),Se={description:"Test if a value is greater than (or equal to) another value",aliases:[">","greaterThan","higher","larger"],parameters:Ae},Ne={propertyAliases:Ee,operatorData:Se,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a=!0]=yield F([e.values,e.strict],t);if(t.typeChecker(R(Se.parameters,{values:r,strict:a})),r.length<2)throw new Error("- Not enough values provided");const[i,s]=r;return i===s&&!a||i>s})),parseChildren:V},Pe=[{name:"values",description:"Array of values - 1st element will be compared to the second",aliases:[],required:!0,type:"array",default:[9,10]},{name:"strict",description:"Whether value must be strictly smaller than (i.e. not equal) (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],xe=U(Pe),we={description:"Test if a value is smaller than (or equal to) another value",aliases:["<","lessThan","lower","smaller"],parameters:Pe},Ie={propertyAliases:xe,operatorData:we,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a=!0]=yield F([e.values,e.strict],t);if(t.typeChecker(R(we.parameters,{values:r,strict:a})),r.length<2)throw new Error("- Not enough values provided");const[i,s]=r;return i===s&&!a||i<s})),parseChildren:V},Ue=[{name:"condition",description:"The expression to check for truthiness",aliases:[],required:!0,type:"any",default:!0},{name:"valueIfTrue",description:"Value to return if condition is true",aliases:["ifTrue"],required:!0,type:"any",default:"The condition is true"},{name:"valueIfFalse",description:"Value to return if condition is false",aliases:["ifFalse","ifNot"],required:!0,type:"any",default:"The condition is false"}],Re=U(Ue),Le={description:"Return a value based on a condition",aliases:["?","conditional","ifThen"],parameters:Ue},ke={propertyAliases:Re,operatorData:Le,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){t.typeChecker(R(Le.parameters,{condition:e.condition,valueIfTrue:e.valueIfTrue,valueIfFalse:e.valueIfFalse}));return(yield B(e.condition,t))?yield B(e.valueIfTrue,t):yield B(e.valueIfFalse,t)})),parseChildren:e=>{const[t,r,a]=e.children;return Object.assign(Object.assign({},e),{condition:t,valueIfTrue:r,valueIfFalse:a})}},De=[{name:"testString",description:"The string to test",aliases:["string","value"],required:!0,type:"string",default:"test-this"},{name:"pattern",description:"The regular expression pattern",aliases:["regex","regexp","regExp","re"],required:!0,type:"string",default:"^[a-z]{4}-[a-z]{4}$"}],_e=U(De),Me={description:"Compare a string against a regex pattern",aliases:["regex","patternMatch","regexp","matchPattern"],parameters:De},He={propertyAliases:_e,operatorData:Me,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a]=yield F([e.testString,e.pattern],t);t.typeChecker(R(Me.parameters,{testString:r,pattern:a}));try{return new RegExp(a).test(r)}catch(e){throw new Error("Regex error:"+f(e))}})),parseChildren:e=>{const[t,r]=e.children;return Object.assign(Object.assign({},e),{testString:t,pattern:r})}},$e=[{name:"property",description:'The path to the required property (e.g. "user.firstName")',aliases:["path","propertyName"],required:!0,type:"string",default:"path.to[0].my.data"},{name:"additionalData",description:"Additional data objects to be considered",aliases:["additional","objects","data","additionalObjects"],required:!1,type:"object",default:{}}],Be=U($e),Fe={description:"Extract values from data objects",aliases:["dataProperties","data","getData","objectProperties","objProps","getProperty","getObjProp"],parameters:$e},Ge={propertyAliases:Be,operatorData:Fe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var a,i;const[s,n={}]=yield F([e.property,e.additionalData],t);t.typeChecker(R(Fe.parameters,{property:s,additionalData:n}));const o=Object.assign(Object.assign({},null!==(i=null===(a=t.options)||void 0===a?void 0:a.data)&&void 0!==i?i:{}),n);return r(o,s)})),parseChildren:e=>{const[t,r]=e.children,a=Object.assign(Object.assign({},e),{property:t});return void 0!==r&&(a.fallback=r),a}},Qe=[{name:"string",description:"A parameterised (%1, %2) string where the parameters are to be replaced",aliases:[],required:!0,type:"string",default:"Hello, %1"},{name:"substitutions",description:"An array of substitution values for the parameterised string",aliases:["replacements","values"],required:!1,type:["array","object"],default:["friend"]},{name:"trimWhiteSpace",description:"Whether or not to trim white space from either end of the substituted strings (default: true)",aliases:["trim","trimWhitespace"],required:!1,type:"boolean",default:!0},{name:"substitutionCharacter",description:'Which character to search for in original string for replacement -- can be "%" or "$" (default: "%")',aliases:["subCharacter","subChar"],required:!1,type:"string",default:"$"},{name:"numberMapping",description:"Rules for mapping number values to text strings, such as pluralisation.",aliases:["numMap","numberMap","pluralisation","pluralization","plurals"],required:!1,type:"object",default:{}}],We=U(Qe),ze={description:"Replace values in a string using simple parameter substitution",aliases:["stringSubstitution","substitute","stringSub","replace"],parameters:Qe},Je={propertyAliases:We,operatorData:ze,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a={},i=!0,s="%",n={}]=yield F([e.string,e.substitutions,e.trimWhiteSpace,e.substitutionCharacter,e.numberMapping],t);if(t.typeChecker(R(ze.parameters,{string:r,substitutions:a,trimWhiteSpace:i,substitutionCharacter:s,numberMapping:n})),Array.isArray(a)){const e="$"===s?"$":"%",t=new RegExp(`(?<!\\\\)(${"%"===e?"%":"\\$"}[\\d]+)`,"g"),n=(r.match(t)||[]).sort(((e,t)=>Number(e.slice(1))-Number(t.slice(1)))),o=new Set(n),l=L(Array.from(o),a.map((e=>i?String(e).trim():e)));return r.split(t).map((e=>e in l?l[e]:e)).join("").replace(`\\${e}`,e)}return r.split(/(?<!\\)({{(?:[A-Za-z0-9_.]|\[[0-9]+\])+}})/g).map((e=>{if(!/(?<!\\){{(.+)}}/.exec(e))return e.replace("\\{{","{{");const r=Ve(e,a,n,t.options.data);return i?String(r).trim():r})).join("")})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{string:t,substitutions:r})}},Ve=(e,t,a,i={})=>{const s=e.replace(/{{(.+)}}/,"$1"),n=r(t,s,r(i,s,""));if("number"!=typeof n)return n;if(!(s in a))return n;const o=a[s];if(n in o)return o[n].replace("{}",String(n));const l=Object.keys(a[s]),u=l.find((e=>e.startsWith(">")));if(u){if(n>Number(u.slice(1)))return null==o?void 0:o[u]}const d=l.find((e=>e.startsWith("<")));if(d){if(n<Number(d.slice(1)))return null==o?void 0:o[d]}return o.other?o.other.replace("{}",String(n)):n},Ye=[{name:"values",description:"An array to count",aliases:[],required:!0,type:"array",default:[1,2,3,4,5]}],Xe=U(Ye),Ke={description:"Count elements in an array",aliases:["count","length"],parameters:Ye},Ze={propertyAliases:Xe,operatorData:Ke,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield F(e.values,t);return t.typeChecker(R(Ke.parameters,{values:r})),r.length})),parseChildren:e=>{const[t]=e.children;return Object.assign(Object.assign({},e),{values:t})}},et=[{name:"value",description:"The string to be split",aliases:["string"],required:!0,type:"string",default:"Alpha, Bravo, Charlie"},{name:"delimiter",description:"The value to split the string on (default is white space)",aliases:["separator"],required:!1,type:"string",default:","},{name:"trimWhiteSpace",description:"Whether to trim white space from around the resulting elements (default: true)",aliases:["trim","trimWhitespace"],required:!1,type:"boolean",default:!0},{name:"excludeTrailing",description:"If the input string ends in a delimiter, there will be an additional blank element if this value is false (default: true)",aliases:["removeTrailing","excludeTrailingDelimiter"],required:!1,type:"boolean",default:!0}],tt=U(et),rt={description:"Split a string into an array",aliases:["split","arraySplit"],parameters:et},at=" ",it={propertyAliases:tt,operatorData:rt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,i;const[s,n,o,l]=yield F([e.value,null!==(r=e.delimiter)&&void 0!==r?r:at,null===(a=e.trimWhiteSpace)||void 0===a||a,null===(i=e.excludeTrailing)||void 0===i||i],t);t.typeChecker(R(rt.parameters,{value:s,delimiter:n,trimWhiteSpace:o,excludeTrailing:l}));let u=s.split(n);return o&&(u=u.map((e=>e.trim()))),l&&""===u[u.length-1]&&u.pop(),u})),parseChildren:e=>{const[t,r=at]=e.children;return Object.assign(Object.assign({},e),{value:t,delimiter:r})}},st=[{name:"query",description:"A SQL query string, with parameterised replacements (i.e. $1, $2, etc)",aliases:[],required:!0,type:"string",default:"SELECT contact_name FROM customers;"},{name:"values",description:"An array of values to replace in the SQL string parameters",aliases:["replacements"],required:!1,type:"array",default:[]},{name:"type",description:"Determines the shape of the resulting data (see documentation)",aliases:["queryType"],required:!1,type:{literal:["array","string","number"]},default:"array"},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],nt=U(st),ot={description:"Query a Postgres database using node-postgres",aliases:["pgSql","sql","postgres","pg","pgDb"],parameters:st},lt=(e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i={text:e,values:t,rowMode:a?"array":""},s=yield r.query(i);if(null==s?void 0:s.error)throw new Error(s.error);switch(a){case"array":return s.rows.flat();case"string":return s.rows.flat().join(" ");case"number":{const e=s.rows.flat();return Number.isNaN(Number(e))?e:Number(e)}default:return s.rows}})),ut={propertyAliases:nt,operatorData:ot,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const[n,o,l,u]=yield F([e.query,e.type,e.values||[],e.useCache],t);if(t.typeChecker(R(ot.parameters,{query:n,type:o,values:l,useCache:u})),!(null===(r=t.options)||void 0===r?void 0:r.pgConnection))throw new Error("No Postgres database connection provided");const d=null===(s=null!==(a=e.useCache)&&void 0!==a?a:t.options.useCache)||void 0===s||s;return t.cache.useCache(d,((e,r,a)=>i(void 0,void 0,void 0,(function*(){return yield lt(e,a,t.options.pgConnection,r)}))),n,o,l)})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{query:t,values:r})}},dt=[{name:"query",description:"GraphQL query string",aliases:[],required:!0,type:"string",default:'query getCountries {\n countries(filter: {continent: {eq: "OC"}}) {\n name\n }\n }'},{name:"url",description:"Endpoint for the GraphQL request (if not already provided in options)",aliases:["endpoint"],required:!1,type:["string","null"],default:"https://countries.trevorblades.com/"},{name:"headers",description:"HTTP Headers (if not already provided in options)",aliases:[],required:!1,type:"object",default:{}},{name:"variables",description:"Values for the variables used in query (key-value pairs)",aliases:[],required:!1,type:"object",default:{}},{name:"returnNode",description:"Property path to extract from the query response",aliases:["outputNode","returnProperty"],required:!1,type:"string",default:"data.countries[1].name"},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],ct=U(dt),pt={description:"GraphQL request",aliases:["graphQl","graphql","gql"],parameters:dt},ht={propertyAliases:ct,operatorData:pt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s,n,o,l;const[u,d,c,p,h,v]=yield F([e.query,e.url,e.variables,e.returnNode,e.headers,e.useCache],t),{url:m,headers:y}=d instanceof Object?d:{url:d,headers:null};t.typeChecker([...R(pt.parameters,{url:m,query:u,variables:c,returnNode:p,headers:h,useCache:v}),{name:"headers",value:y,expectedType:["object","null"]}]);const f=m&&"graphqlendpoint"!==m.toLowerCase()?m:"",g=null!==(s=null!==(a=null===(r=t.options.graphQLConnection)||void 0===r?void 0:r.endpoint)&&void 0!==a?a:t.options.baseEndpoint)&&void 0!==s?s:"",b=M(f)?f:H(g,f),T={query:u,variables:c},O=null===(n=null!=v?v:t.options.useCache)||void 0===n||n,C=yield t.cache.useCache(O,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield $({url:e,method:"post",data:t,headers:r});return _(i.data,a)}))),b,T,Object.assign(Object.assign(Object.assign(Object.assign({},null===(o=t.options.graphQLConnection)||void 0===o?void 0:o.headers),null===(l=t.options)||void 0===l?void 0:l.headers),y),h),p);return C})),parseChildren:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a="",i,...s]=yield F(e.children,t),n=Array.isArray(i)?i:[i],o=s.slice(0,n.length),l=L(n,o),u=Object.assign(Object.assign({},e),{query:r,url:a,variables:l});return s.length>n.length&&(u.returnNode=s.pop()),u}))},vt=[{name:"url",description:"Endpoint URL",aliases:["endpoint"],required:!0,type:"string",default:"https://restcountries.com/v3.1/name/zealand"},{name:"returnProperty",description:"Property from request result",aliases:["outputProperty"],required:!1,type:"string",default:"result.path"},{name:"headers",description:"HTTP Headers",aliases:[],required:!1,type:"object",default:{}},{name:"parameters",description:"Query parameters (key-value)",aliases:["queryParams","queryParameters","urlQueries"],required:!1,type:"object",default:{}},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],mt=U(vt),yt={description:"HTTP GET Request",aliases:["get","api"],parameters:vt},ft=(e,t)=>i(void 0,void 0,void 0,(function*(){const[r="",a,...i]=yield F(e.children,t),s=Array.isArray(a)?a:[a],n=i.slice(0,s.length),o=L(s,n),l=Object.assign(Object.assign({},e),{url:r,parameters:o});return i.length>s.length&&(l.returnProperty=i.pop()),l})),gt=ft,bt={propertyAliases:mt,operatorData:yt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const[n,o,l,u,d]=yield F([e.url,e.parameters,e.returnProperty,e.headers,e.useCache],t),{url:c,headers:p}=n instanceof Object?n:{url:n,headers:null};t.typeChecker([...R(yt.parameters,{url:c,returnProperty:l,headers:u,parameters:o,useCache:d}),{name:"headers",value:p,expectedType:["object","null"]}]);const h=null!==(r=t.options.baseEndpoint)&&void 0!==r?r:"",v=Object.assign(Object.assign(Object.assign({},null===(a=t.options)||void 0===a?void 0:a.headers),p),u),m=null===(s=null!=d?d:t.options.useCache)||void 0===s||s,y=yield t.cache.useCache(m,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield $({url:e,params:t,headers:r});return _(i,a)}))),M(c)?c:H(h,c),o,v,l);return y})),parseChildren:ft},Tt=[{name:"url",description:"Endpoint URL",aliases:["endpoint"],required:!0,type:"string",default:"https://jsonplaceholder.typicode.com/posts"},{name:"returnProperty",description:"Property path from request result",aliases:["outputProperty"],required:!1,type:"string",default:"result.path"},{name:"headers",description:"HTTP Headers",aliases:[],required:!1,type:"object",default:{}},{name:"parameters",description:"JSON Body parameters (key-value)",aliases:["bodyJson","data"],required:!1,type:"object",default:{}},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],Ot=U(Tt),Ct={description:"HTTP POST Request",aliases:["post"],parameters:Tt},jt={propertyAliases:Ot,operatorData:Ct,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const[n,o,l,u,d]=yield F([e.url,e.parameters,e.returnProperty,e.headers,e.useCache],t),{url:c,headers:p}=n instanceof Object?n:{url:n,headers:null};t.typeChecker([...R(Ct.parameters,{url:c,headers:u,data:o,returnProperty:l,useCache:d}),{name:"headers",value:p,expectedType:["object","null"]}]);const h=null!==(r=t.options.baseEndpoint)&&void 0!==r?r:"",v=Object.assign(Object.assign(Object.assign({},null===(a=t.options)||void 0===a?void 0:a.headers),p),u),m=null!==(s=null!=d?d:t.options.useCache)&&void 0!==s&&s;return yield t.cache.useCache(m,(()=>i(void 0,void 0,void 0,(function*(){const e=yield $({url:c,data:o,headers:u,method:"post"});return _(e,l)}))),M(c)?c:H(h,c),o,v,l)})),parseChildren:gt},qt=[{name:"properties",description:'An array of objects, each with a "key" property and a "value" property',aliases:["values","keyValPairs","keyValuePairs"],required:!0,type:"array",default:["firstKey","firstValue","secondKey","secondValue"]}],At=U(qt),Et={description:"Construct an object using objects defining keys and values",aliases:["buildObject","build","object"],parameters:qt},St={propertyAliases:At,operatorData:Et,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){t.typeChecker(R(Et.parameters,{properties:e.properties}));const r=e.properties.filter((e=>e instanceof Object&&"key"in e&&"value"in e)).map((({key:e,value:r})=>{return a=[e,r],i(void 0,void 0,void 0,(function*(){const[e,r]=yield F(a,t);return t.typeChecker({name:"key",value:e,expectedType:["string","number","boolean"]}),[e,r]}));var a}));return Object.fromEntries(yield Promise.all(r))})),parseChildren:e=>{const t=e.children;if(t.length%2!=0)throw new Error("Even number of children required to make key/value pairs");const r=t.filter(((e,t)=>t%2==0)),a=t.filter(((e,t)=>t%2==1)),i=r.map(((e,t)=>({key:e,value:a[t]})));return Object.assign(Object.assign({},e),{properties:i})}},Nt=[{name:"matchExpression",description:"Expression to match against",aliases:["match"],required:!0,type:["string","number","boolean"],default:"matchMe"},{name:"branches",description:"Object whose keys are compared against the match expression. The value of the matching key is returned",aliases:["arms","cases"],required:!1,type:["object","array"],default:{matchMe:"YES",nonMatch:"NO"}},{name:"[...branches]",description:"Branch properties can optionally be placed at the operator root",aliases:[],required:!1,type:["object","array"]}],Pt={propertyAliases:U(Nt),operatorData:{description:"Return different values depending on a matching expression",aliases:["match","switch"],parameters:Nt},evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r;const a=yield B(e.matchExpression,t);t.typeChecker({name:"matchExpression",value:a,expectedType:["string","number","boolean"]});const i=Array.isArray(e.branches)?k(e.branches):null!==(r=e.branches)&&void 0!==r?r:{},n=s(i)?yield B(i,t):i;if(!b(n))throw new Error("Branches don't evaluate to an object");if(a in n)return yield B(n[a],t);if("fallback"in n)return yield B(n.fallback,t);if(a in e)return yield B(e[a],t);throw new Error(`No match found for ${a}`)})),parseChildren:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,...a]=e.children,i=k(yield F(a,t));return Object.assign(Object.assign({},e),{matchExpression:r,branches:i})}))},xt=[{name:"functionPath",description:"Path (in options.functions) to the required function",aliases:["functionsPath","functionName","funcName","path","name"],required:!0,type:"string",default:null},{name:"args",description:"Arguments for the function",aliases:["arguments","variables"],required:!1,type:"array",default:[]},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!1}],wt=U(xt),It={description:"Call a custom function (defined in options)",aliases:["customFunctions","customFunction","objectFunctions","function","functions","runFunction"],parameters:xt},Ut={propertyAliases:wt,operatorData:It,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var a,s,n;const[o,l=[],u]=yield F([e.functionPath,e.args,e.useCache],t);t.typeChecker(R(It.parameters,{functionPath:o,args:l}));const{data:d,functions:c}=t.options,p=null!==(s=null!==(a=r(c,o,null))&&void 0!==a?a:r(d,o,null))&&void 0!==s?s:r(t.options,o,null);if(!p||"function"!=typeof p)throw new Error(`- No function found: "${o}"`);const h=null!==(n=null!=u?u:t.options.useCache)&&void 0!==n&&n;return yield t.cache.useCache(h,((e,...t)=>i(void 0,void 0,void 0,(function*(){return yield p(...t)}))),o,...l)})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{functionPath:t,args:r})}},Rt=[{name:"value",description:"Value to pass through",aliases:["_","data"],required:!0,type:"any",default:null}],Lt=U(Rt),kt={description:"Pass through a value unchanged (or change its type)",aliases:["_","passThru","passthru","pass","ignore","coerce","convert"],parameters:Rt},Dt={propertyAliases:Lt,operatorData:kt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){return t.typeChecker(R(kt.parameters,{value:e.value})),yield B(e.value,t)})),parseChildren:e=>{const[...t]=e.children,r=1===(null==t?void 0:t.length)?t[0]:t;return Object.assign(Object.assign({},e),{value:r})}};var _t=Object.freeze({__proto__:null,AND:Y,BUILD_OBJECT:St,CONDITIONAL:ke,COUNT:Ze,CUSTOM_FUNCTIONS:Ut,DIVIDE:qe,EQUAL:ie,GET:bt,GRAPHQL:ht,GREATER_THAN:Ne,LESS_THAN:Ie,MATCH:Pt,MULTIPLY:Te,NOT_EQUAL:le,OBJECT_PROPERTIES:Ge,OR:ee,PASSTHRU:Dt,PG_SQL:ut,PLUS:pe,POST:jt,REGEX:He,SPLIT:it,STRING_SUBSTITUTION:Je,SUBTRACT:ye});class Mt{constructor(e){var t,r;this.useCache=(e,t,...r)=>i(this,void 0,void 0,(function*(){if(!e)return yield t(...r);const a=Ht(r),i=a in this.store,s=Date.now(),n=i&&s-this.store[a].timestamp>1e3*this.maxTime;if(i)return this.queue=this.queue.filter((e=>e!==a)),this.queue.unshift(a),this.store[a].timestamp=s,n&&(this.store[a].result=yield t(...r)),this.store[a].result;const o=yield t(...r);return this.store[a]={result:o,timestamp:s},this.queue.unshift(a),this.resizeCache(),o})),this.getMax=()=>this.maxSize,this.setMax=e=>{this.maxSize=e,this.resizeCache()},this.getMaxTime=()=>this.maxTime,this.setMaxTime=e=>{this.maxTime=e},this.getCache=()=>this.store,this.setCache=e=>this.store=e,this.resizeCache=()=>{if(this.queue.length>this.maxSize){this.queue.slice(this.maxSize).forEach((e=>delete this.store[e])),this.queue=this.queue.slice(0,this.maxSize)}},this.store={},this.queue=[],this.maxSize=null!==(t=null==e?void 0:e.maxSize)&&void 0!==t?t:50,this.maxTime=null!==(r=null==e?void 0:e.maxTime)&&void 0!==r?r:1800}}const Ht=e=>e.map((e=>"object"==typeof e?JSON.stringify(e):e)).join("_");class $t{constructor(e={}){var t,r;this.typeChecker=(...e)=>{const t=1===e.length&&Array.isArray(e[0])?e[0]:e,r=P(...t);if(!0!==r)throw new Error(r)},this.getCache=()=>this.cache.getCache(),this.setCache=e=>this.cache.setCache(e),this.getVersion=()=>"2.14.1",this.options=Ft(e),this.operators=u(_t,null!==(r=null===(t=this.options)||void 0===t?void 0:t.excludeOperators)&&void 0!==r?r:[],T),this.operatorAliases=T,this.cache=new Mt({maxSize:e.maxCacheSize,maxTime:e.maxCacheTime})}evaluate(e,t={}){return i(this,void 0,void 0,(function*(){const r=m(this.options,Ft(t));return r.maxCacheSize&&r.maxCacheSize!==this.cache.getMax()&&this.cache.setMax(r.maxCacheSize),r.maxCacheTime&&r.maxCacheTime!==this.cache.getMaxTime()&&this.cache.setMaxTime(r.maxCacheTime),yield B(e,{options:r,operators:t.excludeOperators?u(_t,t.excludeOperators,T):this.operators,operatorAliases:this.operatorAliases,typeChecker:r.skipRuntimeTypeCheck?()=>{}:this.typeChecker,resolvedAliasNodes:{},cache:this.cache})}))}getOptions(){return this.options}updateOptions(e){this.options=m(this.options,Ft(e)),this.options.excludeOperators&&(this.operators=u(_t,this.options.excludeOperators,T))}getOperators(){const e=this.options.excludeOperators?u(_t,this.options.excludeOperators,T):this.operators,t=Object.entries(e).map((([e,t])=>Object.assign({name:e},t.operatorData))),r=[...new Set(Object.values(T))];return t.sort(((e,t)=>r.indexOf(e.name)-r.indexOf(t.name)))}getFragments(){var e;return Object.entries(null!==(e=this.options.fragments)&&void 0!==e?e:{}).map((([e,t])=>Object.assign({name:e},null==t?void 0:t.metadata)))}getCustomFunctions(){var e;return Object.entries(null!==(e=this.options.functions)&&void 0!==e?e:{}).map((([e,t])=>({name:e,numRequiredArgs:t.length})))}}const Bt=(e,t)=>new $t(t).evaluate(e),Ft=e=>"objects"in e?Object.assign(Object.assign({},e),{data:e.objects}):e;export{$t as FigTreeEvaluator,Bt as evaluateExpression,h as isAliasString,n as isFragmentNode,b as isObject,s as isOperatorNode,j as preProcessShorthand,o as standardiseOperatorName,d as truncateString};
|
|
1
|
+
import{camelCase as e}from"change-case";import t from"object-property-extractor";import{dequal as r}from"dequal/lite";import a from"querystring";function i(e,t,r,a){return new(r||(r=Promise))((function(i,s){function n(e){try{l(a.next(e))}catch(e){s(e)}}function o(e){try{l(a.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,o)}l((a=a.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const s=e=>e instanceof Object&&"operator"in e,n=e=>e instanceof Object&&"fragment"in e,o=t=>{const r=e(t);return r||t},l=(e,t)=>t[o(e)],u=(e,t,r)=>{const a=Object.assign({},e);return t.forEach((e=>{r[o(e)]||console.warn(`Invalid operator exclusion: ${e}`),delete a[r[o(e)]]})),a},d=(e,t=200)=>e.length<t?e:`${e.slice(0,t-2).trim()}...`,c=(e,t,r=!1)=>{if(void 0!==e)return e;if(r)return d(t);throw new Error(d(t))},p=(e,t)=>{const r=Object.entries(e).map((([e,r])=>[t(e),r]));return Object.fromEntries(r)},h=e=>/^\$.+/.test(e),v=(e,{resolvedAliasNodes:t})=>{var r;return"string"==typeof e&&h(e)&&null!==(r=null==t?void 0:t[e])&&void 0!==r?r:e},y=(e,t)=>{const r=Object.assign(Object.assign({},e),t);return(e.data||t.data)&&(r.data=Object.assign(Object.assign({},e.data),t.data)),(e.functions||t.functions)&&(r.functions=Object.assign(Object.assign({},e.functions),t.functions)),(e.fragments||t.fragments)&&(r.fragments=Object.assign(Object.assign({},e.fragments),t.fragments)),(e.headers||t.headers)&&(r.headers=Object.assign(Object.assign({},e.headers),t.headers)),r},m={number:e=>g(e),string:e=>String(e),array:e=>Array.isArray(e)?e:[e],boolean:e=>Boolean(e),bool:e=>Boolean(e)},f=e=>e.message,g=e=>{if("string"!=typeof e)return Number.isNaN(Number(e))?e:Number(e);const t=new RegExp(/-?\d*\.?\d+/gm),r=e.match(t);return r?Number(r[0]):0},b=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),T={and:"AND","&":"AND","&&":"AND",or:"OR","|":"OR","||":"OR","=":"EQUAL",eq:"EQUAL",equal:"EQUAL",equals:"EQUAL","!=":"NOT_EQUAL","!":"NOT_EQUAL",ne:"NOT_EQUAL",notEqual:"NOT_EQUAL","+":"PLUS",plus:"PLUS",add:"PLUS",concat:"PLUS",join:"PLUS",merge:"PLUS","-":"SUBTRACT",subtract:"SUBTRACT",minus:"SUBTRACT",takeaway:"SUBTRACT","*":"MULTIPLY",x:"MULTIPLY",multiply:"MULTIPLY",times:"MULTIPLY","/":"DIVIDE",divide:"DIVIDE","÷":"DIVIDE",">":"GREATER_THAN",greaterThan:"GREATER_THAN",higher:"GREATER_THAN",larger:"GREATER_THAN","<":"LESS_THAN",lessThan:"LESS_THAN",lower:"LESS_THAN",smaller:"LESS_THAN","?":"CONDITIONAL",conditional:"CONDITIONAL",ifThen:"CONDITIONAL",regex:"REGEX",patternMatch:"REGEX",regexp:"REGEX",matchPattern:"REGEX",dataProperties:"OBJECT_PROPERTIES",data:"OBJECT_PROPERTIES",getData:"OBJECT_PROPERTIES",objectProperties:"OBJECT_PROPERTIES",objProps:"OBJECT_PROPERTIES",getProperty:"OBJECT_PROPERTIES",getObjProp:"OBJECT_PROPERTIES",stringSubstitution:"STRING_SUBSTITUTION",substitute:"STRING_SUBSTITUTION",stringSub:"STRING_SUBSTITUTION",replace:"STRING_SUBSTITUTION",split:"SPLIT",arraySplit:"SPLIT",count:"COUNT",length:"COUNT",get:"GET",api:"GET",post:"POST",sql:"SQL",pgSql:"SQL",postgres:"SQL",pg:"SQL",sqLite:"SQL",sqlite:"SQL",mySql:"SQL",graphQl:"GRAPHQL",graphql:"GRAPHQL",gql:"GRAPHQL",buildObject:"BUILD_OBJECT",build:"BUILD_OBJECT",object:"BUILD_OBJECT",match:"MATCH",switch:"MATCH",customFunctions:"CUSTOM_FUNCTIONS",customFunction:"CUSTOM_FUNCTIONS",objectFunctions:"CUSTOM_FUNCTIONS",function:"CUSTOM_FUNCTIONS",functions:"CUSTOM_FUNCTIONS",runFunction:"CUSTOM_FUNCTIONS",_:"PASSTHRU",passThru:"PASSTHRU",passthru:"PASSTHRU",pass:"PASSTHRU",ignore:"PASSTHRU",coerce:"PASSTHRU",convert:"PASSTHRU"},O=T,C=/(\$[^()]+)\((.*)\)/,q=(e,t={},r=!0)=>r?"string"==typeof e?j(e,t):b(e)?S(e,t):e:e,j=(e,t)=>{const r=C.exec(e);if(!r)return e;const a=r[1].trim(),i=r[2].split(",").map((e=>q(e.trim(),t)));return E(a,i,t)},S=(e,t)=>{if(s(e)||n(e))return e;const r=Object.entries(e),a=r.filter((([e])=>h(e))),i=r.filter((([e])=>!h(e))),o=a.reduce(((e,[r,a])=>e=Object.assign(Object.assign({},e),E(r,a,t))),{});return Object.assign(Object.assign({},o),Object.fromEntries(i))},E=(e,t,r)=>{const a=e.slice(1),i=l(a,O);return i?Array.isArray(t)?{operator:i,children:t}:b(t)&&!Object.keys(t).some((e=>h(e)))?Object.assign({operator:i},t):{operator:i,children:[t]}:a in r?{fragment:a,parameters:Object.assign({},t)}:{[e]:t}},A=e=>b(e)&&"literal"in e,w=({value:e,name:t,expectedType:r})=>{if(A(r)){const{literal:a}=r;return!!a.includes(e)||x(t,e,`Literal(${a.map((e=>void 0===e?"undefined":`"${e}"`)).join(", ")})`)}if(Array.isArray(r))return!!r.some((r=>!0===w({value:e,name:t,expectedType:r})))||x(t,e,r.join("|"));return!!(0,P[r])(e)||x(t,e,r)},N=(...e)=>{const t=[];return e.forEach((e=>{const r=w(e);!0!==r&&t.push(r)})),!(t.length>0)||t.join("\n")},P={any:e=>void 0!==e,string:e=>"string"==typeof e,number:e=>"number"==typeof e,boolean:e=>"boolean"==typeof e,array:e=>Array.isArray(e),null:e=>null===e,object:e=>b(e),undefined:e=>void 0===e},x=(e,t,r)=>void 0===t&&e?`- Missing required property "${e}" (type: ${r})`:void 0!==e?`- Property "${e}" (value: ${L(t)}) is not of type: ${r}`:`- ${L(t)} is not of type: ${r}`,L=e=>{const t=void 0===e||Number.isNaN(e)?String(e):JSON.stringify(e);return d(t,50)},I=e=>{const t={};return e.forEach((e=>{e.aliases.forEach((r=>t[r]=e.name))})),t},U=(e,t)=>e.map((({name:e,required:r,type:a})=>{if(A(a)){const i=[...a.literal];return r||i.push(void 0),{name:e,value:t[e],expectedType:{literal:i}}}const i=Array.isArray(a)?a:[a];r||i.push("undefined");const s=1===i.length?i[0]:i;return{name:e,value:t[e],expectedType:s}})),R=(e,t)=>{const r=e.map(((e,r)=>[e,t[r]]));return Object.fromEntries(r)},k=e=>{if(e.length%2!=0)throw new Error("Even number of children required to make key/value pairs");const t=e.filter(((e,t)=>t%2==0)),r=N(...t.map((e=>({value:e,expectedType:["string","number","boolean"]}))));if(!0!==r)throw new Error(r);const a=e.filter(((e,t)=>t%2==1)),i={};return t.forEach(((e,t)=>{i[e]=a[t]})),i},D=e=>b(e)&&1===Object.keys(e).length?Object.values(e)[0]:e,_=(e,r,a=void 0)=>{const i=r?t(e,r,a):e;return Array.isArray(i)?i.map((e=>D(e))):r?null===i?null:D(i):i},Q=e=>/^https?:\/\/.+/.test(e),$=(...e)=>e.reduce(((e,t,r)=>{const a="/"===t[0]?1:0,i="/"===t.slice(-1)?-1:void 0,s=t.slice(a,i);return""===s?e:e+(0===r?"":"/")+s}),""),H=(e,t)=>i(void 0,void 0,void 0,(function*(){const{url:r,params:a={},data:i={},headers:s={},method:n="get"}=t;if(!r||""===r)throw new Error("Invalid url");try{return yield e[n]({url:r,headers:Object.assign({"Content-Type":"application/json",Accept:"application/json"},s),params:a,data:i})}catch(t){e.throwError(t)}})),M=(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,i,o;const{options:u,operators:d,operatorAliases:h}=t;let y=(null==u?void 0:u.allowJSONStringInput)?(e=>{if("string"!=typeof e)return e;try{const t=JSON.parse(e);return s(t)?t:e}catch(t){return e}})(e):e;y=q(y,null===(r=t.options)||void 0===r?void 0:r.fragments,!u.noShorthand),Array.isArray(y)&&(y=yield B(y,t));const g=s(y),T=n(y);if(u.evaluateFullObject&&!g&&!T)return v(yield G(y,t),t);if(!g&&!T)return u.supportDeprecatedValueNodes&&b(y)&&"value"in y?y.value:v(y,t);const{fallback:O}=y,C=null!==(a=null==u?void 0:u.returnErrorAsString)&&void 0!==a&&a;if(T){const[e,r]=yield B([y.fragment,y.parameters],t),a=q(null===(i=null==u?void 0:u.fragments)||void 0===i?void 0:i[e],u.fragments,!u.noShorthand);if(void 0===a)return c(yield M(O,t),`Fragment not defined: ${e}`,C);if(!s(a))return v(a,t);y=Object.assign(Object.assign(Object.assign({},y),a),r),delete y.fragment}try{const e=l(y.operator,h);if(!e)return c(yield M(O,t),`Invalid operator: ${y.operator}`,C);if(!t.operators[e])return c(yield M(O,t),`Excluded operator: ${y.operator}`,C);const{propertyAliases:r,evaluate:a,parseChildren:i}=d[e];y=((e,t)=>p(t,(t=>t in e?e[t]:t)))(r,y);const s=yield F(y,t);T||Object.entries(s).forEach((([e,r])=>t.resolvedAliasNodes[e]=r));const n=T?Object.assign(Object.assign({},t),{resolvedAliasNodes:Object.assign(Object.assign({},t.resolvedAliasNodes),s)}):t;if("children"in y){if(Array.isArray(y.children)||(y.children=yield M(y.children,n)),!Array.isArray(y.children))return c(yield M(O,t),`Operator: ${e}\n- Property "children" is not of type: array`,C);y=yield i(y,n),delete y.children}let u;try{u=yield a(y,n)}catch(r){return c(yield M(y.fallback,t),`Operator: ${e}\n${f(r)}`,C)}const v=null!==(o=null==y?void 0:y.outputType)&&void 0!==o?o:null==y?void 0:y.type;if(!v)return u;const g=yield M(v,t);return g in m?m[g](u):c(yield M(O,t),`Operator: ${e}\n- Invalid output type: ${g}`,C)}catch(e){return c(yield M(O,t),f(e),C)}})),B=(e,t)=>i(void 0,void 0,void 0,(function*(){return Array.isArray(e)?yield Promise.all(e.map((e=>M(e,t)))):yield M(e,t)})),F=(e,t)=>i(void 0,void 0,void 0,(function*(){const r=Object.keys(e).filter(h);if(0===r.length)return{};const a=[];return r.forEach((r=>a.push(M(e[r],t)))),R(r,yield Promise.all(a))})),G=(e,t)=>i(void 0,void 0,void 0,(function*(){if(!b(e))return e;const r=[],a=[];Object.entries(e).forEach((([r,i])=>{h(r)&&(a.push(r,M(i,t)),delete e[r])}));const i=yield Promise.all(a);t.resolvedAliasNodes=Object.assign(Object.assign({},t.resolvedAliasNodes),k(i)),Object.entries(e).forEach((([e,a])=>{r.push(e,M(a,t))}));const s=yield Promise.all(r);return v(k(s),t)})),z=[{name:"values",description:"Returns true if all values are true",aliases:[],required:!0,type:"array",default:[!0,!0]}],W=I(z),J={description:"Logical AND",aliases:["and","&","&&"],parameters:z},V=e=>{const t=e.children;return Object.assign(Object.assign({},e),{values:t})},Y={propertyAliases:W,operatorData:J,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);return t.typeChecker(U(J.parameters,{values:r})),r.reduce(((e,t)=>e&&!!t),!0)})),parseChildren:V},X=[{name:"values",description:"Returns true if any values are true",aliases:[],required:!0,type:"array",default:[!0,!1]}],K=I(X),Z={description:"Logical OR",aliases:["or","|","||"],parameters:X},ee={propertyAliases:K,operatorData:Z,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);return t.typeChecker(U(Z.parameters,{values:r})),r.reduce(((e,t)=>e||!!t),!1)})),parseChildren:V},te=[{name:"values",description:"Array of values to check for equality",aliases:[],required:!0,type:"array",default:["These are equal","These are equal"]},{name:"caseInsensitive",description:"If the values are strings, ignore the case (default: false)",aliases:[],required:!1,type:"boolean",default:!1},{name:"nullEqualsUndefined",description:"Whether a null value should be considered equal to an undefined value (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],re=I(te),ae={description:"Test multiple values are equal",aliases:["=","eq","equal","equals"],parameters:te},ie={propertyAliases:re,operatorData:ae,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var a,i,s;const[n,o,l]=yield B([e.values,e.caseInsensitive,e.nullEqualsUndefined],t);t.typeChecker(U(ae.parameters,{values:n,caseInsensitive:o,nullEqualsUndefined:l}));const u=(void 0!==o?o:null!==(i=null===(a=t.options)||void 0===a?void 0:a.caseInsensitive)&&void 0!==i&&i)&&n.every((e=>"string"==typeof e))?n.map((e=>e.toLowerCase())):n;return!(void 0!==l?l:void 0!==(null===(s=t.options)||void 0===s?void 0:s.nullEqualsUndefined)&&t.options.nullEqualsUndefined)||null!==u[0]&&void 0!==u[0]?u.every((e=>r(e,u[0]))):u.every((e=>null==e))})),parseChildren:V},se=[{name:"values",description:"Array of values to check for inequality",aliases:[],required:!0,type:"array",default:["These items","don't match"]},{name:"caseInsensitive",description:"If the values are strings, ignore the case (default: false)",aliases:[],required:!1,type:"boolean",default:!1},{name:"nullEqualsUndefined",description:"Whether a null value should be considered equal to an undefined value (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],ne=I(se),oe={description:"Test if any values are different",aliases:["!=","!","ne","notEqual"],parameters:se},le={propertyAliases:ne,operatorData:oe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var a,i,s;const[n,o,l]=yield B([e.values,e.caseInsensitive,e.nullEqualsUndefined],t);t.typeChecker(U(oe.parameters,{values:n,caseInsensitive:o,nullEqualsUndefined:l}));const u=(void 0!==o?o:null!==(i=null===(a=t.options)||void 0===a?void 0:a.caseInsensitive)&&void 0!==i&&i)&&n.every((e=>"string"==typeof e))?n.map((e=>e.toLowerCase())):n;return!(void 0!==l?l:void 0!==(null===(s=t.options)||void 0===s?void 0:s.nullEqualsUndefined)&&t.options.nullEqualsUndefined)||null!==u[0]&&void 0!==u[0]?u.some((e=>!r(e,u[0]))):u.some((e=>null===e&&void 0===e))})),parseChildren:V},ue=[{name:"values",description:"Array of values to check to add together",aliases:[],required:!0,type:"array",default:[1,2,3]},{name:"type",description:"Data type to coerce input values to before addition",aliases:[],required:!1,type:{literal:["string","array","number","boolean","bool"]},default:"string"}],de=I(ue),ce={description:"Add, concatenate or merge multiple values",aliases:["+","plus","add","concat","join","merge"],parameters:ue},pe={propertyAliases:de,operatorData:ce,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);return t.typeChecker(U(ce.parameters,{values:r,type:e.type})),0===r.length?r:"string"===(null==e?void 0:e.type)?r.reduce(((e,t)=>e.concat(t)),""):"array"===(null==e?void 0:e.type)?r.reduce(((e,t)=>e.concat(t)),[]):r.every((e=>"string"==typeof e||Array.isArray(e)))?r.reduce(((e,t)=>e.concat(t))):r.every((e=>b(e)))?r.reduce(((e,t)=>Object.assign(Object.assign({},e),t)),{}):r.reduce(((e,t)=>e+t))})),parseChildren:V},he=[{name:"values",description:"Array of values - 2nd element will be subtracted from the first",aliases:[],required:!1,type:"array",default:[10,5]},{name:"from",description:"Numerical value that will be subtracted from",aliases:["subtractFrom"],required:!1,type:"number",default:100},{name:"subtract",description:"Numerical value to subtract",aliases:[],required:!1,type:"number",default:50}],ve=I(he),ye={description:"Subtract one numerical value from another",aliases:["-","subtract","minus","takeaway"],parameters:he},me={propertyAliases:ve,operatorData:ye,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a,i]=yield B([e.values,e.from,e.subtract],t);t.typeChecker(U(ye.parameters,{values:r,from:a,subtract:i}));const s=null!=r?r:[a,i].filter((e=>void 0!==e));if(s.length<2)throw new Error("- Not enough values provided");if(s.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");return s[0]-s[1]})),parseChildren:V},fe=[{name:"values",description:"Array of values whose product will be calculated",aliases:[],required:!0,type:"array",default:[5,5]}],ge=I(fe),be={description:"Multiply several numerical values together",aliases:["*","x","multiply","times"],parameters:fe},Te={propertyAliases:ge,operatorData:be,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);if(t.typeChecker(U(be.parameters,{values:r})),0===r.length)return 0;if(r.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");return r.reduce(((e,t)=>e*t))})),parseChildren:V},Oe=[{name:"values",description:"Array of values - 1st element will be divided by the first",aliases:[],required:!1,type:"array",default:[100,10]},{name:"dividend",description:"The number that will be divided",aliases:["divide"],required:!1,type:"number",default:99},{name:"divisor",description:"The number that dividend will be divided by",aliases:["by","divideBy"],required:!1,type:"number",default:3},{name:"output",description:"Whether to output a quotient, remainder or decimal",aliases:[],required:!1,type:{literal:["quotient","remainder"]},default:"quotient"}],Ce=I(Oe),qe={description:"Divide one numerical value by another",aliases:["/","divide","÷"],parameters:Oe},je={propertyAliases:Ce,operatorData:qe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a,i,s]=yield B([e.values,e.dividend,e.divisor,e.output],t);t.typeChecker(U(qe.parameters,{values:r,dividend:a,divisor:i,output:s}));const n=null!=r?r:[a,i].filter((e=>void 0!==e));if(n.length<2)throw new Error("- Not enough values provided");if(n.some((e=>"number"!=typeof e)))throw new Error("- Not all values are numbers");if(0===n[1])throw new Error("Division by zero!");switch(s){case"quotient":return Math.floor(n[0]/n[1]);case"remainder":return n[0]%n[1];default:return n[0]/n[1]}})),parseChildren:V},Se=[{name:"values",description:"Array of values - 1st element will be compared to the second",aliases:[],required:!0,type:"array",default:[10,9]},{name:"strict",description:"Whether value must be strictly greater than (i.e. not equal) (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],Ee=I(Se),Ae={description:"Test if a value is greater than (or equal to) another value",aliases:[">","greaterThan","higher","larger"],parameters:Se},we={propertyAliases:Ee,operatorData:Ae,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a=!0]=yield B([e.values,e.strict],t);if(t.typeChecker(U(Ae.parameters,{values:r,strict:a})),r.length<2)throw new Error("- Not enough values provided");const[i,s]=r;return i===s&&!a||i>s})),parseChildren:V},Ne=[{name:"values",description:"Array of values - 1st element will be compared to the second",aliases:[],required:!0,type:"array",default:[9,10]},{name:"strict",description:"Whether value must be strictly smaller than (i.e. not equal) (default: false)",aliases:[],required:!1,type:"boolean",default:!1}],Pe=I(Ne),xe={description:"Test if a value is smaller than (or equal to) another value",aliases:["<","lessThan","lower","smaller"],parameters:Ne},Le={propertyAliases:Pe,operatorData:xe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a=!0]=yield B([e.values,e.strict],t);if(t.typeChecker(U(xe.parameters,{values:r,strict:a})),r.length<2)throw new Error("- Not enough values provided");const[i,s]=r;return i===s&&!a||i<s})),parseChildren:V},Ie=[{name:"condition",description:"The expression to check for truthiness",aliases:[],required:!0,type:"any",default:!0},{name:"valueIfTrue",description:"Value to return if condition is true",aliases:["ifTrue"],required:!0,type:"any",default:"The condition is true"},{name:"valueIfFalse",description:"Value to return if condition is false",aliases:["ifFalse","ifNot"],required:!0,type:"any",default:"The condition is false"}],Ue=I(Ie),Re={description:"Return a value based on a condition",aliases:["?","conditional","ifThen"],parameters:Ie},ke={propertyAliases:Ue,operatorData:Re,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){t.typeChecker(U(Re.parameters,{condition:e.condition,valueIfTrue:e.valueIfTrue,valueIfFalse:e.valueIfFalse}));return(yield M(e.condition,t))?yield M(e.valueIfTrue,t):yield M(e.valueIfFalse,t)})),parseChildren:e=>{const[t,r,a]=e.children;return Object.assign(Object.assign({},e),{condition:t,valueIfTrue:r,valueIfFalse:a})}},De=[{name:"testString",description:"The string to test",aliases:["string","value"],required:!0,type:"string",default:"test-this"},{name:"pattern",description:"The regular expression pattern",aliases:["regex","regexp","regExp","re"],required:!0,type:"string",default:"^[a-z]{4}-[a-z]{4}$"}],_e=I(De),Qe={description:"Compare a string against a regex pattern",aliases:["regex","patternMatch","regexp","matchPattern"],parameters:De},$e={propertyAliases:_e,operatorData:Qe,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a]=yield B([e.testString,e.pattern],t);t.typeChecker(U(Qe.parameters,{testString:r,pattern:a}));try{return new RegExp(a).test(r)}catch(e){throw new Error("Regex error:"+f(e))}})),parseChildren:e=>{const[t,r]=e.children;return Object.assign(Object.assign({},e),{testString:t,pattern:r})}},He=[{name:"property",description:'The path to the required property (e.g. "user.firstName")',aliases:["path","propertyName"],required:!0,type:"string",default:"path.to[0].my.data"},{name:"additionalData",description:"Additional data objects to be considered",aliases:["additional","objects","data","additionalObjects"],required:!1,type:"object",default:{}}],Me=I(He),Be={description:"Extract values from data objects",aliases:["dataProperties","data","getData","objectProperties","objProps","getProperty","getObjProp"],parameters:He},Fe={propertyAliases:Me,operatorData:Be,evaluate:(e,r)=>i(void 0,void 0,void 0,(function*(){var a,i;const[s,n={}]=yield B([e.property,e.additionalData],r);r.typeChecker(U(Be.parameters,{property:s,additionalData:n}));const o=Object.assign(Object.assign({},null!==(i=null===(a=r.options)||void 0===a?void 0:a.data)&&void 0!==i?i:{}),n);return t(o,s)})),parseChildren:e=>{const[t,r]=e.children,a=Object.assign(Object.assign({},e),{property:t});return void 0!==r&&(a.fallback=r),a}},Ge=[{name:"string",description:"A parameterised (%1, %2) string where the parameters are to be replaced",aliases:[],required:!0,type:"string",default:"Hello, %1"},{name:"substitutions",description:"An array of substitution values for the parameterised string",aliases:["replacements","values"],required:!1,type:["array","object"],default:["friend"]},{name:"trimWhiteSpace",description:"Whether or not to trim white space from either end of the substituted strings (default: true)",aliases:["trim","trimWhitespace"],required:!1,type:"boolean",default:!0},{name:"substitutionCharacter",description:'Which character to search for in original string for replacement -- can be "%" or "$" (default: "%")',aliases:["subCharacter","subChar"],required:!1,type:"string",default:"$"},{name:"numberMapping",description:"Rules for mapping number values to text strings, such as pluralisation.",aliases:["numMap","numberMap","pluralisation","pluralization","plurals"],required:!1,type:"object",default:{}}],ze=I(Ge),We={description:"Replace values in a string using simple parameter substitution",aliases:["stringSubstitution","substitute","stringSub","replace"],parameters:Ge},Je={propertyAliases:ze,operatorData:We,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a={},i=!0,s="%",n={}]=yield B([e.string,e.substitutions,e.trimWhiteSpace,e.substitutionCharacter,e.numberMapping],t);if(t.typeChecker(U(We.parameters,{string:r,substitutions:a,trimWhiteSpace:i,substitutionCharacter:s,numberMapping:n})),Array.isArray(a)){const e="$"===s?"$":"%",t=new RegExp(`(?<!\\\\)(${"%"===e?"%":"\\$"}[\\d]+)`,"g"),n=(r.match(t)||[]).sort(((e,t)=>Number(e.slice(1))-Number(t.slice(1)))),o=new Set(n),l=R(Array.from(o),a.map((e=>i?String(e).trim():e)));return r.split(t).map((e=>e in l?l[e]:e)).join("").replace(`\\${e}`,e)}return r.split(/(?<!\\)({{(?:[A-Za-z0-9_.]|\[[0-9]+\])+}})/g).map((e=>{if(!/(?<!\\){{(.+)}}/.exec(e))return e.replace("\\{{","{{");const r=Ve(e,a,n,t.options.data);return i?String(r).trim():r})).join("")})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{string:t,substitutions:r})}},Ve=(e,r,a,i={})=>{const s=e.replace(/{{(.+)}}/,"$1"),n=t(r,s,t(i,s,""));if("number"!=typeof n)return n;if(!(s in a))return n;const o=a[s];if(n in o)return o[n].replace("{}",String(n));const l=Object.keys(a[s]),u=l.find((e=>e.startsWith(">")));if(u){if(n>Number(u.slice(1)))return null==o?void 0:o[u]}const d=l.find((e=>e.startsWith("<")));if(d){if(n<Number(d.slice(1)))return null==o?void 0:o[d]}return o.other?o.other.replace("{}",String(n)):n},Ye=[{name:"values",description:"An array to count",aliases:[],required:!0,type:"array",default:[1,2,3,4,5]}],Xe=I(Ye),Ke={description:"Count elements in an array",aliases:["count","length"],parameters:Ye},Ze={propertyAliases:Xe,operatorData:Ke,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){const r=yield B(e.values,t);return t.typeChecker(U(Ke.parameters,{values:r})),r.length})),parseChildren:e=>{const[t]=e.children;return Object.assign(Object.assign({},e),{values:t})}},et=[{name:"value",description:"The string to be split",aliases:["string"],required:!0,type:"string",default:"Alpha, Bravo, Charlie"},{name:"delimiter",description:"The value to split the string on (default is white space)",aliases:["separator"],required:!1,type:"string",default:","},{name:"trimWhiteSpace",description:"Whether to trim white space from around the resulting elements (default: true)",aliases:["trim","trimWhitespace"],required:!1,type:"boolean",default:!0},{name:"excludeTrailing",description:"If the input string ends in a delimiter, there will be an additional blank element if this value is false (default: true)",aliases:["removeTrailing","excludeTrailingDelimiter"],required:!1,type:"boolean",default:!0}],tt=I(et),rt={description:"Split a string into an array",aliases:["split","arraySplit"],parameters:et},at=" ",it={propertyAliases:tt,operatorData:rt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,i;const[s,n,o,l]=yield B([e.value,null!==(r=e.delimiter)&&void 0!==r?r:at,null===(a=e.trimWhiteSpace)||void 0===a||a,null===(i=e.excludeTrailing)||void 0===i||i],t);t.typeChecker(U(rt.parameters,{value:s,delimiter:n,trimWhiteSpace:o,excludeTrailing:l}));let u=s.split(n);return o&&(u=u.map((e=>e.trim()))),l&&""===u[u.length-1]&&u.pop(),u})),parseChildren:e=>{const[t,r=at]=e.children;return Object.assign(Object.assign({},e),{value:t,delimiter:r})}},st=[{name:"query",description:"SQL query string, with parameterised replacements (e.g. $1, $2, etc)",aliases:["text"],required:!0,type:"string"},{name:"values",description:"An array/object of values to replace the SQL string parameters, as per SQL connection specifications ",aliases:["replacements"],required:!1,type:["array","object"]},{name:"single",description:"Specify if returning a single record",aliases:["singleRecord"],required:!1,type:"boolean"},{name:"flatten",description:"Specify whether to flatten resulting record objects to arrays of values",aliases:["flat","array"],required:!1,type:"boolean"},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean"}],nt=I(st),ot={description:"Query an SQL database",aliases:["sql","pgSql","postgres","pg","sqLite","sqlite","mySql"],parameters:st},lt={propertyAliases:nt,operatorData:ot,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const n=null===(r=t.options)||void 0===r?void 0:r.sqlConnection;if(!n)throw new Error("No SQL database connection provided");const[o,l,u,d,c,p]=yield B([e.query,e.values||[],e.single,e.flatten,e.useCache,e.type],t);t.typeChecker(U(ot.parameters,{query:o,single:u,flatten:d,values:l,useCache:c}));const h=null===(s=null!==(a=e.useCache)&&void 0!==a?a:t.options.useCache)||void 0===s||s;{const e=t.cache.useCache(h,((e,t,r,a,s)=>i(void 0,void 0,void 0,(function*(){const i=(yield n.query({query:e,values:t}))||[];["array","string","number"].includes(null!=s?s:"")&&(a=!0);const o=a?i.map((e=>{const t=Object.values(e);return t.length<=1?t[0]:t})):i;return r?o[0]:o}))),o,l,u,d,p);return e}})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{query:t,values:r})}},ut=[{name:"query",description:"GraphQL query string",aliases:[],required:!0,type:"string",default:'query getCountries {\n countries(filter: {continent: {eq: "OC"}}) {\n name\n }\n }'},{name:"url",description:"Endpoint for the GraphQL request (if not already provided in options)",aliases:["endpoint"],required:!1,type:["string","null"],default:"https://countries.trevorblades.com/"},{name:"headers",description:"HTTP Headers (if not already provided in options)",aliases:[],required:!1,type:"object",default:{}},{name:"variables",description:"Values for the variables used in query (key-value pairs)",aliases:[],required:!1,type:"object",default:{}},{name:"returnNode",description:"Property path to extract from the query response",aliases:["outputNode","returnProperty"],required:!1,type:"string",default:"data.countries[1].name"},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],dt=I(ut),ct={description:"GraphQL request",aliases:["graphQl","graphql","gql"],parameters:ut},pt={propertyAliases:dt,operatorData:ct,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s,n,o,l,u;const d=null!==(r=t.graphQLClient)&&void 0!==r?r:t.httpClient;if(!d)throw new Error("No HTTP client provided for GraphQL connection");const[c,p,h,v,y,m]=yield B([e.query,e.url,e.variables,e.returnNode,e.headers,e.useCache],t),{url:f,headers:g}=p instanceof Object?p:{url:p,headers:null};t.typeChecker([...U(ct.parameters,{url:f,query:c,variables:h,returnNode:v,headers:y,useCache:m}),{name:"headers",value:g,expectedType:["object","null"]}]);const b=f&&"graphqlendpoint"!==f.toLowerCase()?f:"",T=null!==(n=null!==(s=null===(a=t.options.graphQLConnection)||void 0===a?void 0:a.endpoint)&&void 0!==s?s:t.options.baseEndpoint)&&void 0!==n?n:"",O=Q(b)?b:$(T,b),C={query:c,variables:h},q=null===(o=null!=m?m:t.options.useCache)||void 0===o||o,j=yield t.cache.useCache(q,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield H(d,{url:e,method:"post",data:t,headers:r});return _(null==i?void 0:i.data,a)}))),O,C,Object.assign(Object.assign(Object.assign(Object.assign({},null===(l=t.options.graphQLConnection)||void 0===l?void 0:l.headers),null===(u=t.options)||void 0===u?void 0:u.headers),g),y),v);return j})),parseChildren:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,a="",i,...s]=yield B(e.children,t),n=Array.isArray(i)?i:[i],o=s.slice(0,n.length),l=R(n,o),u=Object.assign(Object.assign({},e),{query:r,url:a,variables:l});return s.length>n.length&&(u.returnNode=s.pop()),u}))},ht=[{name:"url",description:"Endpoint URL",aliases:["endpoint"],required:!0,type:"string",default:"https://restcountries.com/v3.1/name/zealand"},{name:"returnProperty",description:"Property from request result",aliases:["outputProperty"],required:!1,type:"string",default:"result.path"},{name:"headers",description:"HTTP Headers",aliases:[],required:!1,type:"object",default:{}},{name:"parameters",description:"Query parameters (key-value)",aliases:["queryParams","queryParameters","urlQueries"],required:!1,type:"object",default:{}},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],vt=I(ht),yt={description:"HTTP GET Request",aliases:["get","api"],parameters:ht},mt=(e,t)=>i(void 0,void 0,void 0,(function*(){const[r="",a,...i]=yield B(e.children,t),s=Array.isArray(a)?a:[a],n=i.slice(0,s.length),o=R(s,n),l=Object.assign(Object.assign({},e),{url:r,parameters:o});return i.length>s.length&&(l.returnProperty=i.pop()),l})),ft=mt,gt={propertyAliases:vt,operatorData:yt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const n=t.httpClient;if(!n)throw new Error("No HTTP client provided");const[o,l,u,d,c]=yield B([e.url,e.parameters,e.returnProperty,e.headers,e.useCache],t),{url:p,headers:h}=o instanceof Object?o:{url:o,headers:null};t.typeChecker([...U(yt.parameters,{url:p,returnProperty:u,headers:d,parameters:l,useCache:c}),{name:"headers",value:h,expectedType:["object","null"]}]);const v=null!==(r=t.options.baseEndpoint)&&void 0!==r?r:"",y=Object.assign(Object.assign(Object.assign({},null===(a=t.options)||void 0===a?void 0:a.headers),h),d),m=null===(s=null!=c?c:t.options.useCache)||void 0===s||s,f=yield t.cache.useCache(m,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield H(n,{url:e,params:t,headers:r});return _(i,a)}))),Q(p)?p:$(v,p),l,y,u);return f})),parseChildren:mt},bt=[{name:"url",description:"Endpoint URL",aliases:["endpoint"],required:!0,type:"string",default:"https://jsonplaceholder.typicode.com/posts"},{name:"returnProperty",description:"Property path from request result",aliases:["outputProperty"],required:!1,type:"string",default:"result.path"},{name:"headers",description:"HTTP Headers",aliases:[],required:!1,type:"object",default:{}},{name:"parameters",description:"JSON Body parameters (key-value)",aliases:["bodyJson","data"],required:!1,type:"object",default:{}},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!0}],Tt=I(bt),Ot={description:"HTTP POST Request",aliases:["post"],parameters:bt},Ct={propertyAliases:Tt,operatorData:Ot,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r,a,s;const n=t.httpClient;if(!n)throw new Error("No HTTP client provided");const[o,l,u,d,c]=yield B([e.url,e.parameters,e.returnProperty,e.headers,e.useCache],t),{url:p,headers:h}=o instanceof Object?o:{url:o,headers:null};t.typeChecker([...U(Ot.parameters,{url:p,headers:d,data:l,returnProperty:u,useCache:c}),{name:"headers",value:h,expectedType:["object","null"]}]);const v=null!==(r=t.options.baseEndpoint)&&void 0!==r?r:"",y=Object.assign(Object.assign(Object.assign({},null===(a=t.options)||void 0===a?void 0:a.headers),h),d),m=null!==(s=null!=c?c:t.options.useCache)&&void 0!==s&&s,f=yield t.cache.useCache(m,((e,t,r,a)=>i(void 0,void 0,void 0,(function*(){const i=yield H(n,{url:e,data:t,headers:r,method:"post"});return _(i,a)}))),Q(p)?p:$(v,p),l,y,u);return f})),parseChildren:ft},qt=[{name:"properties",description:'An array of objects, each with a "key" property and a "value" property',aliases:["values","keyValPairs","keyValuePairs"],required:!0,type:"array",default:["firstKey","firstValue","secondKey","secondValue"]}],jt=I(qt),St={description:"Construct an object using objects defining keys and values",aliases:["buildObject","build","object"],parameters:qt},Et={propertyAliases:jt,operatorData:St,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){t.typeChecker(U(St.parameters,{properties:e.properties}));const r=e.properties.filter((e=>e instanceof Object&&"key"in e&&"value"in e)).map((({key:e,value:r})=>{return a=[e,r],i(void 0,void 0,void 0,(function*(){const[e,r]=yield B(a,t);return t.typeChecker({name:"key",value:e,expectedType:["string","number","boolean"]}),[e,r]}));var a}));return Object.fromEntries(yield Promise.all(r))})),parseChildren:e=>{const t=e.children;if(t.length%2!=0)throw new Error("Even number of children required to make key/value pairs");const r=t.filter(((e,t)=>t%2==0)),a=t.filter(((e,t)=>t%2==1)),i=r.map(((e,t)=>({key:e,value:a[t]})));return Object.assign(Object.assign({},e),{properties:i})}},At=[{name:"matchExpression",description:"Expression to match against",aliases:["match"],required:!0,type:["string","number","boolean"],default:"matchMe"},{name:"branches",description:"Object whose keys are compared against the match expression. The value of the matching key is returned",aliases:["arms","cases"],required:!1,type:["object","array"],default:{matchMe:"YES",nonMatch:"NO"}},{name:"[...branches]",description:"Branch properties can optionally be placed at the operator root",aliases:[],required:!1,type:["object","array"]}],wt={propertyAliases:I(At),operatorData:{description:"Return different values depending on a matching expression",aliases:["match","switch"],parameters:At},evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){var r;const a=yield M(e.matchExpression,t);t.typeChecker({name:"matchExpression",value:a,expectedType:["string","number","boolean"]});const i=Array.isArray(e.branches)?k(e.branches):null!==(r=e.branches)&&void 0!==r?r:{},n=s(i)?yield M(i,t):i;if(!b(n))throw new Error("Branches don't evaluate to an object");if(a in n)return yield M(n[a],t);if("fallback"in n)return yield M(n.fallback,t);if(a in e)return yield M(e[a],t);throw new Error(`No match found for ${a}`)})),parseChildren:(e,t)=>i(void 0,void 0,void 0,(function*(){const[r,...a]=e.children,i=k(yield B(a,t));return Object.assign(Object.assign({},e),{matchExpression:r,branches:i})}))},Nt=[{name:"functionPath",description:"Path (in options.functions) to the required function",aliases:["functionsPath","functionName","funcName","path","name"],required:!0,type:"string",default:null},{name:"args",description:"Arguments for the function",aliases:["arguments","variables"],required:!1,type:"array",default:[]},{name:"useCache",description:"Whether or not the FigTree cache is used",aliases:[],required:!1,type:"boolean",default:!1}],Pt=I(Nt),xt={description:"Call a custom function (defined in options)",aliases:["customFunctions","customFunction","objectFunctions","function","functions","runFunction"],parameters:Nt},Lt={propertyAliases:Pt,operatorData:xt,evaluate:(e,r)=>i(void 0,void 0,void 0,(function*(){var a,s,n;const[o,l=[],u]=yield B([e.functionPath,e.args,e.useCache],r);r.typeChecker(U(xt.parameters,{functionPath:o,args:l}));const{data:d,functions:c}=r.options,p=null!==(s=null!==(a=t(c,o,null))&&void 0!==a?a:t(d,o,null))&&void 0!==s?s:t(r.options,o,null);if(!p||"function"!=typeof p)throw new Error(`- No function found: "${o}"`);const h=null!==(n=null!=u?u:r.options.useCache)&&void 0!==n&&n;return yield r.cache.useCache(h,((e,...t)=>i(void 0,void 0,void 0,(function*(){return yield p(...t)}))),o,...l)})),parseChildren:e=>{const[t,...r]=e.children;return Object.assign(Object.assign({},e),{functionPath:t,args:r})}},It=[{name:"value",description:"Value to pass through",aliases:["_","data"],required:!0,type:"any",default:null}],Ut=I(It),Rt={description:"Pass through a value unchanged (or change its type)",aliases:["_","passThru","passthru","pass","ignore","coerce","convert"],parameters:It},kt={propertyAliases:Ut,operatorData:Rt,evaluate:(e,t)=>i(void 0,void 0,void 0,(function*(){return t.typeChecker(U(Rt.parameters,{value:e.value})),yield M(e.value,t)})),parseChildren:e=>{const[...t]=e.children,r=1===(null==t?void 0:t.length)?t[0]:t;return Object.assign(Object.assign({},e),{value:r})}};var Dt=Object.freeze({__proto__:null,AND:Y,BUILD_OBJECT:Et,CONDITIONAL:ke,COUNT:Ze,CUSTOM_FUNCTIONS:Lt,DIVIDE:je,EQUAL:ie,GET:gt,GRAPHQL:pt,GREATER_THAN:we,LESS_THAN:Le,MATCH:wt,MULTIPLY:Te,NOT_EQUAL:le,OBJECT_PROPERTIES:Fe,OR:ee,PASSTHRU:kt,PLUS:pe,POST:Ct,REGEX:$e,SPLIT:it,SQL:lt,STRING_SUBSTITUTION:Je,SUBTRACT:me});class _t{constructor(e){var t,r;this.useCache=(e,t,...r)=>i(this,void 0,void 0,(function*(){if(!e)return yield t(...r);const a=Qt(r),i=a in this.store,s=Date.now(),n=i&&s-this.store[a].timestamp>1e3*this.maxTime;if(i)return this.queue=this.queue.filter((e=>e!==a)),this.queue.unshift(a),this.store[a].timestamp=s,n&&(this.store[a].result=yield t(...r)),this.store[a].result;const o=yield t(...r);return this.store[a]={result:o,timestamp:s},this.queue.unshift(a),this.resizeCache(),o})),this.getMax=()=>this.maxSize,this.setMax=e=>{this.maxSize=e,this.resizeCache()},this.getMaxTime=()=>this.maxTime,this.setMaxTime=e=>{this.maxTime=e},this.getCache=()=>this.store,this.setCache=e=>this.store=e,this.resizeCache=()=>{if(this.queue.length>this.maxSize){this.queue.slice(this.maxSize).forEach((e=>delete this.store[e])),this.queue=this.queue.slice(0,this.maxSize)}},this.store={},this.queue=[],this.maxSize=null!==(t=null==e?void 0:e.maxSize)&&void 0!==t?t:50,this.maxTime=null!==(r=null==e?void 0:e.maxTime)&&void 0!==r?r:1800}}const Qt=e=>e.map((e=>"object"==typeof e?JSON.stringify(e):e)).join("_"),$t=e=>e?"name"in e&&"fetch"===e.name?Mt(e):"Axios"in e&&"Axios"===e.Axios.name?Ht(e):e:"undefined"!=typeof window&&"document"in window&&"fetch"in window?Mt(window.fetch):void 0,Ht=e=>({get:t=>i(void 0,void 0,void 0,(function*(){return(yield e(Object.assign(Object.assign({},t),{method:"get"}))).data})),post:t=>i(void 0,void 0,void 0,(function*(){return(yield e(Object.assign(Object.assign({},t),{method:"post"}))).data})),throwError:t=>{var r;if(e.isAxiosError(t)){if(!(null==t?void 0:t.response))throw new Error("Network Error");console.log(null===(r=t.response)||void 0===r?void 0:r.data)}throw t}}),Mt=e=>({get:t=>i(void 0,void 0,void 0,(function*(){const{url:r,headers:i,params:s={}}=t,n=Object.keys(s).length>0?`?${a.stringify(s)}`:"",o=yield e(r+n,{headers:i,method:"GET"}),l=yield o.json();if(!o.ok)throw console.log(l),new Error(`Request failed with status code ${o.status}`);return l})),post:t=>i(void 0,void 0,void 0,(function*(){const{url:r,headers:a,params:i,data:s}=t,n=new URLSearchParams(i),o=n.size>0?`?${n.toString()}`:"",l=yield e(r+o,{headers:a,body:JSON.stringify(s),method:"POST"}),u=yield l.json();if(!l.ok)throw console.log(u),new Error(`Request failed with status code ${l.status}`);return u})),throwError:e=>{throw new Error(`${f(e)}`)}});class Bt{constructor(e={}){var t,r,a;this.typeChecker=(...e)=>{const t=1===e.length&&Array.isArray(e[0])?e[0]:e,r=N(...t);if(!0!==r)throw new Error(r)},this.getCache=()=>this.cache.getCache(),this.setCache=e=>this.cache.setCache(e),this.getVersion=()=>"2.15.2",this.options=Gt(e),this.operators=u(Dt,null!==(r=null===(t=this.options)||void 0===t?void 0:t.excludeOperators)&&void 0!==r?r:[],T),this.operatorAliases=T,this.cache=new _t({maxSize:e.maxCacheSize,maxTime:e.maxCacheTime}),this.graphQLClient=$t(null===(a=e.graphQLConnection)||void 0===a?void 0:a.httpClient),this.httpClient=$t(e.httpClient)}evaluate(e,t={}){var r;return i(this,void 0,void 0,(function*(){const a=y(this.options,Gt(t));return t.httpClient&&(this.httpClient=$t(t.httpClient)),(null===(r=t.graphQLConnection)||void 0===r?void 0:r.httpClient)&&(this.graphQLClient=$t(t.graphQLConnection.httpClient)),a.maxCacheSize&&a.maxCacheSize!==this.cache.getMax()&&this.cache.setMax(a.maxCacheSize),a.maxCacheTime&&a.maxCacheTime!==this.cache.getMaxTime()&&this.cache.setMaxTime(a.maxCacheTime),yield M(e,{options:a,operators:t.excludeOperators?u(Dt,t.excludeOperators,T):this.operators,operatorAliases:this.operatorAliases,typeChecker:a.skipRuntimeTypeCheck?()=>{}:this.typeChecker,resolvedAliasNodes:{},cache:this.cache,graphQLClient:this.graphQLClient,httpClient:this.httpClient})}))}getOptions(){return this.options}updateOptions(e){this.options=y(this.options,Gt(e)),this.options.excludeOperators&&(this.operators=u(Dt,this.options.excludeOperators,T))}getOperators(){const e=this.options.excludeOperators?u(Dt,this.options.excludeOperators,T):this.operators,t=Object.entries(e).map((([e,t])=>Object.assign({name:e},t.operatorData))),r=[...new Set(Object.values(T))];return t.sort(((e,t)=>r.indexOf(e.name)-r.indexOf(t.name)))}getFragments(){var e;return Object.entries(null!==(e=this.options.fragments)&&void 0!==e?e:{}).map((([e,t])=>Object.assign({name:e},null==t?void 0:t.metadata)))}getCustomFunctions(){var e;return Object.entries(null!==(e=this.options.functions)&&void 0!==e?e:{}).map((([e,t])=>({name:e,numRequiredArgs:t.length})))}}const Ft=(e,t)=>new Bt(t).evaluate(e),Gt=e=>"objects"in e?Object.assign(Object.assign({},e),{data:e.objects}):e,zt=e=>({query:({query:t,values:r=[]})=>i(void 0,void 0,void 0,(function*(){const a={text:t,values:null!=r?r:[]},i=yield e.query(a);if(null==i?void 0:i.error)throw new Error(i.error);return i.rows}))}),Wt=e=>({query:({query:t,values:r=[]})=>i(void 0,void 0,void 0,(function*(){try{return yield e.all(t,r)}catch(e){throw`SQLite error: ${null==e?void 0:e.message}`}}))});export{Ht as AxiosClient,Mt as FetchClient,Bt as FigTreeEvaluator,zt as SQLNodePostgres,Wt as SQLite,Ft as evaluateExpression,h as isAliasString,n as isFragmentNode,b as isObject,s as isOperatorNode,q as preProcessShorthand,o as standardiseOperatorName,d as truncateString};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fig-tree-evaluator",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.15.2",
|
|
4
4
|
"description": "Module to evaluate JSON-structured expression trees",
|
|
5
5
|
"main": "build/index.cjs.js",
|
|
6
6
|
"module": "build/index.esm.js",
|
|
@@ -17,19 +17,24 @@
|
|
|
17
17
|
"@testing-library/react": "^14.0.0",
|
|
18
18
|
"@types/jest": "^29.5.5",
|
|
19
19
|
"@types/node": "^20.8.2",
|
|
20
|
+
"@types/node-fetch": "^2.6.11",
|
|
20
21
|
"@types/pg": "^8.10.3",
|
|
21
22
|
"@typescript-eslint/eslint-plugin": "^6.11.0",
|
|
22
23
|
"@typescript-eslint/parser": "^6.11.0",
|
|
24
|
+
"axios": "^1.7.2",
|
|
23
25
|
"dotenv": "^16.0.1",
|
|
24
26
|
"eslint": "^8.53.0",
|
|
25
|
-
"fig-tree-evaluator": "^2.
|
|
27
|
+
"fig-tree-evaluator": "^2.15.0",
|
|
26
28
|
"jest": "^29.7.0",
|
|
29
|
+
"node-fetch": "2.7.0",
|
|
27
30
|
"pg": "^8.11.3",
|
|
28
31
|
"prettier": "^3.0.3",
|
|
29
32
|
"rimraf": "^5.0.5",
|
|
30
33
|
"rollup-plugin-dts": "^6.0.2",
|
|
31
34
|
"rollup-plugin-sizes": "^1.0.5",
|
|
32
35
|
"rollup-plugin-terser": "^7.0.2",
|
|
36
|
+
"sqlite": "^5.1.1",
|
|
37
|
+
"sqlite3": "^5.1.7",
|
|
33
38
|
"ts-jest": "^29.1.1",
|
|
34
39
|
"ts-node": "^10.8.0",
|
|
35
40
|
"tslib": "^2.6.2",
|
|
@@ -51,7 +56,6 @@
|
|
|
51
56
|
"gui": "cp -R src/* expression-builder/src/fig-tree-evaluator/src"
|
|
52
57
|
},
|
|
53
58
|
"dependencies": {
|
|
54
|
-
"axios": "^1.5.1",
|
|
55
59
|
"change-case": "^4.1.2",
|
|
56
60
|
"dequal": "^2.0.3",
|
|
57
61
|
"object-property-extractor": "^1.0.11"
|