{"version":3,"sources":["../../src/main.ts","../../src/interpreter/interpreter.ts","../../src/interpreter/types.ts","../../src/interpreter/helpers.ts","../../src/interpreter/scope.ts","../../src/interpreter/built-in-functions.ts","../../src/interpreter/grammar.ts","../../src/lib.ts"],"sourcesContent":["import * as turf from '@turf/turf';\nimport * as wellknown from 'wellknown';\n\nimport { Interpreter } from \"./interpreter/interpreter\";\nimport { STD_LIB } from './lib';\nimport { Scope } from \"./interpreter/scope\";\n\nexport enum OutputFormat {\n    WKT = 'WKT',\n    GeoJSON = 'GeoJSON'\n}\n\nexport interface Options {\n    outputFormat?: OutputFormat,\n    outputNonGeoJSON?: boolean;\n    scope?: Scope;\n    storeHistoricalEvaluations?: boolean;\n}\n\nexport const DEFAULT_OPTIONS: Options = {\n    outputFormat: OutputFormat.WKT,\n    storeHistoricalEvaluations: true\n}\n\nexport class Wael {\n    private options: Options;\n    private evaluationCount = 0;\n    static IDENTIFIER_LAST = '$?';\n\n    constructor(\n        initialOptions?: Options\n    ) {\n        this.options = {\n            ...DEFAULT_OPTIONS,\n            ...initialOptions,\n            scope: initialOptions?.scope ?? Interpreter.createGlobalScope(),\n        };\n        \n        // Import standard library\n        Interpreter.evaluateInput(`StdLib = ${STD_LIB}; Import(StdLib()) Using (*)`, this.options.scope)\n    }\n\n    getEvaluationCount(): number {\n        return this.evaluationCount;\n    }\n\n    evaluate(input: string, overrideOptions?: Partial<Options>) {\n        const options = {\n            ...this.options,\n            ...overrideOptions\n        };\n\n        const result = Interpreter.evaluateInput(input, options.scope);\n\n        // Track evaluations\n        options.scope?.store(Wael.IDENTIFIER_LAST, result);\n        if (options.storeHistoricalEvaluations) {\n            const indexedResultLabel = `$${this.evaluationCount}`;\n            options.scope?.store(indexedResultLabel, result);\n        }\n        this.evaluationCount++;\n\n        if (typeof result === 'object' && typeof result?.type === 'string') {\n            switch(options?.outputFormat) {\n                case OutputFormat.WKT:\n                    return wellknown.stringify(result);\n                case OutputFormat.GeoJSON:\n                    return turf.feature(result) as any;\n                default:\n                    break;\n            }\n        }\n        \n        const output = Wael.getOutputString(result, options.outputFormat);\n        if (options.outputNonGeoJSON) {\n            if (options.outputFormat === OutputFormat.GeoJSON) {\n                return result ?? undefined;\n            }\n            return output;\n        } else {\n            const outputString = typeof output === 'string' ? output : JSON.stringify(output, undefined, 2)\n            throw new Error(`Invalid '${options.outputFormat}' evaluation result: ${outputString}`)\n        }\n    }\n\n    static evaluate(input: string, options?: Partial<Options>) {\n        return new Wael(options).evaluate(input);\n    }\n\n    private static getOutputString(result: any, outputFormat?: OutputFormat) {\n        if (typeof result === 'object') {\n            if (outputFormat === OutputFormat.WKT) {\n                const properties = Object.keys(result).map(key => {\n                    return `  ${key} = ${result[key]?.toString()}`\n                });\nreturn `(\n${properties.join(';\\n')}\n)`\n            } \n        }\n        return `${result}`\n    }\n}\n\n","// import ohm from 'ohm-js';\nimport * as ohm from 'ohm-js';\nimport * as turf from '@turf/turf'\n\nimport { GeometryType, UNIT } from './types';\nimport {\n    OperationNotSupported,\n    arithmeticOperationExp,\n    convertToGeometry,\n    geometryAccessor,\n    getArrayLikeItems,\n    getGeometryType,\n    isAnyGeometryType,\n    isGeometryType,\n    isNumber,\n    toString,\n    transform\n} from './helpers';\nimport { Scope, ScopeBindings } from './scope';\n\nimport { BuiltInFunctions } from './built-in-functions';\nimport { GRAMMAR } from './grammar';\nimport { readFileSync } from 'fs';\nimport syncFetch from 'sync-fetch'\n\nconst grammarString = GRAMMAR;\n\nexport namespace Interpreter {\n\n    export const IMPORT_DEFAULT_IDENTIFIER = 'Default';\n    export const IMPORT_USING_ALL = '*';\n    \n    export const STANDARD_LIBRARY: ScopeBindings = {};\n    const math: { [prop: string]: any } = {};\n    Object.getOwnPropertyNames(Math).forEach(prop => {\n        math[prop] = (Math as any)[prop];\n    });\n    STANDARD_LIBRARY['Math'] = math;\n    STANDARD_LIBRARY['Flatten'] = BuiltInFunctions.Flatten;\n    STANDARD_LIBRARY['PointCircle'] = BuiltInFunctions.PointCircle;\n    STANDARD_LIBRARY['PointGrid'] = BuiltInFunctions.PointGrid;\n    STANDARD_LIBRARY['ToLineString'] = BuiltInFunctions.ToLineString;\n    STANDARD_LIBRARY['ToMultiPoint'] = BuiltInFunctions.ToMultiPoint;\n    STANDARD_LIBRARY['ToPolygon'] = BuiltInFunctions.ToPolygon;\n    STANDARD_LIBRARY['ToGeometryCollection'] = BuiltInFunctions.ToGeometryCollection;\n    STANDARD_LIBRARY['_Rotate'] = BuiltInFunctions.Rotate;\n    STANDARD_LIBRARY['_Round'] = BuiltInFunctions.Round;\n\n    export const createGlobalScope = () => new Scope(undefined, undefined, STANDARD_LIBRARY);\n        \n    export function evaluateInput(input: string, initialScope?: Scope): any {\n        const GLOBAL_SCOPE = createGlobalScope();\n        let currentScope = initialScope || GLOBAL_SCOPE;\n        const grammar = ohm.grammar(grammarString);\n        const semantics = grammar.createSemantics();\n        semantics.addOperation('eval', {\n            stringLiteral(_leftQuote, str, _rightQuote) {\n                return str.sourceString;\n            },\n            ImportAllExpression(exp) {\n                const ret = exp.eval();\n                if (ret) {\n                    // Return data import\n                    return ret;\n                }\n\n                // Return function import object\n                const importObj = currentScope.useImports();\n                return importObj;\n            },\n            ImportUsingExpression(importAllExp, _keyword, identifierList) {\n                importAllExp.eval();\n                const identifiers = identifierList.eval();\n                let importObj;\n                if (identifiers === IMPORT_USING_ALL) {\n                    importObj = currentScope.useNamedImports(Object.keys(currentScope.availableBindings));\n                } else {\n                    importObj = currentScope.useNamedImports(identifiers);\n                }\n                return importObj;\n            },\n            ImportUsingAllParams(_) {\n                return IMPORT_USING_ALL;\n            },\n            ImportExternalExp(_keyword, importUri) {\n                const uri:string  = importUri.eval();\n\n                let data: string;\n                if (uri.startsWith('http://') || uri.startsWith('https://')) {\n                    data = syncFetch(uri).text();\n                } else {\n                    data = readFileSync(uri, 'utf8');\n                }\n                currentScope = currentScope.push();\n                let ret = undefined;\n                let bindings: ScopeBindings | undefined = undefined;\n                try {\n                    ret = convertToGeometry(JSON.parse(data));\n                } catch {\n                    try {\n                        const libRet = evaluateInput(data, currentScope);\n                        bindings = {};\n                        bindings[IMPORT_DEFAULT_IDENTIFIER] = libRet;\n                    } catch {\n                        throw new Error(`Unable to import file: ${uri}`);\n                    }\n                }\n                currentScope = currentScope.pop(bindings) || GLOBAL_SCOPE;\n                return ret;\n            },\n            ImportFunctionExp(_keyword, importFn) {\n                importFn.eval();\n            },\n            IfThenElseExp(_if, c, _then, exp1, _else, exp2) {\n                const condition = c.eval();\n                if (condition) {\n                    return exp1.eval();\n                }\n                return exp2.eval();\n            },\n            booleanValue(val) {\n                const value = val.sourceString.toLocaleLowerCase();\n                if (value === 'true') {\n                    return true;\n                }\n                if (value === 'false') {\n                    return false;\n                }\n                throw new Error(`Invalid boolean value: ${val.sourceString}`);\n            },\n            EqualityExp(v1, op, v2) {\n                const value1 = v1.eval();\n                const operator = op.sourceString;\n                const value2 = v2.eval();\n                switch (operator.trim().toLocaleLowerCase()) {\n                    case \"==\":\n                        return value1 === value2;\n                    case \"!=\":\n                        return value1 !== value2;\n                    case \"and\":\n                        return value1 && value2;\n                    case \"or\":\n                        return value1 || value2;\n                }\n                throw new Error(`Operator not supported: ${operator}`);\n            },\n            NotExp(_, exp) {\n                return !exp.eval();\n            },\n            geometryKeyword(keyword) {\n                return keyword.sourceString;\n            },\n            CompareExp(v1, op, v2) {\n                const value1 = v1.eval();\n                if (!isNumber(value1)) {\n                    throw new Error(`Expected a number for ${v1.sourceString} but got: ${toString(value1)}`)\n                }\n                const operator = op.sourceString;\n                const value2 = v2.eval();\n                if (!isNumber(value2)) {\n                    throw new Error(`Expected a number for ${v2.sourceString} but got: ${toString(value2)}`)\n                }\n                switch (operator.trim()) {\n                    case \"<\":\n                        return value1 < value2;\n                    case \"<=\":\n                        return value1 <= value2;\n                    case \">\":\n                        return value1 > value2;\n                    case \">=\":\n                        return value1 >= value2;\n                }\n                throw new Error(`Operator not supported: ${operator}`);\n            },\n            ConcatExp(g1, _op, g2) {\n                const geom1 = g1.eval();\n                const geom2 = g2.eval();\n\n                const type1 = getGeometryType(geom1);\n                const type2 = getGeometryType(geom2);\n                if (!type1 || !type2) {\n                    throw new Error(`Expected geometry types for concatenation but found geom1: ${toString(geom1)} and geom2: ${toString(geom2)}`);\n                }\n                \n                if (type1 === type2) {\n\n                    const list1: any[] = getArrayLikeItems(geom1);\n                    const list2: any[] = getArrayLikeItems(geom2);\n                    \n                    // Point collections\n                    if (\n                        type1 === GeometryType.LineString || \n                        type1 === GeometryType.MultiPoint || \n                        type1 === GeometryType.GeometryCollection     \n                    ) {\n                        const combined = list1.concat(list2);\n                        if (type1 === GeometryType.LineString) {\n                            return turf.lineString(combined).geometry;\n                        }\n                        if (type1 === GeometryType.MultiPoint) {\n                            return turf.multiPoint(combined).geometry;\n                        }\n                        if (type1 === GeometryType.GeometryCollection) {\n                            return turf.geometryCollection(combined).geometry;\n                        }\n                    }\n                }\n                \n                if (\n                    type1 === GeometryType.LineString || \n                    type1 === GeometryType.MultiPoint   \n                ) {\n                    const list1: any[] = getArrayLikeItems(geom1);\n                    let list2: any;\n                    if (\n                        type2 === GeometryType.LineString || \n                        type2 === GeometryType.MultiPoint   \n                    ) {\n                        list2 = getArrayLikeItems(geom2);\n                    } else {\n                        if (type2 === GeometryType.Point) {\n                            list2 = [geom2.coordinates];\n                        }\n                    }\n                    if (list2) {\n                        const combined = list1.concat(list2);\n                        if (type1 === GeometryType.LineString) {\n                            return turf.lineString(combined).geometry;\n                        }\n                        if (type1 === GeometryType.MultiPoint) {\n                            return turf.multiPoint(combined).geometry;\n                        }\n                        if (type1 === GeometryType.GeometryCollection) {\n                            return turf.geometryCollection(combined).geometry;\n                        }\n                    }\n                }\n\n                if (type1 === GeometryType.GeometryCollection) {\n                    return turf.geometryCollection(geom1.geometries.concat([geom2])).geometry;\n                }\n\n                if (type2 === GeometryType.GeometryCollection) {\n                    return turf.geometryCollection([geom1].concat(...geom2.geometries)).geometry;\n                }\n\n                return turf.geometryCollection([geom1, geom2]).geometry;\n            },\n            PipeExp(a, op, f) {\n                const operator = op.sourceString;\n                const val = a.eval();\n                const fn = f.eval();\n\n                if (operator === '|') {\n                    return fn(val);\n                }\n\n                if (operator === '|*') {\n                    return transform(val, fn);\n                }\n\n                const list: any[] = getArrayLikeItems(val);\n                let listFn: any;\n                switch (operator) {\n                    case '||':\n                        listFn = Array.prototype.map;\n                        break;\n                    case '|~':\n                        listFn = Array.prototype.filter;\n                        break;\n                    case '|>':\n                        listFn = Array.prototype.reduce;\n                        break;\n                    default:\n                        throw new Error(`Operator ${operator} not supported`)\n                }\n\n                if (isGeometryType(GeometryType.GeometryCollection, val)) {\n                    const mappedList = listFn.call(list, fn);\n                    if (isAnyGeometryType(mappedList)) {\n                        return mappedList;\n                    }\n                    return turf.geometryCollection(mappedList).geometry;\n                }\n\n                if (isGeometryType(GeometryType.LineString, val)) {\n                    let mappedList = listFn.call(\n                        list.map(coords => turf.point(coords).geometry),\n                        fn\n                    );\n                    if (isAnyGeometryType(mappedList)) {\n                        return mappedList;\n                    }\n                    mappedList = mappedList.map((v: any) => v.coordinates);\n                    return turf.lineString(mappedList).geometry;\n                }\n\n                if (isGeometryType(GeometryType.MultiPoint, val)) {\n                    let mappedList = listFn.call(\n                        list.map(coords => turf.point(coords).geometry),\n                        fn\n                    );\n                    if (isAnyGeometryType(mappedList)) {\n                        return mappedList;\n                    }\n                    mappedList = mappedList.map((v: any) => v.coordinates);\n                    return turf.multiPoint(mappedList).geometry;\n                }\n\n                // TODO -- Multi line types (Polygon, MultiLineString)\n\n                throw Error(`Error mapping values to geometries`);\n            },\n            TopLevel(scopedExpressions, _end) {\n                let lastValue = scopedExpressions.eval();\n                return lastValue;\n            },\n            GenerateExp(_keyword, numExp, valueExp) {\n                const num = numExp.eval();\n                if (!Number.isInteger(num) && typeof num !== 'function') {\n                    throw new Error(`Expected integer but got: ${toString(num)}`);\n                }\n                let value = valueExp.eval();\n                let mapFn;\n                if (typeof value === 'function') {\n                    mapFn = value;\n                } else if (isAnyGeometryType(value)) {\n                    mapFn = () => value;\n                } else {\n                    throw new Error(`Expected geometry type or function but got: ${toString(value)}`);\n                }\n                const items: any[] = [];\n                if (typeof num === 'function') { \n                    let i = 0;\n                    let condition = num(i);\n                    while(condition) {\n                        const result = mapFn(i);\n                        if (!isAnyGeometryType(result)) {\n                            throw new Error(`Expected geometry type return value but got: ${toString(result)}`);\n                        }\n                        items.push(result);\n                        condition = num(++i);\n                    }\n                } else {\n                    for (let i=0; i<num; i++) {\n                        const result = mapFn(i);\n                        if (!isAnyGeometryType(result)) {\n                            throw new Error(`Expected geometry type return value but got: ${toString(result)}`);\n                        }\n                        items.push(result);\n                    }\n                }\n                return turf.geometryCollection(items).geometry;\n            },\n            FunctionCallExp(callable, p) {\n                const fn = callable.eval();\n                const params = p.eval();\n                if (!fn) {\n                    throw new Error(`${callable.sourceString} is: ${fn}`);\n                }\n                const value = fn(...params);\n                return value;\n            },\n            AccessibleExp_method(val, _accessOp, prop, optionalParams: ohm.Node) {\n                const value = val.eval();\n                const identifier = prop.sourceString;\n                const isInvocation = optionalParams.children.length > 0;\n                const parameters = isInvocation ? optionalParams.children.map(c => c.eval())[0] : [];\n\n                // Function type accessor\n                if (typeof value === 'function') {\n                    if (identifier === 'bind') {\n                        return value.bind(undefined, ...parameters)\n                    }\n                    throw new OperationNotSupported(`Method ${identifier} not supported on function type`);\n                }\n                \n                // Geometry type accessor\n                if (isAnyGeometryType(value)) {\n                    return geometryAccessor(val, prop, parameters);\n                }\n\n                // Object type accessor\n                const resolvedValue = value[identifier];\n                if (typeof resolvedValue === 'function' && isInvocation) {\n                    return resolvedValue(...parameters);\n                }\n                return resolvedValue;\n            },\n            Invocation(_leftParen, list, _rightParen) {\n                return list.asIteration().children.map(c => c.eval());\n            },\n            FunctionExp(p, _, body) {\n                let params = p.eval();\n                params = Array.isArray(params) ? params : [params];\n                let fnScope = currentScope;\n                const fn = function(...values: any[]) {\n                    // Create new scope per function call.\n                    currentScope = currentScope.push({...fnScope.bindings});\n                    params.forEach((paramName: any, index: number) => {\n                        currentScope.store(paramName, values[index], undefined, false)\n                    });\n                    const ret = body.eval();\n                    const defaultBindings: ScopeBindings = {};\n                    defaultBindings[IMPORT_DEFAULT_IDENTIFIER] = ret;\n                    currentScope = currentScope.pop(defaultBindings) || GLOBAL_SCOPE;\n                    return ret;\n                };\n                const boundFn = fn.bind(currentScope);\n                boundFn.toString = function() { return `Function(${p.sourceString} => ${body.sourceString})` }\n                return boundFn;\n            },\n            FunctionParameters_multipleParams(_leftParen, identifierList, _rightParen) {\n                const params = identifierList.asIteration().children.map(c => c.sourceString);\n                return params;\n            },\n            FunctionParameters_single(identifier) {\n                return [identifier.sourceString];\n            },\n            FunctionTextExp_keyword(_keyword, _leftParen, exp, _rightParen) {\n                return exp.eval();\n            },\n            id(first, rest) {\n                const key = first.sourceString + rest.sourceString;\n                return currentScope.resolve(key);\n            },\n            AssignmentExp(exportKeyword, letKeyword, identifier, _operator, value) {\n                const isPublic = !!(exportKeyword?.children?.length);\n                const isLet = !!(letKeyword?.children?.length);\n                const variableName = identifier.sourceString;\n                const variableValue = value.eval();\n                currentScope.store(variableName, variableValue, { public: isPublic }, !isLet);\n                return variableValue;\n\n            },\n            ScopedExpressions_list(list) {\n                const expressions = list.asIteration().children.map(c => c.eval());\n                return expressions[expressions.length - 1];\n            },\n            GeneralExpression_rightComment(exp, _) {\n                return exp.eval();\n            },\n            GeneralExpression_leftComment(_, exp) {\n                return exp.eval();\n            },\n            Paren(_leftParen, exp, _rightParen) {\n                return exp.eval();\n            },\n            OptionallyParen_paren(_leftParen, exp, _rightParen) {\n                return exp.eval();\n            },\n            OptionallyBraced_brace(_leftBrace, exp, _rightBrace) {\n                return exp.eval();\n            },\n            GeometryTaggedText(_keyword, exp) {\n                return exp.eval();\n            },\n            GeometryCollectionText_present(_leftParen, list, _rightParen) {\n                const geometries = ((list || []) as any).asIteration().children.map((c: any) => c.eval());\n                return turf.geometryCollection(geometries).geometry;\n            },\n            MultiPolygonText_present(_leftParen, list, _rightParen) {\n                const polygons = list.asIteration().children.map(c => c.eval());\n                return turf.multiPolygon(polygons.map(p => p.coordinates)).geometry;\n            },\n            MultiLineStringText_present(_leftParen, list, _rightParen) {\n                const lineStrings = list.asIteration().children.map(c => c.eval());\n                return turf.multiLineString(lineStrings.map(p => p.coordinates)).geometry;\n            },\n            MultiPointText_present(_leftParen, list, _rightParen) {\n                const points = list.eval();\n                return turf.multiPoint(points.map((p: any) => p.coordinates)).geometry;\n            },\n            PolygonText_present(_leftParen, list, _rightParen) {\n                const points = list.asIteration().children.map(c => c.eval());\n                return turf.polygon(points.map(p => p.coordinates)).geometry;\n            },\n            LineStringText_present(_leftParen, list, _rightParen) {\n                const points = list.eval();\n                return turf.lineString(points.map((p: any) => p.coordinates)).geometry;\n            },\n            PointList(list) {\n                return list.asIteration().children.map(c => c.eval());\n            },\n            PointTaggedText(_, point) {\n                return point.eval();\n            },\n            PointText_present(_leftParen, point, _rightParen) {\n                return point.eval();\n            },\n            Point(x, y) {\n                return turf.point([x.eval(), y.eval()]).geometry;\n            },\n            ArithmeticAdd_plus(a, _, b) {\n                const result = arithmeticOperationExp(a, b, (a, b) => a + b);\n                if (result !== undefined) {\n                    return result;\n                }\n                throw new OperationNotSupported(`${toString(a.eval())} + ${toString(b.eval())}`);\n            },\n            ArithmeticAdd_minus(a, _, b) {\n                const result = arithmeticOperationExp(a, b, (a, b) => a - b);\n                if (result !== undefined) {\n                    return result;\n                }\n                throw new OperationNotSupported(`${toString(a.eval())} - ${toString(b.eval())}`);\n            },\n            ArithmeticMul_times(a, _, b) {\n                const result = arithmeticOperationExp(a, b, (a, b) => a * b);\n                if (result !== undefined) {\n                    return result;\n                }\n                throw new OperationNotSupported(`${toString(a.eval())} * ${toString(b.eval())}`);\n            },\n            ArithmeticMul_divide(a, _, b) {\n                const result = arithmeticOperationExp(a, b, (a, b) => a / b);\n                if (result !== undefined) {\n                    return result;\n                }\n                throw new OperationNotSupported(`${toString(a.eval())} / ${toString(b.eval())}`);\n            },\n            ArithmeticMul_mod(a, _, b) {\n                const result = arithmeticOperationExp(a, b, (a, b) => a % b);\n                if (result !== undefined) {\n                    return result;\n                }\n                throw new OperationNotSupported(`${toString(a.eval())} % ${toString(b.eval())}`);\n            },\n            ArithmeticExp_power(a, _, b) {\n                const result = arithmeticOperationExp(a, b, (a, b) => Math.pow(a, b));\n                if (result !== undefined) {\n                    return result;\n                }\n                throw new OperationNotSupported(`${toString(a.eval())} ^ ${toString(b.eval())}`);\n            },\n            ArithmeticPri_paren(_l, exp, _r) {\n                return exp.eval();\n            },\n            exactNumericLiteral_decimalWithWholeNumber(whole, _, decimal) {\n                return parseFloat(`${whole.sourceString}.${decimal.sourceString}`);\n            },\n            exactNumericLiteral_decimalWithoutWholeNumber(_, decimal) {\n                return parseFloat(`.${decimal.sourceString}`);\n            },\n            exactNumericLiteral_wholeNumber(whole) {\n                return parseInt(`${whole.sourceString}`);\n            },\n            approximateNumericLiteral(mantissa, e, exponent) {\n                return parseFloat(`${mantissa.eval()}${e}${exponent.eval()}`);\n            },\n            signedNumericLiteral_signPresent(sign, numericLiteral) {\n                return parseFloat(`${sign.sourceString}${numericLiteral.eval()}`);\n            },\n            signedNumericLiteral_signMissing(numericLiteral) {\n                return numericLiteral.eval();\n            },\n            comment(_a, _b, _c, _d, _e) {\n                return UNIT;\n            },\n            emptySet(_val) {\n                return UNIT;\n            }\n        });\n    \n        const matchResult = grammar.match(input);\n        if (matchResult.message) {\n            console.error(`Message: ${matchResult.message}`)\n        }\n        const sem = semantics(matchResult);\n        const result = sem.eval();\n        return result;\n    }\n    \n}","export type GeoJSON = any; // TODO -- use GeoJSON type\n\nexport enum GeometryType {\n    Point = 'Point',\n    LineString = 'LineString',\n    Polygon = 'Polygon',\n    MultiPoint = 'MultiPoint',\n    MultiLineString = 'MultiLineString',\n    MultiPolygon = 'MultiPolygon',\n    GeometryCollection = 'GeometryCollection'\n}\n\nexport type Unit = null;\nexport const UNIT: Unit = null;\n\n","import * as turf from '@turf/turf';\n\nimport { GeometryType } from \"./types\";\nimport { Point } from 'geojson';\n\nexport const isAnyGeometryType = (value: any) => {\n    const types = Object.values(GeometryType);\n    for (const type of types) {\n        if (isGeometryType(type, value)) {\n            return true;\n        }\n    }\n    return false;\n}\n\nexport const isGeometryType = (type: GeometryType, ...values: any) => {\n    for (const value of values) {\n        const isType = typeof value === 'object' &&\n            value?.type === type ||\n            value?.geometry?.type === type;\n        if (!isType) {\n            return false;\n        }\n    }\n    return true;\n};\n\nexport const getGeometryType = (value: any, isForDisplay = false): GeometryType | undefined => {\n    if(typeof value === 'object') {\n        const type = value?.geometry?.type || value?.type\n        if (isForDisplay && type === GeometryType.GeometryCollection) {\n            return GeometryType.GeometryCollection;\n        }\n        return type;\n    }\n    return undefined;\n}\n\n\nexport const isAGeometryType = (value: any, ...types: GeometryType[]) => {\n    for (const type of types) {\n        if(isGeometryType(type, value)) {\n            return true;\n        }\n    }\n    return false;\n};\n\nexport const getArrayLikeItems = (value: any) => {\n    if (\n        isGeometryType(GeometryType.LineString, value) ||\n        isGeometryType(GeometryType.MultiPoint, value)\n    ) {\n        return value.coordinates;\n    } else if (isGeometryType(GeometryType.GeometryCollection, value)) {\n        return value.geometries;\n    }\n    return undefined;\n};\n\nexport const isNumber = (...values: any) => {\n    return isType('number', ...values);\n}\n\nexport const isString = (...values: any) => {\n    return isType('string', ...values);\n};\n\nexport const isType = (type: string, ...values: any) => {\n    for (const value of values) {\n        const isType = typeof value === type;\n        if (!isType) {\n            return false;\n        }\n    }\n    return true;\n}\n\nexport const arithmeticOperationExp = (a: any, b: any, op: (a: any, b: any) => any) => {\n    return arithmeticOperation(a.eval(), b.eval(), op);\n}\n\nexport const arithmeticOperation = (A: any, B: any, op: (a: any, b: any) => any): any => {\n    if (isNumber(A, B)) {\n      return op(A, B);  \n    }\n    if (isNumber(A) && isAnyGeometryType(B)) {\n        return arithmeticOperation(turf.point([A, A]).geometry, B, op);\n    }\n    if (isNumber(B) && isAnyGeometryType(A)) {\n        return arithmeticOperation(A, turf.point([B, B]).geometry, op);\n    }\n    if (isGeometryType(GeometryType.Point, A, B)) {\n        return pointOperation(A, B, op);\n    }\n    if (isGeometryType(GeometryType.LineString, A, B)) {\n        return lineStringOperation(A, B, op);\n    }\n    if (isGeometryType(GeometryType.MultiPoint, A, B)) {\n        return multiPointOperation(A, B, op);\n    }\n    if (isGeometryType(GeometryType.Point, A)) {\n        return transform(B, (b => pointOperation(A, b, op)))\n    }\n    if (isGeometryType(GeometryType.Point, B)) {\n        return transform(A, (a => pointOperation(a, B, op)))\n    }\n    return undefined;\n}\n\nexport const pointOperation = (\n    A: any,\n    B: any,\n    computeFn: (a: number, b: number) => number\n) => {\n    return turf.point([\n        computeFn(A.coordinates[0], B.coordinates[0]),\n        computeFn(A.coordinates[1], B.coordinates[1]),\n    ]).geometry;\n}\n\n\nexport const lineStringOperation = (\n    A: any,\n    B: any,\n    computeFn: (a: number, b: number) => number\n) => {\n    return turf.lineString(A.coordinates.map((p: number[], index: number) => {\n        return [\n            computeFn(p[0], B.coordinates[index][0]),\n            computeFn(p[1], B.coordinates[index][1]),\n        ];\n    })).geometry;\n}\n\nexport const multiPointOperation = (\n    A: any,\n    B: any,\n    computeFn: (a: number, b: number) => number\n) => {\n    return turf.multiPoint(A.coordinates.map((p: number[], index: number) => {\n        return [\n            computeFn(p[0], B.coordinates[index][0]),\n            computeFn(p[1], B.coordinates[index][1]),\n        ];\n    })).geometry;\n}\n\nexport class OperationNotSupported extends Error {\n    constructor(message: string) {\n        super(`Operation not supported: ${message}`);\n    }\n}\n\nexport function toString(value: any) {\n    try {\n        return `${JSON.stringify(value)}`;\n    } catch (err) {\n        return `${value}`;\n    }\n}\n\nexport function transformPoints(coords: any[], coordsMapFn: (g: Point) => any): any {\n    if (!!coords) {\n        if (Array.isArray(coords)) {\n            if (coords.length > 0) {\n                const firstElement = coords[0];\n                if (Array.isArray(firstElement)) {\n                    return coords.map((c: any) => transformPoints(c, coordsMapFn));\n                } else {\n                    // coords is a point\n                    const point = turf.point(coords).geometry;\n                    return coordsMapFn(point).coordinates;\n                }\n                \n            }\n        }\n    }\n    return coords\n}\n\nexport function transform(geoJson: any, coordsMapFn: (g: Point) => any): any {    \n    if (!!geoJson) {\n\n        if (!!geoJson.features) {\n            return {\n                ...geoJson,\n                features: geoJson.features.map((feature: any) => transform(feature, coordsMapFn))\n            };\n        }\n\n        if (!!geoJson.geometries) {\n            return {\n                ...geoJson,\n                geometries: geoJson.geometries.map((geometry: any) => transform(geometry, coordsMapFn))\n            }\n        }\n\n        const geometry: any = geoJson.geometry;\n        if (!!geometry) {\n            if (geoJson.coordinates) {\n                return {\n                    ...geoJson,\n                    geometry: {\n                        ...geometry,\n                        coordinates: transformPoints(geometry.coordinates, coordsMapFn)\n                    }\n                }\n            }\n        }\n\n        const coordinates = geoJson.coordinates;\n        if (!!coordinates) {\n            return {\n                ...geoJson,\n                coordinates: transformPoints(coordinates, coordsMapFn)\n            }\n        }\n    }\n    return geoJson;\n}\n\nexport function convertToGeometry(json: any): any {\n    if (json.type === 'Feature') {\n        return json.geometry;\n    } else if (json.type === 'FeatureCollection') {\n        return {\n            type: 'GeometryCollection',\n            geometries: json.features.map((f: any) => convertToGeometry(f))\n        }\n    } else if (Array.isArray(json)) {\n        return {\n            type: 'GeometryCollection',\n            geometries: json.map((f: any) => convertToGeometry(f))\n        }\n    }\n    return json;\n}\n\nexport function geometryAccessor(v: any, p: any, params: any[]) {\n    const value = v.eval();\n    const property = p.sourceString;\n\n    if (!isAnyGeometryType(value)) {\n        throw new Error(`Expected a geometry type for value \"${v.sourceString}\" but got: ${toString(value)}`);\n    }\n\n    switch (property.toLocaleLowerCase()) {\n        case 'type':\n            if (params?.length > 1) {\n                throw new Error(`Expected no parameters for \"${property}\" for ${v.sourceString}`)\n            }\n            return getGeometryType(value, true);\n    }\n\n    if (isGeometryType(GeometryType.Point, value)) {\n        switch (property.toLocaleLowerCase()) {\n            case 'x':\n                if (params?.length > 0) {\n                    // setter\n                    if (params.length === 1) {\n                        return turf.point([\n                            params[0],\n                            value.coordinates[1]\n                        ]).geometry;\n                    }\n                    throw Error(`Expected one value in \"${property}\" setter for \"${v.sourceString}\" but got: ${toString(params)}`)\n                }\n                // getter\n                return value.coordinates[0];\n            case 'y':\n                if (params?.length > 0) {\n                    // setter\n                    if (params.length === 1) {\n                        return turf.point([\n                            value.coordinates[0],\n                            params[0]\n                        ]).geometry;\n                    }\n                    throw Error(`Expected one value in \"${property}\" setter for \"${v.sourceString}\" but got: ${toString(params)}`)\n                }\n                // getter\n                return value.coordinates[1];\n        }\n    } else if (isGeometryType(GeometryType.GeometryCollection, value)) {\n        switch (property.toLocaleLowerCase()) {\n            case 'geometryn':\n                if (params.length === 1) {\n                    const index = parseInt(params[0]);\n                    return value.geometries[index];\n                }\n                throw Error(`Expected one value in \"${property}\" setter for \"${v.sourceString}\" but got: ${toString(params)}`)\n            case 'numgeometries':\n                return value.geometries.length;\n            }\n    } else if (isGeometryType(GeometryType.LineString, value)) {\n        switch (property.toLocaleLowerCase()) {\n            case 'pointn':\n                if (params.length === 1) {\n                    const index = parseInt(params[0]);\n                    return turf.point(value.coordinates[index]).geometry;\n                }\n                throw Error(`Expected one value in \"${property}\" setter for \"${v.sourceString}\" but got: ${toString(params)}`)\n            case 'numpoints':\n                return value.coordinates.length;\n            }\n    }\n\n    throw new Error(`Property \"${property}\" not accessible on object: ${toString(value)}`);\n\n}","export interface ScopeBindings  {\n    [identifier: string]: any;\n}\n\nexport interface Metadata {\n    public: boolean;\n}\n\nexport interface ScopeBindingMetadata {\n    [identifier: string]: {\n        public?: boolean\n    };\n}\n\nexport class Scope {\n\n    bindings: ScopeBindings = {};\n    availableBindings: ScopeBindings = {};\n    private metadata: ScopeBindingMetadata = {};\n    constructor(\n        private parent?: Scope,\n        public readonly level = 0,\n        defaultBindings: ScopeBindings = {}\n    ) {\n        for (const identifier in defaultBindings) {\n            if (defaultBindings.hasOwnProperty(identifier)) {\n                this.store(identifier, defaultBindings[identifier]);\n            }\n        }\n    }\n\n    store(identifier: string, value: any, metadata?: Metadata, searchParentChain = true) {\n        let scope: Scope = this;\n        if (searchParentChain) {\n            const resolvedScope = this.resolveScope(identifier);\n            if (resolvedScope) {\n                scope = resolvedScope;\n            }\n            scope.store(identifier, value, metadata, false);\n            return;\n        }\n        this.bindings[identifier] = value;\n        if (metadata) {\n            this.metadata[identifier] = metadata;\n        }\n    };\n\n    resolveScope(identifier: string): Scope | undefined {\n        if (this.bindings.hasOwnProperty(identifier)) {\n            return this;\n        }\n\n        if (this.parent) {\n            return this.parent.resolveScope(identifier)\n        }\n\n        return undefined;\n    }\n\n    resolve(identifier: string): any {\n        const scope = this.resolveScope(identifier) ?? this\n        return scope.bindings[identifier];\n    };\n\n    push(extraBindings?: ScopeBindings): Scope {\n        return new Scope(this, this.level + 1, extraBindings);\n    }\n\n    pop(additionalBindings?: ScopeBindings): Scope | undefined {\n        const exportedBindings: ScopeBindings = {\n            ...additionalBindings\n        };\n        for (const identifier in this.metadata) {\n            const metadata = this.metadata[identifier];\n            if (metadata && metadata.public) {\n                exportedBindings[identifier] = this.bindings[identifier]\n            }\n        }\n        this.parent?.import(exportedBindings)\n        return this.parent;\n    }\n\n    import(scopeBindings: ScopeBindings) {\n        this.availableBindings = {\n            ...this.availableBindings,\n            ...scopeBindings\n        };\n    }\n\n    useImports(selectedIdentifiers?: string[]) {\n        let selectedBindings: ScopeBindings = {};\n        if (selectedIdentifiers) {\n            selectedIdentifiers.forEach(selectedIdentifier => {\n                selectedBindings[selectedIdentifier] = this.availableBindings[selectedIdentifier]\n            });\n        } else {\n            selectedBindings = this.availableBindings\n        }\n        this.availableBindings = {};\n        return selectedBindings;\n    }\n\n    useNamedImports(selectedIdentifiers: string[]) {\n        let selectedBindings: ScopeBindings = {};\n        if (selectedIdentifiers) {\n            selectedIdentifiers.forEach(selectedIdentifier => {\n                selectedBindings[selectedIdentifier] = this.availableBindings[selectedIdentifier]\n            });\n        }\n        this.bindings = {\n            ...this.bindings,\n            ...selectedBindings,\n        };\n        return selectedBindings;\n    }\n}","import * as turf from '@turf/turf';\n\nimport { OperationNotSupported, isGeometryType, toString, transform } from './helpers';\n\nimport { GeometryType } from './types';\nimport { Point } from 'geojson';\nimport booleanEqual from \"@turf/boolean-equal\"\n\nexport namespace BuiltInFunctions {\n\n    const FlattenHelper = (value: any) => {\n        const flattenedValues: any[] = [];\n        if (!!value) {\n            if (value?.type === GeometryType.GeometryCollection) {\n                for (const item of value.geometries) {\n                    flattenedValues.push(...FlattenHelper(item));\n                }\n            } else {\n                flattenedValues.push(value);\n            }\n        }\n        return flattenedValues;\n    };\n\n    export const Flatten = (value: any) => {\n        if (value?.type === GeometryType.GeometryCollection) {\n            return turf.geometryCollection(FlattenHelper(value)).geometry;\n        }\n        return value;\n    };\n\n    export const PointCircle = (radius: number, count: number) => {\n        const circlePoints: any[] = [];\n        const angleIncrement = (2 * Math.PI) / count;\n        for (let i = 0; i < count; i++) {\n            const angle = i * angleIncrement;\n            const x = radius * Math.cos(angle);\n            const y = radius * Math.sin(angle);\n            circlePoints.push(turf.point([x, y]).geometry);\n        }\n        return turf.geometryCollection(circlePoints).geometry;\n    };\n\n    export const PointGrid = (x: number, y: number, spacing = 1) => {\n        const points: any[] = [];\n        for (let i=0; i<x; i++) {\n            for (let j=0; j<y; j++) {\n                const point = turf.point([i * spacing, j * spacing]).geometry;\n                points.push(point);\n            }\n        }\n        return turf.geometryCollection(points).geometry;\n    }\n\n    const getPointsList = (value: any) => {\n        let points;\n        if (isGeometryType(GeometryType.GeometryCollection, value)) {\n            points = value?.geometries.map((f: any) => f.coordinates);\n        } else if (\n            isGeometryType(GeometryType.LineString, value) ||\n            isGeometryType(GeometryType.MultiPoint, value)\n        ) {\n            points = value?.coordinates;\n        }\n        if (points) {\n            return points;\n        }\n        throw new Error(\"Expected geometry with points list\");\n    }\n\n    export const ToLineString = (value: any) => {\n        const pointsList = getPointsList(value);\n        return turf.lineString(pointsList).geometry;\n    };\n\n    export const ToMultiPoint = (value: any) => {\n        const pointsList = getPointsList(value);\n        return turf.multiPoint(pointsList).geometry;\n    };\n\n    export const ToPolygon = (value: any) => {\n        const pointsList = getPointsList(value);\n        // Auto-close polygon\n        if (pointsList.length > 0) {\n            if (!booleanEqual(\n                turf.point(pointsList[0]).geometry,\n                turf.point(pointsList[pointsList.length - 1]).geometry\n            )) {\n                pointsList.push(pointsList[0]);\n            }\n        }\n        return turf.polygon([pointsList]).geometry;\n    };\n\n    export const ToGeometryCollection = (value: any) => {\n        const pointsList = getPointsList(value);\n        return turf.geometryCollection(pointsList.map((p: any) => turf.point(p).geometry)).geometry;\n    };\n\n    export const Rotate = (angleDegrees: number, origin: Point = turf.point([0, 0]).geometry, geometry: any) => {\n        return transform(geometry, (p: Point) => {\n            // Convert angle from degrees to radians\n            const angleRadians = (angleDegrees * Math.PI) / -180;\n            const originX = origin.coordinates[0];\n            const originY = origin.coordinates[1];\n            const x = p.coordinates[0];\n            const y = p.coordinates[1];\n\n            // Calculate the distance from the origin to the point\n            const dx = x - originX;\n            const dy = y - originY;\n\n            // Perform the rotation\n            const newX = originX + dx * Math.cos(angleRadians) - dy * Math.sin(angleRadians);\n            const newY = originY + dx * Math.sin(angleRadians) + dy * Math.cos(angleRadians);\n\n            return turf.point([newX, newY]).geometry;\n        });\n    }\n\n    export const Round = (precision = 0, val: any): any => {\n        if (typeof val === 'number') {\n            return +val.toFixed(precision);\n        }\n        if (isGeometryType(GeometryType.Point, val)) {\n            const coords = val.coordinates;\n            return turf.point([\n                Round(precision, coords[0]),\n                Round(precision, coords[1]),\n            ]).geometry;\n        }\n        throw new OperationNotSupported(`Unable to round value: ${toString(val)}`)\n    }\n}\n","export const GRAMMAR = String.raw`\nWAEL {\n\n/***************\n * WAEL syntax *\n ***************/\n\n// Top-level expressions\nTopLevel = ScopedExpressions TopLevelEnd\nTopLevelEnd = ExpressionDelimiter | end \n\n// Comments\ncomment = \"#\" commentSpace* commentText* commentSpace* commentEnd\ncommentText = ~commentEnd any\ncommentEnd = \"\\n\" | end\ncommentSpace = \" \"\n\n// Expression structure\nScopedExpressions = ListOf<GeneralExpression, ExpressionDelimiter> --list\n    | GeneralExpression\nGeneralExpression =  GeneralExpression comment --rightComment\n    | comment GeneralExpression --leftComment\n    | AssignmentExp\n    | AssignableExpression \n    | comment    \nExpressionDelimiter = expressionDelimiter\nexpressionDelimiter = \";\"\n\n// Imports\nImportExpression = AccessibleExp<ImportExpressionType>\nImportExpressionType = ImportUsingExpression | ImportAllExpression\nImportUsingExpression = ImportEitherExpression usingKeyword ImportUsingParameters\nImportUsingParameters = FunctionParameters | ImportUsingAllParams\nImportUsingAllParams = Paren<\"*\">\nImportAllExpression = ImportEitherExpression\nImportEitherExpression = ImportExternalExp | ImportFunctionExp\nImportExternalExp = importKeyword Paren<ImportExternalParamExp>\nImportExternalParamExp = stringLiteralExp | Identifier\nImportFunctionExp = importKeyword Paren<FunctionCallExp>\nimportKeyword = caseInsensitive<\"import\">\nusingKeyword = caseInsensitive<\"using\">\n\n// Exports\nexportKeyword = caseInsensitive<\"export\">\n\n// Variables\nletKeyword = caseInsensitive<\"let\">\nAssignmentExp = exportKeyword? letKeyword? Identifier assignmentOperator AssignableExpression \nAssignableExpression = \n    | ImportExpression\n    | NonArithmeticAssignableExpression\n    | ArithmeticAssignableExpression\nNonArithmeticAssignableExpression = \n    | OperationExp\n    | stringLiteralExp\nArithmeticAssignableExpression = Arithmetic<AssignableExpressionForArithmetic>\nAssignableExpressionForArithmetic = \n    | BooleanResultExp\n    | IfThenElseExp\n    | ComputedExp\n    | FunctionTextExp\n    | NumberExp\n    | AccessibleExp<GeometryExp>\n    | BooleanValue\n    | Paren<OperationExp> \nassignmentOperator = \"=\"\nComputedValue<Type> = Type | ComputedExp\nComputedExp = AccessibleExp<ComputedPrimitive>\nComputedPrimitive = FunctionCallExp | Identifier\n\nAccessibleExp<Type> = \n    | Type accessorOperator Identifier Invocation? --method\n    | Type\n\n// Additional operation expressions\nOperationExp =  PipeExp | GenerateExp | ConcatExp\nPipeExp = MappableValue anyPipeOperator Pipeable //Callable\nPipeable = FunctionCallExp | Callable\nGenerateExp = generateKeyword GenerateCountExpr ComputedValue<GenerateValue> \nGenerateCountExpr = ComputedValue<NumberExp> | FunctionTextExp\nConcatExp = MappableValue concatOperator MappableValue\nGenerateValue = GeometryExp | FunctionTextExp\ngenerateKeyword = caseInsensitive<\"Generate\">\nMappableValue = AssignableExpression \n\n// Helpers\nParen<type> = LeftParen type RightParen\nOptionallyParen<type> = LeftParen type RightParen --paren\n    | type --noParen\nOptionallyBraced<type> = LeftBrace type RightBrace --brace\n    | type\n    \n// Arithmetic expressions\nArithmetic<Type> = ArithmeticAdd<Type>\nArithmeticAdd<Type> = \n        | ArithmeticAdd<Type> plusOperator ArithmeticMul<Type>  -- plus\n        | ArithmeticAdd<Type> minusOperator ArithmeticMul<Type>  -- minus\n        | ArithmeticMul<Type>\nArithmeticMul<Type> = \n        | ArithmeticMul<Type> timesOperator ArithmeticExp<Type>  -- times\n        | ArithmeticMul<Type> divideOperator ArithmeticExp<Type>  -- divide\n        | ArithmeticMul<Type> modOperator ArithmeticExp<Type>  -- mod\n        | ArithmeticExp<Type>\nArithmeticExp<Type> = \n        | ArithmeticPri<Type> powerOperator ArithmeticExp<Type>  -- power\n        | ArithmeticPri<Type>\nArithmeticPri<Type> = \n        | Type\n        | leftParen Arithmetic<Type> rightParen  -- paren\n        \n// Operators\noperator = \n    | expressionDelimiter\n    | anyPipeOperator\n    | plusOperator\n    | minusOperator\n    | timesOperator\n    | divideOperator\n    | powerOperator\n    | modOperator\n    | accessorOperator\n    | conditionalOperator\n    | assignmentOperator\n    | notOperator\n\nanyPipeOperator = doublePipeOperator | coordinatesPipeOperator | filterOperator | reduceOperator | pipeOperator\n\npipeOperator = \"|\"\ncoordinatesPipeOperator = \"|*\"\ndoublePipeOperator = \"||\"\nfilterOperator = \"|~\"\nreduceOperator = \"|>\"\nconcatOperator = \"++\"\nplusOperator = \"+\"\nminusOperator = \"-\"\ntimesOperator = \"*\"\ndivideOperator = \"/\"\npowerOperator = \"^\"\nmodOperator = \"%\"\naccessorOperator = \":\"\n    \n// Function expressions\nFunctionTextExp = functionKeyword LeftParen FunctionExp RightParen --keyword\n\t| OptionallyParen<FunctionExp>\nFunctionExp = FunctionParameters \"=>\" OptionallyParen<FunctionBody>\nFunctionParameters = LeftParen ListOf<Identifier, Comma> RightParen --multipleParams\n    | Identifier --single\nFunctionBody =  OptionallyParen<ScopedExpressions> | AssignableExpression\nFunctionCallExp = FunctionCallExp Invocation | Callable Invocation\nInvocation = LeftParen ListOf<GeneralExpression, Comma> RightParen\nfunctionKeyword = caseInsensitive<\"Function\">\nCallable = \n    | FunctionTextExp\n    | FunctionCallExp\n    | AccessibleExp<Callable>\n    | Identifier\n\n// If-Then-Else expressions\nIfThenElseExp = ifKeyword Paren<BooleanResultExp> thenKeyword\n    Paren<ScopedExpressions> elseKeyword \n    Paren<ScopedExpressions>\nifKeyword = caseInsensitive<\"if\">\nthenKeyword = caseInsensitive<\"then\">\nelseKeyword = caseInsensitive<\"else\">\n\n// Conditional expressions\nBooleanResultExp = EqualityExp | CompareExp | NotExp | booleanValue\nEqualityExp = ComparePrimitive equalityOperatorPrimitive ComparePrimitive\nNotExp = notOperator ComparePrimitive\nConditionalValue = CompareExp | EqualityExp | BooleanValue | NumberExp\nCompareExp = ComparePrimitive compareOperatorPrimitive ComparePrimitive\nComparePrimitive = BooleanResultExp | ComputedValue<NumberExp> | AccessibleExp<GeometryExp> | geometryKeyword\nconditionalOperator = compareOperatorPrimitive | equalityOperatorPrimitive\ncompareOperatorPrimitive = \"<=\" | \">=\" | \"<\" | \">\"\nequalityOperatorPrimitive = \"==\" | \"!=\" | logicalOperator\nlogicalOperator = caseInsensitive<\"And\"> | caseInsensitive<\"Or\">\nnotOperator = \"!\"\n\n// Identifiers\nIdentifier =  basicIdentifier\nbasicIdentifier =  ~nonAllowedIdentifiers id\nid = firstIdCharacter idCharacter*\nfirstIdCharacter = simpleLatinLetter | \"$\" | \"_\"\nidCharacter = simpleLatinLetter | digit | \"_\" | \"?\" | \"'\"\nnonAllowedIdentifiers = keyword identifierEnd\nidentifierEnd = end | comma | leftParen | rightParen | operator | wktSpace\n\n/*************************************\n * OGC Well-Known Text (WKT) Grammar *\n *************************************/\n\n// Based on WKT Syntax: https://www.ogc.org/standard/sfa/\n\nGeometrySyntaxExp<GeometryTypeExp, geometryKeyword> = Arithmetic<GeometryArithmetic<GeometryTypeExp, geometryKeyword>>\nGeometryArithmetic<GeometryTypeExp, geometryKeyword> = GeometryPrimitive<GeometryTypeExp, geometryKeyword>\nGeometryPrimitive<GeometryTypeExp, geometryKeyword> = GeometryTaggedText<GeometryTypeExp, geometryKeyword>\nGeometryTaggedText<GeometryTypeExp, geometryKeyword> = geometryKeyword GeometryTypeExp\n\nGeometryCollectionExp = GeometrySyntaxExp<GeometryCollectionText, geometryCollectionKeyword>\nGeometryCollectionText = emptySet --empty\n    | LeftParen ListOf<GeometryExp, Comma> RightParen --present\ngeometryCollectionKeyword = caseInsensitive<\"GEOMETRYCOLLECTION\">\n\nGeometryExp =  \n    | PointExp\n    | MultiPointExp\n    | LineStringExp\n    | MultiLineStringExp\n    | PolygonExp\n    | MultiPolygonExp\n    | GeometryCollectionExp \n\n// TODO -- support POLYHEDRALSURFACE geometry\n//PolyhedralSurfaceExp = GeometrySyntaxExp<PolyhedralSurfaceText, polyhedralSurfaceKeyword>\n//PolyhedralSurfaceText = emptySet --empty\n//    | LeftParen NonemptyListOf<PolygonText, Comma> RightParen --present\n//polyhedralSurfaceKeyword = caseInsensitive<\"PolyhedralSurface\">\n\nMultiPolygonExp = GeometrySyntaxExp<MultiPolygonText, multiPolygonKeyword>\nMultiPolygonText = emptySet --empty\n    | LeftParen NonemptyListOf<PolygonText, Comma> RightParen --present\nmultiPolygonKeyword = caseInsensitive<\"MULTIPOLYGON\">\n\nPolygonExp = GeometrySyntaxExp<PolygonText, polygonKeyword>\nPolygonText = emptySet --empty\n    | LeftParen NonemptyListOf<LineStringText, Comma> RightParen --present\npolygonKeyword = caseInsensitive<\"POLYGON\">\n\nMultiLineStringExp = GeometrySyntaxExp<MultiLineStringText, multiLineStringKeyword>\nMultiLineStringText = emptySet --empty\n    | LeftParen NonemptyListOf<LineStringText, Comma> RightParen --present\nmultiLineStringKeyword = caseInsensitive<\"MULTILINESTRING\">\n\nLineStringExp = GeometrySyntaxExp<LineStringText, lineStringKeyword>\nLineStringText = emptySet --empty\n    | LeftParen PointList RightParen --present\nlineStringKeyword = caseInsensitive<\"LINESTRING\">\n\nMultiPointExp = GeometrySyntaxExp<MultiPointText, multiPointKeyword>\nMultiPointText = emptySet --empty\n    | LeftParen PointList RightParen --present\nmultiPointKeyword = caseInsensitive<\"MULTIPOINT\">\n\n// Base point type helpers\nPointList = NonemptyListOf<PointListArgument, Comma>\nPointListArgument = Point | ComputedValue<PointExp>\nPointExp = Arithmetic<PointArithmetic>\nPointArithmetic = PointPrimitive | ComputedExp\nPointPrimitive = PointTaggedText | PointText | Point\nPointTaggedText = pointKeyword PointText\nPointText = emptySet --empty\n    | LeftParen Point RightParen --present\nPoint = X Y\npointKeyword = caseInsensitive<\"POINT\">\n\n// Keywords\nkeyword = geometryKeyword\n    | functionKeyword\n    | generateKeyword\n    | booleanValue\n    | ifKeyword\n    | thenKeyword\n    | elseKeyword\n    | importKeyword\n    | exportKeyword\n    | letKeyword\ngeometryKeyword = pointKeyword\n    | multiPointKeyword\n    | lineStringKeyword\n    | multiLineStringKeyword\n    | polygonKeyword\n    | multiPolygonKeyword\n    | geometryCollectionKeyword\n\n// Coordinate values\nX = PointNumberValue \nY = PointNumberValue \nZ = PointNumberValue\nM = PointNumberValue\n\n// Numeric value\nPointNumberValue = signedNumericLiteral\n    | OptionallyParen<ComputedValue<NumberExp>> \n    | ComputedPrimitive\nNumberExp = Arithmetic<ComputedValue<signedNumericLiteral>>\n\n// Boolean value\nBooleanValue = ComputedValue<booleanValue>\nbooleanValue = caseInsensitive<\"true\"> | caseInsensitive<\"false\">\n\n// String literals\nstringLiteralExp =  stringLiteral<\"'\"> | stringLiteral<\"\\\"\"> \nstringLiteral<quoteChar> = quoteChar stringLiteralValue<quoteChar>* quoteChar\nstringLiteralValue<quoteChar> = ~quoteChar any    \n\n// OGC specification primitives\nquotedName = doubleQuote name doubleQuote\nname = letters\nletters = wktLetter+\nwktLetter = simpleLatinLetter | digit | special\nsimpleLatinLetter = simpleLatinUpperCaseLetter\n    | simpleLatinLowerCaseLetter\nsignedNumericLiteral = sign unsignedNumericLiteral --signPresent\n    | unsignedNumericLiteral --signMissing\nunsignedNumericLiteral = exactNumericLiteral | approximateNumericLiteral\napproximateNumericLiteral = mantissa \"E\" exponent   // TODO -- handle this notation at higher level expressions\nmantissa = exactNumericLiteral\nexponent = signedInteger\nexactNumericLiteral = unsignedInteger decimalPoint unsignedInteger --decimalWithWholeNumber\n    | decimalPoint unsignedInteger --decimalWithoutWholeNumber \n    | unsignedInteger --wholeNumber\nsignedInteger = sign unsignedInteger --signedInteger\n    | unsignedInteger --unsignedInteger\nunsignedInteger = digit+\nleftDelimiter = leftParen | leftBracket\nrightDelimiter = rightParen | rightBracket\nspecial = rightParen | leftParen | minusSign | underscore | period | quote | wktSpace\nsign = plusSign | minusSign\ndecimalPoint = period // comma // TODO -- comma causes parsing issues\nemptySet = \"EMPTY\"\nminusSign = \"-\"\nLeftParen = leftParen\nleftParen = \"(\"\nRightParen = rightParen\nrightParen = \")\"\nleftBracket = \"[\"\nrightBracket = \"]\"\nLeftBrace = leftBrace\nleftBrace = \"{\"\nRightBrace = rightBrace\nrightBrace = \"}\"\nperiod = \".\"\nplusSign = \"+\"\ndoubleQuote = \"\\\"\"\nquote = \"'\"\nComma = comma\ncomma = \",\"\nunderscore = \"_\" \n// digit = 0|1|2|3|4|5|6|7|8|9 // provided by default\nsimpleLatinLowerCaseLetter = lower // a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z\nsimpleLatinUpperCaseLetter = upper // A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z\nwktSpace = \" \" // unicode \"U+0020\" (space) // provided by default\n\n}\n`","export const STD_LIB =  String.raw`\n() => (\n    export Rotate = ((deg, origin) => (val => _Rotate(deg, origin, val)));\n    export Round = ((precision) => (val => _Round(precision, val)));\n    true\n)\n`"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["turf","turf","GeometryType","isType","isType","point","feature","geometry","turf","BuiltInFunctions","point","Interpreter","grammar","e","result","point","a","b","OutputFormat"]}