@mojir/lits 2.2.2 → 2.2.4
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 +0 -8
- package/dist/cli/cli.js +1145 -1105
- package/dist/cli/src/AutoCompleter/AutoCompleter.d.ts +2 -1
- package/dist/cli/src/builtin/bindingNode.d.ts +3 -3
- package/dist/cli/src/builtin/index.d.ts +0 -1
- package/dist/cli/src/builtin/interface.d.ts +3 -4
- package/dist/cli/src/builtin/specialExpressionTypes.d.ts +0 -1
- package/dist/cli/src/builtin/specialExpressions/and.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/array.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/block.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/cond.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/if.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/loop.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/loops.d.ts +4 -4
- package/dist/cli/src/builtin/specialExpressions/object.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/or.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/qq.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/recur.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/switch.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/throw.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/try.d.ts +2 -2
- package/dist/cli/src/builtin/specialExpressions/unless.d.ts +2 -2
- package/dist/cli/src/builtin/utils.d.ts +2 -2
- package/dist/cli/src/evaluator/index.d.ts +2 -2
- package/dist/cli/src/evaluator/interface.d.ts +4 -3
- package/dist/cli/src/getUndefinedSymbols/index.d.ts +2 -2
- package/dist/cli/src/parser/ParserContext.d.ts +20 -0
- package/dist/cli/src/parser/helpers.d.ts +19 -0
- package/dist/cli/src/parser/index.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/getPrecedence.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseArray.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseBindingTarget.d.ts +6 -0
- package/dist/cli/src/parser/subParsers/parseCond.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseDo.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseForOrDoseq.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseFunction.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseFunctionCall.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseIfOrUnless.d.ts +5 -0
- package/dist/cli/src/parser/subParsers/parseImplicitBlock.d.ts +5 -0
- package/dist/cli/src/parser/subParsers/parseLet.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseLoop.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseNumber.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseObject.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseOperand.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseRegexpShorthand.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseReservedSymbol.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseString.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseSwitch.d.ts +4 -0
- package/dist/cli/src/parser/subParsers/parseSymbol.d.ts +3 -0
- package/dist/cli/src/parser/subParsers/parseTry.d.ts +4 -0
- package/dist/cli/src/parser/types.d.ts +19 -26
- package/dist/cli/src/testFramework/index.d.ts +3 -2
- package/dist/cli/src/tokenizer/token.d.ts +0 -2
- package/dist/cli/src/tokenizer/tokenizers.d.ts +2 -2
- package/dist/cli/src/typeGuards/astNode.d.ts +18 -19
- package/dist/cli/src/typeGuards/index.d.ts +0 -1
- package/dist/cli/src/typeGuards/lits.d.ts +0 -1
- package/dist/full.esm.js +1 -1
- package/dist/full.esm.js.map +1 -1
- package/dist/full.js +1 -1
- package/dist/full.js.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lits.iife.js +1 -1
- package/dist/lits.iife.js.map +1 -1
- package/dist/modules/assert.esm.js.map +1 -1
- package/dist/modules/assert.js.map +1 -1
- package/dist/modules/bitwise.esm.js.map +1 -1
- package/dist/modules/bitwise.js.map +1 -1
- package/dist/modules/collection.esm.js.map +1 -1
- package/dist/modules/collection.js.map +1 -1
- package/dist/modules/functional.esm.js.map +1 -1
- package/dist/modules/functional.js.map +1 -1
- package/dist/modules/grid.esm.js.map +1 -1
- package/dist/modules/grid.js.map +1 -1
- package/dist/modules/linear-algebra.esm.js.map +1 -1
- package/dist/modules/linear-algebra.js.map +1 -1
- package/dist/modules/matrix.esm.js.map +1 -1
- package/dist/modules/matrix.js.map +1 -1
- package/dist/modules/number-theory.esm.js.map +1 -1
- package/dist/modules/number-theory.js.map +1 -1
- package/dist/modules/random.esm.js.map +1 -1
- package/dist/modules/random.js.map +1 -1
- package/dist/modules/sequence.esm.js.map +1 -1
- package/dist/modules/sequence.js.map +1 -1
- package/dist/modules/src/AutoCompleter/AutoCompleter.d.ts +2 -1
- package/dist/modules/src/builtin/bindingNode.d.ts +3 -3
- package/dist/modules/src/builtin/index.d.ts +0 -1
- package/dist/modules/src/builtin/interface.d.ts +3 -4
- package/dist/modules/src/builtin/specialExpressionTypes.d.ts +0 -1
- package/dist/modules/src/builtin/specialExpressions/and.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/array.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/block.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/cond.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/if.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/loop.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/loops.d.ts +4 -4
- package/dist/modules/src/builtin/specialExpressions/object.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/or.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/qq.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/recur.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/switch.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/throw.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/try.d.ts +2 -2
- package/dist/modules/src/builtin/specialExpressions/unless.d.ts +2 -2
- package/dist/modules/src/builtin/utils.d.ts +2 -2
- package/dist/modules/src/evaluator/index.d.ts +2 -2
- package/dist/modules/src/evaluator/interface.d.ts +4 -3
- package/dist/modules/src/getUndefinedSymbols/index.d.ts +2 -2
- package/dist/modules/src/parser/ParserContext.d.ts +20 -0
- package/dist/modules/src/parser/helpers.d.ts +19 -0
- package/dist/modules/src/parser/index.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/getPrecedence.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseArray.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseBindingTarget.d.ts +6 -0
- package/dist/modules/src/parser/subParsers/parseCond.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseDo.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseForOrDoseq.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseFunction.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseFunctionCall.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseIfOrUnless.d.ts +5 -0
- package/dist/modules/src/parser/subParsers/parseImplicitBlock.d.ts +5 -0
- package/dist/modules/src/parser/subParsers/parseLet.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseLoop.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseNumber.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseObject.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseOperand.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseRegexpShorthand.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseReservedSymbol.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseString.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseSwitch.d.ts +4 -0
- package/dist/modules/src/parser/subParsers/parseSymbol.d.ts +3 -0
- package/dist/modules/src/parser/subParsers/parseTry.d.ts +4 -0
- package/dist/modules/src/parser/types.d.ts +19 -26
- package/dist/modules/src/testFramework/index.d.ts +3 -2
- package/dist/modules/src/tokenizer/token.d.ts +0 -2
- package/dist/modules/src/tokenizer/tokenizers.d.ts +2 -2
- package/dist/modules/src/typeGuards/astNode.d.ts +18 -19
- package/dist/modules/src/typeGuards/index.d.ts +0 -1
- package/dist/modules/src/typeGuards/lits.d.ts +0 -1
- package/dist/modules/string.esm.js.map +1 -1
- package/dist/modules/string.js.map +1 -1
- package/dist/modules/vector.esm.js.map +1 -1
- package/dist/modules/vector.js.map +1 -1
- package/dist/src/AutoCompleter/AutoCompleter.d.ts +2 -1
- package/dist/src/builtin/bindingNode.d.ts +3 -3
- package/dist/src/builtin/index.d.ts +0 -1
- package/dist/src/builtin/interface.d.ts +3 -4
- package/dist/src/builtin/specialExpressionTypes.d.ts +0 -1
- package/dist/src/builtin/specialExpressions/and.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/array.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/block.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/cond.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/if.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/loop.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/loops.d.ts +4 -4
- package/dist/src/builtin/specialExpressions/object.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/or.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/qq.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/recur.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/switch.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/throw.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/try.d.ts +2 -2
- package/dist/src/builtin/specialExpressions/unless.d.ts +2 -2
- package/dist/src/builtin/utils.d.ts +2 -2
- package/dist/src/evaluator/index.d.ts +2 -2
- package/dist/src/evaluator/interface.d.ts +4 -3
- package/dist/src/getUndefinedSymbols/index.d.ts +2 -2
- package/dist/src/parser/ParserContext.d.ts +20 -0
- package/dist/src/parser/helpers.d.ts +19 -0
- package/dist/src/parser/index.d.ts +3 -0
- package/dist/src/parser/subParsers/getPrecedence.d.ts +3 -0
- package/dist/src/parser/subParsers/parseArray.d.ts +3 -0
- package/dist/src/parser/subParsers/parseBindingTarget.d.ts +6 -0
- package/dist/src/parser/subParsers/parseCond.d.ts +4 -0
- package/dist/src/parser/subParsers/parseDo.d.ts +3 -0
- package/dist/src/parser/subParsers/parseForOrDoseq.d.ts +4 -0
- package/dist/src/parser/subParsers/parseFunction.d.ts +4 -0
- package/dist/src/parser/subParsers/parseFunctionCall.d.ts +3 -0
- package/dist/src/parser/subParsers/parseIfOrUnless.d.ts +5 -0
- package/dist/src/parser/subParsers/parseImplicitBlock.d.ts +5 -0
- package/dist/src/parser/subParsers/parseLet.d.ts +4 -0
- package/dist/src/parser/subParsers/parseLoop.d.ts +4 -0
- package/dist/src/parser/subParsers/parseNumber.d.ts +3 -0
- package/dist/src/parser/subParsers/parseObject.d.ts +3 -0
- package/dist/src/parser/subParsers/parseOperand.d.ts +3 -0
- package/dist/src/parser/subParsers/parseRegexpShorthand.d.ts +3 -0
- package/dist/src/parser/subParsers/parseReservedSymbol.d.ts +3 -0
- package/dist/src/parser/subParsers/parseString.d.ts +4 -0
- package/dist/src/parser/subParsers/parseSwitch.d.ts +4 -0
- package/dist/src/parser/subParsers/parseSymbol.d.ts +3 -0
- package/dist/src/parser/subParsers/parseTry.d.ts +4 -0
- package/dist/src/parser/types.d.ts +19 -26
- package/dist/src/testFramework/index.d.ts +3 -2
- package/dist/src/tokenizer/token.d.ts +0 -2
- package/dist/src/tokenizer/tokenizers.d.ts +2 -2
- package/dist/src/typeGuards/astNode.d.ts +18 -19
- package/dist/src/typeGuards/index.d.ts +0 -1
- package/dist/src/typeGuards/lits.d.ts +0 -1
- package/dist/testFramework.esm.js +1 -1
- package/dist/testFramework.esm.js.map +1 -1
- package/dist/testFramework.js +1 -1
- package/dist/testFramework.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/src/parser/Parser.d.ts +0 -58
- package/dist/modules/src/parser/Parser.d.ts +0 -58
- package/dist/src/parser/Parser.d.ts +0 -58
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.esm.js","sources":["../../src/utils/debug/getCodeMarker.ts","../../src/errors.ts","../../src/constants/constants.ts","../../src/utils/debug/debugTools.ts","../../src/utils/symbols.ts","../../src/utils/debug/getSourceCodeInfo.ts","../../src/typeGuards/index.ts","../../src/utils/getAssertionError.ts","../../src/typeGuards/number.ts","../../src/typeGuards/string.ts","../../src/utils/arity.ts","../../src/builtin/modules/string/index.ts","../../src/utils/index.ts","../../src/typeGuards/array.ts"],"sourcesContent":["import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getCodeMarker(sourceCodeInfo: SourceCodeInfo): string {\n if (!sourceCodeInfo.position || !sourceCodeInfo.code)\n return ''\n\n const leftPadding = sourceCodeInfo.position.column - 1\n const rightPadding = sourceCodeInfo.code.length - leftPadding - 1\n return `${' '.repeat(Math.max(leftPadding, 0))}^${' '.repeat(Math.max(rightPadding, 0))}`\n}\n","import { getCodeMarker } from '../src/utils/debug/getCodeMarker'\nimport type { Arr } from './interface'\nimport type { SourceCodeInfo } from './tokenizer/token'\n\nfunction getLitsErrorMessage(message: string, sourceCodeInfo?: SourceCodeInfo) {\n if (!sourceCodeInfo) {\n return message\n }\n const location = `${sourceCodeInfo.position.line}:${sourceCodeInfo.position.column}`\n const filePathLine = sourceCodeInfo.filePath\n ? `\\n${sourceCodeInfo.filePath}:${location}`\n : `\\nLocation ${location}`\n const codeLine = `\\n${sourceCodeInfo.code}`\n const codeMarker = `\\n${getCodeMarker(sourceCodeInfo)}`\n return `${message}${filePathLine}${codeLine}${codeMarker}`\n}\n\nexport class RecurSignal extends Error {\n public params: Arr\n constructor(params: Arr) {\n super(`recur, params: ${params}`)\n Object.setPrototypeOf(this, RecurSignal.prototype)\n this.name = 'RecurSignal'\n this.params = params\n }\n}\n\nexport class LitsError extends Error {\n public readonly sourceCodeInfo?: SourceCodeInfo\n public readonly shortMessage: string\n constructor(err: unknown, sourceCodeInfo: SourceCodeInfo | undefined) {\n const message = err instanceof Error\n ? err.message\n : `${err}`\n\n super(getLitsErrorMessage(message, sourceCodeInfo))\n this.shortMessage = message\n this.sourceCodeInfo = sourceCodeInfo\n Object.setPrototypeOf(this, LitsError.prototype)\n this.name = 'LitsError'\n }\n\n public getCodeMarker(): string | undefined {\n return this.sourceCodeInfo && getCodeMarker(this.sourceCodeInfo)\n }\n}\n\nexport class UserDefinedError extends LitsError {\n public userMessage: string\n constructor(message: string, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n this.userMessage = message\n Object.setPrototypeOf(this, UserDefinedError.prototype)\n this.name = 'UserDefinedError'\n }\n}\n\nexport class AssertionError extends LitsError {\n constructor(message: string | Error, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n Object.setPrototypeOf(this, AssertionError.prototype)\n this.name = 'AssertionError'\n }\n}\n\nexport class UndefinedSymbolError extends LitsError {\n public symbol: string\n constructor(symbolName: string, sourceCodeInfo?: SourceCodeInfo) {\n const message = `Undefined symbol '${symbolName}'.`\n super(message, sourceCodeInfo)\n this.symbol = symbolName\n Object.setPrototypeOf(this, UndefinedSymbolError.prototype)\n this.name = 'UndefinedSymbolError'\n }\n}\n\nexport function isLitsError(error: unknown): error is LitsError {\n return error instanceof LitsError\n}\n","export const NodeTypes = {\n Number: 1,\n String: 2,\n NormalExpression: 3,\n SpecialExpression: 4,\n UserDefinedSymbol: 5,\n NormalBuiltinSymbol: 6,\n SpecialBuiltinSymbol: 7,\n ReservedSymbol: 8,\n Binding: 9,\n Spread: 10,\n} as const\n\nconst NodeTypesSet = new Set(Object.values(NodeTypes))\n\nexport type NodeType = typeof NodeTypes[keyof typeof NodeTypes]\n\nexport function getNodeTypeName(type: NodeType): keyof typeof NodeTypes {\n return Object.keys(NodeTypes).find(key => NodeTypes[key as keyof typeof NodeTypes] === type) as keyof typeof NodeTypes\n}\n\n// TODO, is this needed?\nexport function isNodeType(type: unknown): type is NodeType {\n return typeof type === 'number' && NodeTypesSet.has(type as NodeType)\n}\n\nconst functionTypes = [\n 'UserDefined',\n 'Partial',\n 'Comp',\n 'Constantly',\n 'Juxt',\n 'Complement',\n 'EveryPred',\n 'SomePred',\n 'Fnull',\n 'Builtin',\n 'SpecialBuiltin',\n 'NativeJsFunction',\n 'Module',\n] as const\n\nconst functionTypeSet = new Set(functionTypes)\n\nexport type FunctionType = typeof functionTypes[number]\n\nexport function isFunctionType(type: unknown): type is FunctionType {\n return typeof type === 'string' && functionTypeSet.has(type as FunctionType)\n}\n","import { getNodeTypeName, isFunctionType, isNodeType } from '../../constants/constants'\nimport type { LitsFunction, Node } from '../../parser/types'\nimport { FUNCTION_SYMBOL } from '../symbols'\n\nfunction isLitsFunction(func: unknown): func is LitsFunction {\n if (func === null || typeof func !== 'object')\n return false\n\n return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType)\n}\n\nfunction isNode(value: unknown): value is Node {\n if (!Array.isArray(value) || value.length < 2)\n return false\n return isNodeType(value[0])\n}\n\nexport function valueToString(value: unknown): string {\n if (isLitsFunction(value))\n // eslint-disable-next-line ts/no-unsafe-member-access\n return `<function ${(value as any).name || '\\u03BB'}>`\n\n if (isNode(value))\n return `${getNodeTypeName(value[0])}-node`\n\n if (value === null)\n return 'null'\n\n if (typeof value === 'object' && value instanceof RegExp)\n return `${value}`\n\n if (typeof value === 'object' && value instanceof Error)\n return value.toString()\n\n return JSON.stringify(value)\n}\n","export const FUNCTION_SYMBOL = '^^fn^^'\nexport const REGEXP_SYMBOL = '^^re^^'\n","import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getSourceCodeInfo(anyValue: any, sourceCodeInfo: SourceCodeInfo | undefined): SourceCodeInfo | undefined {\n // eslint-disable-next-line ts/no-unsafe-return, ts/no-unsafe-member-access\n return anyValue?.sourceCodeInfo ?? sourceCodeInfo\n}\n","import { LitsError } from '../errors'\nimport type { UnknownRecord } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\nexport function isNonUndefined<T>(value: T | undefined): value is T {\n return value !== undefined\n}\n\nexport function asNonUndefined<T>(value: T | undefined, sourceCodeInfo?: SourceCodeInfo): T {\n assertNonUndefined(value, sourceCodeInfo)\n return value\n}\n\nexport function assertNonUndefined<T>(value: T | undefined, sourceCodeInfo?: SourceCodeInfo): asserts value is T {\n if (!isNonUndefined(value))\n throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo))\n}\n\nexport function isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function assertUnknownRecord(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is UnknownRecord {\n if (!isUnknownRecord(value)) {\n throw new LitsError(\n `Expected ${'UnknownRecord'}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asUnknownRecord(value: unknown, sourceCodeInfo?: SourceCodeInfo): UnknownRecord {\n assertUnknownRecord(value, sourceCodeInfo)\n return value\n}\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from './debug/debugTools'\nimport { getSourceCodeInfo } from './debug/getSourceCodeInfo'\n\nexport function getAssertionError(typeName: string, value: unknown, sourceCodeInfo?: SourceCodeInfo): LitsError {\n return new LitsError(`Expected ${typeName}, got ${valueToString(value)}.`, getSourceCodeInfo(value, sourceCodeInfo))\n}\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\ntype SignOptions =\n | {\n positive?: true\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: true\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: true\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: true\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: true\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: true\n }\n\ntype GtOptions =\n | {\n gt?: number\n gte?: never\n }\n | {\n gt?: never\n gte?: number\n }\n\ntype LtOptions =\n | {\n lt?: number\n lte?: never\n }\n | {\n lt?: never\n lte?: number\n }\n\ntype NumberOptions = {\n integer?: true\n finite?: true\n} & SignOptions &\nGtOptions &\nLtOptions\n\nfunction getRangeString(options: NumberOptions): string {\n const hasUpperAndLowerBound\n = (typeof options.gt === 'number' || typeof options.gte === 'number')\n && (typeof options.lt === 'number' || typeof options.lte === 'number')\n if (hasUpperAndLowerBound) {\n return `${typeof options.gt === 'number' ? `${options.gt} < n ` : `${options.gte} <= n `}${\n typeof options.lt === 'number' ? `< ${options.lt}` : `<= ${options.lte}`\n }`\n }\n else if (typeof options.gt === 'number' || typeof options.gte === 'number') {\n return `${typeof options.gt === 'number' ? `n > ${options.gt}` : `n >= ${options.gte}`}`\n }\n else if (typeof options.lt === 'number' || typeof options.lte === 'number') {\n return `${typeof options.lt === 'number' ? `n < ${options.lt}` : `n <= ${options.lte}`}`\n }\n else { return '' }\n}\n\nfunction getSignString(options: NumberOptions): string {\n return options.positive\n ? 'positive'\n : options.negative\n ? 'negative'\n : options.nonNegative\n ? 'non negative'\n : options.nonPositive\n ? 'non positive'\n : options.nonZero\n ? 'non zero'\n : ''\n}\n\nfunction getNumberTypeName(options: NumberOptions): string {\n if (options.zero)\n return 'zero'\n\n const sign = getSignString(options)\n const numberType = options.integer ? 'integer' : 'number'\n const finite = options.finite ? 'finite' : ''\n const range = getRangeString(options)\n\n return [sign, finite, numberType, range].filter(x => !!x).join(' ')\n}\n\nexport function isNumber(value: unknown, options: NumberOptions = {}): value is number {\n if (typeof value !== 'number')\n return false\n\n if (Number.isNaN(value))\n return false\n\n if (options.integer && !Number.isInteger(value))\n return false\n\n if (options.finite && !Number.isFinite(value))\n return false\n\n if (options.zero && value !== 0)\n return false\n\n if (options.nonZero && value === 0)\n return false\n\n if (options.positive && value <= 0)\n return false\n\n if (options.negative && value >= 0)\n return false\n\n if (options.nonPositive && value > 0)\n return false\n\n if (options.nonNegative && value < 0)\n return false\n\n if (typeof options.gt === 'number' && value <= options.gt)\n return false\n\n if (typeof options.gte === 'number' && value < options.gte)\n return false\n\n if (typeof options.lt === 'number' && value >= options.lt)\n return false\n\n if (typeof options.lte === 'number' && value > options.lte)\n return false\n\n return true\n}\n\nexport function assertNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n options: NumberOptions = {},\n): asserts value is number {\n if (!isNumber(value, options)) {\n throw new LitsError(\n `Expected ${getNumberTypeName(options)}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asNumber(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: NumberOptions = {},\n): number {\n assertNumber(value, sourceCodeInfo, options)\n return value\n}\n","import type { SourceCodeInfo } from '../tokenizer/token'\nimport { getAssertionError } from '../utils/getAssertionError'\n\ntype StringAssertionOptions =\n | {\n nonEmpty?: true\n char?: never\n }\n | {\n nonEmpty?: never\n char?: true\n }\n\nexport function isString(value: unknown, options: StringAssertionOptions = {}): value is string {\n if (typeof value !== 'string')\n return false\n\n if (options.nonEmpty && value.length === 0)\n return false\n\n if (options.char && value.length !== 1)\n return false\n\n return true\n}\n\nexport function assertString(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: StringAssertionOptions = {},\n): asserts value is string {\n if (!isString(value, options)) {\n throw getAssertionError(\n `${options.nonEmpty ? 'non empty string' : options.char ? 'character' : 'string'}`,\n value,\n sourceCodeInfo,\n )\n }\n}\n\nexport function asString(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: StringAssertionOptions = {},\n): string {\n assertString(value, sourceCodeInfo, options)\n return value\n}\n\nexport function isStringOrNumber(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\nexport function asStringOrNumber(value: unknown, sourceCodeInfo?: SourceCodeInfo): string | number {\n assertStringOrNumber(value, sourceCodeInfo)\n return value\n}\nexport function assertStringOrNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n): asserts value is string | number {\n if (!isStringOrNumber(value))\n throw getAssertionError('string or number', value, sourceCodeInfo)\n}\n","import type { Arity } from '../builtin/interface'\nimport { LitsError } from '../errors'\nimport type { FunctionLike } from '../parser/types'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { isColl } from '../typeGuards/lits'\nimport { valueToString } from './debug/debugTools'\n\nexport function arityAccepts(arity: Arity, nbrOfParams: number): boolean {\n const { min, max } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n if (typeof max === 'number' && nbrOfParams > max) {\n return false\n }\n return true\n}\n\nexport function arityAcceptsMin(arity: Arity, nbrOfParams: number): boolean {\n const { min } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n return true\n}\n\nexport function getCommonArityFromFunctions(params: FunctionLike[]): Arity | null {\n return params.reduce((acc: Arity | null, param): Arity | null => {\n if (acc === null) {\n return null\n }\n const arity: Arity = (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n const { min: aMin, max: aMax } = arity\n const { min: bMin, max: bMax } = acc\n const min = typeof aMin === 'number' && typeof bMin === 'number'\n ? Math.max(aMin, bMin)\n : typeof aMin === 'number' ? aMin : typeof bMin === 'number' ? bMin : undefined\n const max = typeof aMax === 'number' && typeof bMax === 'number'\n ? Math.min(aMax, bMax)\n : typeof aMax === 'number' ? aMax : typeof bMax === 'number' ? bMax : undefined\n\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n return null\n }\n\n return { min, max }\n }, {})\n}\n\nexport function getArityFromFunction(param: FunctionLike): Arity {\n return (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n}\n\nexport function assertNumberOfParams(arity: Arity, length: number, sourceCodeInfo: SourceCodeInfo | undefined): void {\n const { min, max } = arity\n if (typeof min === 'number' && length < min) {\n throw new LitsError(\n `Wrong number of arguments, expected at least ${min}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n\n if (typeof max === 'number' && length > max) {\n throw new LitsError(\n `Wrong number of arguments, expected at most ${max}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n}\n\nexport function canBeOperator(count: Arity): boolean {\n if (typeof count.max === 'number' && count.max < 2) {\n return false\n }\n\n if (typeof count.min === 'number' && count.min > 2) {\n return false\n }\n\n return true\n}\n\nexport function toFixedArity(arity: number): Arity {\n return { min: arity, max: arity }\n}\n","import { LitsError } from '../../../errors'\nimport { asNonUndefined } from '../../../typeGuards'\nimport { assertArray } from '../../../typeGuards/array'\nimport { assertNumber } from '../../../typeGuards/number'\nimport { asStringOrNumber, assertString } from '../../../typeGuards/string'\nimport { toNonNegativeInteger } from '../../../utils'\nimport { toFixedArity } from '../../../utils/arity'\nimport type { BuiltinNormalExpressions } from '../../interface'\nimport type { LitsModule } from '../interface'\nimport type { SourceCodeInfo } from '../../../tokenizer/token'\n\nconst stringUtilsFunctions: BuiltinNormalExpressions = {\n 'string-repeat': {\n evaluate: ([str, count], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true })\n\n return str.repeat(count)\n },\n arity: toFixedArity(2),\n docs: {\n category: 'string',\n returns: { type: 'number' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n n: { type: 'integer' },\n },\n variants: [{ argumentNames: ['s', 'n'] }],\n description: 'Repeates $s $n times.',\n seeAlso: ['str', 'repeat'],\n examples: [\n 'let { string-repeat } = import(\"string\"); \"*\" string-repeat 10',\n 'let { string-repeat } = import(\"string\"); string-repeat(\"*\", 10)',\n 'let { string-repeat } = import(\"string\"); string-repeat(\"***\", 0)',\n ],\n },\n },\n\n 'from-char-code': {\n evaluate: ([num], sourceCodeInfo): string => {\n assertNumber(num, sourceCodeInfo, { finite: true })\n const int = toNonNegativeInteger(num)\n try {\n return String.fromCodePoint(int)\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { code: { type: 'number' } },\n variants: [{ argumentNames: ['code'] }],\n description: 'Return character for code point $code.',\n seeAlso: ['string.to-char-code'],\n examples: [\n 'let { from-char-code } = import(\"string\"); from-char-code(65)',\n 'let { from-char-code } = import(\"string\"); from-char-code(0)',\n ],\n },\n },\n\n 'to-char-code': {\n evaluate: ([str], sourceCodeInfo): number => {\n assertString(str, sourceCodeInfo, { nonEmpty: true })\n return asNonUndefined(str.codePointAt(0), sourceCodeInfo)\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'number' },\n args: { c: { type: 'string' } },\n variants: [{ argumentNames: ['c'] }],\n description: 'Return code point for first character in $c.',\n seeAlso: ['string.from-char-code'],\n examples: [\n 'let { to-char-code } = import(\"string\"); to-char-code(\"A\")',\n 'let { to-char-code } = import(\"string\"); to-char-code(\"Albert\")',\n ],\n },\n },\n\n 'trim-left': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.replace(/^\\s+/, '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a new string with leading whitespaces removed.',\n seeAlso: ['trim', 'string.trim-right'],\n examples: [\n 'let { trim-left } = import(\"string\"); trim-left(\" Albert \")',\n 'let { trim-left } = import(\"string\"); trim-left(\" \")',\n 'let { trim-left } = import(\"string\"); trim-left(\"\")',\n ],\n },\n },\n\n 'trim-right': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.replace(/\\s+$/, '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a new string with trailing whitespaces removed.',\n seeAlso: ['trim', 'string.trim-left'],\n examples: [\n 'let { trim-right } = import(\"string\"); trim-right(\" Albert \")',\n 'let { trim-right } = import(\"string\"); trim-right(\" \")',\n 'let { trim-right } = import(\"string\"); trim-right(\"\")',\n ],\n },\n },\n\n 'split-lines': {\n evaluate: ([str], sourceCodeInfo): string[] => {\n assertString(str, sourceCodeInfo)\n return str.split((/\\r\\n|\\n|\\r/)).filter(line => line !== '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Divides $s into an array of substrings, each representing a line.',\n seeAlso: ['split'],\n examples: [\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\nMojir\\n\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\n\\nMojir\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\nMojir\\n\\n\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"\")',\n ],\n },\n },\n\n 'pad-left': {\n evaluate: ([str, length, padString], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(length, sourceCodeInfo, { integer: true })\n\n if (padString !== undefined)\n assertString(padString, sourceCodeInfo)\n\n return str.padStart(length, padString)\n },\n arity: { min: 2, max: 3 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n length: { type: 'integer' },\n padString: { type: 'string' },\n },\n variants: [\n { argumentNames: ['s', 'length'] },\n { argumentNames: ['s', 'length', 'padString'] },\n ],\n description: 'Pads from the start of $s with `padString` (multiple times, if needed) until the resulting string reaches the given $length.',\n seeAlso: ['string.pad-right'],\n examples: [\n 'let { pad-left } = import(\"string\"); \"Albert\" pad-left 20',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 20)',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 20, \"-*-\")',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 5)',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", -1)',\n ],\n },\n },\n\n 'pad-right': {\n evaluate: ([str, length, padString], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(length, sourceCodeInfo, { integer: true })\n\n if (padString !== undefined)\n assertString(padString, sourceCodeInfo)\n\n return str.padEnd(length, padString)\n },\n arity: { min: 2, max: 3 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n length: { type: 'integer' },\n padString: { type: 'string' },\n },\n variants: [\n { argumentNames: ['s', 'length'] },\n { argumentNames: ['s', 'length', 'padString'] },\n ],\n description: 'Pads from the start of $s with `padString` (multiple times, if needed) until the resulting string reaches the given `length`.',\n seeAlso: ['string.pad-left'],\n examples: [\n 'let { pad-right } = import(\"string\"); \"Albert\" pad-right 20',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 20)',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 20, \"-*-\")',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 5)',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", -1)',\n ],\n },\n },\n\n 'template': {\n evaluate: ([templateString, ...placeholders], sourceCodeInfo): string => {\n assertString(templateString, sourceCodeInfo)\n assertArray(placeholders, sourceCodeInfo)\n const templateStrings = templateString.split('||||')\n if (templateStrings.length <= 1) {\n return applyPlaceholders(templateStrings[0] as string, placeholders, sourceCodeInfo)\n }\n else {\n // Pluralisation\n const count = placeholders[0]\n assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true })\n const stringPlaceholders = [`${count}`, ...placeholders.slice(1)] as string[]\n if (templateStrings.length === 2) {\n // Exactly two valiants.\n // First variant (singular) for count = 1, Second variant (plural) for count = 0 or count > 1\n\n const placehoder = templateStrings[count === 1 ? 0 : 1] as string\n return applyPlaceholders(placehoder, stringPlaceholders, sourceCodeInfo)\n }\n else {\n // More than two variant:\n // Use count as index\n // If count >= number of variants, use last variant\n\n const placehoder = templateStrings[Math.min(count, templateStrings.length - 1)] as string\n return applyPlaceholders(placehoder, stringPlaceholders, sourceCodeInfo)\n }\n }\n },\n arity: { min: 1, max: 10 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n s: { type: 'string' },\n params: { type: 'any', rest: true },\n },\n variants: [{ argumentNames: ['s', 'params'] }],\n description: 'Applies placeholders to a string. Support for basic pluralization - see examples. If pluralization is used, first placeholder must be a number.',\n seeAlso: ['str'],\n examples: [\n 'let { template } = import(\"string\"); template(\"Hi, $1 and $2\", \"Carl\", \"Larry\")',\n 'let { template } = import(\"string\"); template(\"Hi $1, $2, $3, $4, $5, $6, $7, $8 and $9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\")',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 2)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 10)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 2)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 3)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 4)',\n ],\n hideOperatorForm: true,\n },\n },\n\n 'encode-base64': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n return btoa(\n encodeURIComponent(value).replace(/%([0-9A-F]{2})/g, (_match, p1) => {\n // eslint-disable-next-line ts/no-unsafe-argument\n return String.fromCharCode(Number.parseInt(p1, 16))\n }),\n )\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a Base64 encoded string from $s.',\n seeAlso: ['string.decode-base64'],\n examples: [\n 'let { encode-base64 } = import(\"string\"); encode-base64(\"Albert\")',\n ],\n },\n },\n\n 'decode-base64': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n try {\n return decodeURIComponent(\n Array.prototype.map\n .call(atob(value), (c) => {\n // eslint-disable-next-line ts/no-unsafe-call, ts/no-unsafe-member-access\n return `%${(`00${c.charCodeAt(0).toString(16)}`).slice(-2)}`\n })\n .join(''),\n )\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { base64string: { type: 'string' } },\n variants: [{ argumentNames: ['base64string'] }],\n description: 'Returns a Base64 decoded string from $base64string.',\n seeAlso: ['string.encode-base64'],\n examples: [\n 'let { decode-base64 } = import(\"string\"); decode-base64(\"QWxiZXJ0IPCfkLs=\")',\n ],\n },\n },\n\n 'encode-uri-component': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n return encodeURIComponent(value)\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns an escaped `URI` string.',\n seeAlso: ['string.decode-uri-component'],\n examples: [\n 'let { encode-uri-component } = import(\"string\"); encode-uri-component(\"Hi everyone!?\")',\n ],\n },\n },\n\n 'decode-uri-component': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n try {\n return decodeURIComponent(value)\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns an un-escaped `URI` string.',\n seeAlso: ['string.encode-uri-component'],\n examples: [\n 'let { decode-uri-component } = import(\"string\"); decode-uri-component(\"Hi%20everyone!%3F%20%F0%9F%91%8D\")',\n ],\n },\n },\n\n 'capitalize': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns $s with the first character converted to uppercase and the rest to lowercase.',\n seeAlso: ['lower-case', 'upper-case'],\n examples: [\n 'let { capitalize } = import(\"string\"); capitalize(\"albert\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"ALBERT\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"aLBERT\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"\")',\n ],\n },\n },\n}\n\nconst doubleDollarRegexp = /\\$\\$/g\nfunction applyPlaceholders(templateString: string, placeholders: unknown[], sourceCodeInfo?: SourceCodeInfo): string {\n for (let i = 0; i < 9; i += 1) {\n // Matches $1, $2, ..., $9\n // Does not match $$1\n // But does match $$$1, (since the two first '$' will later be raplaced with a single '$'\n const re = new RegExp(`(\\\\$\\\\$|[^$]|^)\\\\$${i + 1}`, 'g')\n if (re.test(templateString)) {\n const placeHolder = asStringOrNumber(placeholders[i], sourceCodeInfo)\n templateString = templateString.replace(re, `$1${placeHolder}`)\n }\n }\n templateString = templateString.replace(doubleDollarRegexp, '$')\n return templateString\n}\n\nexport const stringUtilsModule: LitsModule = {\n name: 'string',\n functions: stringUtilsFunctions,\n}\n","import type { Any, Coll, Obj } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { asAny, isColl, isObj, isRegularExpression } from '../typeGuards/lits'\nimport { isNumber } from '../typeGuards/number'\nimport { asString, assertStringOrNumber } from '../typeGuards/string'\nimport { isUnknownRecord } from '../typeGuards'\nimport { LitsError } from '../errors'\n\nexport function collHasKey(coll: unknown, key: string | number): boolean {\n if (!isColl(coll))\n return false\n\n if (typeof coll === 'string' || Array.isArray(coll)) {\n if (!isNumber(key, { integer: true }))\n return false\n\n return key >= 0 && key < coll.length\n }\n return !!Object.getOwnPropertyDescriptor(coll, key)\n}\n\nexport function compare<T extends string | number>(a: T, b: T, sourceCodeInfo: SourceCodeInfo | undefined): number {\n assertStringOrNumber(a, sourceCodeInfo)\n assertStringOrNumber(b, sourceCodeInfo)\n\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : a > b ? 1 : 0\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.sign((a) - (b))\n }\n throw new LitsError(`Cannot compare values of different types: ${typeof a} and ${typeof b}`, sourceCodeInfo)\n}\n\nexport function deepEqual(a: unknown, b: unknown, sourceCodeInfo?: SourceCodeInfo): boolean {\n if (a === b)\n return true\n\n if (typeof a === 'number' && typeof b === 'number')\n return approxEqual(a, b)\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false\n\n for (let i = 0; i < a.length; i += 1) {\n if (!deepEqual(asAny(a[i], sourceCodeInfo), asAny(b[i], sourceCodeInfo), sourceCodeInfo))\n return false\n }\n return true\n }\n if (isRegularExpression(a) && isRegularExpression(b))\n return a.s === b.s && a.f === b.f\n\n if (isUnknownRecord(a) && isUnknownRecord(b)) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length)\n return false\n\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = asString(aKeys[i], sourceCodeInfo)\n if (!deepEqual(a[key], b[key], sourceCodeInfo))\n return false\n }\n return true\n }\n return false\n}\n\nexport function toNonNegativeInteger(num: number): number {\n return Math.max(0, Math.ceil(num))\n}\n\nexport function toAny(value: unknown): Any {\n return (value ?? null) as Any\n}\n\nfunction clone<T>(value: T): T {\n if (isObj(value)) {\n return Object.entries(value).reduce((result: Obj, entry) => {\n const [key, val] = entry\n result[key] = clone(val)\n return result\n }, {}) as T\n }\n if (Array.isArray(value))\n // eslint-disable-next-line ts/no-unsafe-return\n return value.map(item => clone(item)) as unknown as T\n\n return value\n}\n\nexport function cloneColl<T extends Coll>(value: T): T {\n return clone(value)\n}\n\nexport function joinSets<T>(...results: Set<T>[]): Set<T> {\n const result = new Set<T>()\n for (const symbols of results)\n symbols.forEach(symbol => result.add(symbol))\n\n return result\n}\n\nexport function addToSet<T>(target: Set<T>, source: Set<T>): void {\n source.forEach(symbol => target.add(symbol))\n}\n\nexport const EPSILON = 1e-10\n\nexport function approxEqual(a: number, b: number, epsilon: number = EPSILON): boolean {\n if (a === b) {\n return true\n }\n\n const diff = Math.abs(a - b)\n\n if (a === 0 || b === 0 || diff < epsilon) {\n // Use absolute error for values near zero\n return diff < epsilon\n }\n const absA = Math.abs(a)\n const absB = Math.abs(b)\n\n // Use relative error for larger values\n return diff / (absA + absB) < epsilon\n}\n\nexport function approxZero(value: number): boolean {\n return Math.abs(value) < EPSILON\n}\n\nexport function smartTrim(str: string, minIndent = 0): string {\n const lines = str.split('\\n')\n while (lines[0]?.match(/^\\s*$/)) {\n lines.shift() // Remove leading empty lines\n }\n while (lines[lines.length - 1]?.match(/^\\s*$/)) {\n lines.pop() // Remove trailing empty lines\n }\n const indent = lines.reduce((acc, line) => {\n if (line.match(/^\\s*$/))\n return acc // Skip empty lines\n const lineIndent = line.match(/^\\s*/)![0].length\n return Math.min(acc, lineIndent)\n }, Infinity)\n return lines.map(line => ' '.repeat(minIndent) + line.slice(indent)).join('\\n').trimEnd()\n}\n","import type { SourceCodeInfo } from '../tokenizer/token'\nimport { getAssertionError } from '../utils/getAssertionError'\n\n// isArray not needed, use Array.isArary\nexport function asArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): unknown[] {\n assertArray(value, sourceCodeInfo)\n return value\n}\nexport function assertArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is unknown[] {\n if (!Array.isArray(value))\n throw getAssertionError('array', value, sourceCodeInfo)\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(v => typeof v === 'string')\n}\nexport function asStringArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): string[] {\n assertStringArray(value, sourceCodeInfo)\n return value\n}\nexport function assertStringArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is string[] {\n if (!isStringArray(value))\n throw getAssertionError('array of strings', value, sourceCodeInfo)\n}\n\nexport function isCharArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(v => typeof v === 'string' && v.length === 1)\n}\nexport function asCharArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): string[] {\n assertCharArray(value, sourceCodeInfo)\n return value\n}\nexport function assertCharArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is string[] {\n if (!isCharArray(value))\n throw getAssertionError('array of strings', value, sourceCodeInfo)\n}\n"],"names":["getCodeMarker","sourceCodeInfo","position","code","leftPadding","column","rightPadding","length","repeat","Math","max","LitsError","Error","shortMessage","constructor","err","message","super","location","line","filePath","getLitsErrorMessage","this","Object","setPrototypeOf","prototype","name","NodeTypes","Number","String","NormalExpression","SpecialExpression","UserDefinedSymbol","NormalBuiltinSymbol","SpecialBuiltinSymbol","ReservedSymbol","Binding","Spread","NodeTypesSet","Set","values","functionTypeSet","isLitsFunction","func","type","functionType","has","isNode","value","Array","isArray","valueToString","keys","find","key","RegExp","toString","JSON","stringify","getSourceCodeInfo","anyValue","asNonUndefined","undefined","isNonUndefined","assertNonUndefined","getAssertionError","typeName","assertNumber","options","isNaN","integer","isInteger","finite","isFinite","zero","nonZero","positive","negative","nonPositive","nonNegative","gt","gte","lt","lte","isNumber","sign","getSignString","numberType","range","getRangeString","filter","x","join","getNumberTypeName","assertString","nonEmpty","char","isString","asStringOrNumber","isStringOrNumber","assertStringOrNumber","toFixedArity","arity","min","stringUtilsFunctions","evaluate","str","count","docs","category","returns","args","a","b","s","n","variants","argumentNames","description","seeAlso","examples","num","int","ceil","toNonNegativeInteger","fromCodePoint","error","codePointAt","c","replace","split","padString","padStart","padEnd","template","templateString","placeholders","assertArray","templateStrings","applyPlaceholders","stringPlaceholders","slice","params","rest","hideOperatorForm","btoa","encodeURIComponent","_match","p1","fromCharCode","parseInt","decodeURIComponent","map","call","atob","charCodeAt","base64string","capitalize","charAt","toUpperCase","toLowerCase","doubleDollarRegexp","i","re","test","placeHolder","stringUtilsModule","functions"],"mappings":"AAEM,SAAUA,EAAcC,GAC5B,IAAKA,EAAeC,WAAaD,EAAeE,KAC9C,MAAO,GAET,MAAMC,EAAcH,EAAeC,SAASG,OAAS,EAC/CC,EAAeL,EAAeE,KAAKI,OAASH,EAAc,EAChE,MAAO,GAAG,IAAII,OAAOC,KAAKC,IAAIN,EAAa,OAAO,IAAII,OAAOC,KAAKC,IAAIJ,EAAc,KACtF,CCkBM,MAAOK,UAAkBC,MACbX,eACAY,aAChB,WAAAC,CAAYC,EAAcd,GACxB,MAAMe,EAAUD,aAAeH,MAC3BG,EAAIC,QACJ,GAAGD,IAEPE,MA/BJ,SAA6BD,EAAiBf,GAC5C,IAAKA,EACH,OAAOe,EAET,MAAME,EAAW,GAAGjB,EAAeC,SAASiB,QAAQlB,EAAeC,SAASG,SAM5E,MAAO,GAAGW,IALWf,EAAemB,SAChC,KAAKnB,EAAemB,YAAYF,IAChC,cAAcA,QACIjB,EAAeE,SACbH,EAAcC,IAExC,CAoBUoB,CAAoBL,EAASf,IACnCqB,KAAKT,aAAeG,EACpBM,KAAKrB,eAAiBA,EACtBsB,OAAOC,eAAeF,KAAMX,EAAUc,WACtCH,KAAKI,KAAO,WACb,CAEM,aAAA1B,GACL,OAAOsB,KAAKrB,gBAAkBD,EAAcsB,KAAKrB,eAClD,EC5CI,MAAM0B,EAAY,CACvBC,OAAQ,EACRC,OAAQ,EACRC,iBAAkB,EAClBC,kBAAmB,EACnBC,kBAAmB,EACnBC,oBAAqB,EACrBC,qBAAsB,EACtBC,eAAgB,EAChBC,QAAS,EACTC,OAAQ,IAGJC,EAAe,IAAIC,IAAIhB,OAAOiB,OAAOb,IAa3C,MAgBMc,EAAkB,IAAIF,IAhBN,CACpB,cACA,UACA,OACA,aACA,OACA,aACA,YACA,WACA,QACA,UACA,iBACA,mBACA,WCnCF,SAASG,EAAeC,GACtB,OAAa,OAATA,GAAiC,iBAATA,ICLC,WDQHA,GAAQ,iBAAkBA,IDuC7B,iBADMC,ECtC8CD,EAAKE,eDuC7CJ,EAAgBK,IAAIF,KADnD,IAAyBA,CCrC/B,CAEA,SAASG,EAAOC,GACd,SAAKC,MAAMC,QAAQF,IAAUA,EAAMzC,OAAS,KDWrB,iBADEqC,ECRPI,EAAM,KDSWV,EAAaQ,IAAIF,IADhD,IAAqBA,CCP3B,CAEM,SAAUO,EAAcH,GAC5B,OAAIN,EAAeM,GAEV,aAAcA,EAActB,MAAQ,OAEzCqB,EAAOC,GACF,GDNqBJ,ECMFI,EAAM,GDL3BzB,OAAO6B,KAAKzB,GAAW0B,KAAKC,GAAO3B,EAAU2B,KAAmCV,UCOzE,OAAVI,EACK,OAEY,iBAAVA,GAAsBA,aAAiBO,OACzC,GAAGP,IAES,iBAAVA,GAAsBA,aAAiBpC,MACzCoC,EAAMQ,WAERC,KAAKC,UAAUV,GDjBlB,IAA0BJ,CCkBhC,CEjCgB,SAAAe,EAAkBC,EAAe3D,GAE/C,OAAO2D,GAAU3D,gBAAkBA,CACrC,CCKgB,SAAA4D,EAAkBb,EAAsB/C,GAEtD,OAGc,SAAsB+C,EAAsB/C,GAC1D,IAVI,SAA4B+C,GAChC,YAAiBc,IAAVd,CACT,CAQOe,CAAef,GAClB,MAAM,IAAIrC,EAAU,uBAAwBgD,EAAkBX,EAAO/C,GACzE,CAPE+D,CAAmBhB,EAAO/C,GACnB+C,CACT,UCRgBiB,EAAkBC,EAAkBlB,EAAgB/C,GAClE,OAAO,IAAIU,EAAU,YAAYuD,UAAiBf,EAAcH,MAAWW,EAAkBX,EAAO/C,GACtG,CCqKM,SAAUkE,EACdnB,EACA/C,EACAmE,EAAyB,CAAA,GAEzB,aAnDuBpB,EAAgBoB,EAAyB,IAChE,QAAqB,iBAAVpB,GAGPpB,OAAOyC,MAAMrB,IAGboB,EAAQE,UAAY1C,OAAO2C,UAAUvB,IAGrCoB,EAAQI,SAAW5C,OAAO6C,SAASzB,IAGnCoB,EAAQM,MAAkB,IAAV1B,GAGhBoB,EAAQO,SAAqB,IAAV3B,GAGnBoB,EAAQQ,UAAY5B,GAAS,GAG7BoB,EAAQS,UAAY7B,GAAS,GAG7BoB,EAAQU,aAAe9B,EAAQ,GAG/BoB,EAAQW,aAAe/B,EAAQ,GAGT,iBAAfoB,EAAQY,IAAmBhC,GAASoB,EAAQY,IAG5B,iBAAhBZ,EAAQa,KAAoBjC,EAAQoB,EAAQa,KAG7B,iBAAfb,EAAQc,IAAmBlC,GAASoB,EAAQc,IAG5B,iBAAhBd,EAAQe,KAAoBnC,EAAQoB,EAAQe,IAIzD,CAOOC,CAASpC,EAAOoB,GACnB,MAAM,IAAIzD,EACR,YAjEN,SAA2ByD,GACzB,GAAIA,EAAQM,KACV,MAAO,OAET,MAAMW,EAlBR,SAAuBjB,GACrB,OAAOA,EAAQQ,SACX,WACAR,EAAQS,SACN,WACAT,EAAQW,YACN,eACAX,EAAQU,YACN,eACAV,EAAQO,QACN,WACA,EACd,CAMeW,CAAclB,GACrBmB,EAAanB,EAAQE,QAAU,UAAY,SAC3CE,EAASJ,EAAQI,OAAS,SAAW,GACrCgB,EAvCR,SAAwBpB,GAItB,MAF2B,iBAAfA,EAAQY,IAA0C,iBAAhBZ,EAAQa,KACxB,iBAAfb,EAAQc,IAA0C,iBAAhBd,EAAQe,IAM1B,iBAAff,EAAQY,IAA0C,iBAAhBZ,EAAQa,IACxB,iBAAfb,EAAQY,GAAkB,OAAOZ,EAAQY,KAAO,QAAQZ,EAAQa,MAEpD,iBAAfb,EAAQc,IAA0C,iBAAhBd,EAAQe,IACxB,iBAAff,EAAQc,GAAkB,OAAOd,EAAQc,KAAO,QAAQd,EAAQe,MAErE,GAVL,GAAyB,iBAAff,EAAQY,GAAkB,GAAGZ,EAAQY,UAAY,GAAGZ,EAAQa,cACrD,iBAAfb,EAAQc,GAAkB,KAAKd,EAAQc,KAAO,MAAMd,EAAQe,OAUzE,CAuBgBM,CAAerB,GAE7B,MAAO,CAACiB,EAAMb,EAAQe,EAAYC,GAAOE,OAAOC,KAAOA,GAAGC,KAAK,IACjE,CAuDkBC,CAAkBzB,WAAiBjB,EAAcH,MAC7DW,EAAkBX,EAAO/C,GAG/B,CC7JM,SAAU6F,EACd9C,EACA/C,EACAmE,EAAkC,CAAA,GAElC,aAlBuBpB,EAAgBoB,EAAkC,IACzE,QAAqB,iBAAVpB,GAGPoB,EAAQ2B,UAA6B,IAAjB/C,EAAMzC,QAG1B6D,EAAQ4B,MAAyB,IAAjBhD,EAAMzC,OAI5B,CAOO0F,CAASjD,EAAOoB,GACnB,MAAMH,EACJ,IAAGG,EAAQ2B,SAAW,mBAAqB3B,EAAQ4B,KAAO,YAAc,UACxEhD,EACA/C,EAGN,CAcgB,SAAAiG,EAAiBlD,EAAgB/C,GAE/C,OAEc,SACd+C,EACA/C,GAEA,IAXI,SAA2B+C,GAC/B,MAAwB,iBAAVA,GAAuC,iBAAVA,CAC7C,CASOmD,CAAiBnD,GACpB,MAAMiB,EAAkB,mBAAoBjB,EAAO/C,EACvD,CATEmG,CAAqBpD,EAAO/C,GACrB+C,CACT,CC2BM,SAAUqD,EAAaC,GAC3B,MAAO,CAAEC,IAAKD,EAAO5F,IAAK4F,EAC5B,CCzEA,MAAME,EAAiD,CACrD,gBAAiB,CACfC,SAAU,EAAEC,EAAKC,GAAQ1G,KACvB6F,EAAaY,EAAKzG,GAClBkE,EAAawC,EAAO1G,EAAgB,CAAEqE,SAAS,EAAMS,aAAa,IAE3D2B,EAAIlG,OAAOmG,IAEpBL,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CACJC,EAAG,CAAEpE,KAAM,UACXqE,EAAG,CAAErE,KAAM,WACXsE,EAAG,CAAEtE,KAAM,UACXuE,EAAG,CAAEvE,KAAM,YAEbwE,SAAU,CAAC,CAAEC,cAAe,CAAC,IAAK,OAClCC,YAAa,wBACbC,QAAS,CAAC,MAAO,UACjBC,SAAU,CACR,iEACA,mEACA,uEAKN,iBAAkB,CAChBf,SAAU,EAAEgB,GAAMxH,KAChBkE,EAAasD,EAAKxH,EAAgB,CAAEuE,QAAQ,IAC5C,MAAMkD,EC2BN,SAA+BD,GACnC,OAAOhH,KAAKC,IAAI,EAAGD,KAAKkH,KAAKF,GAC/B,CD7BkBG,CAAqBH,GACjC,IACE,OAAO5F,OAAOgG,cAAcH,EAC7B,CACD,MAAOI,GACL,MAAM,IAAInH,EAAUmH,EAAgB7H,EACrC,GAEHqG,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAE5G,KAAM,CAAEyC,KAAM,WACtBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,UAC7BC,YAAa,yCACbC,QAAS,CAAC,uBACVC,SAAU,CACR,gEACA,kEAKN,eAAgB,CACdf,SAAU,EAAEC,GAAMzG,KAChB6F,EAAaY,EAAKzG,EAAgB,CAAE8F,UAAU,IACvClC,EAAe6C,EAAIqB,YAAY,GAAI9H,IAE5CqG,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAEiB,EAAG,CAAEpF,KAAM,WACnBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,OAC7BC,YAAa,+CACbC,QAAS,CAAC,yBACVC,SAAU,CACR,6DACA,qEAKN,YAAa,CACXf,SAAU,EAAEC,GAAMzG,KAChB6F,EAAaY,EAAKzG,GACXyG,EAAIuB,QAAQ,OAAQ,KAE7B3B,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAEG,EAAG,CAAEtE,KAAM,WACnBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,OAC7BC,YAAa,yDACbC,QAAS,CAAC,OAAQ,qBAClBC,SAAU,CACR,gEACA,yDACA,yDAKN,aAAc,CACZf,SAAU,EAAEC,GAAMzG,KAChB6F,EAAaY,EAAKzG,GACXyG,EAAIuB,QAAQ,OAAQ,KAE7B3B,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAEG,EAAG,CAAEtE,KAAM,WACnBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,OAC7BC,YAAa,0DACbC,QAAS,CAAC,OAAQ,oBAClBC,SAAU,CACR,kEACA,2DACA,2DAKN,cAAe,CACbf,SAAU,EAAEC,GAAMzG,KAChB6F,EAAaY,EAAKzG,GACXyG,EAAIwB,MAAK,cAAiBxC,OAAOvE,GAAiB,KAATA,IAElDmF,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAEG,EAAG,CAAEtE,KAAM,WACnBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,OAC7BC,YAAa,oEACbC,QAAS,CAAC,SACVC,SAAU,CACR,yEACA,yEACA,2EACA,6DAKN,WAAY,CACVf,SAAU,EAAEC,EAAKnG,EAAQ4H,GAAYlI,KACnC6F,EAAaY,EAAKzG,GAClBkE,EAAa5D,EAAQN,EAAgB,CAAEqE,SAAS,SAE9BR,IAAdqE,GACFrC,EAAaqC,EAAWlI,GAEnByG,EAAI0B,SAAS7H,EAAQ4H,IAE9B7B,MAAO,CAAEC,IAAK,EAAG7F,IAAK,GACtBkG,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CACJC,EAAG,CAAEpE,KAAM,UACXqE,EAAG,CAAErE,KAAM,WACXsE,EAAG,CAAEtE,KAAM,UACXrC,OAAQ,CAAEqC,KAAM,WAChBuF,UAAW,CAAEvF,KAAM,WAErBwE,SAAU,CACR,CAAEC,cAAe,CAAC,IAAK,WACvB,CAAEA,cAAe,CAAC,IAAK,SAAU,eAEnCC,YAAa,+HACbC,QAAS,CAAC,oBACVC,SAAU,CACR,4DACA,8DACA,qEACA,6DACA,iEAKN,YAAa,CACXf,SAAU,EAAEC,EAAKnG,EAAQ4H,GAAYlI,KACnC6F,EAAaY,EAAKzG,GAClBkE,EAAa5D,EAAQN,EAAgB,CAAEqE,SAAS,SAE9BR,IAAdqE,GACFrC,EAAaqC,EAAWlI,GAEnByG,EAAI2B,OAAO9H,EAAQ4H,IAE5B7B,MAAO,CAAEC,IAAK,EAAG7F,IAAK,GACtBkG,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CACJC,EAAG,CAAEpE,KAAM,UACXqE,EAAG,CAAErE,KAAM,WACXsE,EAAG,CAAEtE,KAAM,UACXrC,OAAQ,CAAEqC,KAAM,WAChBuF,UAAW,CAAEvF,KAAM,WAErBwE,SAAU,CACR,CAAEC,cAAe,CAAC,IAAK,WACvB,CAAEA,cAAe,CAAC,IAAK,SAAU,eAEnCC,YAAa,gIACbC,QAAS,CAAC,mBACVC,SAAU,CACR,8DACA,gEACA,uEACA,+DACA,mEAKNc,SAAY,CACV7B,SAAU,EAAE8B,KAAmBC,GAAevI,KAC5C6F,EAAayC,EAAgBtI,GE1NnB,SAAY+C,EAAgB/C,GAC1C,IAAKgD,MAAMC,QAAQF,GACjB,MAAMiB,EAAkB,QAASjB,EAAO/C,EAC5C,CFwNMwI,CAAYD,EAAcvI,GAC1B,MAAMyI,EAAkBH,EAAeL,MAAM,QAC7C,GAAIQ,EAAgBnI,QAAU,EAC5B,OAAOoI,EAAkBD,EAAgB,GAAcF,EAAcvI,GAElE,CAEH,MAAM0G,EAAQ6B,EAAa,GAC3BrE,EAAawC,EAAO1G,EAAgB,CAAEqE,SAAS,EAAMS,aAAa,IAClE,MAAM6D,EAAqB,CAAC,GAAGjC,OAAY6B,EAAaK,MAAM,IAC9D,GAA+B,IAA3BH,EAAgBnI,OAAc,CAKhC,OAAOoI,EADYD,EAA0B,IAAV/B,EAAc,EAAI,GAChBiC,EAAoB3I,EAC1D,CAOC,OAAO0I,EADYD,EAAgBjI,KAAK8F,IAAII,EAAO+B,EAAgBnI,OAAS,IACvCqI,EAAoB3I,EAE5D,GAEHqG,MAAO,CAAEC,IAAK,EAAG7F,IAAK,IACtBkG,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CACJG,EAAG,CAAEtE,KAAM,UACXkG,OAAQ,CAAElG,KAAM,MAAOmG,MAAM,IAE/B3B,SAAU,CAAC,CAAEC,cAAe,CAAC,IAAK,YAClCC,YAAa,kJACbC,QAAS,CAAC,OACVC,SAAU,CACR,kFACA,yIACA,0EACA,0EACA,0EACA,qFACA,qFACA,sFACA,kHACA,kHACA,kHACA,kHACA,mHAEFwB,kBAAkB,IAItB,gBAAiB,CACfvC,SAAU,EAAEzD,GAAQ/C,KAClB6F,EAAa9C,EAAO/C,GACbgJ,KACLC,mBAAmBlG,GAAOiF,QAAQ,kBAAmB,CAACkB,EAAQC,IAErDvH,OAAOwH,aAAazH,OAAO0H,SAASF,EAAI,QAIrD9C,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAEG,EAAG,CAAEtE,KAAM,WACnBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,OAC7BC,YAAa,2CACbC,QAAS,CAAC,wBACVC,SAAU,CACR,uEAKN,gBAAiB,CACff,SAAU,EAAEzD,GAAQ/C,KAClB6F,EAAa9C,EAAO/C,GACpB,IACE,OAAOsJ,mBACLtG,MAAMxB,UAAU+H,IACbC,KAAKC,KAAK1G,GAASgF,GAEX,IAAI,KAAMA,EAAE2B,WAAW,GAAGnG,SAAS,MAAOqF,OAAO,MAEzDjD,KAAK,IAEX,CACD,MAAOkC,GACL,MAAM,IAAInH,EAAUmH,EAAgB7H,EACrC,GAEHqG,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAE6C,aAAc,CAAEhH,KAAM,WAC9BwE,SAAU,CAAC,CAAEC,cAAe,CAAC,kBAC7BC,YAAa,sDACbC,QAAS,CAAC,wBACVC,SAAU,CACR,iFAKN,uBAAwB,CACtBf,SAAU,EAAEzD,GAAQ/C,KAClB6F,EAAa9C,EAAO/C,GACbiJ,mBAAmBlG,IAE5BsD,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAEG,EAAG,CAAEtE,KAAM,WACnBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,OAC7BC,YAAa,mCACbC,QAAS,CAAC,+BACVC,SAAU,CACR,4FAKN,uBAAwB,CACtBf,SAAU,EAAEzD,GAAQ/C,KAClB6F,EAAa9C,EAAO/C,GACpB,IACE,OAAOsJ,mBAAmBvG,EAC3B,CACD,MAAO8E,GACL,MAAM,IAAInH,EAAUmH,EAAgB7H,EACrC,GAEHqG,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAEG,EAAG,CAAEtE,KAAM,WACnBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,OAC7BC,YAAa,sCACbC,QAAS,CAAC,+BACVC,SAAU,CACR,+GAKNqC,WAAc,CACZpD,SAAU,EAAEC,GAAMzG,KAChB6F,EAAaY,EAAKzG,GACXyG,EAAIoD,OAAO,GAAGC,cAAgBrD,EAAImC,MAAM,GAAGmB,eAEpD1D,MAAOD,EAAa,GACpBO,KAAM,CACJC,SAAU,SACVC,QAAS,CAAElE,KAAM,UACjBmE,KAAM,CAAEG,EAAG,CAAEtE,KAAM,WACnBwE,SAAU,CAAC,CAAEC,cAAe,CAAC,OAC7BC,YAAa,wFACbC,QAAS,CAAC,aAAc,cACxBC,SAAU,CACR,8DACA,8DACA,8DACA,4DAMFyC,EAAqB,QAC3B,SAAStB,EAAkBJ,EAAwBC,EAAyBvI,GAC1E,IAAK,IAAIiK,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAAG,CAI7B,MAAMC,EAAK,IAAI5G,OAAO,qBAAqB2G,EAAI,IAAK,KACpD,GAAIC,EAAGC,KAAK7B,GAAiB,CAC3B,MAAM8B,EAAcnE,EAAiBsC,EAAa0B,GAAIjK,GACtDsI,EAAiBA,EAAeN,QAAQkC,EAAI,KAAKE,IAClD,CACF,CAED,OADA9B,EAAiBA,EAAeN,QAAQgC,EAAoB,IAE9D,CAEa,MAAAK,EAAgC,CAC3C5I,KAAM,SACN6I,UAAW/D"}
|
|
1
|
+
{"version":3,"file":"string.esm.js","sources":["../../src/utils/debug/getCodeMarker.ts","../../src/errors.ts","../../src/constants/constants.ts","../../src/utils/debug/debugTools.ts","../../src/utils/symbols.ts","../../src/utils/debug/getSourceCodeInfo.ts","../../src/typeGuards/index.ts","../../src/utils/getAssertionError.ts","../../src/typeGuards/number.ts","../../src/typeGuards/string.ts","../../src/utils/arity.ts","../../src/builtin/modules/string/index.ts","../../src/utils/index.ts","../../src/typeGuards/array.ts"],"sourcesContent":["import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getCodeMarker(sourceCodeInfo: SourceCodeInfo): string {\n if (!sourceCodeInfo.position || !sourceCodeInfo.code)\n return ''\n\n const leftPadding = sourceCodeInfo.position.column - 1\n const rightPadding = sourceCodeInfo.code.length - leftPadding - 1\n return `${' '.repeat(Math.max(leftPadding, 0))}^${' '.repeat(Math.max(rightPadding, 0))}`\n}\n","import { getCodeMarker } from '../src/utils/debug/getCodeMarker'\nimport type { Arr } from './interface'\nimport type { SourceCodeInfo } from './tokenizer/token'\n\nfunction getLitsErrorMessage(message: string, sourceCodeInfo?: SourceCodeInfo) {\n if (!sourceCodeInfo) {\n return message\n }\n const location = `${sourceCodeInfo.position.line}:${sourceCodeInfo.position.column}`\n const filePathLine = sourceCodeInfo.filePath\n ? `\\n${sourceCodeInfo.filePath}:${location}`\n : `\\nLocation ${location}`\n const codeLine = `\\n${sourceCodeInfo.code}`\n const codeMarker = `\\n${getCodeMarker(sourceCodeInfo)}`\n return `${message}${filePathLine}${codeLine}${codeMarker}`\n}\n\nexport class RecurSignal extends Error {\n public params: Arr\n constructor(params: Arr) {\n super(`recur, params: ${params}`)\n Object.setPrototypeOf(this, RecurSignal.prototype)\n this.name = 'RecurSignal'\n this.params = params\n }\n}\n\nexport class LitsError extends Error {\n public readonly sourceCodeInfo?: SourceCodeInfo\n public readonly shortMessage: string\n constructor(err: unknown, sourceCodeInfo: SourceCodeInfo | undefined) {\n const message = err instanceof Error\n ? err.message\n : `${err}`\n\n super(getLitsErrorMessage(message, sourceCodeInfo))\n this.shortMessage = message\n this.sourceCodeInfo = sourceCodeInfo\n Object.setPrototypeOf(this, LitsError.prototype)\n this.name = 'LitsError'\n }\n\n public getCodeMarker(): string | undefined {\n return this.sourceCodeInfo && getCodeMarker(this.sourceCodeInfo)\n }\n}\n\nexport class UserDefinedError extends LitsError {\n public userMessage: string\n constructor(message: string, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n this.userMessage = message\n Object.setPrototypeOf(this, UserDefinedError.prototype)\n this.name = 'UserDefinedError'\n }\n}\n\nexport class AssertionError extends LitsError {\n constructor(message: string | Error, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n Object.setPrototypeOf(this, AssertionError.prototype)\n this.name = 'AssertionError'\n }\n}\n\nexport class UndefinedSymbolError extends LitsError {\n public symbol: string\n constructor(symbolName: string, sourceCodeInfo?: SourceCodeInfo) {\n const message = `Undefined symbol '${symbolName}'.`\n super(message, sourceCodeInfo)\n this.symbol = symbolName\n Object.setPrototypeOf(this, UndefinedSymbolError.prototype)\n this.name = 'UndefinedSymbolError'\n }\n}\n\nexport function isLitsError(error: unknown): error is LitsError {\n return error instanceof LitsError\n}\n","export const NodeTypes = {\n Number: 1,\n String: 2,\n NormalExpression: 3,\n SpecialExpression: 4,\n UserDefinedSymbol: 5,\n NormalBuiltinSymbol: 6,\n SpecialBuiltinSymbol: 7,\n ReservedSymbol: 8,\n Binding: 9,\n Spread: 10,\n} as const\n\nconst NodeTypesSet = new Set(Object.values(NodeTypes))\n\nexport type NodeType = typeof NodeTypes[keyof typeof NodeTypes]\n\nexport function getNodeTypeName(type: NodeType): keyof typeof NodeTypes {\n return Object.keys(NodeTypes).find(key => NodeTypes[key as keyof typeof NodeTypes] === type) as keyof typeof NodeTypes\n}\n\n// TODO, is this needed?\nexport function isNodeType(type: unknown): type is NodeType {\n return typeof type === 'number' && NodeTypesSet.has(type as NodeType)\n}\n\nconst functionTypes = [\n 'UserDefined',\n 'Partial',\n 'Comp',\n 'Constantly',\n 'Juxt',\n 'Complement',\n 'EveryPred',\n 'SomePred',\n 'Fnull',\n 'Builtin',\n 'SpecialBuiltin',\n 'NativeJsFunction',\n 'Module',\n] as const\n\nconst functionTypeSet = new Set(functionTypes)\n\nexport type FunctionType = typeof functionTypes[number]\n\nexport function isFunctionType(type: unknown): type is FunctionType {\n return typeof type === 'string' && functionTypeSet.has(type as FunctionType)\n}\n","import { getNodeTypeName, isFunctionType, isNodeType } from '../../constants/constants'\nimport type { AstNode, LitsFunction } from '../../parser/types'\nimport { FUNCTION_SYMBOL } from '../symbols'\n\nfunction isLitsFunction(func: unknown): func is LitsFunction {\n if (func === null || typeof func !== 'object')\n return false\n\n return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType)\n}\n\nfunction isNode(value: unknown): value is AstNode {\n if (!Array.isArray(value) || value.length < 2)\n return false\n return isNodeType(value[0])\n}\n\nexport function valueToString(value: unknown): string {\n if (isLitsFunction(value))\n // eslint-disable-next-line ts/no-unsafe-member-access\n return `<function ${(value as any).name || '\\u03BB'}>`\n\n if (isNode(value))\n return `${getNodeTypeName(value[0])}-node`\n\n if (value === null)\n return 'null'\n\n if (typeof value === 'object' && value instanceof RegExp)\n return `${value}`\n\n if (typeof value === 'object' && value instanceof Error)\n return value.toString()\n\n return JSON.stringify(value)\n}\n","export const FUNCTION_SYMBOL = '^^fn^^'\nexport const REGEXP_SYMBOL = '^^re^^'\n","import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getSourceCodeInfo(anyValue: any, sourceCodeInfo: SourceCodeInfo | undefined): SourceCodeInfo | undefined {\n // eslint-disable-next-line ts/no-unsafe-return, ts/no-unsafe-member-access\n return anyValue?.sourceCodeInfo ?? sourceCodeInfo\n}\n","import { LitsError } from '../errors'\nimport type { UnknownRecord } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\nfunction isNonUndefined<T>(value: T | undefined): value is T {\n return value !== undefined\n}\n\nexport function asNonUndefined<T>(value: T | undefined, sourceCodeInfo?: SourceCodeInfo): T {\n assertNonUndefined(value, sourceCodeInfo)\n return value\n}\n\nexport function assertNonUndefined<T>(value: T | undefined, sourceCodeInfo?: SourceCodeInfo): asserts value is T {\n if (!isNonUndefined(value))\n throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo))\n}\n\nexport function isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function assertUnknownRecord(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is UnknownRecord {\n if (!isUnknownRecord(value)) {\n throw new LitsError(\n `Expected ${'UnknownRecord'}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asUnknownRecord(value: unknown, sourceCodeInfo?: SourceCodeInfo): UnknownRecord {\n assertUnknownRecord(value, sourceCodeInfo)\n return value\n}\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from './debug/debugTools'\nimport { getSourceCodeInfo } from './debug/getSourceCodeInfo'\n\nexport function getAssertionError(typeName: string, value: unknown, sourceCodeInfo?: SourceCodeInfo): LitsError {\n return new LitsError(`Expected ${typeName}, got ${valueToString(value)}.`, getSourceCodeInfo(value, sourceCodeInfo))\n}\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\ntype SignOptions =\n | {\n positive?: true\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: true\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: true\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: true\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: true\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: true\n }\n\ntype GtOptions =\n | {\n gt?: number\n gte?: never\n }\n | {\n gt?: never\n gte?: number\n }\n\ntype LtOptions =\n | {\n lt?: number\n lte?: never\n }\n | {\n lt?: never\n lte?: number\n }\n\ntype NumberOptions = {\n integer?: true\n finite?: true\n} & SignOptions &\nGtOptions &\nLtOptions\n\nfunction getRangeString(options: NumberOptions): string {\n const hasUpperAndLowerBound\n = (typeof options.gt === 'number' || typeof options.gte === 'number')\n && (typeof options.lt === 'number' || typeof options.lte === 'number')\n if (hasUpperAndLowerBound) {\n return `${typeof options.gt === 'number' ? `${options.gt} < n ` : `${options.gte} <= n `}${\n typeof options.lt === 'number' ? `< ${options.lt}` : `<= ${options.lte}`\n }`\n }\n else if (typeof options.gt === 'number' || typeof options.gte === 'number') {\n return `${typeof options.gt === 'number' ? `n > ${options.gt}` : `n >= ${options.gte}`}`\n }\n else if (typeof options.lt === 'number' || typeof options.lte === 'number') {\n return `${typeof options.lt === 'number' ? `n < ${options.lt}` : `n <= ${options.lte}`}`\n }\n else { return '' }\n}\n\nfunction getSignString(options: NumberOptions): string {\n return options.positive\n ? 'positive'\n : options.negative\n ? 'negative'\n : options.nonNegative\n ? 'non negative'\n : options.nonPositive\n ? 'non positive'\n : options.nonZero\n ? 'non zero'\n : ''\n}\n\nfunction getNumberTypeName(options: NumberOptions): string {\n if (options.zero)\n return 'zero'\n\n const sign = getSignString(options)\n const numberType = options.integer ? 'integer' : 'number'\n const finite = options.finite ? 'finite' : ''\n const range = getRangeString(options)\n\n return [sign, finite, numberType, range].filter(x => !!x).join(' ')\n}\n\nexport function isNumber(value: unknown, options: NumberOptions = {}): value is number {\n if (typeof value !== 'number')\n return false\n\n if (Number.isNaN(value))\n return false\n\n if (options.integer && !Number.isInteger(value))\n return false\n\n if (options.finite && !Number.isFinite(value))\n return false\n\n if (options.zero && value !== 0)\n return false\n\n if (options.nonZero && value === 0)\n return false\n\n if (options.positive && value <= 0)\n return false\n\n if (options.negative && value >= 0)\n return false\n\n if (options.nonPositive && value > 0)\n return false\n\n if (options.nonNegative && value < 0)\n return false\n\n if (typeof options.gt === 'number' && value <= options.gt)\n return false\n\n if (typeof options.gte === 'number' && value < options.gte)\n return false\n\n if (typeof options.lt === 'number' && value >= options.lt)\n return false\n\n if (typeof options.lte === 'number' && value > options.lte)\n return false\n\n return true\n}\n\nexport function assertNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n options: NumberOptions = {},\n): asserts value is number {\n if (!isNumber(value, options)) {\n throw new LitsError(\n `Expected ${getNumberTypeName(options)}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asNumber(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: NumberOptions = {},\n): number {\n assertNumber(value, sourceCodeInfo, options)\n return value\n}\n","import type { SourceCodeInfo } from '../tokenizer/token'\nimport { getAssertionError } from '../utils/getAssertionError'\n\ntype StringAssertionOptions =\n | {\n nonEmpty?: true\n char?: never\n }\n | {\n nonEmpty?: never\n char?: true\n }\n\nexport function isString(value: unknown, options: StringAssertionOptions = {}): value is string {\n if (typeof value !== 'string')\n return false\n\n if (options.nonEmpty && value.length === 0)\n return false\n\n if (options.char && value.length !== 1)\n return false\n\n return true\n}\n\nexport function assertString(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: StringAssertionOptions = {},\n): asserts value is string {\n if (!isString(value, options)) {\n throw getAssertionError(\n `${options.nonEmpty ? 'non empty string' : options.char ? 'character' : 'string'}`,\n value,\n sourceCodeInfo,\n )\n }\n}\n\nexport function asString(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: StringAssertionOptions = {},\n): string {\n assertString(value, sourceCodeInfo, options)\n return value\n}\n\nexport function isStringOrNumber(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\nexport function asStringOrNumber(value: unknown, sourceCodeInfo?: SourceCodeInfo): string | number {\n assertStringOrNumber(value, sourceCodeInfo)\n return value\n}\nexport function assertStringOrNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n): asserts value is string | number {\n if (!isStringOrNumber(value))\n throw getAssertionError('string or number', value, sourceCodeInfo)\n}\n","import type { Arity } from '../builtin/interface'\nimport { LitsError } from '../errors'\nimport type { FunctionLike } from '../parser/types'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { isColl } from '../typeGuards/lits'\nimport { valueToString } from './debug/debugTools'\n\nexport function arityAccepts(arity: Arity, nbrOfParams: number): boolean {\n const { min, max } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n if (typeof max === 'number' && nbrOfParams > max) {\n return false\n }\n return true\n}\n\nexport function arityAcceptsMin(arity: Arity, nbrOfParams: number): boolean {\n const { min } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n return true\n}\n\nexport function getCommonArityFromFunctions(params: FunctionLike[]): Arity | null {\n return params.reduce((acc: Arity | null, param): Arity | null => {\n if (acc === null) {\n return null\n }\n const arity: Arity = (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n const { min: aMin, max: aMax } = arity\n const { min: bMin, max: bMax } = acc\n const min = typeof aMin === 'number' && typeof bMin === 'number'\n ? Math.max(aMin, bMin)\n : typeof aMin === 'number' ? aMin : typeof bMin === 'number' ? bMin : undefined\n const max = typeof aMax === 'number' && typeof bMax === 'number'\n ? Math.min(aMax, bMax)\n : typeof aMax === 'number' ? aMax : typeof bMax === 'number' ? bMax : undefined\n\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n return null\n }\n\n return { min, max }\n }, {})\n}\n\nexport function getArityFromFunction(param: FunctionLike): Arity {\n return (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n}\n\nexport function assertNumberOfParams(arity: Arity, length: number, sourceCodeInfo: SourceCodeInfo | undefined): void {\n const { min, max } = arity\n if (typeof min === 'number' && length < min) {\n throw new LitsError(\n `Wrong number of arguments, expected at least ${min}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n\n if (typeof max === 'number' && length > max) {\n throw new LitsError(\n `Wrong number of arguments, expected at most ${max}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n}\n\nexport function canBeOperator(count: Arity): boolean {\n if (typeof count.max === 'number' && count.max < 2) {\n return false\n }\n\n if (typeof count.min === 'number' && count.min > 2) {\n return false\n }\n\n return true\n}\n\nexport function toFixedArity(arity: number): Arity {\n return { min: arity, max: arity }\n}\n","import { LitsError } from '../../../errors'\nimport { asNonUndefined } from '../../../typeGuards'\nimport { assertArray } from '../../../typeGuards/array'\nimport { assertNumber } from '../../../typeGuards/number'\nimport { asStringOrNumber, assertString } from '../../../typeGuards/string'\nimport { toNonNegativeInteger } from '../../../utils'\nimport { toFixedArity } from '../../../utils/arity'\nimport type { BuiltinNormalExpressions } from '../../interface'\nimport type { LitsModule } from '../interface'\nimport type { SourceCodeInfo } from '../../../tokenizer/token'\n\nconst stringUtilsFunctions: BuiltinNormalExpressions = {\n 'string-repeat': {\n evaluate: ([str, count], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true })\n\n return str.repeat(count)\n },\n arity: toFixedArity(2),\n docs: {\n category: 'string',\n returns: { type: 'number' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n n: { type: 'integer' },\n },\n variants: [{ argumentNames: ['s', 'n'] }],\n description: 'Repeates $s $n times.',\n seeAlso: ['str', 'repeat'],\n examples: [\n 'let { string-repeat } = import(\"string\"); \"*\" string-repeat 10',\n 'let { string-repeat } = import(\"string\"); string-repeat(\"*\", 10)',\n 'let { string-repeat } = import(\"string\"); string-repeat(\"***\", 0)',\n ],\n },\n },\n\n 'from-char-code': {\n evaluate: ([num], sourceCodeInfo): string => {\n assertNumber(num, sourceCodeInfo, { finite: true })\n const int = toNonNegativeInteger(num)\n try {\n return String.fromCodePoint(int)\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { code: { type: 'number' } },\n variants: [{ argumentNames: ['code'] }],\n description: 'Return character for code point $code.',\n seeAlso: ['string.to-char-code'],\n examples: [\n 'let { from-char-code } = import(\"string\"); from-char-code(65)',\n 'let { from-char-code } = import(\"string\"); from-char-code(0)',\n ],\n },\n },\n\n 'to-char-code': {\n evaluate: ([str], sourceCodeInfo): number => {\n assertString(str, sourceCodeInfo, { nonEmpty: true })\n return asNonUndefined(str.codePointAt(0), sourceCodeInfo)\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'number' },\n args: { c: { type: 'string' } },\n variants: [{ argumentNames: ['c'] }],\n description: 'Return code point for first character in $c.',\n seeAlso: ['string.from-char-code'],\n examples: [\n 'let { to-char-code } = import(\"string\"); to-char-code(\"A\")',\n 'let { to-char-code } = import(\"string\"); to-char-code(\"Albert\")',\n ],\n },\n },\n\n 'trim-left': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.replace(/^\\s+/, '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a new string with leading whitespaces removed.',\n seeAlso: ['trim', 'string.trim-right'],\n examples: [\n 'let { trim-left } = import(\"string\"); trim-left(\" Albert \")',\n 'let { trim-left } = import(\"string\"); trim-left(\" \")',\n 'let { trim-left } = import(\"string\"); trim-left(\"\")',\n ],\n },\n },\n\n 'trim-right': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.replace(/\\s+$/, '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a new string with trailing whitespaces removed.',\n seeAlso: ['trim', 'string.trim-left'],\n examples: [\n 'let { trim-right } = import(\"string\"); trim-right(\" Albert \")',\n 'let { trim-right } = import(\"string\"); trim-right(\" \")',\n 'let { trim-right } = import(\"string\"); trim-right(\"\")',\n ],\n },\n },\n\n 'split-lines': {\n evaluate: ([str], sourceCodeInfo): string[] => {\n assertString(str, sourceCodeInfo)\n return str.split((/\\r\\n|\\n|\\r/)).filter(line => line !== '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Divides $s into an array of substrings, each representing a line.',\n seeAlso: ['split'],\n examples: [\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\nMojir\\n\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\n\\nMojir\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\nMojir\\n\\n\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"\")',\n ],\n },\n },\n\n 'pad-left': {\n evaluate: ([str, length, padString], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(length, sourceCodeInfo, { integer: true })\n\n if (padString !== undefined)\n assertString(padString, sourceCodeInfo)\n\n return str.padStart(length, padString)\n },\n arity: { min: 2, max: 3 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n length: { type: 'integer' },\n padString: { type: 'string' },\n },\n variants: [\n { argumentNames: ['s', 'length'] },\n { argumentNames: ['s', 'length', 'padString'] },\n ],\n description: 'Pads from the start of $s with `padString` (multiple times, if needed) until the resulting string reaches the given $length.',\n seeAlso: ['string.pad-right'],\n examples: [\n 'let { pad-left } = import(\"string\"); \"Albert\" pad-left 20',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 20)',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 20, \"-*-\")',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 5)',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", -1)',\n ],\n },\n },\n\n 'pad-right': {\n evaluate: ([str, length, padString], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(length, sourceCodeInfo, { integer: true })\n\n if (padString !== undefined)\n assertString(padString, sourceCodeInfo)\n\n return str.padEnd(length, padString)\n },\n arity: { min: 2, max: 3 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n length: { type: 'integer' },\n padString: { type: 'string' },\n },\n variants: [\n { argumentNames: ['s', 'length'] },\n { argumentNames: ['s', 'length', 'padString'] },\n ],\n description: 'Pads from the start of $s with `padString` (multiple times, if needed) until the resulting string reaches the given `length`.',\n seeAlso: ['string.pad-left'],\n examples: [\n 'let { pad-right } = import(\"string\"); \"Albert\" pad-right 20',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 20)',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 20, \"-*-\")',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 5)',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", -1)',\n ],\n },\n },\n\n 'template': {\n evaluate: ([templateString, ...placeholders], sourceCodeInfo): string => {\n assertString(templateString, sourceCodeInfo)\n assertArray(placeholders, sourceCodeInfo)\n const templateStrings = templateString.split('||||')\n if (templateStrings.length <= 1) {\n return applyPlaceholders(templateStrings[0] as string, placeholders, sourceCodeInfo)\n }\n else {\n // Pluralisation\n const count = placeholders[0]\n assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true })\n const stringPlaceholders = [`${count}`, ...placeholders.slice(1)] as string[]\n if (templateStrings.length === 2) {\n // Exactly two valiants.\n // First variant (singular) for count = 1, Second variant (plural) for count = 0 or count > 1\n\n const placehoder = templateStrings[count === 1 ? 0 : 1] as string\n return applyPlaceholders(placehoder, stringPlaceholders, sourceCodeInfo)\n }\n else {\n // More than two variant:\n // Use count as index\n // If count >= number of variants, use last variant\n\n const placehoder = templateStrings[Math.min(count, templateStrings.length - 1)] as string\n return applyPlaceholders(placehoder, stringPlaceholders, sourceCodeInfo)\n }\n }\n },\n arity: { min: 1, max: 10 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n s: { type: 'string' },\n params: { type: 'any', rest: true },\n },\n variants: [{ argumentNames: ['s', 'params'] }],\n description: 'Applies placeholders to a string. Support for basic pluralization - see examples. If pluralization is used, first placeholder must be a number.',\n seeAlso: ['str'],\n examples: [\n 'let { template } = import(\"string\"); template(\"Hi, $1 and $2\", \"Carl\", \"Larry\")',\n 'let { template } = import(\"string\"); template(\"Hi $1, $2, $3, $4, $5, $6, $7, $8 and $9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\")',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 2)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 10)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 2)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 3)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 4)',\n ],\n hideOperatorForm: true,\n },\n },\n\n 'encode-base64': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n return btoa(\n encodeURIComponent(value).replace(/%([0-9A-F]{2})/g, (_match, p1) => {\n // eslint-disable-next-line ts/no-unsafe-argument\n return String.fromCharCode(Number.parseInt(p1, 16))\n }),\n )\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a Base64 encoded string from $s.',\n seeAlso: ['string.decode-base64'],\n examples: [\n 'let { encode-base64 } = import(\"string\"); encode-base64(\"Albert\")',\n ],\n },\n },\n\n 'decode-base64': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n try {\n return decodeURIComponent(\n Array.prototype.map\n .call(atob(value), (c) => {\n // eslint-disable-next-line ts/no-unsafe-call, ts/no-unsafe-member-access\n return `%${(`00${c.charCodeAt(0).toString(16)}`).slice(-2)}`\n })\n .join(''),\n )\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { base64string: { type: 'string' } },\n variants: [{ argumentNames: ['base64string'] }],\n description: 'Returns a Base64 decoded string from $base64string.',\n seeAlso: ['string.encode-base64'],\n examples: [\n 'let { decode-base64 } = import(\"string\"); decode-base64(\"QWxiZXJ0IPCfkLs=\")',\n ],\n },\n },\n\n 'encode-uri-component': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n return encodeURIComponent(value)\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns an escaped `URI` string.',\n seeAlso: ['string.decode-uri-component'],\n examples: [\n 'let { encode-uri-component } = import(\"string\"); encode-uri-component(\"Hi everyone!?\")',\n ],\n },\n },\n\n 'decode-uri-component': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n try {\n return decodeURIComponent(value)\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns an un-escaped `URI` string.',\n seeAlso: ['string.encode-uri-component'],\n examples: [\n 'let { decode-uri-component } = import(\"string\"); decode-uri-component(\"Hi%20everyone!%3F%20%F0%9F%91%8D\")',\n ],\n },\n },\n\n 'capitalize': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns $s with the first character converted to uppercase and the rest to lowercase.',\n seeAlso: ['lower-case', 'upper-case'],\n examples: [\n 'let { capitalize } = import(\"string\"); capitalize(\"albert\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"ALBERT\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"aLBERT\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"\")',\n ],\n },\n },\n}\n\nconst doubleDollarRegexp = /\\$\\$/g\nfunction applyPlaceholders(templateString: string, placeholders: unknown[], sourceCodeInfo?: SourceCodeInfo): string {\n for (let i = 0; i < 9; i += 1) {\n // Matches $1, $2, ..., $9\n // Does not match $$1\n // But does match $$$1, (since the two first '$' will later be raplaced with a single '$'\n const re = new RegExp(`(\\\\$\\\\$|[^$]|^)\\\\$${i + 1}`, 'g')\n if (re.test(templateString)) {\n const placeHolder = asStringOrNumber(placeholders[i], sourceCodeInfo)\n templateString = templateString.replace(re, `$1${placeHolder}`)\n }\n }\n templateString = templateString.replace(doubleDollarRegexp, '$')\n return templateString\n}\n\nexport const stringUtilsModule: LitsModule = {\n name: 'string',\n functions: stringUtilsFunctions,\n}\n","import type { Any, Coll, Obj } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { asAny, isColl, isObj, isRegularExpression } from '../typeGuards/lits'\nimport { isNumber } from '../typeGuards/number'\nimport { asString, assertStringOrNumber } from '../typeGuards/string'\nimport { isUnknownRecord } from '../typeGuards'\nimport { LitsError } from '../errors'\n\nexport function collHasKey(coll: unknown, key: string | number): boolean {\n if (!isColl(coll))\n return false\n\n if (typeof coll === 'string' || Array.isArray(coll)) {\n if (!isNumber(key, { integer: true }))\n return false\n\n return key >= 0 && key < coll.length\n }\n return !!Object.getOwnPropertyDescriptor(coll, key)\n}\n\nexport function compare<T extends string | number>(a: T, b: T, sourceCodeInfo: SourceCodeInfo | undefined): number {\n assertStringOrNumber(a, sourceCodeInfo)\n assertStringOrNumber(b, sourceCodeInfo)\n\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : a > b ? 1 : 0\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.sign((a) - (b))\n }\n throw new LitsError(`Cannot compare values of different types: ${typeof a} and ${typeof b}`, sourceCodeInfo)\n}\n\nexport function deepEqual(a: unknown, b: unknown, sourceCodeInfo?: SourceCodeInfo): boolean {\n if (a === b)\n return true\n\n if (typeof a === 'number' && typeof b === 'number')\n return approxEqual(a, b)\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false\n\n for (let i = 0; i < a.length; i += 1) {\n if (!deepEqual(asAny(a[i], sourceCodeInfo), asAny(b[i], sourceCodeInfo), sourceCodeInfo))\n return false\n }\n return true\n }\n if (isRegularExpression(a) && isRegularExpression(b))\n return a.s === b.s && a.f === b.f\n\n if (isUnknownRecord(a) && isUnknownRecord(b)) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length)\n return false\n\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = asString(aKeys[i], sourceCodeInfo)\n if (!deepEqual(a[key], b[key], sourceCodeInfo))\n return false\n }\n return true\n }\n return false\n}\n\nexport function toNonNegativeInteger(num: number): number {\n return Math.max(0, Math.ceil(num))\n}\n\nexport function toAny(value: unknown): Any {\n return (value ?? null) as Any\n}\n\nfunction clone<T>(value: T): T {\n if (isObj(value)) {\n return Object.entries(value).reduce((result: Obj, entry) => {\n const [key, val] = entry\n result[key] = clone(val)\n return result\n }, {}) as T\n }\n if (Array.isArray(value))\n // eslint-disable-next-line ts/no-unsafe-return\n return value.map(item => clone(item)) as unknown as T\n\n return value\n}\n\nexport function cloneColl<T extends Coll>(value: T): T {\n return clone(value)\n}\n\nexport function joinSets<T>(...results: Set<T>[]): Set<T> {\n const result = new Set<T>()\n for (const symbols of results)\n symbols.forEach(symbol => result.add(symbol))\n\n return result\n}\n\nexport function addToSet<T>(target: Set<T>, source: Set<T>): void {\n source.forEach(symbol => target.add(symbol))\n}\n\nexport const EPSILON = 1e-10\n\nexport function approxEqual(a: number, b: number, epsilon: number = EPSILON): boolean {\n if (a === b) {\n return true\n }\n\n const diff = Math.abs(a - b)\n\n if (a === 0 || b === 0 || diff < epsilon) {\n // Use absolute error for values near zero\n return diff < epsilon\n }\n const absA = Math.abs(a)\n const absB = Math.abs(b)\n\n // Use relative error for larger values\n return diff / (absA + absB) < epsilon\n}\n\nexport function approxZero(value: number): boolean {\n return Math.abs(value) < EPSILON\n}\n\nexport function smartTrim(str: string, minIndent = 0): string {\n const lines = str.split('\\n')\n while (lines[0]?.match(/^\\s*$/)) {\n lines.shift() // Remove leading empty lines\n }\n while (lines[lines.length - 1]?.match(/^\\s*$/)) {\n lines.pop() // Remove trailing empty lines\n }\n const indent = lines.reduce((acc, line) => {\n if (line.match(/^\\s*$/))\n return acc // Skip empty lines\n const lineIndent = line.match(/^\\s*/)![0].length\n return Math.min(acc, lineIndent)\n }, Infinity)\n return lines.map(line => ' '.repeat(minIndent) + line.slice(indent)).join('\\n').trimEnd()\n}\n","import type { SourceCodeInfo } from '../tokenizer/token'\nimport { getAssertionError } from '../utils/getAssertionError'\n\n// isArray not needed, use Array.isArary\nexport function asArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): unknown[] {\n assertArray(value, sourceCodeInfo)\n return value\n}\nexport function assertArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is unknown[] {\n if (!Array.isArray(value))\n throw getAssertionError('array', value, sourceCodeInfo)\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(v => typeof v === 'string')\n}\nexport function asStringArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): string[] {\n assertStringArray(value, sourceCodeInfo)\n return value\n}\nexport function assertStringArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is string[] {\n if (!isStringArray(value))\n throw getAssertionError('array of strings', value, sourceCodeInfo)\n}\n\nexport function isCharArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(v => typeof v === 'string' && v.length === 1)\n}\nexport function asCharArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): string[] {\n assertCharArray(value, sourceCodeInfo)\n return value\n}\nexport function assertCharArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is string[] {\n if (!isCharArray(value))\n throw getAssertionError('array of strings', value, sourceCodeInfo)\n}\n"],"names":["getCodeMarker","sourceCodeInfo","position","code","leftPadding","column","rightPadding","length","repeat","Math","max","LitsError","Error","shortMessage","constructor","err","message","super","location","line","filePath","getLitsErrorMessage","this","Object","setPrototypeOf","prototype","name","NodeTypes","Number","String","NormalExpression","SpecialExpression","UserDefinedSymbol","NormalBuiltinSymbol","SpecialBuiltinSymbol","ReservedSymbol","Binding","Spread","NodeTypesSet","Set","values","functionTypeSet","isLitsFunction","func","type","functionType","has","isNode","value","Array","isArray","valueToString","keys","find","key","RegExp","toString","JSON","stringify","getSourceCodeInfo","anyValue","asNonUndefined","undefined","isNonUndefined","assertNonUndefined","getAssertionError","typeName","assertNumber","options","isNaN","integer","isInteger","finite","isFinite","zero","nonZero","positive","negative","nonPositive","nonNegative","gt","gte","lt","lte","isNumber","sign","getSignString","numberType","range","getRangeString","filter","x","join","getNumberTypeName","assertString","nonEmpty","char","isString","asStringOrNumber","isStringOrNumber","assertStringOrNumber","toFixedArity","arity","min","stringUtilsFunctions","evaluate","str","count","docs","category","returns","args","a","b","s","n","variants","argumentNames","description","seeAlso","examples","num","int","ceil","toNonNegativeInteger","fromCodePoint","error","codePointAt","c","replace","split","padString","padStart","padEnd","template","templateString","placeholders","assertArray","templateStrings","applyPlaceholders","stringPlaceholders","slice","params","rest","hideOperatorForm","btoa","encodeURIComponent","_match","p1","fromCharCode","parseInt","decodeURIComponent","map","call","atob","charCodeAt","base64string","capitalize","charAt","toUpperCase","toLowerCase","doubleDollarRegexp","i","re","test","placeHolder","stringUtilsModule","functions"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.js","sources":["../../src/utils/debug/getCodeMarker.ts","../../src/errors.ts","../../src/constants/constants.ts","../../src/utils/debug/debugTools.ts","../../src/utils/symbols.ts","../../src/utils/debug/getSourceCodeInfo.ts","../../src/typeGuards/index.ts","../../src/utils/getAssertionError.ts","../../src/typeGuards/number.ts","../../src/typeGuards/string.ts","../../src/utils/arity.ts","../../src/builtin/modules/string/index.ts","../../src/utils/index.ts","../../src/typeGuards/array.ts"],"sourcesContent":["import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getCodeMarker(sourceCodeInfo: SourceCodeInfo): string {\n if (!sourceCodeInfo.position || !sourceCodeInfo.code)\n return ''\n\n const leftPadding = sourceCodeInfo.position.column - 1\n const rightPadding = sourceCodeInfo.code.length - leftPadding - 1\n return `${' '.repeat(Math.max(leftPadding, 0))}^${' '.repeat(Math.max(rightPadding, 0))}`\n}\n","import { getCodeMarker } from '../src/utils/debug/getCodeMarker'\nimport type { Arr } from './interface'\nimport type { SourceCodeInfo } from './tokenizer/token'\n\nfunction getLitsErrorMessage(message: string, sourceCodeInfo?: SourceCodeInfo) {\n if (!sourceCodeInfo) {\n return message\n }\n const location = `${sourceCodeInfo.position.line}:${sourceCodeInfo.position.column}`\n const filePathLine = sourceCodeInfo.filePath\n ? `\\n${sourceCodeInfo.filePath}:${location}`\n : `\\nLocation ${location}`\n const codeLine = `\\n${sourceCodeInfo.code}`\n const codeMarker = `\\n${getCodeMarker(sourceCodeInfo)}`\n return `${message}${filePathLine}${codeLine}${codeMarker}`\n}\n\nexport class RecurSignal extends Error {\n public params: Arr\n constructor(params: Arr) {\n super(`recur, params: ${params}`)\n Object.setPrototypeOf(this, RecurSignal.prototype)\n this.name = 'RecurSignal'\n this.params = params\n }\n}\n\nexport class LitsError extends Error {\n public readonly sourceCodeInfo?: SourceCodeInfo\n public readonly shortMessage: string\n constructor(err: unknown, sourceCodeInfo: SourceCodeInfo | undefined) {\n const message = err instanceof Error\n ? err.message\n : `${err}`\n\n super(getLitsErrorMessage(message, sourceCodeInfo))\n this.shortMessage = message\n this.sourceCodeInfo = sourceCodeInfo\n Object.setPrototypeOf(this, LitsError.prototype)\n this.name = 'LitsError'\n }\n\n public getCodeMarker(): string | undefined {\n return this.sourceCodeInfo && getCodeMarker(this.sourceCodeInfo)\n }\n}\n\nexport class UserDefinedError extends LitsError {\n public userMessage: string\n constructor(message: string, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n this.userMessage = message\n Object.setPrototypeOf(this, UserDefinedError.prototype)\n this.name = 'UserDefinedError'\n }\n}\n\nexport class AssertionError extends LitsError {\n constructor(message: string | Error, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n Object.setPrototypeOf(this, AssertionError.prototype)\n this.name = 'AssertionError'\n }\n}\n\nexport class UndefinedSymbolError extends LitsError {\n public symbol: string\n constructor(symbolName: string, sourceCodeInfo?: SourceCodeInfo) {\n const message = `Undefined symbol '${symbolName}'.`\n super(message, sourceCodeInfo)\n this.symbol = symbolName\n Object.setPrototypeOf(this, UndefinedSymbolError.prototype)\n this.name = 'UndefinedSymbolError'\n }\n}\n\nexport function isLitsError(error: unknown): error is LitsError {\n return error instanceof LitsError\n}\n","export const NodeTypes = {\n Number: 1,\n String: 2,\n NormalExpression: 3,\n SpecialExpression: 4,\n UserDefinedSymbol: 5,\n NormalBuiltinSymbol: 6,\n SpecialBuiltinSymbol: 7,\n ReservedSymbol: 8,\n Binding: 9,\n Spread: 10,\n} as const\n\nconst NodeTypesSet = new Set(Object.values(NodeTypes))\n\nexport type NodeType = typeof NodeTypes[keyof typeof NodeTypes]\n\nexport function getNodeTypeName(type: NodeType): keyof typeof NodeTypes {\n return Object.keys(NodeTypes).find(key => NodeTypes[key as keyof typeof NodeTypes] === type) as keyof typeof NodeTypes\n}\n\n// TODO, is this needed?\nexport function isNodeType(type: unknown): type is NodeType {\n return typeof type === 'number' && NodeTypesSet.has(type as NodeType)\n}\n\nconst functionTypes = [\n 'UserDefined',\n 'Partial',\n 'Comp',\n 'Constantly',\n 'Juxt',\n 'Complement',\n 'EveryPred',\n 'SomePred',\n 'Fnull',\n 'Builtin',\n 'SpecialBuiltin',\n 'NativeJsFunction',\n 'Module',\n] as const\n\nconst functionTypeSet = new Set(functionTypes)\n\nexport type FunctionType = typeof functionTypes[number]\n\nexport function isFunctionType(type: unknown): type is FunctionType {\n return typeof type === 'string' && functionTypeSet.has(type as FunctionType)\n}\n","import { getNodeTypeName, isFunctionType, isNodeType } from '../../constants/constants'\nimport type { LitsFunction, Node } from '../../parser/types'\nimport { FUNCTION_SYMBOL } from '../symbols'\n\nfunction isLitsFunction(func: unknown): func is LitsFunction {\n if (func === null || typeof func !== 'object')\n return false\n\n return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType)\n}\n\nfunction isNode(value: unknown): value is Node {\n if (!Array.isArray(value) || value.length < 2)\n return false\n return isNodeType(value[0])\n}\n\nexport function valueToString(value: unknown): string {\n if (isLitsFunction(value))\n // eslint-disable-next-line ts/no-unsafe-member-access\n return `<function ${(value as any).name || '\\u03BB'}>`\n\n if (isNode(value))\n return `${getNodeTypeName(value[0])}-node`\n\n if (value === null)\n return 'null'\n\n if (typeof value === 'object' && value instanceof RegExp)\n return `${value}`\n\n if (typeof value === 'object' && value instanceof Error)\n return value.toString()\n\n return JSON.stringify(value)\n}\n","export const FUNCTION_SYMBOL = '^^fn^^'\nexport const REGEXP_SYMBOL = '^^re^^'\n","import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getSourceCodeInfo(anyValue: any, sourceCodeInfo: SourceCodeInfo | undefined): SourceCodeInfo | undefined {\n // eslint-disable-next-line ts/no-unsafe-return, ts/no-unsafe-member-access\n return anyValue?.sourceCodeInfo ?? sourceCodeInfo\n}\n","import { LitsError } from '../errors'\nimport type { UnknownRecord } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\nexport function isNonUndefined<T>(value: T | undefined): value is T {\n return value !== undefined\n}\n\nexport function asNonUndefined<T>(value: T | undefined, sourceCodeInfo?: SourceCodeInfo): T {\n assertNonUndefined(value, sourceCodeInfo)\n return value\n}\n\nexport function assertNonUndefined<T>(value: T | undefined, sourceCodeInfo?: SourceCodeInfo): asserts value is T {\n if (!isNonUndefined(value))\n throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo))\n}\n\nexport function isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function assertUnknownRecord(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is UnknownRecord {\n if (!isUnknownRecord(value)) {\n throw new LitsError(\n `Expected ${'UnknownRecord'}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asUnknownRecord(value: unknown, sourceCodeInfo?: SourceCodeInfo): UnknownRecord {\n assertUnknownRecord(value, sourceCodeInfo)\n return value\n}\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from './debug/debugTools'\nimport { getSourceCodeInfo } from './debug/getSourceCodeInfo'\n\nexport function getAssertionError(typeName: string, value: unknown, sourceCodeInfo?: SourceCodeInfo): LitsError {\n return new LitsError(`Expected ${typeName}, got ${valueToString(value)}.`, getSourceCodeInfo(value, sourceCodeInfo))\n}\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\ntype SignOptions =\n | {\n positive?: true\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: true\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: true\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: true\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: true\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: true\n }\n\ntype GtOptions =\n | {\n gt?: number\n gte?: never\n }\n | {\n gt?: never\n gte?: number\n }\n\ntype LtOptions =\n | {\n lt?: number\n lte?: never\n }\n | {\n lt?: never\n lte?: number\n }\n\ntype NumberOptions = {\n integer?: true\n finite?: true\n} & SignOptions &\nGtOptions &\nLtOptions\n\nfunction getRangeString(options: NumberOptions): string {\n const hasUpperAndLowerBound\n = (typeof options.gt === 'number' || typeof options.gte === 'number')\n && (typeof options.lt === 'number' || typeof options.lte === 'number')\n if (hasUpperAndLowerBound) {\n return `${typeof options.gt === 'number' ? `${options.gt} < n ` : `${options.gte} <= n `}${\n typeof options.lt === 'number' ? `< ${options.lt}` : `<= ${options.lte}`\n }`\n }\n else if (typeof options.gt === 'number' || typeof options.gte === 'number') {\n return `${typeof options.gt === 'number' ? `n > ${options.gt}` : `n >= ${options.gte}`}`\n }\n else if (typeof options.lt === 'number' || typeof options.lte === 'number') {\n return `${typeof options.lt === 'number' ? `n < ${options.lt}` : `n <= ${options.lte}`}`\n }\n else { return '' }\n}\n\nfunction getSignString(options: NumberOptions): string {\n return options.positive\n ? 'positive'\n : options.negative\n ? 'negative'\n : options.nonNegative\n ? 'non negative'\n : options.nonPositive\n ? 'non positive'\n : options.nonZero\n ? 'non zero'\n : ''\n}\n\nfunction getNumberTypeName(options: NumberOptions): string {\n if (options.zero)\n return 'zero'\n\n const sign = getSignString(options)\n const numberType = options.integer ? 'integer' : 'number'\n const finite = options.finite ? 'finite' : ''\n const range = getRangeString(options)\n\n return [sign, finite, numberType, range].filter(x => !!x).join(' ')\n}\n\nexport function isNumber(value: unknown, options: NumberOptions = {}): value is number {\n if (typeof value !== 'number')\n return false\n\n if (Number.isNaN(value))\n return false\n\n if (options.integer && !Number.isInteger(value))\n return false\n\n if (options.finite && !Number.isFinite(value))\n return false\n\n if (options.zero && value !== 0)\n return false\n\n if (options.nonZero && value === 0)\n return false\n\n if (options.positive && value <= 0)\n return false\n\n if (options.negative && value >= 0)\n return false\n\n if (options.nonPositive && value > 0)\n return false\n\n if (options.nonNegative && value < 0)\n return false\n\n if (typeof options.gt === 'number' && value <= options.gt)\n return false\n\n if (typeof options.gte === 'number' && value < options.gte)\n return false\n\n if (typeof options.lt === 'number' && value >= options.lt)\n return false\n\n if (typeof options.lte === 'number' && value > options.lte)\n return false\n\n return true\n}\n\nexport function assertNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n options: NumberOptions = {},\n): asserts value is number {\n if (!isNumber(value, options)) {\n throw new LitsError(\n `Expected ${getNumberTypeName(options)}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asNumber(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: NumberOptions = {},\n): number {\n assertNumber(value, sourceCodeInfo, options)\n return value\n}\n","import type { SourceCodeInfo } from '../tokenizer/token'\nimport { getAssertionError } from '../utils/getAssertionError'\n\ntype StringAssertionOptions =\n | {\n nonEmpty?: true\n char?: never\n }\n | {\n nonEmpty?: never\n char?: true\n }\n\nexport function isString(value: unknown, options: StringAssertionOptions = {}): value is string {\n if (typeof value !== 'string')\n return false\n\n if (options.nonEmpty && value.length === 0)\n return false\n\n if (options.char && value.length !== 1)\n return false\n\n return true\n}\n\nexport function assertString(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: StringAssertionOptions = {},\n): asserts value is string {\n if (!isString(value, options)) {\n throw getAssertionError(\n `${options.nonEmpty ? 'non empty string' : options.char ? 'character' : 'string'}`,\n value,\n sourceCodeInfo,\n )\n }\n}\n\nexport function asString(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: StringAssertionOptions = {},\n): string {\n assertString(value, sourceCodeInfo, options)\n return value\n}\n\nexport function isStringOrNumber(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\nexport function asStringOrNumber(value: unknown, sourceCodeInfo?: SourceCodeInfo): string | number {\n assertStringOrNumber(value, sourceCodeInfo)\n return value\n}\nexport function assertStringOrNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n): asserts value is string | number {\n if (!isStringOrNumber(value))\n throw getAssertionError('string or number', value, sourceCodeInfo)\n}\n","import type { Arity } from '../builtin/interface'\nimport { LitsError } from '../errors'\nimport type { FunctionLike } from '../parser/types'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { isColl } from '../typeGuards/lits'\nimport { valueToString } from './debug/debugTools'\n\nexport function arityAccepts(arity: Arity, nbrOfParams: number): boolean {\n const { min, max } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n if (typeof max === 'number' && nbrOfParams > max) {\n return false\n }\n return true\n}\n\nexport function arityAcceptsMin(arity: Arity, nbrOfParams: number): boolean {\n const { min } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n return true\n}\n\nexport function getCommonArityFromFunctions(params: FunctionLike[]): Arity | null {\n return params.reduce((acc: Arity | null, param): Arity | null => {\n if (acc === null) {\n return null\n }\n const arity: Arity = (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n const { min: aMin, max: aMax } = arity\n const { min: bMin, max: bMax } = acc\n const min = typeof aMin === 'number' && typeof bMin === 'number'\n ? Math.max(aMin, bMin)\n : typeof aMin === 'number' ? aMin : typeof bMin === 'number' ? bMin : undefined\n const max = typeof aMax === 'number' && typeof bMax === 'number'\n ? Math.min(aMax, bMax)\n : typeof aMax === 'number' ? aMax : typeof bMax === 'number' ? bMax : undefined\n\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n return null\n }\n\n return { min, max }\n }, {})\n}\n\nexport function getArityFromFunction(param: FunctionLike): Arity {\n return (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n}\n\nexport function assertNumberOfParams(arity: Arity, length: number, sourceCodeInfo: SourceCodeInfo | undefined): void {\n const { min, max } = arity\n if (typeof min === 'number' && length < min) {\n throw new LitsError(\n `Wrong number of arguments, expected at least ${min}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n\n if (typeof max === 'number' && length > max) {\n throw new LitsError(\n `Wrong number of arguments, expected at most ${max}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n}\n\nexport function canBeOperator(count: Arity): boolean {\n if (typeof count.max === 'number' && count.max < 2) {\n return false\n }\n\n if (typeof count.min === 'number' && count.min > 2) {\n return false\n }\n\n return true\n}\n\nexport function toFixedArity(arity: number): Arity {\n return { min: arity, max: arity }\n}\n","import { LitsError } from '../../../errors'\nimport { asNonUndefined } from '../../../typeGuards'\nimport { assertArray } from '../../../typeGuards/array'\nimport { assertNumber } from '../../../typeGuards/number'\nimport { asStringOrNumber, assertString } from '../../../typeGuards/string'\nimport { toNonNegativeInteger } from '../../../utils'\nimport { toFixedArity } from '../../../utils/arity'\nimport type { BuiltinNormalExpressions } from '../../interface'\nimport type { LitsModule } from '../interface'\nimport type { SourceCodeInfo } from '../../../tokenizer/token'\n\nconst stringUtilsFunctions: BuiltinNormalExpressions = {\n 'string-repeat': {\n evaluate: ([str, count], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true })\n\n return str.repeat(count)\n },\n arity: toFixedArity(2),\n docs: {\n category: 'string',\n returns: { type: 'number' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n n: { type: 'integer' },\n },\n variants: [{ argumentNames: ['s', 'n'] }],\n description: 'Repeates $s $n times.',\n seeAlso: ['str', 'repeat'],\n examples: [\n 'let { string-repeat } = import(\"string\"); \"*\" string-repeat 10',\n 'let { string-repeat } = import(\"string\"); string-repeat(\"*\", 10)',\n 'let { string-repeat } = import(\"string\"); string-repeat(\"***\", 0)',\n ],\n },\n },\n\n 'from-char-code': {\n evaluate: ([num], sourceCodeInfo): string => {\n assertNumber(num, sourceCodeInfo, { finite: true })\n const int = toNonNegativeInteger(num)\n try {\n return String.fromCodePoint(int)\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { code: { type: 'number' } },\n variants: [{ argumentNames: ['code'] }],\n description: 'Return character for code point $code.',\n seeAlso: ['string.to-char-code'],\n examples: [\n 'let { from-char-code } = import(\"string\"); from-char-code(65)',\n 'let { from-char-code } = import(\"string\"); from-char-code(0)',\n ],\n },\n },\n\n 'to-char-code': {\n evaluate: ([str], sourceCodeInfo): number => {\n assertString(str, sourceCodeInfo, { nonEmpty: true })\n return asNonUndefined(str.codePointAt(0), sourceCodeInfo)\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'number' },\n args: { c: { type: 'string' } },\n variants: [{ argumentNames: ['c'] }],\n description: 'Return code point for first character in $c.',\n seeAlso: ['string.from-char-code'],\n examples: [\n 'let { to-char-code } = import(\"string\"); to-char-code(\"A\")',\n 'let { to-char-code } = import(\"string\"); to-char-code(\"Albert\")',\n ],\n },\n },\n\n 'trim-left': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.replace(/^\\s+/, '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a new string with leading whitespaces removed.',\n seeAlso: ['trim', 'string.trim-right'],\n examples: [\n 'let { trim-left } = import(\"string\"); trim-left(\" Albert \")',\n 'let { trim-left } = import(\"string\"); trim-left(\" \")',\n 'let { trim-left } = import(\"string\"); trim-left(\"\")',\n ],\n },\n },\n\n 'trim-right': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.replace(/\\s+$/, '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a new string with trailing whitespaces removed.',\n seeAlso: ['trim', 'string.trim-left'],\n examples: [\n 'let { trim-right } = import(\"string\"); trim-right(\" Albert \")',\n 'let { trim-right } = import(\"string\"); trim-right(\" \")',\n 'let { trim-right } = import(\"string\"); trim-right(\"\")',\n ],\n },\n },\n\n 'split-lines': {\n evaluate: ([str], sourceCodeInfo): string[] => {\n assertString(str, sourceCodeInfo)\n return str.split((/\\r\\n|\\n|\\r/)).filter(line => line !== '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Divides $s into an array of substrings, each representing a line.',\n seeAlso: ['split'],\n examples: [\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\nMojir\\n\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\n\\nMojir\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\nMojir\\n\\n\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"\")',\n ],\n },\n },\n\n 'pad-left': {\n evaluate: ([str, length, padString], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(length, sourceCodeInfo, { integer: true })\n\n if (padString !== undefined)\n assertString(padString, sourceCodeInfo)\n\n return str.padStart(length, padString)\n },\n arity: { min: 2, max: 3 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n length: { type: 'integer' },\n padString: { type: 'string' },\n },\n variants: [\n { argumentNames: ['s', 'length'] },\n { argumentNames: ['s', 'length', 'padString'] },\n ],\n description: 'Pads from the start of $s with `padString` (multiple times, if needed) until the resulting string reaches the given $length.',\n seeAlso: ['string.pad-right'],\n examples: [\n 'let { pad-left } = import(\"string\"); \"Albert\" pad-left 20',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 20)',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 20, \"-*-\")',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 5)',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", -1)',\n ],\n },\n },\n\n 'pad-right': {\n evaluate: ([str, length, padString], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(length, sourceCodeInfo, { integer: true })\n\n if (padString !== undefined)\n assertString(padString, sourceCodeInfo)\n\n return str.padEnd(length, padString)\n },\n arity: { min: 2, max: 3 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n length: { type: 'integer' },\n padString: { type: 'string' },\n },\n variants: [\n { argumentNames: ['s', 'length'] },\n { argumentNames: ['s', 'length', 'padString'] },\n ],\n description: 'Pads from the start of $s with `padString` (multiple times, if needed) until the resulting string reaches the given `length`.',\n seeAlso: ['string.pad-left'],\n examples: [\n 'let { pad-right } = import(\"string\"); \"Albert\" pad-right 20',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 20)',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 20, \"-*-\")',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 5)',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", -1)',\n ],\n },\n },\n\n 'template': {\n evaluate: ([templateString, ...placeholders], sourceCodeInfo): string => {\n assertString(templateString, sourceCodeInfo)\n assertArray(placeholders, sourceCodeInfo)\n const templateStrings = templateString.split('||||')\n if (templateStrings.length <= 1) {\n return applyPlaceholders(templateStrings[0] as string, placeholders, sourceCodeInfo)\n }\n else {\n // Pluralisation\n const count = placeholders[0]\n assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true })\n const stringPlaceholders = [`${count}`, ...placeholders.slice(1)] as string[]\n if (templateStrings.length === 2) {\n // Exactly two valiants.\n // First variant (singular) for count = 1, Second variant (plural) for count = 0 or count > 1\n\n const placehoder = templateStrings[count === 1 ? 0 : 1] as string\n return applyPlaceholders(placehoder, stringPlaceholders, sourceCodeInfo)\n }\n else {\n // More than two variant:\n // Use count as index\n // If count >= number of variants, use last variant\n\n const placehoder = templateStrings[Math.min(count, templateStrings.length - 1)] as string\n return applyPlaceholders(placehoder, stringPlaceholders, sourceCodeInfo)\n }\n }\n },\n arity: { min: 1, max: 10 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n s: { type: 'string' },\n params: { type: 'any', rest: true },\n },\n variants: [{ argumentNames: ['s', 'params'] }],\n description: 'Applies placeholders to a string. Support for basic pluralization - see examples. If pluralization is used, first placeholder must be a number.',\n seeAlso: ['str'],\n examples: [\n 'let { template } = import(\"string\"); template(\"Hi, $1 and $2\", \"Carl\", \"Larry\")',\n 'let { template } = import(\"string\"); template(\"Hi $1, $2, $3, $4, $5, $6, $7, $8 and $9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\")',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 2)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 10)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 2)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 3)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 4)',\n ],\n hideOperatorForm: true,\n },\n },\n\n 'encode-base64': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n return btoa(\n encodeURIComponent(value).replace(/%([0-9A-F]{2})/g, (_match, p1) => {\n // eslint-disable-next-line ts/no-unsafe-argument\n return String.fromCharCode(Number.parseInt(p1, 16))\n }),\n )\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a Base64 encoded string from $s.',\n seeAlso: ['string.decode-base64'],\n examples: [\n 'let { encode-base64 } = import(\"string\"); encode-base64(\"Albert\")',\n ],\n },\n },\n\n 'decode-base64': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n try {\n return decodeURIComponent(\n Array.prototype.map\n .call(atob(value), (c) => {\n // eslint-disable-next-line ts/no-unsafe-call, ts/no-unsafe-member-access\n return `%${(`00${c.charCodeAt(0).toString(16)}`).slice(-2)}`\n })\n .join(''),\n )\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { base64string: { type: 'string' } },\n variants: [{ argumentNames: ['base64string'] }],\n description: 'Returns a Base64 decoded string from $base64string.',\n seeAlso: ['string.encode-base64'],\n examples: [\n 'let { decode-base64 } = import(\"string\"); decode-base64(\"QWxiZXJ0IPCfkLs=\")',\n ],\n },\n },\n\n 'encode-uri-component': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n return encodeURIComponent(value)\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns an escaped `URI` string.',\n seeAlso: ['string.decode-uri-component'],\n examples: [\n 'let { encode-uri-component } = import(\"string\"); encode-uri-component(\"Hi everyone!?\")',\n ],\n },\n },\n\n 'decode-uri-component': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n try {\n return decodeURIComponent(value)\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns an un-escaped `URI` string.',\n seeAlso: ['string.encode-uri-component'],\n examples: [\n 'let { decode-uri-component } = import(\"string\"); decode-uri-component(\"Hi%20everyone!%3F%20%F0%9F%91%8D\")',\n ],\n },\n },\n\n 'capitalize': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns $s with the first character converted to uppercase and the rest to lowercase.',\n seeAlso: ['lower-case', 'upper-case'],\n examples: [\n 'let { capitalize } = import(\"string\"); capitalize(\"albert\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"ALBERT\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"aLBERT\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"\")',\n ],\n },\n },\n}\n\nconst doubleDollarRegexp = /\\$\\$/g\nfunction applyPlaceholders(templateString: string, placeholders: unknown[], sourceCodeInfo?: SourceCodeInfo): string {\n for (let i = 0; i < 9; i += 1) {\n // Matches $1, $2, ..., $9\n // Does not match $$1\n // But does match $$$1, (since the two first '$' will later be raplaced with a single '$'\n const re = new RegExp(`(\\\\$\\\\$|[^$]|^)\\\\$${i + 1}`, 'g')\n if (re.test(templateString)) {\n const placeHolder = asStringOrNumber(placeholders[i], sourceCodeInfo)\n templateString = templateString.replace(re, `$1${placeHolder}`)\n }\n }\n templateString = templateString.replace(doubleDollarRegexp, '$')\n return templateString\n}\n\nexport const stringUtilsModule: LitsModule = {\n name: 'string',\n functions: stringUtilsFunctions,\n}\n","import type { Any, Coll, Obj } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { asAny, isColl, isObj, isRegularExpression } from '../typeGuards/lits'\nimport { isNumber } from '../typeGuards/number'\nimport { asString, assertStringOrNumber } from '../typeGuards/string'\nimport { isUnknownRecord } from '../typeGuards'\nimport { LitsError } from '../errors'\n\nexport function collHasKey(coll: unknown, key: string | number): boolean {\n if (!isColl(coll))\n return false\n\n if (typeof coll === 'string' || Array.isArray(coll)) {\n if (!isNumber(key, { integer: true }))\n return false\n\n return key >= 0 && key < coll.length\n }\n return !!Object.getOwnPropertyDescriptor(coll, key)\n}\n\nexport function compare<T extends string | number>(a: T, b: T, sourceCodeInfo: SourceCodeInfo | undefined): number {\n assertStringOrNumber(a, sourceCodeInfo)\n assertStringOrNumber(b, sourceCodeInfo)\n\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : a > b ? 1 : 0\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.sign((a) - (b))\n }\n throw new LitsError(`Cannot compare values of different types: ${typeof a} and ${typeof b}`, sourceCodeInfo)\n}\n\nexport function deepEqual(a: unknown, b: unknown, sourceCodeInfo?: SourceCodeInfo): boolean {\n if (a === b)\n return true\n\n if (typeof a === 'number' && typeof b === 'number')\n return approxEqual(a, b)\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false\n\n for (let i = 0; i < a.length; i += 1) {\n if (!deepEqual(asAny(a[i], sourceCodeInfo), asAny(b[i], sourceCodeInfo), sourceCodeInfo))\n return false\n }\n return true\n }\n if (isRegularExpression(a) && isRegularExpression(b))\n return a.s === b.s && a.f === b.f\n\n if (isUnknownRecord(a) && isUnknownRecord(b)) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length)\n return false\n\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = asString(aKeys[i], sourceCodeInfo)\n if (!deepEqual(a[key], b[key], sourceCodeInfo))\n return false\n }\n return true\n }\n return false\n}\n\nexport function toNonNegativeInteger(num: number): number {\n return Math.max(0, Math.ceil(num))\n}\n\nexport function toAny(value: unknown): Any {\n return (value ?? null) as Any\n}\n\nfunction clone<T>(value: T): T {\n if (isObj(value)) {\n return Object.entries(value).reduce((result: Obj, entry) => {\n const [key, val] = entry\n result[key] = clone(val)\n return result\n }, {}) as T\n }\n if (Array.isArray(value))\n // eslint-disable-next-line ts/no-unsafe-return\n return value.map(item => clone(item)) as unknown as T\n\n return value\n}\n\nexport function cloneColl<T extends Coll>(value: T): T {\n return clone(value)\n}\n\nexport function joinSets<T>(...results: Set<T>[]): Set<T> {\n const result = new Set<T>()\n for (const symbols of results)\n symbols.forEach(symbol => result.add(symbol))\n\n return result\n}\n\nexport function addToSet<T>(target: Set<T>, source: Set<T>): void {\n source.forEach(symbol => target.add(symbol))\n}\n\nexport const EPSILON = 1e-10\n\nexport function approxEqual(a: number, b: number, epsilon: number = EPSILON): boolean {\n if (a === b) {\n return true\n }\n\n const diff = Math.abs(a - b)\n\n if (a === 0 || b === 0 || diff < epsilon) {\n // Use absolute error for values near zero\n return diff < epsilon\n }\n const absA = Math.abs(a)\n const absB = Math.abs(b)\n\n // Use relative error for larger values\n return diff / (absA + absB) < epsilon\n}\n\nexport function approxZero(value: number): boolean {\n return Math.abs(value) < EPSILON\n}\n\nexport function smartTrim(str: string, minIndent = 0): string {\n const lines = str.split('\\n')\n while (lines[0]?.match(/^\\s*$/)) {\n lines.shift() // Remove leading empty lines\n }\n while (lines[lines.length - 1]?.match(/^\\s*$/)) {\n lines.pop() // Remove trailing empty lines\n }\n const indent = lines.reduce((acc, line) => {\n if (line.match(/^\\s*$/))\n return acc // Skip empty lines\n const lineIndent = line.match(/^\\s*/)![0].length\n return Math.min(acc, lineIndent)\n }, Infinity)\n return lines.map(line => ' '.repeat(minIndent) + line.slice(indent)).join('\\n').trimEnd()\n}\n","import type { SourceCodeInfo } from '../tokenizer/token'\nimport { getAssertionError } from '../utils/getAssertionError'\n\n// isArray not needed, use Array.isArary\nexport function asArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): unknown[] {\n assertArray(value, sourceCodeInfo)\n return value\n}\nexport function assertArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is unknown[] {\n if (!Array.isArray(value))\n throw getAssertionError('array', value, sourceCodeInfo)\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(v => typeof v === 'string')\n}\nexport function asStringArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): string[] {\n assertStringArray(value, sourceCodeInfo)\n return value\n}\nexport function assertStringArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is string[] {\n if (!isStringArray(value))\n throw getAssertionError('array of strings', value, sourceCodeInfo)\n}\n\nexport function isCharArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(v => typeof v === 'string' && v.length === 1)\n}\nexport function asCharArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): string[] {\n assertCharArray(value, sourceCodeInfo)\n return value\n}\nexport function assertCharArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is string[] {\n if (!isCharArray(value))\n throw getAssertionError('array of strings', value, sourceCodeInfo)\n}\n"],"names":["getCodeMarker","sourceCodeInfo","position","code","leftPadding","column","rightPadding","length","repeat","Math","max","LitsError","Error","shortMessage","constructor","err","message","super","location","line","filePath","getLitsErrorMessage","this","Object","setPrototypeOf","prototype","name","NodeTypes","Number","String","NormalExpression","SpecialExpression","UserDefinedSymbol","NormalBuiltinSymbol","SpecialBuiltinSymbol","ReservedSymbol","Binding","Spread","NodeTypesSet","Set","values","functionTypeSet","isLitsFunction","func","type","functionType","has","isNode","value","Array","isArray","valueToString","keys","find","key","RegExp","toString","JSON","stringify","getSourceCodeInfo","anyValue","asNonUndefined","undefined","isNonUndefined","assertNonUndefined","getAssertionError","typeName","assertNumber","options","isNaN","integer","isInteger","finite","isFinite","zero","nonZero","positive","negative","nonPositive","nonNegative","gt","gte","lt","lte","isNumber","sign","getSignString","numberType","range","getRangeString","filter","x","join","getNumberTypeName","assertString","nonEmpty","char","isString","asStringOrNumber","isStringOrNumber","assertStringOrNumber","toFixedArity","arity","min","stringUtilsFunctions","evaluate","str","count","docs","category","returns","args","a","b","s","n","variants","argumentNames","description","seeAlso","examples","num","int","ceil","toNonNegativeInteger","fromCodePoint","error","codePointAt","c","replace","split","padString","padStart","padEnd","template","templateString","placeholders","assertArray","templateStrings","applyPlaceholders","stringPlaceholders","slice","params","rest","hideOperatorForm","btoa","encodeURIComponent","_match","p1","fromCharCode","parseInt","decodeURIComponent","map","call","atob","charCodeAt","base64string","capitalize","charAt","toUpperCase","toLowerCase","doubleDollarRegexp","i","re","test","placeHolder","stringUtilsModule","functions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"string.js","sources":["../../src/utils/debug/getCodeMarker.ts","../../src/errors.ts","../../src/constants/constants.ts","../../src/utils/debug/debugTools.ts","../../src/utils/symbols.ts","../../src/utils/debug/getSourceCodeInfo.ts","../../src/typeGuards/index.ts","../../src/utils/getAssertionError.ts","../../src/typeGuards/number.ts","../../src/typeGuards/string.ts","../../src/utils/arity.ts","../../src/builtin/modules/string/index.ts","../../src/utils/index.ts","../../src/typeGuards/array.ts"],"sourcesContent":["import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getCodeMarker(sourceCodeInfo: SourceCodeInfo): string {\n if (!sourceCodeInfo.position || !sourceCodeInfo.code)\n return ''\n\n const leftPadding = sourceCodeInfo.position.column - 1\n const rightPadding = sourceCodeInfo.code.length - leftPadding - 1\n return `${' '.repeat(Math.max(leftPadding, 0))}^${' '.repeat(Math.max(rightPadding, 0))}`\n}\n","import { getCodeMarker } from '../src/utils/debug/getCodeMarker'\nimport type { Arr } from './interface'\nimport type { SourceCodeInfo } from './tokenizer/token'\n\nfunction getLitsErrorMessage(message: string, sourceCodeInfo?: SourceCodeInfo) {\n if (!sourceCodeInfo) {\n return message\n }\n const location = `${sourceCodeInfo.position.line}:${sourceCodeInfo.position.column}`\n const filePathLine = sourceCodeInfo.filePath\n ? `\\n${sourceCodeInfo.filePath}:${location}`\n : `\\nLocation ${location}`\n const codeLine = `\\n${sourceCodeInfo.code}`\n const codeMarker = `\\n${getCodeMarker(sourceCodeInfo)}`\n return `${message}${filePathLine}${codeLine}${codeMarker}`\n}\n\nexport class RecurSignal extends Error {\n public params: Arr\n constructor(params: Arr) {\n super(`recur, params: ${params}`)\n Object.setPrototypeOf(this, RecurSignal.prototype)\n this.name = 'RecurSignal'\n this.params = params\n }\n}\n\nexport class LitsError extends Error {\n public readonly sourceCodeInfo?: SourceCodeInfo\n public readonly shortMessage: string\n constructor(err: unknown, sourceCodeInfo: SourceCodeInfo | undefined) {\n const message = err instanceof Error\n ? err.message\n : `${err}`\n\n super(getLitsErrorMessage(message, sourceCodeInfo))\n this.shortMessage = message\n this.sourceCodeInfo = sourceCodeInfo\n Object.setPrototypeOf(this, LitsError.prototype)\n this.name = 'LitsError'\n }\n\n public getCodeMarker(): string | undefined {\n return this.sourceCodeInfo && getCodeMarker(this.sourceCodeInfo)\n }\n}\n\nexport class UserDefinedError extends LitsError {\n public userMessage: string\n constructor(message: string, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n this.userMessage = message\n Object.setPrototypeOf(this, UserDefinedError.prototype)\n this.name = 'UserDefinedError'\n }\n}\n\nexport class AssertionError extends LitsError {\n constructor(message: string | Error, sourceCodeInfo?: SourceCodeInfo) {\n super(message, sourceCodeInfo)\n Object.setPrototypeOf(this, AssertionError.prototype)\n this.name = 'AssertionError'\n }\n}\n\nexport class UndefinedSymbolError extends LitsError {\n public symbol: string\n constructor(symbolName: string, sourceCodeInfo?: SourceCodeInfo) {\n const message = `Undefined symbol '${symbolName}'.`\n super(message, sourceCodeInfo)\n this.symbol = symbolName\n Object.setPrototypeOf(this, UndefinedSymbolError.prototype)\n this.name = 'UndefinedSymbolError'\n }\n}\n\nexport function isLitsError(error: unknown): error is LitsError {\n return error instanceof LitsError\n}\n","export const NodeTypes = {\n Number: 1,\n String: 2,\n NormalExpression: 3,\n SpecialExpression: 4,\n UserDefinedSymbol: 5,\n NormalBuiltinSymbol: 6,\n SpecialBuiltinSymbol: 7,\n ReservedSymbol: 8,\n Binding: 9,\n Spread: 10,\n} as const\n\nconst NodeTypesSet = new Set(Object.values(NodeTypes))\n\nexport type NodeType = typeof NodeTypes[keyof typeof NodeTypes]\n\nexport function getNodeTypeName(type: NodeType): keyof typeof NodeTypes {\n return Object.keys(NodeTypes).find(key => NodeTypes[key as keyof typeof NodeTypes] === type) as keyof typeof NodeTypes\n}\n\n// TODO, is this needed?\nexport function isNodeType(type: unknown): type is NodeType {\n return typeof type === 'number' && NodeTypesSet.has(type as NodeType)\n}\n\nconst functionTypes = [\n 'UserDefined',\n 'Partial',\n 'Comp',\n 'Constantly',\n 'Juxt',\n 'Complement',\n 'EveryPred',\n 'SomePred',\n 'Fnull',\n 'Builtin',\n 'SpecialBuiltin',\n 'NativeJsFunction',\n 'Module',\n] as const\n\nconst functionTypeSet = new Set(functionTypes)\n\nexport type FunctionType = typeof functionTypes[number]\n\nexport function isFunctionType(type: unknown): type is FunctionType {\n return typeof type === 'string' && functionTypeSet.has(type as FunctionType)\n}\n","import { getNodeTypeName, isFunctionType, isNodeType } from '../../constants/constants'\nimport type { AstNode, LitsFunction } from '../../parser/types'\nimport { FUNCTION_SYMBOL } from '../symbols'\n\nfunction isLitsFunction(func: unknown): func is LitsFunction {\n if (func === null || typeof func !== 'object')\n return false\n\n return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType)\n}\n\nfunction isNode(value: unknown): value is AstNode {\n if (!Array.isArray(value) || value.length < 2)\n return false\n return isNodeType(value[0])\n}\n\nexport function valueToString(value: unknown): string {\n if (isLitsFunction(value))\n // eslint-disable-next-line ts/no-unsafe-member-access\n return `<function ${(value as any).name || '\\u03BB'}>`\n\n if (isNode(value))\n return `${getNodeTypeName(value[0])}-node`\n\n if (value === null)\n return 'null'\n\n if (typeof value === 'object' && value instanceof RegExp)\n return `${value}`\n\n if (typeof value === 'object' && value instanceof Error)\n return value.toString()\n\n return JSON.stringify(value)\n}\n","export const FUNCTION_SYMBOL = '^^fn^^'\nexport const REGEXP_SYMBOL = '^^re^^'\n","import type { SourceCodeInfo } from '../../tokenizer/token'\n\nexport function getSourceCodeInfo(anyValue: any, sourceCodeInfo: SourceCodeInfo | undefined): SourceCodeInfo | undefined {\n // eslint-disable-next-line ts/no-unsafe-return, ts/no-unsafe-member-access\n return anyValue?.sourceCodeInfo ?? sourceCodeInfo\n}\n","import { LitsError } from '../errors'\nimport type { UnknownRecord } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\nfunction isNonUndefined<T>(value: T | undefined): value is T {\n return value !== undefined\n}\n\nexport function asNonUndefined<T>(value: T | undefined, sourceCodeInfo?: SourceCodeInfo): T {\n assertNonUndefined(value, sourceCodeInfo)\n return value\n}\n\nexport function assertNonUndefined<T>(value: T | undefined, sourceCodeInfo?: SourceCodeInfo): asserts value is T {\n if (!isNonUndefined(value))\n throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo))\n}\n\nexport function isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function assertUnknownRecord(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is UnknownRecord {\n if (!isUnknownRecord(value)) {\n throw new LitsError(\n `Expected ${'UnknownRecord'}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asUnknownRecord(value: unknown, sourceCodeInfo?: SourceCodeInfo): UnknownRecord {\n assertUnknownRecord(value, sourceCodeInfo)\n return value\n}\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from './debug/debugTools'\nimport { getSourceCodeInfo } from './debug/getSourceCodeInfo'\n\nexport function getAssertionError(typeName: string, value: unknown, sourceCodeInfo?: SourceCodeInfo): LitsError {\n return new LitsError(`Expected ${typeName}, got ${valueToString(value)}.`, getSourceCodeInfo(value, sourceCodeInfo))\n}\n","import { LitsError } from '../errors'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { valueToString } from '../utils/debug/debugTools'\nimport { getSourceCodeInfo } from '../utils/debug/getSourceCodeInfo'\n\ntype SignOptions =\n | {\n positive?: true\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: true\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: true\n nonNegative?: never\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: true\n zero?: never\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: true\n nonZero?: never\n }\n | {\n positive?: never\n negative?: never\n nonPositive?: never\n nonNegative?: never\n zero?: never\n nonZero?: true\n }\n\ntype GtOptions =\n | {\n gt?: number\n gte?: never\n }\n | {\n gt?: never\n gte?: number\n }\n\ntype LtOptions =\n | {\n lt?: number\n lte?: never\n }\n | {\n lt?: never\n lte?: number\n }\n\ntype NumberOptions = {\n integer?: true\n finite?: true\n} & SignOptions &\nGtOptions &\nLtOptions\n\nfunction getRangeString(options: NumberOptions): string {\n const hasUpperAndLowerBound\n = (typeof options.gt === 'number' || typeof options.gte === 'number')\n && (typeof options.lt === 'number' || typeof options.lte === 'number')\n if (hasUpperAndLowerBound) {\n return `${typeof options.gt === 'number' ? `${options.gt} < n ` : `${options.gte} <= n `}${\n typeof options.lt === 'number' ? `< ${options.lt}` : `<= ${options.lte}`\n }`\n }\n else if (typeof options.gt === 'number' || typeof options.gte === 'number') {\n return `${typeof options.gt === 'number' ? `n > ${options.gt}` : `n >= ${options.gte}`}`\n }\n else if (typeof options.lt === 'number' || typeof options.lte === 'number') {\n return `${typeof options.lt === 'number' ? `n < ${options.lt}` : `n <= ${options.lte}`}`\n }\n else { return '' }\n}\n\nfunction getSignString(options: NumberOptions): string {\n return options.positive\n ? 'positive'\n : options.negative\n ? 'negative'\n : options.nonNegative\n ? 'non negative'\n : options.nonPositive\n ? 'non positive'\n : options.nonZero\n ? 'non zero'\n : ''\n}\n\nfunction getNumberTypeName(options: NumberOptions): string {\n if (options.zero)\n return 'zero'\n\n const sign = getSignString(options)\n const numberType = options.integer ? 'integer' : 'number'\n const finite = options.finite ? 'finite' : ''\n const range = getRangeString(options)\n\n return [sign, finite, numberType, range].filter(x => !!x).join(' ')\n}\n\nexport function isNumber(value: unknown, options: NumberOptions = {}): value is number {\n if (typeof value !== 'number')\n return false\n\n if (Number.isNaN(value))\n return false\n\n if (options.integer && !Number.isInteger(value))\n return false\n\n if (options.finite && !Number.isFinite(value))\n return false\n\n if (options.zero && value !== 0)\n return false\n\n if (options.nonZero && value === 0)\n return false\n\n if (options.positive && value <= 0)\n return false\n\n if (options.negative && value >= 0)\n return false\n\n if (options.nonPositive && value > 0)\n return false\n\n if (options.nonNegative && value < 0)\n return false\n\n if (typeof options.gt === 'number' && value <= options.gt)\n return false\n\n if (typeof options.gte === 'number' && value < options.gte)\n return false\n\n if (typeof options.lt === 'number' && value >= options.lt)\n return false\n\n if (typeof options.lte === 'number' && value > options.lte)\n return false\n\n return true\n}\n\nexport function assertNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n options: NumberOptions = {},\n): asserts value is number {\n if (!isNumber(value, options)) {\n throw new LitsError(\n `Expected ${getNumberTypeName(options)}, got ${valueToString(value)}.`,\n getSourceCodeInfo(value, sourceCodeInfo),\n )\n }\n}\n\nexport function asNumber(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: NumberOptions = {},\n): number {\n assertNumber(value, sourceCodeInfo, options)\n return value\n}\n","import type { SourceCodeInfo } from '../tokenizer/token'\nimport { getAssertionError } from '../utils/getAssertionError'\n\ntype StringAssertionOptions =\n | {\n nonEmpty?: true\n char?: never\n }\n | {\n nonEmpty?: never\n char?: true\n }\n\nexport function isString(value: unknown, options: StringAssertionOptions = {}): value is string {\n if (typeof value !== 'string')\n return false\n\n if (options.nonEmpty && value.length === 0)\n return false\n\n if (options.char && value.length !== 1)\n return false\n\n return true\n}\n\nexport function assertString(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: StringAssertionOptions = {},\n): asserts value is string {\n if (!isString(value, options)) {\n throw getAssertionError(\n `${options.nonEmpty ? 'non empty string' : options.char ? 'character' : 'string'}`,\n value,\n sourceCodeInfo,\n )\n }\n}\n\nexport function asString(\n value: unknown,\n sourceCodeInfo: SourceCodeInfo | undefined,\n options: StringAssertionOptions = {},\n): string {\n assertString(value, sourceCodeInfo, options)\n return value\n}\n\nexport function isStringOrNumber(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\nexport function asStringOrNumber(value: unknown, sourceCodeInfo?: SourceCodeInfo): string | number {\n assertStringOrNumber(value, sourceCodeInfo)\n return value\n}\nexport function assertStringOrNumber(\n value: unknown,\n sourceCodeInfo?: SourceCodeInfo,\n): asserts value is string | number {\n if (!isStringOrNumber(value))\n throw getAssertionError('string or number', value, sourceCodeInfo)\n}\n","import type { Arity } from '../builtin/interface'\nimport { LitsError } from '../errors'\nimport type { FunctionLike } from '../parser/types'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { isColl } from '../typeGuards/lits'\nimport { valueToString } from './debug/debugTools'\n\nexport function arityAccepts(arity: Arity, nbrOfParams: number): boolean {\n const { min, max } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n if (typeof max === 'number' && nbrOfParams > max) {\n return false\n }\n return true\n}\n\nexport function arityAcceptsMin(arity: Arity, nbrOfParams: number): boolean {\n const { min } = arity\n if (typeof min === 'number' && nbrOfParams < min) {\n return false\n }\n return true\n}\n\nexport function getCommonArityFromFunctions(params: FunctionLike[]): Arity | null {\n return params.reduce((acc: Arity | null, param): Arity | null => {\n if (acc === null) {\n return null\n }\n const arity: Arity = (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n const { min: aMin, max: aMax } = arity\n const { min: bMin, max: bMax } = acc\n const min = typeof aMin === 'number' && typeof bMin === 'number'\n ? Math.max(aMin, bMin)\n : typeof aMin === 'number' ? aMin : typeof bMin === 'number' ? bMin : undefined\n const max = typeof aMax === 'number' && typeof bMax === 'number'\n ? Math.min(aMax, bMax)\n : typeof aMax === 'number' ? aMax : typeof bMax === 'number' ? bMax : undefined\n\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n return null\n }\n\n return { min, max }\n }, {})\n}\n\nexport function getArityFromFunction(param: FunctionLike): Arity {\n return (typeof param === 'number' || isColl(param)) ? toFixedArity(1) : param.arity\n}\n\nexport function assertNumberOfParams(arity: Arity, length: number, sourceCodeInfo: SourceCodeInfo | undefined): void {\n const { min, max } = arity\n if (typeof min === 'number' && length < min) {\n throw new LitsError(\n `Wrong number of arguments, expected at least ${min}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n\n if (typeof max === 'number' && length > max) {\n throw new LitsError(\n `Wrong number of arguments, expected at most ${max}, got ${valueToString(length)}.`,\n sourceCodeInfo,\n )\n }\n}\n\nexport function canBeOperator(count: Arity): boolean {\n if (typeof count.max === 'number' && count.max < 2) {\n return false\n }\n\n if (typeof count.min === 'number' && count.min > 2) {\n return false\n }\n\n return true\n}\n\nexport function toFixedArity(arity: number): Arity {\n return { min: arity, max: arity }\n}\n","import { LitsError } from '../../../errors'\nimport { asNonUndefined } from '../../../typeGuards'\nimport { assertArray } from '../../../typeGuards/array'\nimport { assertNumber } from '../../../typeGuards/number'\nimport { asStringOrNumber, assertString } from '../../../typeGuards/string'\nimport { toNonNegativeInteger } from '../../../utils'\nimport { toFixedArity } from '../../../utils/arity'\nimport type { BuiltinNormalExpressions } from '../../interface'\nimport type { LitsModule } from '../interface'\nimport type { SourceCodeInfo } from '../../../tokenizer/token'\n\nconst stringUtilsFunctions: BuiltinNormalExpressions = {\n 'string-repeat': {\n evaluate: ([str, count], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true })\n\n return str.repeat(count)\n },\n arity: toFixedArity(2),\n docs: {\n category: 'string',\n returns: { type: 'number' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n n: { type: 'integer' },\n },\n variants: [{ argumentNames: ['s', 'n'] }],\n description: 'Repeates $s $n times.',\n seeAlso: ['str', 'repeat'],\n examples: [\n 'let { string-repeat } = import(\"string\"); \"*\" string-repeat 10',\n 'let { string-repeat } = import(\"string\"); string-repeat(\"*\", 10)',\n 'let { string-repeat } = import(\"string\"); string-repeat(\"***\", 0)',\n ],\n },\n },\n\n 'from-char-code': {\n evaluate: ([num], sourceCodeInfo): string => {\n assertNumber(num, sourceCodeInfo, { finite: true })\n const int = toNonNegativeInteger(num)\n try {\n return String.fromCodePoint(int)\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { code: { type: 'number' } },\n variants: [{ argumentNames: ['code'] }],\n description: 'Return character for code point $code.',\n seeAlso: ['string.to-char-code'],\n examples: [\n 'let { from-char-code } = import(\"string\"); from-char-code(65)',\n 'let { from-char-code } = import(\"string\"); from-char-code(0)',\n ],\n },\n },\n\n 'to-char-code': {\n evaluate: ([str], sourceCodeInfo): number => {\n assertString(str, sourceCodeInfo, { nonEmpty: true })\n return asNonUndefined(str.codePointAt(0), sourceCodeInfo)\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'number' },\n args: { c: { type: 'string' } },\n variants: [{ argumentNames: ['c'] }],\n description: 'Return code point for first character in $c.',\n seeAlso: ['string.from-char-code'],\n examples: [\n 'let { to-char-code } = import(\"string\"); to-char-code(\"A\")',\n 'let { to-char-code } = import(\"string\"); to-char-code(\"Albert\")',\n ],\n },\n },\n\n 'trim-left': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.replace(/^\\s+/, '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a new string with leading whitespaces removed.',\n seeAlso: ['trim', 'string.trim-right'],\n examples: [\n 'let { trim-left } = import(\"string\"); trim-left(\" Albert \")',\n 'let { trim-left } = import(\"string\"); trim-left(\" \")',\n 'let { trim-left } = import(\"string\"); trim-left(\"\")',\n ],\n },\n },\n\n 'trim-right': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.replace(/\\s+$/, '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a new string with trailing whitespaces removed.',\n seeAlso: ['trim', 'string.trim-left'],\n examples: [\n 'let { trim-right } = import(\"string\"); trim-right(\" Albert \")',\n 'let { trim-right } = import(\"string\"); trim-right(\" \")',\n 'let { trim-right } = import(\"string\"); trim-right(\"\")',\n ],\n },\n },\n\n 'split-lines': {\n evaluate: ([str], sourceCodeInfo): string[] => {\n assertString(str, sourceCodeInfo)\n return str.split((/\\r\\n|\\n|\\r/)).filter(line => line !== '')\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Divides $s into an array of substrings, each representing a line.',\n seeAlso: ['split'],\n examples: [\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\nMojir\\n\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\n\\nMojir\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"Albert\\nMojir\\n\\n\")',\n 'let { split-lines } = import(\"string\"); split-lines(\"\")',\n ],\n },\n },\n\n 'pad-left': {\n evaluate: ([str, length, padString], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(length, sourceCodeInfo, { integer: true })\n\n if (padString !== undefined)\n assertString(padString, sourceCodeInfo)\n\n return str.padStart(length, padString)\n },\n arity: { min: 2, max: 3 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n length: { type: 'integer' },\n padString: { type: 'string' },\n },\n variants: [\n { argumentNames: ['s', 'length'] },\n { argumentNames: ['s', 'length', 'padString'] },\n ],\n description: 'Pads from the start of $s with `padString` (multiple times, if needed) until the resulting string reaches the given $length.',\n seeAlso: ['string.pad-right'],\n examples: [\n 'let { pad-left } = import(\"string\"); \"Albert\" pad-left 20',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 20)',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 20, \"-*-\")',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", 5)',\n 'let { pad-left } = import(\"string\"); pad-left(\"Albert\", -1)',\n ],\n },\n },\n\n 'pad-right': {\n evaluate: ([str, length, padString], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n assertNumber(length, sourceCodeInfo, { integer: true })\n\n if (padString !== undefined)\n assertString(padString, sourceCodeInfo)\n\n return str.padEnd(length, padString)\n },\n arity: { min: 2, max: 3 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n a: { type: 'string' },\n b: { type: 'integer' },\n s: { type: 'string' },\n length: { type: 'integer' },\n padString: { type: 'string' },\n },\n variants: [\n { argumentNames: ['s', 'length'] },\n { argumentNames: ['s', 'length', 'padString'] },\n ],\n description: 'Pads from the start of $s with `padString` (multiple times, if needed) until the resulting string reaches the given `length`.',\n seeAlso: ['string.pad-left'],\n examples: [\n 'let { pad-right } = import(\"string\"); \"Albert\" pad-right 20',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 20)',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 20, \"-*-\")',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", 5)',\n 'let { pad-right } = import(\"string\"); pad-right(\"Albert\", -1)',\n ],\n },\n },\n\n 'template': {\n evaluate: ([templateString, ...placeholders], sourceCodeInfo): string => {\n assertString(templateString, sourceCodeInfo)\n assertArray(placeholders, sourceCodeInfo)\n const templateStrings = templateString.split('||||')\n if (templateStrings.length <= 1) {\n return applyPlaceholders(templateStrings[0] as string, placeholders, sourceCodeInfo)\n }\n else {\n // Pluralisation\n const count = placeholders[0]\n assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true })\n const stringPlaceholders = [`${count}`, ...placeholders.slice(1)] as string[]\n if (templateStrings.length === 2) {\n // Exactly two valiants.\n // First variant (singular) for count = 1, Second variant (plural) for count = 0 or count > 1\n\n const placehoder = templateStrings[count === 1 ? 0 : 1] as string\n return applyPlaceholders(placehoder, stringPlaceholders, sourceCodeInfo)\n }\n else {\n // More than two variant:\n // Use count as index\n // If count >= number of variants, use last variant\n\n const placehoder = templateStrings[Math.min(count, templateStrings.length - 1)] as string\n return applyPlaceholders(placehoder, stringPlaceholders, sourceCodeInfo)\n }\n }\n },\n arity: { min: 1, max: 10 },\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: {\n s: { type: 'string' },\n params: { type: 'any', rest: true },\n },\n variants: [{ argumentNames: ['s', 'params'] }],\n description: 'Applies placeholders to a string. Support for basic pluralization - see examples. If pluralization is used, first placeholder must be a number.',\n seeAlso: ['str'],\n examples: [\n 'let { template } = import(\"string\"); template(\"Hi, $1 and $2\", \"Carl\", \"Larry\")',\n 'let { template } = import(\"string\"); template(\"Hi $1, $2, $3, $4, $5, $6, $7, $8 and $9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\")',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"$1 book||||$1 books\", 2)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"No book||||$1 book||||$1 books\", 10)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 0)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 1)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 2)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 3)',\n 'let { template } = import(\"string\"); template(\"No book||||One book||||Two books||||Three books||||$1 books\", 4)',\n ],\n hideOperatorForm: true,\n },\n },\n\n 'encode-base64': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n return btoa(\n encodeURIComponent(value).replace(/%([0-9A-F]{2})/g, (_match, p1) => {\n // eslint-disable-next-line ts/no-unsafe-argument\n return String.fromCharCode(Number.parseInt(p1, 16))\n }),\n )\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns a Base64 encoded string from $s.',\n seeAlso: ['string.decode-base64'],\n examples: [\n 'let { encode-base64 } = import(\"string\"); encode-base64(\"Albert\")',\n ],\n },\n },\n\n 'decode-base64': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n try {\n return decodeURIComponent(\n Array.prototype.map\n .call(atob(value), (c) => {\n // eslint-disable-next-line ts/no-unsafe-call, ts/no-unsafe-member-access\n return `%${(`00${c.charCodeAt(0).toString(16)}`).slice(-2)}`\n })\n .join(''),\n )\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { base64string: { type: 'string' } },\n variants: [{ argumentNames: ['base64string'] }],\n description: 'Returns a Base64 decoded string from $base64string.',\n seeAlso: ['string.encode-base64'],\n examples: [\n 'let { decode-base64 } = import(\"string\"); decode-base64(\"QWxiZXJ0IPCfkLs=\")',\n ],\n },\n },\n\n 'encode-uri-component': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n return encodeURIComponent(value)\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns an escaped `URI` string.',\n seeAlso: ['string.decode-uri-component'],\n examples: [\n 'let { encode-uri-component } = import(\"string\"); encode-uri-component(\"Hi everyone!?\")',\n ],\n },\n },\n\n 'decode-uri-component': {\n evaluate: ([value], sourceCodeInfo): string => {\n assertString(value, sourceCodeInfo)\n try {\n return decodeURIComponent(value)\n }\n catch (error) {\n throw new LitsError(error as Error, sourceCodeInfo)\n }\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns an un-escaped `URI` string.',\n seeAlso: ['string.encode-uri-component'],\n examples: [\n 'let { decode-uri-component } = import(\"string\"); decode-uri-component(\"Hi%20everyone!%3F%20%F0%9F%91%8D\")',\n ],\n },\n },\n\n 'capitalize': {\n evaluate: ([str], sourceCodeInfo): string => {\n assertString(str, sourceCodeInfo)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n },\n arity: toFixedArity(1),\n docs: {\n category: 'string',\n returns: { type: 'string' },\n args: { s: { type: 'string' } },\n variants: [{ argumentNames: ['s'] }],\n description: 'Returns $s with the first character converted to uppercase and the rest to lowercase.',\n seeAlso: ['lower-case', 'upper-case'],\n examples: [\n 'let { capitalize } = import(\"string\"); capitalize(\"albert\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"ALBERT\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"aLBERT\")',\n 'let { capitalize } = import(\"string\"); capitalize(\"\")',\n ],\n },\n },\n}\n\nconst doubleDollarRegexp = /\\$\\$/g\nfunction applyPlaceholders(templateString: string, placeholders: unknown[], sourceCodeInfo?: SourceCodeInfo): string {\n for (let i = 0; i < 9; i += 1) {\n // Matches $1, $2, ..., $9\n // Does not match $$1\n // But does match $$$1, (since the two first '$' will later be raplaced with a single '$'\n const re = new RegExp(`(\\\\$\\\\$|[^$]|^)\\\\$${i + 1}`, 'g')\n if (re.test(templateString)) {\n const placeHolder = asStringOrNumber(placeholders[i], sourceCodeInfo)\n templateString = templateString.replace(re, `$1${placeHolder}`)\n }\n }\n templateString = templateString.replace(doubleDollarRegexp, '$')\n return templateString\n}\n\nexport const stringUtilsModule: LitsModule = {\n name: 'string',\n functions: stringUtilsFunctions,\n}\n","import type { Any, Coll, Obj } from '../interface'\nimport type { SourceCodeInfo } from '../tokenizer/token'\nimport { asAny, isColl, isObj, isRegularExpression } from '../typeGuards/lits'\nimport { isNumber } from '../typeGuards/number'\nimport { asString, assertStringOrNumber } from '../typeGuards/string'\nimport { isUnknownRecord } from '../typeGuards'\nimport { LitsError } from '../errors'\n\nexport function collHasKey(coll: unknown, key: string | number): boolean {\n if (!isColl(coll))\n return false\n\n if (typeof coll === 'string' || Array.isArray(coll)) {\n if (!isNumber(key, { integer: true }))\n return false\n\n return key >= 0 && key < coll.length\n }\n return !!Object.getOwnPropertyDescriptor(coll, key)\n}\n\nexport function compare<T extends string | number>(a: T, b: T, sourceCodeInfo: SourceCodeInfo | undefined): number {\n assertStringOrNumber(a, sourceCodeInfo)\n assertStringOrNumber(b, sourceCodeInfo)\n\n if (typeof a === 'string' && typeof b === 'string') {\n return a < b ? -1 : a > b ? 1 : 0\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.sign((a) - (b))\n }\n throw new LitsError(`Cannot compare values of different types: ${typeof a} and ${typeof b}`, sourceCodeInfo)\n}\n\nexport function deepEqual(a: unknown, b: unknown, sourceCodeInfo?: SourceCodeInfo): boolean {\n if (a === b)\n return true\n\n if (typeof a === 'number' && typeof b === 'number')\n return approxEqual(a, b)\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false\n\n for (let i = 0; i < a.length; i += 1) {\n if (!deepEqual(asAny(a[i], sourceCodeInfo), asAny(b[i], sourceCodeInfo), sourceCodeInfo))\n return false\n }\n return true\n }\n if (isRegularExpression(a) && isRegularExpression(b))\n return a.s === b.s && a.f === b.f\n\n if (isUnknownRecord(a) && isUnknownRecord(b)) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length)\n return false\n\n for (let i = 0; i < aKeys.length; i += 1) {\n const key = asString(aKeys[i], sourceCodeInfo)\n if (!deepEqual(a[key], b[key], sourceCodeInfo))\n return false\n }\n return true\n }\n return false\n}\n\nexport function toNonNegativeInteger(num: number): number {\n return Math.max(0, Math.ceil(num))\n}\n\nexport function toAny(value: unknown): Any {\n return (value ?? null) as Any\n}\n\nfunction clone<T>(value: T): T {\n if (isObj(value)) {\n return Object.entries(value).reduce((result: Obj, entry) => {\n const [key, val] = entry\n result[key] = clone(val)\n return result\n }, {}) as T\n }\n if (Array.isArray(value))\n // eslint-disable-next-line ts/no-unsafe-return\n return value.map(item => clone(item)) as unknown as T\n\n return value\n}\n\nexport function cloneColl<T extends Coll>(value: T): T {\n return clone(value)\n}\n\nexport function joinSets<T>(...results: Set<T>[]): Set<T> {\n const result = new Set<T>()\n for (const symbols of results)\n symbols.forEach(symbol => result.add(symbol))\n\n return result\n}\n\nexport function addToSet<T>(target: Set<T>, source: Set<T>): void {\n source.forEach(symbol => target.add(symbol))\n}\n\nexport const EPSILON = 1e-10\n\nexport function approxEqual(a: number, b: number, epsilon: number = EPSILON): boolean {\n if (a === b) {\n return true\n }\n\n const diff = Math.abs(a - b)\n\n if (a === 0 || b === 0 || diff < epsilon) {\n // Use absolute error for values near zero\n return diff < epsilon\n }\n const absA = Math.abs(a)\n const absB = Math.abs(b)\n\n // Use relative error for larger values\n return diff / (absA + absB) < epsilon\n}\n\nexport function approxZero(value: number): boolean {\n return Math.abs(value) < EPSILON\n}\n\nexport function smartTrim(str: string, minIndent = 0): string {\n const lines = str.split('\\n')\n while (lines[0]?.match(/^\\s*$/)) {\n lines.shift() // Remove leading empty lines\n }\n while (lines[lines.length - 1]?.match(/^\\s*$/)) {\n lines.pop() // Remove trailing empty lines\n }\n const indent = lines.reduce((acc, line) => {\n if (line.match(/^\\s*$/))\n return acc // Skip empty lines\n const lineIndent = line.match(/^\\s*/)![0].length\n return Math.min(acc, lineIndent)\n }, Infinity)\n return lines.map(line => ' '.repeat(minIndent) + line.slice(indent)).join('\\n').trimEnd()\n}\n","import type { SourceCodeInfo } from '../tokenizer/token'\nimport { getAssertionError } from '../utils/getAssertionError'\n\n// isArray not needed, use Array.isArary\nexport function asArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): unknown[] {\n assertArray(value, sourceCodeInfo)\n return value\n}\nexport function assertArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is unknown[] {\n if (!Array.isArray(value))\n throw getAssertionError('array', value, sourceCodeInfo)\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(v => typeof v === 'string')\n}\nexport function asStringArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): string[] {\n assertStringArray(value, sourceCodeInfo)\n return value\n}\nexport function assertStringArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is string[] {\n if (!isStringArray(value))\n throw getAssertionError('array of strings', value, sourceCodeInfo)\n}\n\nexport function isCharArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(v => typeof v === 'string' && v.length === 1)\n}\nexport function asCharArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): string[] {\n assertCharArray(value, sourceCodeInfo)\n return value\n}\nexport function assertCharArray(value: unknown, sourceCodeInfo?: SourceCodeInfo): asserts value is string[] {\n if (!isCharArray(value))\n throw getAssertionError('array of strings', value, sourceCodeInfo)\n}\n"],"names":["getCodeMarker","sourceCodeInfo","position","code","leftPadding","column","rightPadding","length","repeat","Math","max","LitsError","Error","shortMessage","constructor","err","message","super","location","line","filePath","getLitsErrorMessage","this","Object","setPrototypeOf","prototype","name","NodeTypes","Number","String","NormalExpression","SpecialExpression","UserDefinedSymbol","NormalBuiltinSymbol","SpecialBuiltinSymbol","ReservedSymbol","Binding","Spread","NodeTypesSet","Set","values","functionTypeSet","isLitsFunction","func","type","functionType","has","isNode","value","Array","isArray","valueToString","keys","find","key","RegExp","toString","JSON","stringify","getSourceCodeInfo","anyValue","asNonUndefined","undefined","isNonUndefined","assertNonUndefined","getAssertionError","typeName","assertNumber","options","isNaN","integer","isInteger","finite","isFinite","zero","nonZero","positive","negative","nonPositive","nonNegative","gt","gte","lt","lte","isNumber","sign","getSignString","numberType","range","getRangeString","filter","x","join","getNumberTypeName","assertString","nonEmpty","char","isString","asStringOrNumber","isStringOrNumber","assertStringOrNumber","toFixedArity","arity","min","stringUtilsFunctions","evaluate","str","count","docs","category","returns","args","a","b","s","n","variants","argumentNames","description","seeAlso","examples","num","int","ceil","toNonNegativeInteger","fromCodePoint","error","codePointAt","c","replace","split","padString","padStart","padEnd","template","templateString","placeholders","assertArray","templateStrings","applyPlaceholders","stringPlaceholders","slice","params","rest","hideOperatorForm","btoa","encodeURIComponent","_match","p1","fromCharCode","parseInt","decodeURIComponent","map","call","atob","charCodeAt","base64string","capitalize","charAt","toUpperCase","toLowerCase","doubleDollarRegexp","i","re","test","placeHolder","stringUtilsModule","functions"],"mappings":"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"}
|