mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-21 10:03:31 +00:00
Extend gitbook/expr std lib with some additional methods (#4173)
Co-authored-by: Samy Pessé <samypesse@gmail.com>
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@gitbook/expr": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Extend gitbook/expr std lib with some additional methods
|
||||||
@@ -25,6 +25,7 @@ describe('autocomplete', () => {
|
|||||||
description: 'An array of string',
|
description: 'An array of string',
|
||||||
items: SymbolString(),
|
items: SymbolString(),
|
||||||
});
|
});
|
||||||
|
const visitorClaimsKeyPropStringSymbol = SymbolString({ name: 'key' });
|
||||||
const symbols = {
|
const symbols = {
|
||||||
visitor: SymbolObject({
|
visitor: SymbolObject({
|
||||||
name: 'visitor',
|
name: 'visitor',
|
||||||
@@ -33,7 +34,7 @@ describe('autocomplete', () => {
|
|||||||
name: 'claims',
|
name: 'claims',
|
||||||
description: 'The claims contained in the visitor JWT token',
|
description: 'The claims contained in the visitor JWT token',
|
||||||
properties: {
|
properties: {
|
||||||
key: SymbolString({ name: 'key' }),
|
key: visitorClaimsKeyPropStringSymbol,
|
||||||
flags: SymbolObject({
|
flags: SymbolObject({
|
||||||
name: 'flags',
|
name: 'flags',
|
||||||
properties: {
|
properties: {
|
||||||
@@ -168,8 +169,12 @@ describe('autocomplete', () => {
|
|||||||
childrenRefs: [
|
childrenRefs: [
|
||||||
'visitor.claims.key.length',
|
'visitor.claims.key.length',
|
||||||
'visitor.claims.key.at',
|
'visitor.claims.key.at',
|
||||||
|
'visitor.claims.key.startsWith',
|
||||||
'visitor.claims.key.endsWith',
|
'visitor.claims.key.endsWith',
|
||||||
'visitor.claims.key.includes',
|
'visitor.claims.key.includes',
|
||||||
|
'visitor.claims.key.toLowerCase',
|
||||||
|
'visitor.claims.key.toUpperCase',
|
||||||
|
'visitor.claims.key.trim',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -227,8 +232,12 @@ describe('autocomplete', () => {
|
|||||||
childrenRefs: [
|
childrenRefs: [
|
||||||
'visitor.claims.role.length',
|
'visitor.claims.role.length',
|
||||||
'visitor.claims.role.at',
|
'visitor.claims.role.at',
|
||||||
|
'visitor.claims.role.startsWith',
|
||||||
'visitor.claims.role.endsWith',
|
'visitor.claims.role.endsWith',
|
||||||
'visitor.claims.role.includes',
|
'visitor.claims.role.includes',
|
||||||
|
'visitor.claims.role.toLowerCase',
|
||||||
|
'visitor.claims.role.toUpperCase',
|
||||||
|
'visitor.claims.role.trim',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -246,13 +255,47 @@ describe('autocomplete', () => {
|
|||||||
childrenRefs: [
|
childrenRefs: [
|
||||||
'visitor.claims.key.length',
|
'visitor.claims.key.length',
|
||||||
'visitor.claims.key.at',
|
'visitor.claims.key.at',
|
||||||
|
'visitor.claims.key.startsWith',
|
||||||
'visitor.claims.key.endsWith',
|
'visitor.claims.key.endsWith',
|
||||||
'visitor.claims.key.includes',
|
'visitor.claims.key.includes',
|
||||||
|
'visitor.claims.key.toLowerCase',
|
||||||
|
'visitor.claims.key.toUpperCase',
|
||||||
|
'visitor.claims.key.trim',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
expressionWithCursor: 'visitor.claims.key.<cur>',
|
||||||
|
expectedSuggestions: [
|
||||||
|
{
|
||||||
|
type: 'symbol',
|
||||||
|
symbol: {
|
||||||
|
definition: SymbolNumber({
|
||||||
|
name: 'length',
|
||||||
|
description:
|
||||||
|
'The length data property of a String value contains the length of the string in UTF-16 code units.',
|
||||||
|
link: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length',
|
||||||
|
}),
|
||||||
|
ref: 'visitor.claims.key.length',
|
||||||
|
parentRef: 'visitor.claims.key',
|
||||||
|
childrenRefs: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
...visitorClaimsKeyPropStringSymbol.methods.map<AutocompleteSymbolSuggestion>(
|
||||||
|
(method) => ({
|
||||||
|
type: 'symbol',
|
||||||
|
symbol: {
|
||||||
|
definition: method,
|
||||||
|
ref: `visitor.claims.key.${method.name}`,
|
||||||
|
parentRef: 'visitor.claims.key',
|
||||||
|
childrenRefs: [],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
expressionWithCursor: 'visitor.claims.h<cur>',
|
expressionWithCursor: 'visitor.claims.h<cur>',
|
||||||
expectedSuggestions: [
|
expectedSuggestions: [
|
||||||
|
|||||||
@@ -54,12 +54,54 @@ describe('ExpressionRuntime', () => {
|
|||||||
inputs: { reviews: [{ status: 'approved' }, { status: 'approved' }] },
|
inputs: { reviews: [{ status: 'approved' }, { status: 'approved' }] },
|
||||||
expectedResult: true,
|
expectedResult: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
scenario: 'array includes',
|
||||||
|
condition: 'reviews.includes("approved")',
|
||||||
|
inputs: { reviews: ['pending', 'approved'] },
|
||||||
|
expectedResult: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
scenario: 'array map',
|
scenario: 'array map',
|
||||||
condition: '[1, 2, 3].map(n => n * x)',
|
condition: '[1, 2, 3].map(n => n * x)',
|
||||||
inputs: { x: 2 },
|
inputs: { x: 2 },
|
||||||
expectedResult: [2, 4, 6],
|
expectedResult: [2, 4, 6],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
scenario: 'string startsWith',
|
||||||
|
condition: 'user.role.startsWith("ad")',
|
||||||
|
inputs: { user: { role: 'admin' } },
|
||||||
|
expectedResult: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: 'string endsWith',
|
||||||
|
condition: 'user.role.endsWith("min")',
|
||||||
|
inputs: { user: { role: 'admin' } },
|
||||||
|
expectedResult: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: 'string includes',
|
||||||
|
condition: 'user.role.includes("dm")',
|
||||||
|
inputs: { user: { role: 'admin' } },
|
||||||
|
expectedResult: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: 'string toLowerCase',
|
||||||
|
condition: 'user.role.toLowerCase() === "admin"',
|
||||||
|
inputs: { user: { role: 'ADMIN' } },
|
||||||
|
expectedResult: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: 'string toUpperCase',
|
||||||
|
condition: 'user.role.toUpperCase() === "ADMIN"',
|
||||||
|
inputs: { user: { role: 'admin' } },
|
||||||
|
expectedResult: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: 'string trim',
|
||||||
|
condition: 'user.role.trim() === "admin"',
|
||||||
|
inputs: { user: { role: ' admin ' } },
|
||||||
|
expectedResult: true,
|
||||||
|
},
|
||||||
])(
|
])(
|
||||||
'should properly evaluate/safeEvaluate a valid conditional expression: $scenario',
|
'should properly evaluate/safeEvaluate a valid conditional expression: $scenario',
|
||||||
({ condition, inputs, expectedResult }) => {
|
({ condition, inputs, expectedResult }) => {
|
||||||
|
|||||||
@@ -255,8 +255,12 @@ describe('ExpressionRuntime', () => {
|
|||||||
childrenRefs: [
|
childrenRefs: [
|
||||||
'visitor.claims.key.length',
|
'visitor.claims.key.length',
|
||||||
'visitor.claims.key.at',
|
'visitor.claims.key.at',
|
||||||
|
'visitor.claims.key.startsWith',
|
||||||
'visitor.claims.key.endsWith',
|
'visitor.claims.key.endsWith',
|
||||||
'visitor.claims.key.includes',
|
'visitor.claims.key.includes',
|
||||||
|
'visitor.claims.key.toLowerCase',
|
||||||
|
'visitor.claims.key.toUpperCase',
|
||||||
|
'visitor.claims.key.trim',
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -301,8 +305,12 @@ describe('ExpressionRuntime', () => {
|
|||||||
childrenRefs: [
|
childrenRefs: [
|
||||||
'visitor.claims.flags.FLAG1.length',
|
'visitor.claims.flags.FLAG1.length',
|
||||||
'visitor.claims.flags.FLAG1.at',
|
'visitor.claims.flags.FLAG1.at',
|
||||||
|
'visitor.claims.flags.FLAG1.startsWith',
|
||||||
'visitor.claims.flags.FLAG1.endsWith',
|
'visitor.claims.flags.FLAG1.endsWith',
|
||||||
'visitor.claims.flags.FLAG1.includes',
|
'visitor.claims.flags.FLAG1.includes',
|
||||||
|
'visitor.claims.flags.FLAG1.toLowerCase',
|
||||||
|
'visitor.claims.flags.FLAG1.toUpperCase',
|
||||||
|
'visitor.claims.flags.FLAG1.trim',
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -318,8 +326,12 @@ describe('ExpressionRuntime', () => {
|
|||||||
childrenRefs: [
|
childrenRefs: [
|
||||||
'visitor.claims.flags.FLAG2.length',
|
'visitor.claims.flags.FLAG2.length',
|
||||||
'visitor.claims.flags.FLAG2.at',
|
'visitor.claims.flags.FLAG2.at',
|
||||||
|
'visitor.claims.flags.FLAG2.startsWith',
|
||||||
'visitor.claims.flags.FLAG2.endsWith',
|
'visitor.claims.flags.FLAG2.endsWith',
|
||||||
'visitor.claims.flags.FLAG2.includes',
|
'visitor.claims.flags.FLAG2.includes',
|
||||||
|
'visitor.claims.flags.FLAG2.toLowerCase',
|
||||||
|
'visitor.claims.flags.FLAG2.toUpperCase',
|
||||||
|
'visitor.claims.flags.FLAG2.trim',
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -156,6 +156,31 @@ const StandardLibrary: Partial<
|
|||||||
members: [SymbolString(), SymbolUndefined()],
|
members: [SymbolString(), SymbolUndefined()],
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
|
SymbolFunction({
|
||||||
|
name: 'startsWith',
|
||||||
|
description: `Returns true if the given characters are found at the beginning of the string, including when searchString
|
||||||
|
is an empty string. Otherwise returns false.`,
|
||||||
|
link: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith',
|
||||||
|
args: [
|
||||||
|
SymbolString({
|
||||||
|
name: 'searchString',
|
||||||
|
description: `The characters to be searched for at the start of this string. Cannot be a regex.
|
||||||
|
All values that are not regexes are coerced to strings, so omitting it or passing undefined causes startsWith() to search for
|
||||||
|
the string "undefined", which is rarely what you want.`,
|
||||||
|
}),
|
||||||
|
OptionalFunctionArg(
|
||||||
|
SymbolNumber({
|
||||||
|
name: 'position',
|
||||||
|
description: `The start position at which searchString is expected to be found
|
||||||
|
(the index of searchString's first character). Defaults to 0.`,
|
||||||
|
})
|
||||||
|
),
|
||||||
|
],
|
||||||
|
returns: SymbolBoolean({
|
||||||
|
description: `true if the given characters are found at the beginning of the string, including when searchString is an empty string;
|
||||||
|
otherwise, false.`,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
SymbolFunction({
|
SymbolFunction({
|
||||||
name: 'endsWith',
|
name: 'endsWith',
|
||||||
description: `Returns true if the sequence of elements of searchString converted to a String is the same as the corresponding
|
description: `Returns true if the sequence of elements of searchString converted to a String is the same as the corresponding
|
||||||
@@ -205,6 +230,39 @@ const StandardLibrary: Partial<
|
|||||||
otherwise, false.`,
|
otherwise, false.`,
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
|
SymbolFunction({
|
||||||
|
name: 'toLowerCase',
|
||||||
|
description:
|
||||||
|
'Returns the value of the string converted to lower case. toLowerCase() does not affect the value of the string str itself.',
|
||||||
|
link: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase',
|
||||||
|
args: [],
|
||||||
|
returns: SymbolString({
|
||||||
|
description:
|
||||||
|
'A new string representing the calling string converted to lower case.',
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
SymbolFunction({
|
||||||
|
name: 'toUpperCase',
|
||||||
|
description:
|
||||||
|
'Returns the value of the string converted to uppercase. toUpperCase() does not affect the value of the string str itself.',
|
||||||
|
link: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase',
|
||||||
|
args: [],
|
||||||
|
returns: SymbolString({
|
||||||
|
description:
|
||||||
|
'A new string representing the calling string converted to upper case.',
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
SymbolFunction({
|
||||||
|
name: 'trim',
|
||||||
|
description:
|
||||||
|
'Returns new string representing str stripped of whitespace from both its beginning and end.',
|
||||||
|
link: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim',
|
||||||
|
args: [],
|
||||||
|
returns: SymbolString({
|
||||||
|
description:
|
||||||
|
'A new string representing str stripped of whitespace from both its beginning and end.',
|
||||||
|
}),
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
[SymbolType.Array]: (arraySymbolDef: ArraySymbolDef) => ({
|
[SymbolType.Array]: (arraySymbolDef: ArraySymbolDef) => ({
|
||||||
|
|||||||
Reference in New Issue
Block a user