solve-engine 1.1.0 → 1.2.0
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/dist/{EngineError-B61GS1jp.d.cts → EngineError-CNA_rHY-.d.cts} +6 -0
- package/dist/{EngineError-B61GS1jp.d.ts → EngineError-CNA_rHY-.d.ts} +6 -0
- package/dist/{Lexer-BOs7euZe.d.cts → Lexer-B4C1qHXu.d.cts} +1 -1
- package/dist/{Lexer-CSI_lwbW.d.ts → Lexer-DKMlj7Sy.d.ts} +1 -1
- package/dist/{PackageCompatibility-B-7rK1TD.d.cts → PackageCompatibility-B6NX9IaN.d.cts} +1 -1
- package/dist/{PackageCompatibility-Dh59eF-X.d.ts → PackageCompatibility-Ceg5XdAp.d.ts} +1 -1
- package/dist/{PackageRegistry-BHWJP83F.d.cts → PackageRegistry-DnJYVw9G.d.cts} +55 -8
- package/dist/{PackageRegistry-_8rDlvxI.d.ts → PackageRegistry-DrCPQNyy.d.ts} +55 -8
- package/dist/{Parselet-BBT8riYh.d.ts → Parselet-Bhf7d0_W.d.ts} +2 -2
- package/dist/{Parselet-BHcgK9S7.d.cts → Parselet-Cv7S7KRt.d.cts} +2 -2
- package/dist/{ScopeManager-CxA24W5n.d.ts → ScopeManager-Bzq87GfA.d.ts} +10 -3
- package/dist/{ScopeManager-8vf02dwj.d.cts → ScopeManager-DRDBVfan.d.cts} +10 -3
- package/dist/{Token-B1hdkedD.d.cts → Token-CbP_OutD.d.cts} +9 -0
- package/dist/{Token-B1hdkedD.d.ts → Token-CbP_OutD.d.ts} +9 -0
- package/dist/{TokenNormalizer-C6VzZgHa.d.ts → TokenNormalizer-DCWdZjGz.d.ts} +1 -1
- package/dist/{TokenNormalizer-DRc1Js1V.d.cts → TokenNormalizer-DnlL7_8c.d.cts} +1 -1
- package/dist/{VMCheckpoints-MK--EBH2.d.ts → VMCheckpoints-C6c17Hbo.d.ts} +2 -2
- package/dist/{VMCheckpoints-ELYqITdF.d.cts → VMCheckpoints-dZxSMGHG.d.cts} +2 -2
- package/dist/{Value-BUi1RA3S.d.cts → Value-DZNQ_PU7.d.cts} +32 -5
- package/dist/{Value-BUi1RA3S.d.ts → Value-DZNQ_PU7.d.ts} +32 -5
- package/dist/{WorkerError-_-RkoQ5P.d.ts → WorkerError-B7t7R2-m.d.ts} +1 -1
- package/dist/{WorkerError-gzmaopj2.d.cts → WorkerError-Djd7GGGa.d.cts} +1 -1
- package/dist/{chunk-SSV46KFA.cjs → chunk-4K5W7EH2.cjs} +6 -6
- package/dist/{chunk-SSV46KFA.cjs.map → chunk-4K5W7EH2.cjs.map} +1 -1
- package/dist/{chunk-267JPOTF.js → chunk-5EFKSKMA.js} +11 -4
- package/dist/chunk-5EFKSKMA.js.map +1 -0
- package/dist/{chunk-536WPM2V.cjs → chunk-7AXJNQMF.cjs} +17 -3
- package/dist/chunk-7AXJNQMF.cjs.map +1 -0
- package/dist/{chunk-GUG7SNSV.js → chunk-7JM3F4KL.js} +39 -8
- package/dist/chunk-7JM3F4KL.js.map +1 -0
- package/dist/{chunk-XJGJCF2R.cjs → chunk-7USV76HV.cjs} +6 -6
- package/dist/{chunk-XJGJCF2R.cjs.map → chunk-7USV76HV.cjs.map} +1 -1
- package/dist/{chunk-HIQ5HSZL.cjs → chunk-A2DZ5BEJ.cjs} +53 -46
- package/dist/{chunk-HIQ5HSZL.cjs.map → chunk-A2DZ5BEJ.cjs.map} +1 -1
- package/dist/{chunk-CKQMXMHR.cjs → chunk-AKNGX4TZ.cjs} +28 -11
- package/dist/chunk-AKNGX4TZ.cjs.map +1 -0
- package/dist/{chunk-I4GAWIPW.js → chunk-AOH6UR2L.js} +6 -6
- package/dist/{chunk-I4GAWIPW.js.map → chunk-AOH6UR2L.js.map} +1 -1
- package/dist/{chunk-MG6Q3DUO.cjs → chunk-BESTLPRK.cjs} +326 -214
- package/dist/chunk-BESTLPRK.cjs.map +1 -0
- package/dist/{chunk-Z7XGGLI2.js → chunk-BSPXMGIS.js} +3 -3
- package/dist/{chunk-Z7XGGLI2.js.map → chunk-BSPXMGIS.js.map} +1 -1
- package/dist/{chunk-SRGQ72IR.cjs → chunk-C2OMO3WN.cjs} +376 -370
- package/dist/chunk-C2OMO3WN.cjs.map +1 -0
- package/dist/{chunk-G7Z4HJQA.js → chunk-CSDQMDU2.js} +4 -4
- package/dist/{chunk-G7Z4HJQA.js.map → chunk-CSDQMDU2.js.map} +1 -1
- package/dist/{chunk-7KYSUDQO.js → chunk-F4UB4XIL.js} +4 -4
- package/dist/{chunk-7KYSUDQO.js.map → chunk-F4UB4XIL.js.map} +1 -1
- package/dist/{chunk-WXEHD6TT.js → chunk-FE4RC37D.js} +15 -9
- package/dist/chunk-FE4RC37D.js.map +1 -0
- package/dist/{chunk-7ZX6B7SY.cjs → chunk-FR7RNOPT.cjs} +637 -556
- package/dist/chunk-FR7RNOPT.cjs.map +1 -0
- package/dist/{chunk-QFTDTX6K.cjs → chunk-G2YPPLGX.cjs} +29 -2
- package/dist/chunk-G2YPPLGX.cjs.map +1 -0
- package/dist/{chunk-HVRVSI2Z.cjs → chunk-GDEU72RG.cjs} +86 -86
- package/dist/{chunk-HVRVSI2Z.cjs.map → chunk-GDEU72RG.cjs.map} +1 -1
- package/dist/{chunk-OTN6SZOD.cjs → chunk-HKTQCQ4Z.cjs} +860 -489
- package/dist/chunk-HKTQCQ4Z.cjs.map +1 -0
- package/dist/{chunk-XA4CKRML.cjs → chunk-HWHU642X.cjs} +2 -2
- package/dist/{chunk-XA4CKRML.cjs.map → chunk-HWHU642X.cjs.map} +1 -1
- package/dist/{chunk-C75AFGVD.cjs → chunk-ICEKS6YC.cjs} +11 -11
- package/dist/{chunk-C75AFGVD.cjs.map → chunk-ICEKS6YC.cjs.map} +1 -1
- package/dist/{chunk-JIPATHVY.js → chunk-IJGOFP2J.js} +138 -26
- package/dist/chunk-IJGOFP2J.js.map +1 -0
- package/dist/{chunk-ENKKJYD3.js → chunk-IQJGDZOP.js} +4 -4
- package/dist/{chunk-ENKKJYD3.js.map → chunk-IQJGDZOP.js.map} +1 -1
- package/dist/{chunk-2TZKENDH.cjs → chunk-IT74O4BE.cjs} +15 -7
- package/dist/chunk-IT74O4BE.cjs.map +1 -0
- package/dist/{chunk-ZVTWQLK4.cjs → chunk-KXDQKVNX.cjs} +10 -10
- package/dist/{chunk-ZVTWQLK4.cjs.map → chunk-KXDQKVNX.cjs.map} +1 -1
- package/dist/{chunk-JJIXHXFQ.js → chunk-L5YHV6BQ.js} +5 -5
- package/dist/{chunk-JJIXHXFQ.js.map → chunk-L5YHV6BQ.js.map} +1 -1
- package/dist/{chunk-ZXCESUJS.cjs → chunk-LO7HU5WB.cjs} +8 -8
- package/dist/{chunk-ZXCESUJS.cjs.map → chunk-LO7HU5WB.cjs.map} +1 -1
- package/dist/{chunk-UO6BUV6K.js → chunk-LSALB3IN.js} +17 -3
- package/dist/chunk-LSALB3IN.js.map +1 -0
- package/dist/{chunk-J45BCEZ4.cjs → chunk-MI7OTUHL.cjs} +27 -27
- package/dist/{chunk-J45BCEZ4.cjs.map → chunk-MI7OTUHL.cjs.map} +1 -1
- package/dist/{chunk-B4HBEFTB.cjs → chunk-MIGXCBXT.cjs} +8 -2
- package/dist/chunk-MIGXCBXT.cjs.map +1 -0
- package/dist/{chunk-ERCOHGXD.js → chunk-N7OA4WPJ.js} +8 -2
- package/dist/chunk-N7OA4WPJ.js.map +1 -0
- package/dist/{chunk-4D6NIHE2.js → chunk-NAWZATKT.js} +29 -2
- package/dist/chunk-NAWZATKT.js.map +1 -0
- package/dist/{chunk-GQMUHVE3.js → chunk-ORM7CHYZ.js} +36 -5
- package/dist/chunk-ORM7CHYZ.js.map +1 -0
- package/dist/{chunk-B7NLZMQ3.cjs → chunk-PCZVMMWU.cjs} +8 -8
- package/dist/{chunk-B7NLZMQ3.cjs.map → chunk-PCZVMMWU.cjs.map} +1 -1
- package/dist/{chunk-OADDUPT3.js → chunk-RNKDIXDV.js} +4 -4
- package/dist/{chunk-OADDUPT3.js.map → chunk-RNKDIXDV.js.map} +1 -1
- package/dist/{chunk-SNHVVOJK.cjs → chunk-TC6BTUSU.cjs} +55 -24
- package/dist/chunk-TC6BTUSU.cjs.map +1 -0
- package/dist/{chunk-RRLHC37V.js → chunk-TPOK3UNI.js} +387 -17
- package/dist/chunk-TPOK3UNI.js.map +1 -0
- package/dist/{chunk-CCBZZQAE.js → chunk-UF6JG5SG.js} +2 -2
- package/dist/{chunk-CCBZZQAE.js.map → chunk-UF6JG5SG.js.map} +1 -1
- package/dist/{chunk-NKW7LKYU.js → chunk-WMQRJTAO.js} +88 -7
- package/dist/chunk-WMQRJTAO.js.map +1 -0
- package/dist/{chunk-YTIYVHL7.cjs → chunk-YJHY7CMN.cjs} +108 -77
- package/dist/chunk-YJHY7CMN.cjs.map +1 -0
- package/dist/{chunk-3OWCDIPN.js → chunk-YNIWOYW6.js} +21 -4
- package/dist/chunk-YNIWOYW6.js.map +1 -0
- package/dist/{chunk-WWQEY7BV.js → chunk-ZN6YYPIW.js} +3 -3
- package/dist/{chunk-WWQEY7BV.js.map → chunk-ZN6YYPIW.js.map} +1 -1
- package/dist/{chunk-NNQ2TYDF.js → chunk-ZNFFTYWH.js} +11 -5
- package/dist/chunk-ZNFFTYWH.js.map +1 -0
- package/dist/constants.cjs +5 -5
- package/dist/constants.js +2 -2
- package/dist/engine.cjs +33 -33
- package/dist/engine.d.cts +27 -11
- package/dist/engine.d.ts +27 -11
- package/dist/engine.js +20 -20
- package/dist/errors.cjs +26 -26
- package/dist/errors.d.cts +3 -3
- package/dist/errors.d.ts +3 -3
- package/dist/errors.js +2 -2
- package/dist/format.cjs +7 -7
- package/dist/format.d.cts +1 -1
- package/dist/format.d.ts +1 -1
- package/dist/format.js +4 -4
- package/dist/index.cjs +48 -48
- package/dist/index.d.cts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.js +21 -21
- package/dist/language.cjs +7 -7
- package/dist/language.d.cts +10 -10
- package/dist/language.d.ts +10 -10
- package/dist/language.js +2 -2
- package/dist/lexer.cjs +16 -16
- package/dist/lexer.d.cts +3 -3
- package/dist/lexer.d.ts +3 -3
- package/dist/lexer.js +5 -5
- package/dist/normalizer.cjs +10 -10
- package/dist/normalizer.d.cts +3 -3
- package/dist/normalizer.d.ts +3 -3
- package/dist/normalizer.js +4 -4
- package/dist/packages.cjs +40 -36
- package/dist/packages.d.cts +37 -11
- package/dist/packages.d.ts +37 -11
- package/dist/packages.js +11 -11
- package/dist/parser.cjs +13 -13
- package/dist/parser.d.cts +4 -4
- package/dist/parser.d.ts +4 -4
- package/dist/parser.js +5 -5
- package/dist/{pipeline-CtfJtPQc.d.cts → pipeline-D-PS9gVw.d.ts} +3 -3
- package/dist/{pipeline-DCd5M6Gk.d.ts → pipeline-DtSBJ8TS.d.cts} +3 -3
- package/dist/resolvers.d.cts +2 -2
- package/dist/resolvers.d.ts +2 -2
- package/dist/testing.cjs +26 -26
- package/dist/testing.d.cts +10 -10
- package/dist/testing.d.ts +10 -10
- package/dist/testing.js +19 -19
- package/dist/uom.cjs +8 -8
- package/dist/uom.d.cts +2 -2
- package/dist/uom.d.ts +2 -2
- package/dist/uom.js +4 -4
- package/dist/vm.cjs +32 -32
- package/dist/vm.d.cts +7 -7
- package/dist/vm.d.ts +7 -7
- package/dist/vm.js +7 -7
- package/dist/worker.cjs +38 -38
- package/dist/worker.d.cts +10 -10
- package/dist/worker.d.ts +10 -10
- package/dist/worker.js +20 -20
- package/package.json +1 -1
- package/dist/chunk-267JPOTF.js.map +0 -1
- package/dist/chunk-2TZKENDH.cjs.map +0 -1
- package/dist/chunk-3OWCDIPN.js.map +0 -1
- package/dist/chunk-4D6NIHE2.js.map +0 -1
- package/dist/chunk-536WPM2V.cjs.map +0 -1
- package/dist/chunk-7ZX6B7SY.cjs.map +0 -1
- package/dist/chunk-B4HBEFTB.cjs.map +0 -1
- package/dist/chunk-CKQMXMHR.cjs.map +0 -1
- package/dist/chunk-ERCOHGXD.js.map +0 -1
- package/dist/chunk-GQMUHVE3.js.map +0 -1
- package/dist/chunk-GUG7SNSV.js.map +0 -1
- package/dist/chunk-JIPATHVY.js.map +0 -1
- package/dist/chunk-MG6Q3DUO.cjs.map +0 -1
- package/dist/chunk-NKW7LKYU.js.map +0 -1
- package/dist/chunk-NNQ2TYDF.js.map +0 -1
- package/dist/chunk-OTN6SZOD.cjs.map +0 -1
- package/dist/chunk-QFTDTX6K.cjs.map +0 -1
- package/dist/chunk-RRLHC37V.js.map +0 -1
- package/dist/chunk-SNHVVOJK.cjs.map +0 -1
- package/dist/chunk-SRGQ72IR.cjs.map +0 -1
- package/dist/chunk-UO6BUV6K.js.map +0 -1
- package/dist/chunk-WXEHD6TT.js.map +0 -1
- package/dist/chunk-YTIYVHL7.cjs.map +0 -1
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkMI7OTUHL_cjs = require('./chunk-MI7OTUHL.cjs');
|
|
4
|
+
var chunkICEKS6YC_cjs = require('./chunk-ICEKS6YC.cjs');
|
|
5
5
|
var chunkADBA3XBE_cjs = require('./chunk-ADBA3XBE.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunk4K5W7EH2_cjs = require('./chunk-4K5W7EH2.cjs');
|
|
7
7
|
var chunkZ2XP767T_cjs = require('./chunk-Z2XP767T.cjs');
|
|
8
|
-
var
|
|
9
|
-
var
|
|
8
|
+
var chunkFR7RNOPT_cjs = require('./chunk-FR7RNOPT.cjs');
|
|
9
|
+
var chunkKXDQKVNX_cjs = require('./chunk-KXDQKVNX.cjs');
|
|
10
10
|
var chunkVEKIWQ3F_cjs = require('./chunk-VEKIWQ3F.cjs');
|
|
11
11
|
var chunkALYRJ72W_cjs = require('./chunk-ALYRJ72W.cjs');
|
|
12
|
-
var
|
|
13
|
-
var
|
|
12
|
+
var chunkA2DZ5BEJ_cjs = require('./chunk-A2DZ5BEJ.cjs');
|
|
13
|
+
var chunkIT74O4BE_cjs = require('./chunk-IT74O4BE.cjs');
|
|
14
14
|
var chunkEJ3ILXX6_cjs = require('./chunk-EJ3ILXX6.cjs');
|
|
15
|
-
var
|
|
16
|
-
var
|
|
15
|
+
var chunkYJHY7CMN_cjs = require('./chunk-YJHY7CMN.cjs');
|
|
16
|
+
var chunkG2YPPLGX_cjs = require('./chunk-G2YPPLGX.cjs');
|
|
17
17
|
var chunkOUHT5Z36_cjs = require('./chunk-OUHT5Z36.cjs');
|
|
18
18
|
var chunkAQNHHJMJ_cjs = require('./chunk-AQNHHJMJ.cjs');
|
|
19
19
|
var chunkAMOJYLG2_cjs = require('./chunk-AMOJYLG2.cjs');
|
|
20
|
-
var
|
|
20
|
+
var chunkMIGXCBXT_cjs = require('./chunk-MIGXCBXT.cjs');
|
|
21
21
|
|
|
22
22
|
// src/packages/arithmetic/parselets/NumberParselet.ts
|
|
23
23
|
var CHAINED_DOT_THOUSANDS_GROUPS = /^\d{1,3}(\.\d{3}){2,}$/;
|
|
@@ -33,17 +33,17 @@ var NumberParselet = class {
|
|
|
33
33
|
if (raw.startsWith("0x") || raw.startsWith("0X")) {
|
|
34
34
|
v = parseInt(raw, 16);
|
|
35
35
|
if (Number.isNaN(v)) {
|
|
36
|
-
throw
|
|
36
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid hex literal: "${raw}"`, { raw });
|
|
37
37
|
}
|
|
38
38
|
} else if (raw.startsWith("0b") || raw.startsWith("0B")) {
|
|
39
39
|
v = parseInt(raw.slice(2), 2);
|
|
40
40
|
if (Number.isNaN(v)) {
|
|
41
|
-
throw
|
|
41
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid binary literal: "${raw}"`, { raw });
|
|
42
42
|
}
|
|
43
43
|
} else if (raw.startsWith("0o") || raw.startsWith("0O")) {
|
|
44
44
|
v = parseInt(raw.slice(2), 8);
|
|
45
45
|
if (Number.isNaN(v)) {
|
|
46
|
-
throw
|
|
46
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing("INVALID_NUMBER_LITERAL", `Invalid octal literal: "${raw}"`, { raw });
|
|
47
47
|
}
|
|
48
48
|
} else if (CHAINED_DOT_THOUSANDS_GROUPS.test(raw)) {
|
|
49
49
|
v = parseFloat(raw.split(".").join(""));
|
|
@@ -181,7 +181,7 @@ function largeNumberSuffixNormalizerRule(priority = 65) {
|
|
|
181
181
|
const scaled = scaleDecimalString(numberToken.text, magnitude);
|
|
182
182
|
return {
|
|
183
183
|
consumed: 2,
|
|
184
|
-
replacement: [
|
|
184
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("NUMBER", scaled, tokens.slice(pos, pos + 2))],
|
|
185
185
|
ruleName: "arithmetic:large-number-suffix"
|
|
186
186
|
};
|
|
187
187
|
}
|
|
@@ -204,35 +204,35 @@ var ARITHMETIC_PACKAGE = {
|
|
|
204
204
|
{ tokenType: "BIT_NOT", parselet: new PrefixOpParselet(36 /* BIT_NOT */) }
|
|
205
205
|
],
|
|
206
206
|
infixParselets: [
|
|
207
|
-
{ tokenType: "PLUS", parselet: new BinaryOpParselet(
|
|
207
|
+
{ tokenType: "PLUS", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Sum, 20 /* ADD */) },
|
|
208
208
|
// The word "and", which adds exactly like "+" but at a looser binding
|
|
209
209
|
// power so a phrase parselet can use it as a list separator. See
|
|
210
210
|
// Token.ts's AND_CONJ comment for why it is not simply mapped to PLUS.
|
|
211
|
-
{ tokenType: "AND_CONJ", parselet: new BinaryOpParselet(
|
|
212
|
-
{ tokenType: "MINUS", parselet: new BinaryOpParselet(
|
|
213
|
-
{ tokenType: "STAR", parselet: new BinaryOpParselet(
|
|
214
|
-
{ tokenType: "SLASH", parselet: new BinaryOpParselet(
|
|
215
|
-
{ tokenType: "MOD", parselet: new BinaryOpParselet(
|
|
211
|
+
{ tokenType: "AND_CONJ", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Conjunction, 20 /* ADD */) },
|
|
212
|
+
{ tokenType: "MINUS", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Sum, 21 /* SUB */) },
|
|
213
|
+
{ tokenType: "STAR", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 22 /* MUL */) },
|
|
214
|
+
{ tokenType: "SLASH", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 23 /* DIV */) },
|
|
215
|
+
{ tokenType: "MOD", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 24 /* MOD */) },
|
|
216
216
|
// `^` is right-associative, so "2 ^ 3 ^ 2" is 2^(3^2) = 512. The Tier 1
|
|
217
217
|
// fast path in PrecedenceParser is what actually runs for `^`; this
|
|
218
218
|
// registration has to agree with it or the two tiers describe different
|
|
219
219
|
// languages.
|
|
220
|
-
{ tokenType: "CARET", parselet: new BinaryOpParselet(
|
|
221
|
-
{ tokenType: "TIMES_BY", parselet: new BinaryOpParselet(
|
|
222
|
-
{ tokenType: "MULTIPLY_BY", parselet: new BinaryOpParselet(
|
|
223
|
-
{ tokenType: "DIVIDE_BY", parselet: new BinaryOpParselet(
|
|
220
|
+
{ tokenType: "CARET", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Exponent, 25 /* EXP */, true) },
|
|
221
|
+
{ tokenType: "TIMES_BY", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 22 /* MUL */) },
|
|
222
|
+
{ tokenType: "MULTIPLY_BY", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 22 /* MUL */) },
|
|
223
|
+
{ tokenType: "DIVIDE_BY", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Product, 23 /* DIV */) },
|
|
224
224
|
// The shifts and the bitwise trio, at the levels BindingPower gives them
|
|
225
225
|
// and therefore at C and JavaScript precedence. These six are declared
|
|
226
226
|
// twice, here and in BUILTIN_INFIX_BP, and only the Tier 1 numbers are
|
|
227
227
|
// ever read, so the levels must be the SAME names in both places. When
|
|
228
228
|
// they were not, the four that had a fast-path entry ran at one level
|
|
229
229
|
// while `>>>`, which had none, ran at another.
|
|
230
|
-
{ tokenType: "LSHIFT", parselet: new BinaryOpParselet(
|
|
231
|
-
{ tokenType: "RSHIFT", parselet: new BinaryOpParselet(
|
|
232
|
-
{ tokenType: "URSHIFT", parselet: new BinaryOpParselet(
|
|
233
|
-
{ tokenType: "BIT_AND", parselet: new BinaryOpParselet(
|
|
234
|
-
{ tokenType: "BIT_OR", parselet: new BinaryOpParselet(
|
|
235
|
-
{ tokenType: "BIT_XOR", parselet: new BinaryOpParselet(
|
|
230
|
+
{ tokenType: "LSHIFT", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Shift, 30 /* LSHIFT */) },
|
|
231
|
+
{ tokenType: "RSHIFT", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Shift, 31 /* RSHIFT */) },
|
|
232
|
+
{ tokenType: "URSHIFT", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.Shift, 32 /* URSHIFT */) },
|
|
233
|
+
{ tokenType: "BIT_AND", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.BitwiseAnd, 33 /* BIT_AND */) },
|
|
234
|
+
{ tokenType: "BIT_OR", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.BitwiseOr, 34 /* BIT_OR */) },
|
|
235
|
+
{ tokenType: "BIT_XOR", parselet: new BinaryOpParselet(chunkMI7OTUHL_cjs.BindingPower.BitwiseXor, 35 /* BIT_XOR */) }
|
|
236
236
|
],
|
|
237
237
|
normalizerRules: [largeNumberSuffixNormalizerRule()]
|
|
238
238
|
};
|
|
@@ -241,7 +241,7 @@ var ARITHMETIC_PACKAGE = {
|
|
|
241
241
|
var PercentParselet = class {
|
|
242
242
|
constructor() {
|
|
243
243
|
this.category = "Percentage";
|
|
244
|
-
this.bindingPower =
|
|
244
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Prefix;
|
|
245
245
|
}
|
|
246
246
|
parse(parser, left, token, builder) {
|
|
247
247
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
@@ -257,7 +257,7 @@ var IsWhatParselet = class {
|
|
|
257
257
|
this.category = "Percentage";
|
|
258
258
|
// Below arithmetic, so the whole expression to the left is the value being
|
|
259
259
|
// asked about: `10 + 10 is what % of 200` asks about 20.
|
|
260
|
-
this.bindingPower =
|
|
260
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
261
261
|
}
|
|
262
262
|
parse(parser, _left, _token, builder) {
|
|
263
263
|
if (nextWordIs(parser, "what")) {
|
|
@@ -272,7 +272,7 @@ var IsWhatParselet = class {
|
|
|
272
272
|
*/
|
|
273
273
|
parseWhatRate(parser, builder) {
|
|
274
274
|
if (!parser.match("PERCENT")) {
|
|
275
|
-
throw
|
|
275
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
276
276
|
"IS_WHAT_EXPECTED_PERCENT",
|
|
277
277
|
'Expected "%" after "is what", as in "20 is what % of 200"'
|
|
278
278
|
);
|
|
@@ -282,7 +282,7 @@ var IsWhatParselet = class {
|
|
|
282
282
|
builder.emitOpcode(74 /* TO_PERCENTAGE */);
|
|
283
283
|
return;
|
|
284
284
|
}
|
|
285
|
-
parser.parseExpression(
|
|
285
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
286
286
|
builder.emitOpcode(23 /* DIV */);
|
|
287
287
|
if (preposition === "off") {
|
|
288
288
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
@@ -300,7 +300,7 @@ var IsWhatParselet = class {
|
|
|
300
300
|
* `<part> is <rate> of|off|on what`, solving for the base.
|
|
301
301
|
*/
|
|
302
302
|
parseWhatBase(parser, builder) {
|
|
303
|
-
parser.parseExpression(
|
|
303
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
304
304
|
if (parser.match("TO")) {
|
|
305
305
|
expectWord(parser, "what", '"81 is 9 to what power"');
|
|
306
306
|
expectWord(parser, "power", '"81 is 9 to what power"');
|
|
@@ -317,7 +317,7 @@ var IsWhatParselet = class {
|
|
|
317
317
|
}
|
|
318
318
|
const preposition = parser.match("OF_WHAT") ? "of" : parser.match("OFF_WHAT") ? "off" : parser.match("ON_WHAT") ? "on" : null;
|
|
319
319
|
if (preposition === null) {
|
|
320
|
-
throw
|
|
320
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
321
321
|
"IS_WHAT_EXPECTED_PREPOSITION",
|
|
322
322
|
'Expected "of what", "off what" or "on what", as in "20 is 10% of what"'
|
|
323
323
|
);
|
|
@@ -343,7 +343,7 @@ function nextWordIs(parser, word) {
|
|
|
343
343
|
}
|
|
344
344
|
function expectWord(parser, word, example) {
|
|
345
345
|
if (!nextWordIs(parser, word)) {
|
|
346
|
-
throw
|
|
346
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
347
347
|
"IS_WHAT_EXPECTED_WORD",
|
|
348
348
|
`Expected "${word}" here, as in ${example}`
|
|
349
349
|
);
|
|
@@ -366,10 +366,10 @@ var OnOffBaseParselet = class {
|
|
|
366
366
|
constructor(sign) {
|
|
367
367
|
this.sign = sign;
|
|
368
368
|
this.category = "Percentage";
|
|
369
|
-
this.bindingPower =
|
|
369
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
370
370
|
}
|
|
371
371
|
parse(parser, _left, _token, builder) {
|
|
372
|
-
parser.parseExpression(
|
|
372
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
373
373
|
builder.emitOpcode(2 /* SWAP */);
|
|
374
374
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
375
375
|
builder.emitNumber(1);
|
|
@@ -400,7 +400,7 @@ function percentOnOffNormalizerRule(priority = 68) {
|
|
|
400
400
|
consumed: 2,
|
|
401
401
|
replacement: [
|
|
402
402
|
tokens[pos],
|
|
403
|
-
|
|
403
|
+
chunkICEKS6YC_cjs.createFusedToken(text === "on" ? "PCT_ON" : "PCT_OFF", text, [word])
|
|
404
404
|
],
|
|
405
405
|
ruleName: "percentage:on-off"
|
|
406
406
|
};
|
|
@@ -412,7 +412,7 @@ function percentOnOffNormalizerRule(priority = 68) {
|
|
|
412
412
|
var OfParselet = class {
|
|
413
413
|
constructor() {
|
|
414
414
|
this.category = "Percentage";
|
|
415
|
-
this.bindingPower =
|
|
415
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
|
|
416
416
|
}
|
|
417
417
|
parse(parser, left, token, builder) {
|
|
418
418
|
parser.parseExpression(this.bindingPower, builder);
|
|
@@ -424,7 +424,7 @@ var OfParselet = class {
|
|
|
424
424
|
var OfWhatIsParselet = class {
|
|
425
425
|
constructor() {
|
|
426
426
|
this.category = "Percentage";
|
|
427
|
-
this.bindingPower =
|
|
427
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
|
|
428
428
|
}
|
|
429
429
|
parse(parser, left, token, builder) {
|
|
430
430
|
parser.parseExpression(this.bindingPower, builder);
|
|
@@ -438,7 +438,7 @@ var OnOffWhatIsParselet = class {
|
|
|
438
438
|
constructor(sign) {
|
|
439
439
|
this.sign = sign;
|
|
440
440
|
this.category = "Percentage";
|
|
441
|
-
this.bindingPower =
|
|
441
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
|
|
442
442
|
}
|
|
443
443
|
parse(parser, left, token, builder) {
|
|
444
444
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
@@ -481,7 +481,7 @@ var IncreaseByParselet = class {
|
|
|
481
481
|
constructor(multiplier) {
|
|
482
482
|
this.multiplier = multiplier;
|
|
483
483
|
this.category = "Percentage";
|
|
484
|
-
this.bindingPower =
|
|
484
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
485
485
|
}
|
|
486
486
|
parse(parser, left, token, builder) {
|
|
487
487
|
parser.parseExpression(this.bindingPower, builder);
|
|
@@ -497,7 +497,7 @@ var IncreaseByParselet = class {
|
|
|
497
497
|
var PercentageChangeParselet = class {
|
|
498
498
|
constructor() {
|
|
499
499
|
this.category = "Percentage";
|
|
500
|
-
this.bindingPower =
|
|
500
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
501
501
|
}
|
|
502
502
|
parse(parser, left, token, builder) {
|
|
503
503
|
if (left.type === "UNIT") {
|
|
@@ -551,7 +551,7 @@ var UpDownParselet = class {
|
|
|
551
551
|
constructor(sign) {
|
|
552
552
|
this.sign = sign;
|
|
553
553
|
this.category = "Percentage";
|
|
554
|
-
this.bindingPower =
|
|
554
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
555
555
|
}
|
|
556
556
|
parse(parser, _left, _token, builder) {
|
|
557
557
|
parser.parseExpression(this.bindingPower, builder);
|
|
@@ -603,7 +603,7 @@ function stepTokenAt(tokens, i) {
|
|
|
603
603
|
if (text !== "up" && text !== "down") return null;
|
|
604
604
|
if (tokens[i + 1]?.type !== "NUMBER") return null;
|
|
605
605
|
if (tokens[i + 2]?.type !== "PERCENT") return null;
|
|
606
|
-
return
|
|
606
|
+
return chunkICEKS6YC_cjs.createFusedToken(text === "up" ? "PCT_UP" : "PCT_DOWN", text, [word]);
|
|
607
607
|
}
|
|
608
608
|
function percentUpDownNormalizerRule(priority = 68) {
|
|
609
609
|
return {
|
|
@@ -783,7 +783,7 @@ var FunctionCallParselet = class {
|
|
|
783
783
|
const fnName = token.value.toLowerCase();
|
|
784
784
|
const fnIdx = builtinNameToIndex[fnName];
|
|
785
785
|
if (fnIdx === void 0) {
|
|
786
|
-
throw
|
|
786
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.execution(
|
|
787
787
|
"UNKNOWN_FUNCTION",
|
|
788
788
|
`Unknown function: ${fnName}`,
|
|
789
789
|
{ functionName: fnName }
|
|
@@ -792,10 +792,10 @@ var FunctionCallParselet = class {
|
|
|
792
792
|
parser.consume("LPAREN");
|
|
793
793
|
let argCount = 0;
|
|
794
794
|
if (parser.peek()?.type !== "RPAREN") {
|
|
795
|
-
parser.parseExpression(
|
|
795
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
796
796
|
argCount++;
|
|
797
797
|
while (parser.match("COMMA")) {
|
|
798
|
-
parser.parseExpression(
|
|
798
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
799
799
|
argCount++;
|
|
800
800
|
}
|
|
801
801
|
}
|
|
@@ -852,7 +852,7 @@ var NextLastParselet = class {
|
|
|
852
852
|
const dayToken = parser.peek();
|
|
853
853
|
const targetDay = dayToken ? WEEKDAY_TOKEN_INDEX[dayToken.type] : void 0;
|
|
854
854
|
if (targetDay === void 0) {
|
|
855
|
-
throw
|
|
855
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
856
856
|
"MISSING_WEEKDAY",
|
|
857
857
|
`"${token.value}" must be followed by a day of the week (e.g. "${token.value} Saturday")`,
|
|
858
858
|
{ keyword: token.value, actualType: dayToken?.type, actualValue: dayToken?.value }
|
|
@@ -921,22 +921,22 @@ function unixTimestampToEpochMs(n) {
|
|
|
921
921
|
}
|
|
922
922
|
|
|
923
923
|
// src/packages/datetime/parselets/DatetimeTimestampPluginFunctions.ts
|
|
924
|
-
var WORKDAYS_IN_FN_IDX =
|
|
925
|
-
var WEEKDAY_ON_FN_IDX =
|
|
926
|
-
var TO_DATE_FN_IDX =
|
|
927
|
-
var TO_TIMESTAMP_FN_IDX =
|
|
928
|
-
var MONTH_ON_FN_IDX =
|
|
929
|
-
var WEEK_ON_FN_IDX =
|
|
930
|
-
var IS_WEEKEND_FN_IDX =
|
|
931
|
-
var IS_WORKDAY_FN_IDX =
|
|
932
|
-
var SPAN_BETWEEN_FN_IDX =
|
|
924
|
+
var WORKDAYS_IN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
925
|
+
var WEEKDAY_ON_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
926
|
+
var TO_DATE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
927
|
+
var TO_TIMESTAMP_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
928
|
+
var MONTH_ON_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
929
|
+
var WEEK_ON_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
930
|
+
var IS_WEEKEND_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
931
|
+
var IS_WORKDAY_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
932
|
+
var SPAN_BETWEEN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
933
933
|
function workdaysInDurationHandler(args) {
|
|
934
934
|
const v = args[0];
|
|
935
935
|
let totalDays;
|
|
936
936
|
if (v.type === 6 /* Uom */ && v.unit) {
|
|
937
937
|
const measure = chunkEJ3ILXX6_cjs.getMeasure(v.unit);
|
|
938
938
|
if (measure !== "time") {
|
|
939
|
-
return
|
|
939
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
940
940
|
"WORKDAYS_IN_EXPECTED_DURATION",
|
|
941
941
|
`"workdays in" expects a time duration, got unit "${v.unit}"`
|
|
942
942
|
);
|
|
@@ -950,7 +950,7 @@ function workdaysInDurationHandler(args) {
|
|
|
950
950
|
const fullWeeks = Math.floor(magnitudeDays / 7);
|
|
951
951
|
const remainderDays = magnitudeDays - fullWeeks * 7;
|
|
952
952
|
const workdays = sign * (fullWeeks * 5 + Math.min(remainderDays, 5));
|
|
953
|
-
return
|
|
953
|
+
return chunkIT74O4BE_cjs.numberValue(workdays);
|
|
954
954
|
}
|
|
955
955
|
var WEEKDAY_NAMES = [
|
|
956
956
|
"Sunday",
|
|
@@ -963,15 +963,15 @@ var WEEKDAY_NAMES = [
|
|
|
963
963
|
];
|
|
964
964
|
function asEpochMs(value, fieldName) {
|
|
965
965
|
if (value.type === 4 /* Datetime */) return value.toNumber();
|
|
966
|
-
return
|
|
966
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
967
967
|
"DATE_FIELD_EXPECTED_DATE",
|
|
968
|
-
`"${fieldName}" expects a date, got ${
|
|
968
|
+
`"${fieldName}" expects a date, got ${chunkIT74O4BE_cjs.ValueType[value.type] ?? "an unsupported value"}`
|
|
969
969
|
);
|
|
970
970
|
}
|
|
971
971
|
function weekdayOnDateHandler(args) {
|
|
972
972
|
const epochMs = asEpochMs(args[0], "weekday");
|
|
973
973
|
if (typeof epochMs !== "number") return epochMs;
|
|
974
|
-
return
|
|
974
|
+
return chunkIT74O4BE_cjs.stringValue(WEEKDAY_NAMES[new Date(epochMs).getDay()]);
|
|
975
975
|
}
|
|
976
976
|
var MONTH_NAMES = [
|
|
977
977
|
"January",
|
|
@@ -990,7 +990,7 @@ var MONTH_NAMES = [
|
|
|
990
990
|
function monthOnDateHandler(args) {
|
|
991
991
|
const epochMs = asEpochMs(args[0], "month");
|
|
992
992
|
if (typeof epochMs !== "number") return epochMs;
|
|
993
|
-
return
|
|
993
|
+
return chunkIT74O4BE_cjs.stringValue(MONTH_NAMES[new Date(epochMs).getMonth()]);
|
|
994
994
|
}
|
|
995
995
|
function weekOnDateHandler(args) {
|
|
996
996
|
const epochMs = asEpochMs(args[0], "week");
|
|
@@ -1001,7 +1001,7 @@ function weekOnDateHandler(args) {
|
|
|
1001
1001
|
target.setUTCDate(target.getUTCDate() + 4 - isoDay);
|
|
1002
1002
|
const yearStart = Date.UTC(target.getUTCFullYear(), 0, 1);
|
|
1003
1003
|
const days = Math.floor((target.getTime() - yearStart) / 864e5);
|
|
1004
|
-
return
|
|
1004
|
+
return chunkIT74O4BE_cjs.numberValue(Math.floor(days / 7) + 1);
|
|
1005
1005
|
}
|
|
1006
1006
|
function isWeekendDate(epochMs) {
|
|
1007
1007
|
const day = new Date(epochMs).getDay();
|
|
@@ -1010,15 +1010,15 @@ function isWeekendDate(epochMs) {
|
|
|
1010
1010
|
function isWeekendOnDateHandler(args) {
|
|
1011
1011
|
const epochMs = asEpochMs(args[0], "is a weekend");
|
|
1012
1012
|
if (typeof epochMs !== "number") return epochMs;
|
|
1013
|
-
return
|
|
1013
|
+
return chunkIT74O4BE_cjs.boolValue(isWeekendDate(epochMs));
|
|
1014
1014
|
}
|
|
1015
1015
|
function isWorkdayOnDateHandler(args) {
|
|
1016
1016
|
const epochMs = asEpochMs(args[0], "is a workday");
|
|
1017
1017
|
if (typeof epochMs !== "number") return epochMs;
|
|
1018
|
-
return
|
|
1018
|
+
return chunkIT74O4BE_cjs.boolValue(!isWeekendDate(epochMs));
|
|
1019
1019
|
}
|
|
1020
1020
|
function spanBetweenDatesHandler(args) {
|
|
1021
|
-
return
|
|
1021
|
+
return chunkIT74O4BE_cjs.uomValue(Math.abs(args[0].toNumber() - args[1].toNumber()), "ms");
|
|
1022
1022
|
}
|
|
1023
1023
|
function toDateFromAnyHandler(args) {
|
|
1024
1024
|
const v = args[0];
|
|
@@ -1028,28 +1028,28 @@ function toDateFromAnyHandler(args) {
|
|
|
1028
1028
|
if (v.type === 3 /* String */) {
|
|
1029
1029
|
const ms = parseIso8601(v.value);
|
|
1030
1030
|
if (ms === null) {
|
|
1031
|
-
return
|
|
1031
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
1032
1032
|
"INVALID_ISO8601_STRING",
|
|
1033
1033
|
`"${v.value}" is not a recognizable ISO8601 date/time string`
|
|
1034
1034
|
);
|
|
1035
1035
|
}
|
|
1036
|
-
return
|
|
1036
|
+
return chunkIT74O4BE_cjs.datetimeValue(ms);
|
|
1037
1037
|
}
|
|
1038
|
-
return
|
|
1038
|
+
return chunkIT74O4BE_cjs.datetimeValue(unixTimestampToEpochMs(v.toNumber()));
|
|
1039
1039
|
}
|
|
1040
1040
|
function toTimestampFromAnyHandler(args) {
|
|
1041
1041
|
const v = args[0];
|
|
1042
1042
|
if (v.type === 3 /* String */) {
|
|
1043
1043
|
const ms = parseIso8601(v.value);
|
|
1044
1044
|
if (ms === null) {
|
|
1045
|
-
return
|
|
1045
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
1046
1046
|
"INVALID_ISO8601_STRING",
|
|
1047
1047
|
`"${v.value}" is not a recognizable ISO8601 date/time string`
|
|
1048
1048
|
);
|
|
1049
1049
|
}
|
|
1050
|
-
return
|
|
1050
|
+
return chunkIT74O4BE_cjs.numberValue(Math.floor(ms / 1e3));
|
|
1051
1051
|
}
|
|
1052
|
-
return
|
|
1052
|
+
return chunkIT74O4BE_cjs.numberValue(Math.floor(v.toNumber() / 1e3));
|
|
1053
1053
|
}
|
|
1054
1054
|
var workdaysInDuration = workdaysInDurationHandler;
|
|
1055
1055
|
var weekdayOnDate = weekdayOnDateHandler;
|
|
@@ -1080,10 +1080,10 @@ var WorkdayOffsetParselet = class {
|
|
|
1080
1080
|
constructor(direction) {
|
|
1081
1081
|
this.direction = direction;
|
|
1082
1082
|
this.category = "Date/Time";
|
|
1083
|
-
this.bindingPower =
|
|
1083
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
1084
1084
|
}
|
|
1085
1085
|
parse(parser, _left, _token, builder) {
|
|
1086
|
-
parser.parseExpression(
|
|
1086
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Sum, builder);
|
|
1087
1087
|
builder.emitOpcode(96 /* DATE_WORKDAY_OFFSET */);
|
|
1088
1088
|
builder.emitByte(this.direction === "backward" ? 1 : 0);
|
|
1089
1089
|
}
|
|
@@ -1095,9 +1095,9 @@ var WorkdaysBetweenParselet = class {
|
|
|
1095
1095
|
this.category = "Date/Time";
|
|
1096
1096
|
}
|
|
1097
1097
|
parse(parser, _token, builder) {
|
|
1098
|
-
parser.parseExpression(
|
|
1098
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
1099
1099
|
parser.consume("AND_CONJ");
|
|
1100
|
-
parser.parseExpression(
|
|
1100
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
1101
1101
|
builder.emitOpcode(97 /* DATE_WORKDAYS_BETWEEN */);
|
|
1102
1102
|
}
|
|
1103
1103
|
};
|
|
@@ -1132,9 +1132,9 @@ var DurationBetweenParselet = class {
|
|
|
1132
1132
|
}
|
|
1133
1133
|
parse(parser, token, builder) {
|
|
1134
1134
|
const unit = token.value;
|
|
1135
|
-
parser.parseExpression(
|
|
1135
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
1136
1136
|
parser.consume("AND_CONJ");
|
|
1137
|
-
parser.parseExpression(
|
|
1137
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
1138
1138
|
builder.emitOpcode(50 /* CALL_PLUGIN */);
|
|
1139
1139
|
builder.emitIndex(SPAN_BETWEEN_FN_IDX);
|
|
1140
1140
|
builder.emitIndex(2);
|
|
@@ -1149,7 +1149,7 @@ var DayTypePredicateParselet = class {
|
|
|
1149
1149
|
constructor(functionIndex) {
|
|
1150
1150
|
this.functionIndex = functionIndex;
|
|
1151
1151
|
this.category = "Date/Time";
|
|
1152
|
-
this.bindingPower =
|
|
1152
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
1153
1153
|
}
|
|
1154
1154
|
parse(parser, left, token, builder) {
|
|
1155
1155
|
builder.emitOpcode(50 /* CALL_PLUGIN */);
|
|
@@ -1175,7 +1175,7 @@ var CurrentTimestampParselet = class {
|
|
|
1175
1175
|
var ToDateParselet = class {
|
|
1176
1176
|
constructor() {
|
|
1177
1177
|
this.category = "Date/Time";
|
|
1178
|
-
this.bindingPower =
|
|
1178
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
1179
1179
|
}
|
|
1180
1180
|
parse(parser, left, token, builder) {
|
|
1181
1181
|
builder.emitOpcode(50 /* CALL_PLUGIN */);
|
|
@@ -1188,7 +1188,7 @@ var ToDateParselet = class {
|
|
|
1188
1188
|
var ToTimestampParselet = class {
|
|
1189
1189
|
constructor() {
|
|
1190
1190
|
this.category = "Date/Time";
|
|
1191
|
-
this.bindingPower =
|
|
1191
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
1192
1192
|
}
|
|
1193
1193
|
parse(parser, left, token, builder) {
|
|
1194
1194
|
builder.emitOpcode(50 /* CALL_PLUGIN */);
|
|
@@ -1222,7 +1222,7 @@ function untilSinceNormalizerRule(priority = 60) {
|
|
|
1222
1222
|
const fusedType = keywordToken.type === "UNTIL" ? "UNTIL_UNIT" : "SINCE_UNIT";
|
|
1223
1223
|
return {
|
|
1224
1224
|
consumed: 2,
|
|
1225
|
-
replacement: [
|
|
1225
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken(fusedType, unitToken.value, [unitToken, keywordToken])],
|
|
1226
1226
|
ruleName: `datetime:${keywordToken.type.toLowerCase()}`
|
|
1227
1227
|
};
|
|
1228
1228
|
}
|
|
@@ -1259,7 +1259,7 @@ function betweenUnitNormalizerRule(priority = 60) {
|
|
|
1259
1259
|
}
|
|
1260
1260
|
return {
|
|
1261
1261
|
consumed: howManyLength + 2,
|
|
1262
|
-
replacement: [
|
|
1262
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("BETWEEN_UNIT", unitToken.value, sources)],
|
|
1263
1263
|
ruleName: "datetime:between"
|
|
1264
1264
|
};
|
|
1265
1265
|
}
|
|
@@ -1280,7 +1280,7 @@ function workdayRateDenominatorNormalizerRule(priority = 70) {
|
|
|
1280
1280
|
const syntheticOne = {
|
|
1281
1281
|
...unit,
|
|
1282
1282
|
type: "NUMBER",
|
|
1283
|
-
typeId:
|
|
1283
|
+
typeId: chunkG2YPPLGX_cjs.tokenTypeId("NUMBER"),
|
|
1284
1284
|
value: "1",
|
|
1285
1285
|
text: "1"
|
|
1286
1286
|
};
|
|
@@ -1295,7 +1295,7 @@ function workdayRateDenominatorNormalizerRule(priority = 70) {
|
|
|
1295
1295
|
|
|
1296
1296
|
// src/packages/datetime/normalizer/DateLiteralNormalizerRule.ts
|
|
1297
1297
|
var DATETIME_LITERAL_TYPE = "DATETIME_LITERAL";
|
|
1298
|
-
var DATETIME_LITERAL_TYPE_ID =
|
|
1298
|
+
var DATETIME_LITERAL_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId(DATETIME_LITERAL_TYPE);
|
|
1299
1299
|
var PLAIN_INTEGER = /^\d+$/;
|
|
1300
1300
|
var DOT_DAY_MONTH = /^\d{1,2}\.\d{1,2}$/;
|
|
1301
1301
|
var DOT_LEADING_YEAR = /^\.(\d{2}|\d{4})$/;
|
|
@@ -1324,7 +1324,7 @@ function buildDateToken(day, month, year, sourceTokens, ruleName) {
|
|
|
1324
1324
|
}
|
|
1325
1325
|
const first = sourceTokens[0];
|
|
1326
1326
|
const text = sourceTokens.map((t) => t.value).join("");
|
|
1327
|
-
const fusedToken = new
|
|
1327
|
+
const fusedToken = new chunkYJHY7CMN_cjs.LexerToken(
|
|
1328
1328
|
DATETIME_LITERAL_TYPE,
|
|
1329
1329
|
DATETIME_LITERAL_TYPE_ID,
|
|
1330
1330
|
String(date.getTime()),
|
|
@@ -1365,7 +1365,7 @@ function fuseIsoTimestamp(tokens, pos, ruleName) {
|
|
|
1365
1365
|
if (covered !== matched[0].length) return null;
|
|
1366
1366
|
const epochMs = parseIso8601(matched[0]);
|
|
1367
1367
|
if (epochMs === null) return null;
|
|
1368
|
-
const fusedToken = new
|
|
1368
|
+
const fusedToken = new chunkYJHY7CMN_cjs.LexerToken(
|
|
1369
1369
|
DATETIME_LITERAL_TYPE,
|
|
1370
1370
|
DATETIME_LITERAL_TYPE_ID,
|
|
1371
1371
|
String(epochMs),
|
|
@@ -1558,7 +1558,7 @@ var DaysInPeriodParselet = class {
|
|
|
1558
1558
|
}
|
|
1559
1559
|
const year = this.readOptionalYear(parser);
|
|
1560
1560
|
if (year !== null) return daysInYear(year);
|
|
1561
|
-
throw
|
|
1561
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
1562
1562
|
"DAYS_IN_EXPECTED_PERIOD",
|
|
1563
1563
|
'Expected a month, quarter or year, as in "days in February 2020" or "days in Q3"'
|
|
1564
1564
|
);
|
|
@@ -1624,7 +1624,7 @@ function daysInPeriodNormalizerRule(priority = 60) {
|
|
|
1624
1624
|
if (!startsPeriod(tokens[pos + 2])) return null;
|
|
1625
1625
|
return {
|
|
1626
1626
|
consumed: 2,
|
|
1627
|
-
replacement: [
|
|
1627
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("DAYS_IN_PERIOD", "days in", [days, tokens[pos + 1]])],
|
|
1628
1628
|
ruleName: "datetime:days-in-period"
|
|
1629
1629
|
};
|
|
1630
1630
|
}
|
|
@@ -1766,7 +1766,7 @@ var DATETIME_PACKAGE = {
|
|
|
1766
1766
|
{ index: SPAN_BETWEEN_FN_IDX, handler: spanBetweenDates }
|
|
1767
1767
|
],
|
|
1768
1768
|
asConverters: {
|
|
1769
|
-
iso8601: (value) =>
|
|
1769
|
+
iso8601: (value) => chunkIT74O4BE_cjs.stringValue(formatIso8601Local(value.toNumber())),
|
|
1770
1770
|
// The same three fields the "what X is it" questions answer, in the
|
|
1771
1771
|
// composable form: `next friday + 2 weeks as weekday`. Question phrases
|
|
1772
1772
|
// only ever take a bare date expression, whereas `as` binds after a
|
|
@@ -2090,10 +2090,10 @@ function tryConsumeZoneReference(parser) {
|
|
|
2090
2090
|
}
|
|
2091
2091
|
|
|
2092
2092
|
// src/packages/time/parselets/TimezonePluginFunctions.ts
|
|
2093
|
-
var ZONE_CONVERT_FN_IDX =
|
|
2094
|
-
var TIME_IN_ZONE_FN_IDX =
|
|
2095
|
-
var DATE_IN_ZONE_FN_IDX =
|
|
2096
|
-
var TIME_DIFFERENCE_FN_IDX =
|
|
2093
|
+
var ZONE_CONVERT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
2094
|
+
var TIME_IN_ZONE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
2095
|
+
var DATE_IN_ZONE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
2096
|
+
var TIME_DIFFERENCE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
2097
2097
|
function zoneConvertHandler(args) {
|
|
2098
2098
|
const totalMinutes = args[0].toNumber();
|
|
2099
2099
|
const sourceZoneRef = args[1].value;
|
|
@@ -2109,17 +2109,17 @@ function zoneConvertHandler(args) {
|
|
|
2109
2109
|
);
|
|
2110
2110
|
const time = formatTimeInZone(utcMs, targetZoneRef);
|
|
2111
2111
|
const dayShift = dayShiftBetweenZones(utcMs, targetZoneRef, sourceZoneRef);
|
|
2112
|
-
if (dayShift === 0) return
|
|
2112
|
+
if (dayShift === 0) return chunkIT74O4BE_cjs.stringValue(time);
|
|
2113
2113
|
const sign = dayShift > 0 ? "+" : "";
|
|
2114
|
-
return
|
|
2114
|
+
return chunkIT74O4BE_cjs.stringValue(`${time} (${sign}${dayShift} day${Math.abs(dayShift) === 1 ? "" : "s"})`);
|
|
2115
2115
|
}
|
|
2116
2116
|
function timeInZoneHandler(args) {
|
|
2117
2117
|
const zoneRef = args[0].value;
|
|
2118
|
-
return
|
|
2118
|
+
return chunkIT74O4BE_cjs.stringValue(formatTimeInZone(Date.now(), zoneRef));
|
|
2119
2119
|
}
|
|
2120
2120
|
function dateInZoneHandler(args) {
|
|
2121
2121
|
const zoneRef = args[0].value;
|
|
2122
|
-
return
|
|
2122
|
+
return chunkIT74O4BE_cjs.stringValue(formatDateInZone(Date.now(), zoneRef));
|
|
2123
2123
|
}
|
|
2124
2124
|
function timeDifferenceHandler(args) {
|
|
2125
2125
|
const zoneRef1 = args[0].value;
|
|
@@ -2131,7 +2131,7 @@ function timeDifferenceHandler(args) {
|
|
|
2131
2131
|
const offset2 = resolveOffsetMinutes(zoneRef2, now);
|
|
2132
2132
|
const diff = offset2 - offset1;
|
|
2133
2133
|
if (diff === 0) {
|
|
2134
|
-
return
|
|
2134
|
+
return chunkIT74O4BE_cjs.stringValue(`${label2} and ${label1} currently share the same UTC offset`);
|
|
2135
2135
|
}
|
|
2136
2136
|
const ahead = diff > 0 ? label2 : label1;
|
|
2137
2137
|
const behind = diff > 0 ? label1 : label2;
|
|
@@ -2141,7 +2141,7 @@ function timeDifferenceHandler(args) {
|
|
|
2141
2141
|
const parts = [];
|
|
2142
2142
|
if (hours > 0) parts.push(`${hours} hour${hours === 1 ? "" : "s"}`);
|
|
2143
2143
|
if (minutes > 0) parts.push(`${minutes} minute${minutes === 1 ? "" : "s"}`);
|
|
2144
|
-
return
|
|
2144
|
+
return chunkIT74O4BE_cjs.stringValue(`${ahead} is ${parts.join(" ")} ahead of ${behind}`);
|
|
2145
2145
|
}
|
|
2146
2146
|
|
|
2147
2147
|
// src/packages/time/parselets/ClockTimeParselet.ts
|
|
@@ -2154,7 +2154,7 @@ var ClockTimeParselet = class {
|
|
|
2154
2154
|
const sourceZoneRef = tryConsumeZoneReference(parser);
|
|
2155
2155
|
if (sourceZoneRef !== null) {
|
|
2156
2156
|
if (parser.peek()?.type !== "IN") {
|
|
2157
|
-
throw
|
|
2157
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2158
2158
|
"TIME_ZONE_EXPECTED_IN",
|
|
2159
2159
|
`Expected "in <city>" after the zone name (e.g. "6pm Sydney in Chicago") but got ${parser.peek() ? `"${parser.peek().value}"` : "end of input"}`
|
|
2160
2160
|
);
|
|
@@ -2162,7 +2162,7 @@ var ClockTimeParselet = class {
|
|
|
2162
2162
|
parser.consume();
|
|
2163
2163
|
const target = tryConsumeZoneReference(parser);
|
|
2164
2164
|
if (target === null) {
|
|
2165
|
-
throw
|
|
2165
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2166
2166
|
"TIME_ZONE_EXPECTED_TARGET",
|
|
2167
2167
|
`Expected a city or zone name after "in" (e.g. "6pm Sydney in Chicago")`
|
|
2168
2168
|
);
|
|
@@ -2237,7 +2237,7 @@ function timeOrDateInZoneParselet(pluginFnIdx) {
|
|
|
2237
2237
|
parse(parser, token, builder) {
|
|
2238
2238
|
const zone = tryConsumeZoneReference(parser);
|
|
2239
2239
|
if (zone === null) {
|
|
2240
|
-
throw
|
|
2240
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2241
2241
|
"TIME_ZONE_EXPECTED_CITY",
|
|
2242
2242
|
`Expected a city or zone name after "${token.value}" (e.g. "time in Paris")`
|
|
2243
2243
|
);
|
|
@@ -2259,7 +2259,7 @@ var TimeDifferenceParselet = class {
|
|
|
2259
2259
|
parse(parser, token, builder) {
|
|
2260
2260
|
const zone1 = tryConsumeZoneReference(parser);
|
|
2261
2261
|
if (zone1 === null) {
|
|
2262
|
-
throw
|
|
2262
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2263
2263
|
"TIME_DIFFERENCE_EXPECTED_CITY",
|
|
2264
2264
|
`Expected a city or zone name after "time difference between" (e.g. "time difference between Seattle and Moscow")`
|
|
2265
2265
|
);
|
|
@@ -2267,7 +2267,7 @@ var TimeDifferenceParselet = class {
|
|
|
2267
2267
|
parser.consume("AND_CONJ");
|
|
2268
2268
|
const zone2 = tryConsumeZoneReference(parser);
|
|
2269
2269
|
if (zone2 === null) {
|
|
2270
|
-
throw
|
|
2270
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2271
2271
|
"TIME_DIFFERENCE_EXPECTED_SECOND_CITY",
|
|
2272
2272
|
`Expected a second city or zone name after "and" (e.g. "time difference between Seattle and Moscow")`
|
|
2273
2273
|
);
|
|
@@ -2295,7 +2295,7 @@ var VideoTimecodeParselet = class {
|
|
|
2295
2295
|
const [hours, minutes, seconds, frames] = token.value.split(",").map(Number);
|
|
2296
2296
|
const separator = parser.peek();
|
|
2297
2297
|
if (!separator || separator.type !== "RATE_AT" && separator.type !== "AT") {
|
|
2298
|
-
throw
|
|
2298
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2299
2299
|
"TIMECODE_EXPECTED_FPS",
|
|
2300
2300
|
`A video timecode must specify a frame rate, e.g. "${token.value.split(",").join(":")} at 30 fps" or "... @ 30 fps"`
|
|
2301
2301
|
);
|
|
@@ -2303,7 +2303,7 @@ var VideoTimecodeParselet = class {
|
|
|
2303
2303
|
parser.consume();
|
|
2304
2304
|
const fpsToken = parser.peek();
|
|
2305
2305
|
if (!fpsToken || fpsToken.type !== "FPS_RATE") {
|
|
2306
|
-
throw
|
|
2306
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2307
2307
|
"TIMECODE_EXPECTED_FPS",
|
|
2308
2308
|
`Expected "<number> fps" after "${separator.value}" (e.g. "at 30 fps")`
|
|
2309
2309
|
);
|
|
@@ -2312,18 +2312,18 @@ var VideoTimecodeParselet = class {
|
|
|
2312
2312
|
const fps = parseFloat(fpsToken.value);
|
|
2313
2313
|
const fpsWhole = Math.round(fps);
|
|
2314
2314
|
if (frames >= fpsWhole) {
|
|
2315
|
-
throw
|
|
2315
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2316
2316
|
"TIMECODE_FRAME_OUT_OF_RANGE",
|
|
2317
2317
|
`Frame number ${frames} is out of range for ${fps} fps (must be 0-${fpsWhole - 1})`
|
|
2318
2318
|
);
|
|
2319
2319
|
}
|
|
2320
2320
|
const totalFrames = (hours * 3600 + minutes * 60 + seconds) * fpsWhole + frames;
|
|
2321
|
-
let unit =
|
|
2321
|
+
let unit = chunkIT74O4BE_cjs.timecodeUnit(fps);
|
|
2322
2322
|
if (parser.peek()?.type === "IN") {
|
|
2323
2323
|
parser.consume();
|
|
2324
2324
|
const framesWord = parser.peek();
|
|
2325
2325
|
if (!framesWord || framesWord.type !== "IDENT" || framesWord.value.toLowerCase() !== "frames") {
|
|
2326
|
-
throw
|
|
2326
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2327
2327
|
"TIMECODE_EXPECTED_FRAMES",
|
|
2328
2328
|
`Expected "frames" after "in" (e.g. "... in frames") but got ${framesWord ? `"${framesWord.value}"` : "end of input"}`
|
|
2329
2329
|
);
|
|
@@ -2364,7 +2364,7 @@ var FrameCountParselet = class {
|
|
|
2364
2364
|
parser.consume();
|
|
2365
2365
|
const fpsToken = parser.peek();
|
|
2366
2366
|
if (!fpsToken || fpsToken.type !== "FPS_RATE") {
|
|
2367
|
-
throw
|
|
2367
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2368
2368
|
"TIMECODE_EXPECTED_FPS",
|
|
2369
2369
|
`Expected "<number> fps" after "${separator.value}" (e.g. "@ 30 fps")`
|
|
2370
2370
|
);
|
|
@@ -2403,7 +2403,7 @@ function clockTimeNormalizerRule(priority = 65) {
|
|
|
2403
2403
|
name: "time:clock-time",
|
|
2404
2404
|
priority,
|
|
2405
2405
|
match(tokens, pos) {
|
|
2406
|
-
if (
|
|
2406
|
+
if (chunkICEKS6YC_cjs.isInsideRangeContext(tokens, pos)) return null;
|
|
2407
2407
|
const hourToken = tokens[pos];
|
|
2408
2408
|
if (hourToken.type !== "NUMBER") return null;
|
|
2409
2409
|
const hour = parseInt(hourToken.value, 10);
|
|
@@ -2419,7 +2419,7 @@ function clockTimeNormalizerRule(priority = 65) {
|
|
|
2419
2419
|
const consumed = hasAmPm ? 4 : 3;
|
|
2420
2420
|
return {
|
|
2421
2421
|
consumed,
|
|
2422
|
-
replacement: [
|
|
2422
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("CLOCK_TIME", String(totalMinutes), tokens.slice(pos, pos + consumed))],
|
|
2423
2423
|
ruleName: "time:clock-time"
|
|
2424
2424
|
};
|
|
2425
2425
|
}
|
|
@@ -2429,7 +2429,7 @@ function clockTimeNormalizerRule(priority = 65) {
|
|
|
2429
2429
|
if (totalMinutes === null) return null;
|
|
2430
2430
|
return {
|
|
2431
2431
|
consumed: 2,
|
|
2432
|
-
replacement: [
|
|
2432
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("CLOCK_TIME", String(totalMinutes), tokens.slice(pos, pos + 2))],
|
|
2433
2433
|
ruleName: "time:clock-time"
|
|
2434
2434
|
};
|
|
2435
2435
|
}
|
|
@@ -2452,7 +2452,7 @@ function clockTimeIntervalNormalizerRule(priority = 66) {
|
|
|
2452
2452
|
if (end?.type !== "CLOCK_TIME") return null;
|
|
2453
2453
|
return {
|
|
2454
2454
|
consumed: 3,
|
|
2455
|
-
replacement: [
|
|
2455
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("CLOCK_TIME_INTERVAL", `${start.value}:${end.value}`, tokens.slice(pos, pos + 3))],
|
|
2456
2456
|
ruleName: "time:clock-time-interval"
|
|
2457
2457
|
};
|
|
2458
2458
|
}
|
|
@@ -2471,7 +2471,7 @@ function fpsRateNormalizerRule(priority = 65) {
|
|
|
2471
2471
|
if (fpsToken?.type !== "IDENT" || fpsToken.value.toLowerCase() !== "fps") return null;
|
|
2472
2472
|
return {
|
|
2473
2473
|
consumed: 2,
|
|
2474
|
-
replacement: [
|
|
2474
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("FPS_RATE", numberToken.value, tokens.slice(pos, pos + 2))],
|
|
2475
2475
|
ruleName: "time:fps-rate"
|
|
2476
2476
|
};
|
|
2477
2477
|
}
|
|
@@ -2484,7 +2484,7 @@ function laptimeNormalizerRule(priority = 70) {
|
|
|
2484
2484
|
name: "time:laptime",
|
|
2485
2485
|
priority,
|
|
2486
2486
|
match(tokens, pos) {
|
|
2487
|
-
if (
|
|
2487
|
+
if (chunkICEKS6YC_cjs.isInsideRangeContext(tokens, pos)) return null;
|
|
2488
2488
|
const h = tokens[pos];
|
|
2489
2489
|
const c1 = tokens[pos + 1];
|
|
2490
2490
|
const m = tokens[pos + 2];
|
|
@@ -2503,7 +2503,7 @@ function laptimeNormalizerRule(priority = 70) {
|
|
|
2503
2503
|
const totalSeconds = hours * 3600 + minutes * 60 + seconds;
|
|
2504
2504
|
return {
|
|
2505
2505
|
consumed: 5,
|
|
2506
|
-
replacement: [
|
|
2506
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("LAPTIME", String(totalSeconds), tokens.slice(pos, pos + 5))],
|
|
2507
2507
|
ruleName: "time:laptime"
|
|
2508
2508
|
};
|
|
2509
2509
|
}
|
|
@@ -2516,7 +2516,7 @@ function videoTimecodeNormalizerRule(priority = 75) {
|
|
|
2516
2516
|
name: "time:video-timecode",
|
|
2517
2517
|
priority,
|
|
2518
2518
|
match(tokens, pos) {
|
|
2519
|
-
if (
|
|
2519
|
+
if (chunkICEKS6YC_cjs.isInsideRangeContext(tokens, pos)) return null;
|
|
2520
2520
|
const h = tokens[pos];
|
|
2521
2521
|
const c1 = tokens[pos + 1];
|
|
2522
2522
|
const m = tokens[pos + 2];
|
|
@@ -2542,7 +2542,7 @@ function videoTimecodeNormalizerRule(priority = 75) {
|
|
|
2542
2542
|
return {
|
|
2543
2543
|
consumed: 7,
|
|
2544
2544
|
replacement: [
|
|
2545
|
-
|
|
2545
|
+
chunkICEKS6YC_cjs.createFusedToken("VIDEO_TIMECODE", `${hours},${minutes},${seconds},${frames}`, tokens.slice(pos, pos + 7))
|
|
2546
2546
|
],
|
|
2547
2547
|
ruleName: "time:video-timecode"
|
|
2548
2548
|
};
|
|
@@ -2562,7 +2562,7 @@ function frameCountNormalizerRule(priority = 65) {
|
|
|
2562
2562
|
if (framesToken?.type !== "IDENT" || framesToken.value.toLowerCase() !== "frames") return null;
|
|
2563
2563
|
return {
|
|
2564
2564
|
consumed: 2,
|
|
2565
|
-
replacement: [
|
|
2565
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("FRAME_COUNT", numberToken.value, tokens.slice(pos, pos + 2))],
|
|
2566
2566
|
ruleName: "time:frame-count"
|
|
2567
2567
|
};
|
|
2568
2568
|
}
|
|
@@ -2588,7 +2588,7 @@ function durationSeconds(value) {
|
|
|
2588
2588
|
function toTimespanString(value) {
|
|
2589
2589
|
const total = durationSeconds(value);
|
|
2590
2590
|
if (total === null) {
|
|
2591
|
-
return
|
|
2591
|
+
return chunkIT74O4BE_cjs.stringValue(`"as timespan" needs a duration, got ${value.unit ?? "a non-duration"}`);
|
|
2592
2592
|
}
|
|
2593
2593
|
const negative = total < 0;
|
|
2594
2594
|
let remaining = Math.abs(total);
|
|
@@ -2605,12 +2605,12 @@ function toTimespanString(value) {
|
|
|
2605
2605
|
if (secondsLeft > 0 || parts.length === 0) {
|
|
2606
2606
|
parts.push(`${secondsLeft} ${secondsLeft === 1 ? "second" : "seconds"}`);
|
|
2607
2607
|
}
|
|
2608
|
-
return
|
|
2608
|
+
return chunkIT74O4BE_cjs.stringValue((negative ? "-" : "") + parts.join(" "));
|
|
2609
2609
|
}
|
|
2610
2610
|
function toLaptimeString(value) {
|
|
2611
2611
|
const total = durationSeconds(value);
|
|
2612
2612
|
if (total === null) {
|
|
2613
|
-
return
|
|
2613
|
+
return chunkIT74O4BE_cjs.stringValue(`"as laptime" needs a duration, got ${value.unit ?? "a non-duration"}`);
|
|
2614
2614
|
}
|
|
2615
2615
|
const negative = total < 0;
|
|
2616
2616
|
const rounded = Math.round(Math.abs(total) * 1e3) / 1e3;
|
|
@@ -2620,7 +2620,7 @@ function toLaptimeString(value) {
|
|
|
2620
2620
|
const whole = Math.floor(seconds);
|
|
2621
2621
|
const fraction = Math.round((seconds - whole) * 1e3);
|
|
2622
2622
|
const base = `${pad(hours)}:${pad(minutes)}:${pad(whole)}`;
|
|
2623
|
-
return
|
|
2623
|
+
return chunkIT74O4BE_cjs.stringValue((negative ? "-" : "") + (fraction > 0 ? `${base}.${String(fraction).padStart(3, "0")}` : base));
|
|
2624
2624
|
}
|
|
2625
2625
|
function pad(n) {
|
|
2626
2626
|
return n < 10 ? `0${n}` : String(n);
|
|
@@ -2673,7 +2673,7 @@ function definePhrasePattern(opts) {
|
|
|
2673
2673
|
for (const alt of opts.alternatives) {
|
|
2674
2674
|
const first = alt.slots[0];
|
|
2675
2675
|
if (!first || first.kind !== "keyword") {
|
|
2676
|
-
throw
|
|
2676
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.config(
|
|
2677
2677
|
"INVALID_PHRASE_PATTERN",
|
|
2678
2678
|
"Every PhraseAlternative's first slot must be a `keyword` slot \u2014 alternatives are chosen by peeking the next token, which only works if the choice is decidable from one leading keyword.",
|
|
2679
2679
|
{ category: opts.category }
|
|
@@ -2690,7 +2690,7 @@ function definePhrasePattern(opts) {
|
|
|
2690
2690
|
});
|
|
2691
2691
|
if (!alternative) {
|
|
2692
2692
|
const expected = opts.alternatives.map((alt) => alt.slots[0].tokenTypes.join("|")).join(", ");
|
|
2693
|
-
throw
|
|
2693
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2694
2694
|
"NO_MATCHING_PHRASE_ALTERNATIVE",
|
|
2695
2695
|
`Expected one of [${expected}] but got "${next?.type ?? "end of input"}" ("${next?.value ?? ""}")`,
|
|
2696
2696
|
{ category: opts.category, expected, actualType: next?.type, actualValue: next?.value }
|
|
@@ -2701,7 +2701,7 @@ function definePhrasePattern(opts) {
|
|
|
2701
2701
|
if (slot.kind === "keyword") {
|
|
2702
2702
|
const token = parser.peek();
|
|
2703
2703
|
if (!token || !slot.tokenTypes.includes(token.type)) {
|
|
2704
|
-
throw
|
|
2704
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2705
2705
|
"PHRASE_KEYWORD_MISMATCH",
|
|
2706
2706
|
`Expected one of [${slot.tokenTypes.join("|")}] but got "${token?.type ?? "end of input"}" ("${token?.value ?? ""}")`,
|
|
2707
2707
|
{ category: opts.category, expected: slot.tokenTypes, actualType: token?.type, actualValue: token?.value }
|
|
@@ -2731,7 +2731,7 @@ var keywordLedRollPattern = definePhrasePattern({
|
|
|
2731
2731
|
{
|
|
2732
2732
|
slots: [
|
|
2733
2733
|
{ kind: "keyword", tokenTypes: ["BETWEEN"] },
|
|
2734
|
-
{ kind: "expr", bindingPower:
|
|
2734
|
+
{ kind: "expr", bindingPower: chunkMI7OTUHL_cjs.BindingPower.Product },
|
|
2735
2735
|
// The word "and" lexes as PLUS, not a dedicated AND token, en.ts's
|
|
2736
2736
|
// keywordMap maps `and: "PLUS"` (a synonym for arithmetic "+").
|
|
2737
2737
|
// The original hand-written parselet never actually checked the
|
|
@@ -2746,7 +2746,7 @@ var keywordLedRollPattern = definePhrasePattern({
|
|
|
2746
2746
|
{
|
|
2747
2747
|
slots: [
|
|
2748
2748
|
{ kind: "keyword", tokenTypes: ["FROM"] },
|
|
2749
|
-
{ kind: "expr", bindingPower:
|
|
2749
|
+
{ kind: "expr", bindingPower: chunkMI7OTUHL_cjs.BindingPower.Product },
|
|
2750
2750
|
{ kind: "keyword", tokenTypes: ["TO"] },
|
|
2751
2751
|
{ kind: "expr" }
|
|
2752
2752
|
],
|
|
@@ -2801,7 +2801,7 @@ var VariableParselet = class {
|
|
|
2801
2801
|
parse(parser, _token, builder) {
|
|
2802
2802
|
const nameToken = parser.consume();
|
|
2803
2803
|
if (nameToken.type !== "IDENT" && nameToken.type !== "UNIT") {
|
|
2804
|
-
throw
|
|
2804
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2805
2805
|
"EXPECTED_IDENTIFIER",
|
|
2806
2806
|
`Expected identifier or unit after colon, got ${nameToken.type}`,
|
|
2807
2807
|
{ tokenType: nameToken.type }
|
|
@@ -2840,7 +2840,7 @@ var GlobalVariableParselet = class {
|
|
|
2840
2840
|
parser.consume("COLON");
|
|
2841
2841
|
const nameToken = parser.consume();
|
|
2842
2842
|
if (nameToken.type !== "IDENT" && nameToken.type !== "UNIT") {
|
|
2843
|
-
throw
|
|
2843
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
2844
2844
|
"EXPECTED_IDENTIFIER",
|
|
2845
2845
|
`Expected identifier after 'global :', got ${nameToken.type}`,
|
|
2846
2846
|
{ tokenType: nameToken.type }
|
|
@@ -2890,11 +2890,11 @@ var GlobalVariableAsyncResolver = class {
|
|
|
2890
2890
|
const op = opcodes[i];
|
|
2891
2891
|
if (op === 62 /* LOAD_GLOBAL_VAR */) {
|
|
2892
2892
|
const varName = strings[opcodes[i + 1]];
|
|
2893
|
-
if (!
|
|
2893
|
+
if (!chunkFR7RNOPT_cjs.sharedGlobalVariableStore.has(varName)) {
|
|
2894
2894
|
return this.pendingResultFor(varName, packageId, signal);
|
|
2895
2895
|
}
|
|
2896
2896
|
}
|
|
2897
|
-
i =
|
|
2897
|
+
i = chunk4K5W7EH2_cjs.nextInstruction(opcodes, i);
|
|
2898
2898
|
}
|
|
2899
2899
|
return null;
|
|
2900
2900
|
}
|
|
@@ -2902,7 +2902,7 @@ var GlobalVariableAsyncResolver = class {
|
|
|
2902
2902
|
let resolver = this.pending.get(varName);
|
|
2903
2903
|
if (!resolver) {
|
|
2904
2904
|
resolver = new Promise((resolve) => {
|
|
2905
|
-
const unsubscribe =
|
|
2905
|
+
const unsubscribe = chunkFR7RNOPT_cjs.sharedGlobalVariableStore.subscribe((name, value) => {
|
|
2906
2906
|
if (name !== varName) return;
|
|
2907
2907
|
unsubscribe();
|
|
2908
2908
|
this.pending.delete(varName);
|
|
@@ -2949,7 +2949,7 @@ var VARIABLES_PACKAGE = {
|
|
|
2949
2949
|
|
|
2950
2950
|
// src/uom/HistoricalCurrency.ts
|
|
2951
2951
|
var HISTORICAL_CURRENCY_NS = "currency-historical";
|
|
2952
|
-
var HISTORICAL_CURRENCY_FN_IDX =
|
|
2952
|
+
var HISTORICAL_CURRENCY_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
2953
2953
|
var HistoricalCurrencyErrorCodes = {
|
|
2954
2954
|
/** No {@link HistoricalRateProvider} was supplied, so `on <date>` conversions cannot be answered. NOT a fall back to today's rate. */
|
|
2955
2955
|
NOT_CONFIGURED: "HISTORICAL_RATES_NOT_CONFIGURED",
|
|
@@ -2970,8 +2970,8 @@ function pad2(n) {
|
|
|
2970
2970
|
return n < 10 ? `0${n}` : String(n);
|
|
2971
2971
|
}
|
|
2972
2972
|
function tryConsumeCurrencyOnDate(parser, to, from) {
|
|
2973
|
-
if (!
|
|
2974
|
-
if (from !== void 0 && !
|
|
2973
|
+
if (!chunkKXDQKVNX_cjs.sharedCurrencyExchange.isCurrency(to)) return null;
|
|
2974
|
+
if (from !== void 0 && !chunkKXDQKVNX_cjs.sharedCurrencyExchange.isCurrency(from)) return null;
|
|
2975
2975
|
const onToken = parser.peek();
|
|
2976
2976
|
if (!onToken || onToken.type !== "IDENT" || onToken.value.toLowerCase() !== "on") return null;
|
|
2977
2977
|
const dateToken = parser.peekAt(1);
|
|
@@ -2985,7 +2985,7 @@ async function fetchHistoricalRate(provider, from, to, isoDate, signal, queryCli
|
|
|
2985
2985
|
const fromUpper = from.toUpperCase();
|
|
2986
2986
|
const toUpper = to.toUpperCase();
|
|
2987
2987
|
if (!provider) {
|
|
2988
|
-
return
|
|
2988
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
2989
2989
|
HistoricalCurrencyErrorCodes.NOT_CONFIGURED,
|
|
2990
2990
|
`Historical exchange rates are not configured. Supply historicalRateProvider via createCurrencyPackage({ ... }) to convert ${fromUpper} to ${toUpper} on ${isoDate}.`
|
|
2991
2991
|
);
|
|
@@ -2993,9 +2993,9 @@ async function fetchHistoricalRate(provider, from, to, isoDate, signal, queryCli
|
|
|
2993
2993
|
const { signal: fetchSignal, cleanup } = chunkVEKIWQ3F_cjs.createTimeoutSignal(signal, FETCH_TIMEOUT_MS, "Historical currency rate fetch");
|
|
2994
2994
|
try {
|
|
2995
2995
|
const rate = await provider(fromUpper, toUpper, isoDate, fetchSignal);
|
|
2996
|
-
return
|
|
2996
|
+
return chunkIT74O4BE_cjs.numberValue(rate);
|
|
2997
2997
|
} catch (error) {
|
|
2998
|
-
const failedValue =
|
|
2998
|
+
const failedValue = chunkIT74O4BE_cjs.errorValue(
|
|
2999
2999
|
HistoricalCurrencyErrorCodes.QUERY_FAILED,
|
|
3000
3000
|
`Failed to resolve the historical rate for ${fromUpper} to ${toUpper} on ${isoDate}: ${error instanceof Error ? error.message : String(error)}`
|
|
3001
3001
|
);
|
|
@@ -3016,10 +3016,10 @@ function createHistoricalCurrencyPluginFunction(provider) {
|
|
|
3016
3016
|
const amount = args[0];
|
|
3017
3017
|
const toArg = args[1];
|
|
3018
3018
|
const dateArg = args[2];
|
|
3019
|
-
const fault =
|
|
3019
|
+
const fault = chunkIT74O4BE_cjs.faultedOperand(amount);
|
|
3020
3020
|
if (fault) return fault;
|
|
3021
|
-
if (amount.type !== 6 /* Uom */ || amount.unit === void 0 || !
|
|
3022
|
-
return
|
|
3021
|
+
if (amount.type !== 6 /* Uom */ || amount.unit === void 0 || !chunkKXDQKVNX_cjs.sharedCurrencyExchange.isCurrency(amount.unit)) {
|
|
3022
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
3023
3023
|
HistoricalCurrencyErrorCodes.INVALID_OPERAND,
|
|
3024
3024
|
`Historical conversion needs an amount in a currency, for example "100 USD in GBP on 2024-01-15".`
|
|
3025
3025
|
);
|
|
@@ -3028,14 +3028,14 @@ function createHistoricalCurrencyPluginFunction(provider) {
|
|
|
3028
3028
|
const to = String(toArg.value);
|
|
3029
3029
|
const isoDate = String(dateArg.value);
|
|
3030
3030
|
if (from.toUpperCase() === to.toUpperCase()) {
|
|
3031
|
-
return
|
|
3031
|
+
return chunkIT74O4BE_cjs.uomValue(amount.toNumber(), to);
|
|
3032
3032
|
}
|
|
3033
3033
|
const queryClient = chunkZ2XP767T_cjs.getActiveQueryClient();
|
|
3034
3034
|
const key = historicalRateQueryKey(from, to, isoDate);
|
|
3035
3035
|
const cached = queryClient?.getQueryData(key);
|
|
3036
3036
|
if (cached === void 0) {
|
|
3037
3037
|
if (!queryClient) {
|
|
3038
|
-
return
|
|
3038
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
3039
3039
|
HistoricalCurrencyErrorCodes.NOT_PREFLIGHTED,
|
|
3040
3040
|
`No historical rate resolved for ${from.toUpperCase()} to ${to.toUpperCase()} on ${isoDate}.`
|
|
3041
3041
|
);
|
|
@@ -3048,7 +3048,7 @@ function createHistoricalCurrencyPluginFunction(provider) {
|
|
|
3048
3048
|
}
|
|
3049
3049
|
if (cached.type === 13 /* Error */) return cached;
|
|
3050
3050
|
const rate = cached.value;
|
|
3051
|
-
return
|
|
3051
|
+
return chunkIT74O4BE_cjs.uomValue(amount.toNumber() * rate, to);
|
|
3052
3052
|
};
|
|
3053
3053
|
}
|
|
3054
3054
|
function createHistoricalCurrencyResolver(provider) {
|
|
@@ -3072,7 +3072,7 @@ function createHistoricalCurrencyResolver(provider) {
|
|
|
3072
3072
|
const sources = /* @__PURE__ */ new Set();
|
|
3073
3073
|
for (let k = 0; k < stringIdxs.length - 2; k++) {
|
|
3074
3074
|
const s = strings[stringIdxs[k]];
|
|
3075
|
-
if (
|
|
3075
|
+
if (chunkKXDQKVNX_cjs.sharedCurrencyExchange.isCurrency(s)) sources.add(s.toUpperCase());
|
|
3076
3076
|
}
|
|
3077
3077
|
if (sources.size === 1) {
|
|
3078
3078
|
const from = sources.values().next().value;
|
|
@@ -3091,7 +3091,7 @@ function createHistoricalCurrencyResolver(provider) {
|
|
|
3091
3091
|
}
|
|
3092
3092
|
stringIdxs = [];
|
|
3093
3093
|
}
|
|
3094
|
-
i =
|
|
3094
|
+
i = chunk4K5W7EH2_cjs.nextInstruction(opcodes, i);
|
|
3095
3095
|
}
|
|
3096
3096
|
return null;
|
|
3097
3097
|
},
|
|
@@ -3102,18 +3102,18 @@ function createHistoricalCurrencyResolver(provider) {
|
|
|
3102
3102
|
|
|
3103
3103
|
// src/packages/uom/parselets/UomLiteralParselet.ts
|
|
3104
3104
|
function resolveUnitAlias(rawUnit) {
|
|
3105
|
-
return
|
|
3105
|
+
return chunkA2DZ5BEJ_cjs.resolveCurrencyAlias(rawUnit) ?? rawUnit;
|
|
3106
3106
|
}
|
|
3107
3107
|
var UomLiteralParselet = class {
|
|
3108
3108
|
constructor() {
|
|
3109
3109
|
this.category = "UoM";
|
|
3110
|
-
this.bindingPower =
|
|
3110
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Postfix;
|
|
3111
3111
|
}
|
|
3112
3112
|
parse(parser, left, token, builder) {
|
|
3113
3113
|
const unit = resolveUnitAlias(token.value);
|
|
3114
3114
|
builder.emitOpcode(13 /* PUSH_STRING */);
|
|
3115
3115
|
builder.emitString(unit);
|
|
3116
|
-
const boundInsideProduct = parser.infixMinBindingPower >=
|
|
3116
|
+
const boundInsideProduct = parser.infixMinBindingPower >= chunkMI7OTUHL_cjs.BindingPower.Product;
|
|
3117
3117
|
if (!boundInsideProduct && (parser.peek()?.type === "TO" || parser.peek()?.type === "IN")) {
|
|
3118
3118
|
parser.consume();
|
|
3119
3119
|
const targetToken = parser.peek();
|
|
@@ -3154,14 +3154,14 @@ var UomLiteralParselet = class {
|
|
|
3154
3154
|
|
|
3155
3155
|
// src/packages/uom/parselets/ConvertParselet.ts
|
|
3156
3156
|
function resolveUnitAlias2(rawUnit) {
|
|
3157
|
-
return
|
|
3157
|
+
return chunkA2DZ5BEJ_cjs.resolveCurrencyAlias(rawUnit) ?? rawUnit;
|
|
3158
3158
|
}
|
|
3159
3159
|
var ConvertParselet = class {
|
|
3160
3160
|
constructor() {
|
|
3161
3161
|
this.category = "UoM";
|
|
3162
3162
|
}
|
|
3163
3163
|
parse(parser, token, builder) {
|
|
3164
|
-
parser.parseExpression(
|
|
3164
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Postfix, builder);
|
|
3165
3165
|
const nextToken = parser.peek();
|
|
3166
3166
|
if (nextToken && nextToken.type === "UNIT") {
|
|
3167
3167
|
parser.consume();
|
|
@@ -3226,7 +3226,7 @@ function uomPossibilitiesNormalizerRule(priority = 60) {
|
|
|
3226
3226
|
if (questionToken.type !== "QUESTION") return null;
|
|
3227
3227
|
return {
|
|
3228
3228
|
consumed: 3,
|
|
3229
|
-
replacement: [
|
|
3229
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("UOM_POSSIBILITIES_QUERY", unitToken.value, [unitToken, toToken, questionToken])],
|
|
3230
3230
|
ruleName: "uom:possibilities"
|
|
3231
3231
|
};
|
|
3232
3232
|
}
|
|
@@ -3278,8 +3278,8 @@ function compoundQuantityNormalizerRule(priority = 63) {
|
|
|
3278
3278
|
return {
|
|
3279
3279
|
consumed,
|
|
3280
3280
|
replacement: [
|
|
3281
|
-
|
|
3282
|
-
|
|
3281
|
+
chunkICEKS6YC_cjs.createFusedToken("NUMBER", String(scaled), source),
|
|
3282
|
+
chunkICEKS6YC_cjs.createFusedToken("UNIT", smallestUnit, [smallestUnitToken])
|
|
3283
3283
|
],
|
|
3284
3284
|
ruleName: "uom:compound-quantity"
|
|
3285
3285
|
};
|
|
@@ -3307,7 +3307,7 @@ function twoUnitConversionNormalizerRule(priority = 59) {
|
|
|
3307
3307
|
return {
|
|
3308
3308
|
consumed: 4,
|
|
3309
3309
|
replacement: [
|
|
3310
|
-
|
|
3310
|
+
chunkICEKS6YC_cjs.createFusedToken("IN_TWO_UNITS", `${major} ${minor}`, tokens.slice(pos, pos + 4))
|
|
3311
3311
|
],
|
|
3312
3312
|
ruleName: "uom:two-unit-conversion"
|
|
3313
3313
|
};
|
|
@@ -3328,7 +3328,7 @@ function degreeSymbolNormalizerRule(priority = 74) {
|
|
|
3328
3328
|
if ((symbol.text ?? symbol.value ?? "") !== "\xB0") return null;
|
|
3329
3329
|
return {
|
|
3330
3330
|
consumed: 2,
|
|
3331
|
-
replacement: [number,
|
|
3331
|
+
replacement: [number, chunkICEKS6YC_cjs.createFusedToken("UNIT", "degrees", [symbol])],
|
|
3332
3332
|
ruleName: "uom:degree-symbol"
|
|
3333
3333
|
};
|
|
3334
3334
|
}
|
|
@@ -3340,7 +3340,7 @@ var TwoUnitConversionParselet = class {
|
|
|
3340
3340
|
constructor(builtinIndex) {
|
|
3341
3341
|
this.builtinIndex = builtinIndex;
|
|
3342
3342
|
this.category = "Uom";
|
|
3343
|
-
this.bindingPower =
|
|
3343
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
3344
3344
|
}
|
|
3345
3345
|
parse(_parser, _left, token, builder) {
|
|
3346
3346
|
const [major, minor] = String(token.value).split(" ");
|
|
@@ -3380,7 +3380,7 @@ function bareRateDenominatorNormalizerRule(priority = 75) {
|
|
|
3380
3380
|
if (introduces && isUnit2(tokens[pos + 3])) {
|
|
3381
3381
|
return {
|
|
3382
3382
|
consumed: 2,
|
|
3383
|
-
replacement: [head,
|
|
3383
|
+
replacement: [head, chunkICEKS6YC_cjs.createFusedToken("UNIT", label.value, [label])],
|
|
3384
3384
|
ruleName: "uom:bare-rate-denominator"
|
|
3385
3385
|
};
|
|
3386
3386
|
}
|
|
@@ -3394,7 +3394,7 @@ function bareRateDenominatorNormalizerRule(priority = 75) {
|
|
|
3394
3394
|
return {
|
|
3395
3395
|
consumed: 2,
|
|
3396
3396
|
replacement: [
|
|
3397
|
-
|
|
3397
|
+
chunkICEKS6YC_cjs.createFusedToken("PER_UNIT", unitToken.value, [head, unitToken])
|
|
3398
3398
|
],
|
|
3399
3399
|
ruleName: "uom:bare-rate-denominator"
|
|
3400
3400
|
};
|
|
@@ -3407,7 +3407,7 @@ var PerUnitParselet = class {
|
|
|
3407
3407
|
constructor(builtinIndex) {
|
|
3408
3408
|
this.builtinIndex = builtinIndex;
|
|
3409
3409
|
this.category = "Uom";
|
|
3410
|
-
this.bindingPower =
|
|
3410
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
|
|
3411
3411
|
}
|
|
3412
3412
|
parse(_parser, _left, token, builder) {
|
|
3413
3413
|
builder.emitOpcode(13 /* PUSH_STRING */);
|
|
@@ -3423,10 +3423,10 @@ var AtRateParselet = class {
|
|
|
3423
3423
|
constructor(builtinIndex) {
|
|
3424
3424
|
this.builtinIndex = builtinIndex;
|
|
3425
3425
|
this.category = "Uom";
|
|
3426
|
-
this.bindingPower =
|
|
3426
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Product;
|
|
3427
3427
|
}
|
|
3428
3428
|
parse(parser, _left, _token, builder) {
|
|
3429
|
-
parser.parseExpression(
|
|
3429
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
3430
3430
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
3431
3431
|
builder.emitIndex(this.builtinIndex);
|
|
3432
3432
|
builder.emitIndex(2);
|
|
@@ -3459,7 +3459,7 @@ function atRateNormalizerRule(priority = 73) {
|
|
|
3459
3459
|
if (!hasRateAhead(tokens, pos + 1)) return null;
|
|
3460
3460
|
return {
|
|
3461
3461
|
consumed: 1,
|
|
3462
|
-
replacement: [
|
|
3462
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("AT_RATE", "at", [tokens[pos]])],
|
|
3463
3463
|
ruleName: "uom:at-rate"
|
|
3464
3464
|
};
|
|
3465
3465
|
}
|
|
@@ -3486,8 +3486,8 @@ function forDurationNormalizerRule(priority = 76) {
|
|
|
3486
3486
|
return {
|
|
3487
3487
|
consumed: 3,
|
|
3488
3488
|
replacement: [
|
|
3489
|
-
|
|
3490
|
-
|
|
3489
|
+
chunkICEKS6YC_cjs.createFusedToken("STAR", "*", [head]),
|
|
3490
|
+
chunkICEKS6YC_cjs.createFusedToken("NUMBER", "1", [article]),
|
|
3491
3491
|
tokens[pos + 2]
|
|
3492
3492
|
],
|
|
3493
3493
|
ruleName: "uom:for-duration"
|
|
@@ -3524,7 +3524,7 @@ function reversedConversionNormalizerRule(priority = 61) {
|
|
|
3524
3524
|
return {
|
|
3525
3525
|
consumed: 4,
|
|
3526
3526
|
replacement: [
|
|
3527
|
-
|
|
3527
|
+
chunkICEKS6YC_cjs.createFusedToken("NUMBER", "1", [third]),
|
|
3528
3528
|
tokens[pos + 3],
|
|
3529
3529
|
tokens[pos + 1],
|
|
3530
3530
|
target
|
|
@@ -3633,13 +3633,13 @@ function getIngredientDensity(name) {
|
|
|
3633
3633
|
}
|
|
3634
3634
|
|
|
3635
3635
|
// src/packages/uom/parselets/CookingPluginFunctions.ts
|
|
3636
|
-
var COOKING_CONVERT_IDX =
|
|
3636
|
+
var COOKING_CONVERT_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
3637
3637
|
function cookingConvertHandler(args) {
|
|
3638
3638
|
const amountValue = args[0];
|
|
3639
3639
|
const ingredientName = args[1].value;
|
|
3640
3640
|
const targetUnitText = args[2].value;
|
|
3641
3641
|
if (amountValue.type !== 6 /* Uom */ || !amountValue.unit) {
|
|
3642
|
-
return
|
|
3642
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
3643
3643
|
"COOKING_CONVERSION_REQUIRES_UNIT",
|
|
3644
3644
|
`Expected a value with a mass or volume unit (e.g. "300g", "10 cups"), got a plain number`
|
|
3645
3645
|
);
|
|
@@ -3650,23 +3650,23 @@ function cookingConvertHandler(args) {
|
|
|
3650
3650
|
const targetMeasure = chunkEJ3ILXX6_cjs.getMeasure(targetUnitText);
|
|
3651
3651
|
const isMassOrVolume = (m) => m === "mass" || m === "volume";
|
|
3652
3652
|
if (!isMassOrVolume(sourceMeasure)) {
|
|
3653
|
-
return
|
|
3653
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
3654
3654
|
"COOKING_CONVERSION_UNSUPPORTED_UNIT",
|
|
3655
3655
|
`"${sourceUnit}" is not a recognized mass or volume unit`
|
|
3656
3656
|
);
|
|
3657
3657
|
}
|
|
3658
3658
|
if (!isMassOrVolume(targetMeasure)) {
|
|
3659
|
-
return
|
|
3659
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
3660
3660
|
"COOKING_CONVERSION_UNSUPPORTED_UNIT",
|
|
3661
3661
|
`"${targetUnitText}" is not a recognized mass or volume unit`
|
|
3662
3662
|
);
|
|
3663
3663
|
}
|
|
3664
3664
|
if (sourceMeasure === targetMeasure) {
|
|
3665
|
-
return
|
|
3665
|
+
return chunkIT74O4BE_cjs.uomValue(chunkEJ3ILXX6_cjs.convertUnit(amount, sourceUnit, targetUnitText), targetUnitText);
|
|
3666
3666
|
}
|
|
3667
3667
|
const density = getIngredientDensity(ingredientName);
|
|
3668
3668
|
if (density === void 0) {
|
|
3669
|
-
return
|
|
3669
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
3670
3670
|
"COOKING_UNKNOWN_INGREDIENT",
|
|
3671
3671
|
`No density data for "${ingredientName}" \u2014 cannot convert between mass and volume for this ingredient`
|
|
3672
3672
|
);
|
|
@@ -3675,12 +3675,12 @@ function cookingConvertHandler(args) {
|
|
|
3675
3675
|
const grams2 = chunkEJ3ILXX6_cjs.convertUnit(amount, sourceUnit, "g");
|
|
3676
3676
|
const mL2 = grams2 / density;
|
|
3677
3677
|
const result2 = chunkEJ3ILXX6_cjs.convertUnit(mL2, "ml", targetUnitText);
|
|
3678
|
-
return
|
|
3678
|
+
return chunkIT74O4BE_cjs.uomValue(result2, targetUnitText);
|
|
3679
3679
|
}
|
|
3680
3680
|
const mL = chunkEJ3ILXX6_cjs.convertUnit(amount, sourceUnit, "ml");
|
|
3681
3681
|
const grams = mL * density;
|
|
3682
3682
|
const result = chunkEJ3ILXX6_cjs.convertUnit(grams, "g", targetUnitText);
|
|
3683
|
-
return
|
|
3683
|
+
return chunkIT74O4BE_cjs.uomValue(result, targetUnitText);
|
|
3684
3684
|
}
|
|
3685
3685
|
|
|
3686
3686
|
// src/packages/uom/parselets/CookingConversionParselet.ts
|
|
@@ -3723,7 +3723,7 @@ function ingredientNameNormalizerRule(priority = 68) {
|
|
|
3723
3723
|
const candidate = candidateTokens.map((t) => t.value.toLowerCase()).join(" ");
|
|
3724
3724
|
return {
|
|
3725
3725
|
consumed: wordCount,
|
|
3726
|
-
replacement: [
|
|
3726
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("INGREDIENT_NAME", candidate, candidateTokens)],
|
|
3727
3727
|
ruleName: "uom-cooking:ingredient-name"
|
|
3728
3728
|
};
|
|
3729
3729
|
}
|
|
@@ -3746,7 +3746,7 @@ function multiWordUnitNormalizerRule(priority = 78) {
|
|
|
3746
3746
|
if (chunkAMOJYLG2_cjs.UNIT_TABLE[spelling] === void 0) return null;
|
|
3747
3747
|
return {
|
|
3748
3748
|
consumed: 2,
|
|
3749
|
-
replacement: [
|
|
3749
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("UNIT", spelling, tokens.slice(pos, pos + 2))],
|
|
3750
3750
|
ruleName: "uom:multi-word-unit"
|
|
3751
3751
|
};
|
|
3752
3752
|
}
|
|
@@ -3768,7 +3768,7 @@ function compoundUnitNormalizerRule(priority = 77) {
|
|
|
3768
3768
|
const spelling = `${numerator.value}/${denominator.value}`;
|
|
3769
3769
|
return {
|
|
3770
3770
|
consumed: 3,
|
|
3771
|
-
replacement: [
|
|
3771
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("UNIT", spelling, [numerator, slash, denominator])],
|
|
3772
3772
|
ruleName: "uom:compound-unit"
|
|
3773
3773
|
};
|
|
3774
3774
|
}
|
|
@@ -3817,8 +3817,8 @@ var CurrencySymbolParselet = class {
|
|
|
3817
3817
|
this.category = "UoM";
|
|
3818
3818
|
}
|
|
3819
3819
|
parse(parser, token, builder) {
|
|
3820
|
-
const currency =
|
|
3821
|
-
parser.parseExpression(
|
|
3820
|
+
const currency = chunkA2DZ5BEJ_cjs.resolveCurrencyAlias(token.value) ?? token.value.toUpperCase();
|
|
3821
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Prefix, builder);
|
|
3822
3822
|
if (parser.peek()?.type === "UNIT") {
|
|
3823
3823
|
parser.consume();
|
|
3824
3824
|
}
|
|
@@ -3838,7 +3838,7 @@ var InParselet = class {
|
|
|
3838
3838
|
const targetToken = parser.peek();
|
|
3839
3839
|
if (targetToken && (targetToken.type === "UNIT" || targetToken.type === "DOLLAR" || targetToken.type === "POUND" || targetToken.type === "EURO" || targetToken.type === "YEN" || targetToken.type === "RUBLE" || targetToken.type === "WON" || targetToken.type === "CURRENCY_SYMBOL" || targetToken.type === "IDENT" || targetToken.type === "IN")) {
|
|
3840
3840
|
parser.consume();
|
|
3841
|
-
const targetUnit =
|
|
3841
|
+
const targetUnit = chunkA2DZ5BEJ_cjs.resolveCurrencyAlias(targetToken.value) ?? targetToken.value;
|
|
3842
3842
|
const isoDate = tryConsumeCurrencyOnDate(parser, targetUnit);
|
|
3843
3843
|
if (isoDate !== null) {
|
|
3844
3844
|
builder.emitOpcode(13 /* PUSH_STRING */);
|
|
@@ -3862,7 +3862,7 @@ function createCurrencyPackage(config = {}) {
|
|
|
3862
3862
|
return {
|
|
3863
3863
|
name: "solve-currency",
|
|
3864
3864
|
asyncResolvers: [
|
|
3865
|
-
new
|
|
3865
|
+
new chunk4K5W7EH2_cjs.CurrencyAsyncResolver(),
|
|
3866
3866
|
createHistoricalCurrencyResolver(config.historicalRateProvider)
|
|
3867
3867
|
],
|
|
3868
3868
|
prefixParselets: [
|
|
@@ -3951,7 +3951,7 @@ var MatrixLiteralParselet = class {
|
|
|
3951
3951
|
let rows = 0;
|
|
3952
3952
|
let cols = -1;
|
|
3953
3953
|
if (parser.peek()?.type === "RBRACKET") {
|
|
3954
|
-
throw
|
|
3954
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
3955
3955
|
"EMPTY_MATRIX_LITERAL",
|
|
3956
3956
|
"A matrix literal cannot be empty \u2014 `[]` has no valid shape.",
|
|
3957
3957
|
{}
|
|
@@ -3968,7 +3968,7 @@ var MatrixLiteralParselet = class {
|
|
|
3968
3968
|
if (cols === -1) {
|
|
3969
3969
|
cols = rowCols;
|
|
3970
3970
|
} else if (rowCols !== cols) {
|
|
3971
|
-
throw
|
|
3971
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
3972
3972
|
"RAGGED_MATRIX_LITERAL",
|
|
3973
3973
|
`Matrix literal rows must all have the same number of columns \u2014 row ${rows + 1} has ${rowCols}, but a previous row has ${cols}.`,
|
|
3974
3974
|
{ expectedCols: cols, actualCols: rowCols, row: rows + 1 }
|
|
@@ -3988,7 +3988,7 @@ var MatrixLiteralParselet = class {
|
|
|
3988
3988
|
var MatrixIndexParselet = class {
|
|
3989
3989
|
constructor() {
|
|
3990
3990
|
this.category = "Matrix";
|
|
3991
|
-
this.bindingPower =
|
|
3991
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Postfix;
|
|
3992
3992
|
}
|
|
3993
3993
|
parse(parser, _left, _token, builder) {
|
|
3994
3994
|
const isSlice = this.hasTopLevelColon(parser);
|
|
@@ -4008,7 +4008,7 @@ var MatrixIndexParselet = class {
|
|
|
4008
4008
|
return;
|
|
4009
4009
|
}
|
|
4010
4010
|
if (argCount !== 2) {
|
|
4011
|
-
throw
|
|
4011
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4012
4012
|
"INVALID_MATRIX_SLICE_ARITY",
|
|
4013
4013
|
`Range-based matrix slicing needs exactly 2 arguments ("a[rowRange, colRange]"), got ${argCount}.`,
|
|
4014
4014
|
{ argCount }
|
|
@@ -4091,12 +4091,12 @@ function parseTransform(parser, builder) {
|
|
|
4091
4091
|
}
|
|
4092
4092
|
return { kind: 2, name };
|
|
4093
4093
|
}
|
|
4094
|
-
const transformBuilder = new
|
|
4095
|
-
parser.parseExpression(
|
|
4094
|
+
const transformBuilder = new chunkMI7OTUHL_cjs.BytecodeBuilder();
|
|
4095
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, transformBuilder);
|
|
4096
4096
|
parser.setBuilder(builder);
|
|
4097
4097
|
const program = transformBuilder.build();
|
|
4098
4098
|
if (program.hasAsync) {
|
|
4099
|
-
throw
|
|
4099
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4100
4100
|
"MAP_REDUCE_TRANSFORM_MUST_BE_SYNCHRONOUS",
|
|
4101
4101
|
`map/reduce transform expressions must be synchronous (no weather/stocks/currency calls).`
|
|
4102
4102
|
);
|
|
@@ -4114,7 +4114,7 @@ function consumeCollectionName(parser) {
|
|
|
4114
4114
|
parser.consume();
|
|
4115
4115
|
return token.value;
|
|
4116
4116
|
}
|
|
4117
|
-
throw
|
|
4117
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4118
4118
|
"MAP_REDUCE_EXPECTED_COLLECTION_NAME",
|
|
4119
4119
|
`Expected a collection name (e.g. "x" in "x=[1,2,3]") but got ${token ? `"${token.value}"` : "end of input"}.`
|
|
4120
4120
|
);
|
|
@@ -4178,7 +4178,7 @@ var ReduceParselet = class {
|
|
|
4178
4178
|
parseCollectionExpr(parser, builder);
|
|
4179
4179
|
let hasInitial = 0;
|
|
4180
4180
|
if (parser.match("COMMA")) {
|
|
4181
|
-
parser.parseExpression(
|
|
4181
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4182
4182
|
hasInitial = 1;
|
|
4183
4183
|
}
|
|
4184
4184
|
parser.consume("RPAREN");
|
|
@@ -4193,15 +4193,15 @@ var SumParselet = class {
|
|
|
4193
4193
|
}
|
|
4194
4194
|
parse(parser, _token, builder) {
|
|
4195
4195
|
parser.consume("LPAREN");
|
|
4196
|
-
const bodyBuilder = new
|
|
4196
|
+
const bodyBuilder = new chunkMI7OTUHL_cjs.BytecodeBuilder();
|
|
4197
4197
|
bodyBuilder.emitOpcode(60 /* LOAD_VAR */);
|
|
4198
4198
|
bodyBuilder.emitString("acc");
|
|
4199
|
-
parser.parseExpression(
|
|
4199
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, bodyBuilder);
|
|
4200
4200
|
parser.setBuilder(builder);
|
|
4201
4201
|
bodyBuilder.emitOpcode(20 /* ADD */);
|
|
4202
4202
|
const bodyProgram = bodyBuilder.build();
|
|
4203
4203
|
if (bodyProgram.hasAsync) {
|
|
4204
|
-
throw
|
|
4204
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4205
4205
|
"MAP_REDUCE_TRANSFORM_MUST_BE_SYNCHRONOUS",
|
|
4206
4206
|
`sum's element expression must be synchronous (no weather/stocks/currency calls).`
|
|
4207
4207
|
);
|
|
@@ -4222,15 +4222,15 @@ var ProdParselet = class {
|
|
|
4222
4222
|
}
|
|
4223
4223
|
parse(parser, _token, builder) {
|
|
4224
4224
|
parser.consume("LPAREN");
|
|
4225
|
-
const bodyBuilder = new
|
|
4225
|
+
const bodyBuilder = new chunkMI7OTUHL_cjs.BytecodeBuilder();
|
|
4226
4226
|
bodyBuilder.emitOpcode(60 /* LOAD_VAR */);
|
|
4227
4227
|
bodyBuilder.emitString("acc");
|
|
4228
|
-
parser.parseExpression(
|
|
4228
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, bodyBuilder);
|
|
4229
4229
|
parser.setBuilder(builder);
|
|
4230
4230
|
bodyBuilder.emitOpcode(22 /* MUL */);
|
|
4231
4231
|
const bodyProgram = bodyBuilder.build();
|
|
4232
4232
|
if (bodyProgram.hasAsync) {
|
|
4233
|
-
throw
|
|
4233
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4234
4234
|
"MAP_REDUCE_TRANSFORM_MUST_BE_SYNCHRONOUS",
|
|
4235
4235
|
`prod's element expression must be synchronous (no weather/stocks/currency calls).`
|
|
4236
4236
|
);
|
|
@@ -4275,7 +4275,7 @@ function mapReduceCallNormalizerRule(priority = 80) {
|
|
|
4275
4275
|
return {
|
|
4276
4276
|
consumed: 1,
|
|
4277
4277
|
replacement: [
|
|
4278
|
-
new
|
|
4278
|
+
new chunkYJHY7CMN_cjs.LexerToken(tokenType, chunkG2YPPLGX_cjs.tokenTypeId(tokenType), token.value, token.value, token.offset, 0, token.line, token.col)
|
|
4279
4279
|
],
|
|
4280
4280
|
ruleName: "mapreduce:call"
|
|
4281
4281
|
};
|
|
@@ -4317,7 +4317,7 @@ var ExpandParselet = class {
|
|
|
4317
4317
|
}
|
|
4318
4318
|
parse(parser, _token, builder) {
|
|
4319
4319
|
parser.consume("LPAREN");
|
|
4320
|
-
parser.parseExpression(
|
|
4320
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4321
4321
|
parser.consume("RPAREN");
|
|
4322
4322
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
4323
4323
|
builder.emitIndex(SYMBOLIC_BUILTIN_EXPAND);
|
|
@@ -4332,7 +4332,7 @@ var FactorParselet = class {
|
|
|
4332
4332
|
}
|
|
4333
4333
|
parse(parser, _token, builder) {
|
|
4334
4334
|
parser.consume("LPAREN");
|
|
4335
|
-
parser.parseExpression(
|
|
4335
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4336
4336
|
parser.consume("RPAREN");
|
|
4337
4337
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
4338
4338
|
builder.emitIndex(SYMBOLIC_BUILTIN_FACTOR);
|
|
@@ -4344,7 +4344,7 @@ var FactorParselet = class {
|
|
|
4344
4344
|
function readVariableName(parser, verb) {
|
|
4345
4345
|
const token = parser.peek();
|
|
4346
4346
|
if (!token || token.type !== "IDENT" && token.type !== "UNIT") {
|
|
4347
|
-
throw
|
|
4347
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4348
4348
|
"SYMBOLIC_REQUIRES_VARIABLE_NAME",
|
|
4349
4349
|
`${verb} needs the name of an unknown here, as in ${verb}(x^2, x).`,
|
|
4350
4350
|
{ found: token?.type ?? "end of input" }
|
|
@@ -4358,12 +4358,12 @@ function emitVariableName(builder, name) {
|
|
|
4358
4358
|
builder.emitString(name);
|
|
4359
4359
|
}
|
|
4360
4360
|
function parseBoundExpression(parser, builder, verb) {
|
|
4361
|
-
const inner = new
|
|
4362
|
-
parser.parseExpression(
|
|
4361
|
+
const inner = new chunkMI7OTUHL_cjs.BytecodeBuilder();
|
|
4362
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, inner);
|
|
4363
4363
|
parser.setBuilder(builder);
|
|
4364
4364
|
const program = inner.build();
|
|
4365
4365
|
if (program.hasAsync) {
|
|
4366
|
-
throw
|
|
4366
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4367
4367
|
"SYMBOLIC_ARGUMENT_MUST_BE_SYNCHRONOUS",
|
|
4368
4368
|
`${verb}'s expression must be synchronous (no weather/stocks/currency calls).`
|
|
4369
4369
|
);
|
|
@@ -4388,7 +4388,7 @@ var SolveParselet = class {
|
|
|
4388
4388
|
parser.consume("COMMA");
|
|
4389
4389
|
const variable = parser.peek();
|
|
4390
4390
|
if (!variable || variable.type !== "IDENT" && variable.type !== "UNIT") {
|
|
4391
|
-
throw
|
|
4391
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4392
4392
|
"SOLVE_REQUIRES_VARIABLE_NAME",
|
|
4393
4393
|
`solve's second argument must be the name of the unknown to solve for, as in solve(x^2-4=0, x).`,
|
|
4394
4394
|
{ found: variable?.type ?? "end of input" }
|
|
@@ -4423,7 +4423,7 @@ var DerParselet = class {
|
|
|
4423
4423
|
emitBoundExpression(builder, expression, variable);
|
|
4424
4424
|
emitVariableName(builder, variable);
|
|
4425
4425
|
if (parser.match("COMMA")) {
|
|
4426
|
-
parser.parseExpression(
|
|
4426
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4427
4427
|
} else {
|
|
4428
4428
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
4429
4429
|
builder.emitNumber(1);
|
|
@@ -4467,9 +4467,9 @@ var TaylorParselet = class {
|
|
|
4467
4467
|
emitBoundExpression(builder, expression, variable);
|
|
4468
4468
|
emitVariableName(builder, variable);
|
|
4469
4469
|
parser.consume("EQUALS");
|
|
4470
|
-
parser.parseExpression(
|
|
4470
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4471
4471
|
parser.consume("COMMA");
|
|
4472
|
-
parser.parseExpression(
|
|
4472
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4473
4473
|
parser.consume("RPAREN");
|
|
4474
4474
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
4475
4475
|
builder.emitIndex(SYMBOLIC_BUILTIN_TAYLOR);
|
|
@@ -4486,7 +4486,7 @@ var JacobianParselet = class {
|
|
|
4486
4486
|
parser.consume("LPAREN");
|
|
4487
4487
|
let count = 0;
|
|
4488
4488
|
do {
|
|
4489
|
-
parser.parseExpression(
|
|
4489
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4490
4490
|
count++;
|
|
4491
4491
|
} while (parser.match("COMMA"));
|
|
4492
4492
|
parser.consume("RPAREN");
|
|
@@ -4517,7 +4517,7 @@ var ConjParselet = class {
|
|
|
4517
4517
|
}
|
|
4518
4518
|
parse(parser, _token, builder) {
|
|
4519
4519
|
parser.consume("LPAREN");
|
|
4520
|
-
parser.parseExpression(
|
|
4520
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4521
4521
|
parser.consume("RPAREN");
|
|
4522
4522
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
4523
4523
|
builder.emitIndex(SYMBOLIC_BUILTIN_CONJ);
|
|
@@ -4532,7 +4532,7 @@ var ReParselet = class {
|
|
|
4532
4532
|
}
|
|
4533
4533
|
parse(parser, _token, builder) {
|
|
4534
4534
|
parser.consume("LPAREN");
|
|
4535
|
-
parser.parseExpression(
|
|
4535
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4536
4536
|
parser.consume("RPAREN");
|
|
4537
4537
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
4538
4538
|
builder.emitIndex(SYMBOLIC_BUILTIN_RE);
|
|
@@ -4547,7 +4547,7 @@ var ImParselet = class {
|
|
|
4547
4547
|
}
|
|
4548
4548
|
parse(parser, _token, builder) {
|
|
4549
4549
|
parser.consume("LPAREN");
|
|
4550
|
-
parser.parseExpression(
|
|
4550
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4551
4551
|
parser.consume("RPAREN");
|
|
4552
4552
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
4553
4553
|
builder.emitIndex(SYMBOLIC_BUILTIN_IM);
|
|
@@ -4562,7 +4562,7 @@ var CancelParselet = class {
|
|
|
4562
4562
|
}
|
|
4563
4563
|
parse(parser, _token, builder) {
|
|
4564
4564
|
parser.consume("LPAREN");
|
|
4565
|
-
parser.parseExpression(
|
|
4565
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4566
4566
|
parser.consume("RPAREN");
|
|
4567
4567
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
4568
4568
|
builder.emitIndex(SYMBOLIC_BUILTIN_CANCEL);
|
|
@@ -4577,7 +4577,7 @@ var ApartParselet = class {
|
|
|
4577
4577
|
}
|
|
4578
4578
|
parse(parser, _token, builder) {
|
|
4579
4579
|
parser.consume("LPAREN");
|
|
4580
|
-
parser.parseExpression(
|
|
4580
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
4581
4581
|
parser.consume("RPAREN");
|
|
4582
4582
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
4583
4583
|
builder.emitIndex(SYMBOLIC_BUILTIN_APART);
|
|
@@ -4600,9 +4600,9 @@ function imaginaryLiteralNormalizerRule(priority = 75) {
|
|
|
4600
4600
|
return {
|
|
4601
4601
|
consumed: 2,
|
|
4602
4602
|
replacement: [
|
|
4603
|
-
new
|
|
4603
|
+
new chunkYJHY7CMN_cjs.LexerToken(
|
|
4604
4604
|
"IMAGINARY",
|
|
4605
|
-
|
|
4605
|
+
chunkG2YPPLGX_cjs.tokenTypeId("IMAGINARY"),
|
|
4606
4606
|
number.value,
|
|
4607
4607
|
number.value,
|
|
4608
4608
|
number.offset,
|
|
@@ -4646,7 +4646,7 @@ function symbolicCallNormalizerRule(priority = 80) {
|
|
|
4646
4646
|
return {
|
|
4647
4647
|
consumed: 1,
|
|
4648
4648
|
replacement: [
|
|
4649
|
-
new
|
|
4649
|
+
new chunkYJHY7CMN_cjs.LexerToken(tokenType, chunkG2YPPLGX_cjs.tokenTypeId(tokenType), token.value, token.value, token.offset, 0, token.line, token.col)
|
|
4650
4650
|
],
|
|
4651
4651
|
ruleName: "symbolic:call"
|
|
4652
4652
|
};
|
|
@@ -4799,7 +4799,7 @@ var BigIntNumberParselet = class {
|
|
|
4799
4799
|
}
|
|
4800
4800
|
parse(parser, token, builder) {
|
|
4801
4801
|
builder.emitOpcode(11 /* PUSH_BIGINT */);
|
|
4802
|
-
builder.emitString(
|
|
4802
|
+
builder.emitString(chunkMI7OTUHL_cjs.bigIntLiteralDigits(token.value, parser.getLocaleCode()));
|
|
4803
4803
|
}
|
|
4804
4804
|
};
|
|
4805
4805
|
|
|
@@ -4816,7 +4816,7 @@ var ComparisonParselet = class {
|
|
|
4816
4816
|
constructor(opcode) {
|
|
4817
4817
|
this.opcode = opcode;
|
|
4818
4818
|
this.category = "Conditionals";
|
|
4819
|
-
this.bindingPower =
|
|
4819
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
4820
4820
|
}
|
|
4821
4821
|
parse(parser, left, token, builder) {
|
|
4822
4822
|
parser.parseExpression(this.bindingPower, builder);
|
|
@@ -4879,9 +4879,9 @@ var CONDITIONALS_PACKAGE = {
|
|
|
4879
4879
|
{ tokenType: "GT", parselet: new ComparisonParselet(44 /* GT */) },
|
|
4880
4880
|
{ tokenType: "LTE", parselet: new ComparisonParselet(43 /* LTE */) },
|
|
4881
4881
|
{ tokenType: "GTE", parselet: new ComparisonParselet(45 /* GTE */) },
|
|
4882
|
-
{ tokenType: "OR", parselet: new LogicalParselet(131 /* LOGICAL_OR */,
|
|
4883
|
-
{ tokenType: "LOGICAL_AND", parselet: new LogicalParselet(130 /* LOGICAL_AND */,
|
|
4884
|
-
{ tokenType: "LOGICAL_OR", parselet: new LogicalParselet(131 /* LOGICAL_OR */,
|
|
4882
|
+
{ tokenType: "OR", parselet: new LogicalParselet(131 /* LOGICAL_OR */, chunkMI7OTUHL_cjs.BindingPower.LogicalOr) },
|
|
4883
|
+
{ tokenType: "LOGICAL_AND", parselet: new LogicalParselet(130 /* LOGICAL_AND */, chunkMI7OTUHL_cjs.BindingPower.LogicalAnd) },
|
|
4884
|
+
{ tokenType: "LOGICAL_OR", parselet: new LogicalParselet(131 /* LOGICAL_OR */, chunkMI7OTUHL_cjs.BindingPower.LogicalOr) }
|
|
4885
4885
|
]
|
|
4886
4886
|
};
|
|
4887
4887
|
|
|
@@ -4913,7 +4913,7 @@ var BASE_CONVERTERS = {
|
|
|
4913
4913
|
var AsConverterParselet = class {
|
|
4914
4914
|
constructor() {
|
|
4915
4915
|
this.category = "Converters";
|
|
4916
|
-
this.bindingPower =
|
|
4916
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
4917
4917
|
}
|
|
4918
4918
|
parse(parser, left, token, builder) {
|
|
4919
4919
|
const nextToken = parser.peek();
|
|
@@ -4923,7 +4923,7 @@ var AsConverterParselet = class {
|
|
|
4923
4923
|
return;
|
|
4924
4924
|
}
|
|
4925
4925
|
if (!nextToken || nextToken.type !== "CONVERTER_NAME" && nextToken.type !== "IDENT" && nextToken.type !== "FUNC" && nextToken.type !== "UNIT") {
|
|
4926
|
-
throw
|
|
4926
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4927
4927
|
"AS_CONVERTER_EXPECTED_NAME",
|
|
4928
4928
|
`Expected a converter name after "as" (e.g. "as hex", "as decimal") but got ${nextToken ? `"${nextToken.value}"` : "end of input"}`
|
|
4929
4929
|
);
|
|
@@ -4935,7 +4935,7 @@ var AsConverterParselet = class {
|
|
|
4935
4935
|
const radix = radixToken?.type === "NUMBER" ? Number(radixToken.value) : NaN;
|
|
4936
4936
|
const opcode = BASE_CONVERTERS[radix];
|
|
4937
4937
|
if (opcode === void 0) {
|
|
4938
|
-
throw
|
|
4938
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
4939
4939
|
"AS_CONVERTER_UNSUPPORTED_BASE",
|
|
4940
4940
|
`"as base ${radixToken?.value ?? "?"}": only bases ${Object.keys(BASE_CONVERTERS).join(", ")} can be written out`
|
|
4941
4941
|
);
|
|
@@ -4947,7 +4947,7 @@ var AsConverterParselet = class {
|
|
|
4947
4947
|
const builtinOp = BUILTIN_CONVERTERS[name];
|
|
4948
4948
|
if (builtinOp !== void 0) {
|
|
4949
4949
|
if (builtinOp === 141 /* TO_MULTIPLIER */ && parser.match("OF")) {
|
|
4950
|
-
parser.parseExpression(
|
|
4950
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
4951
4951
|
builder.emitOpcode(23 /* DIV */);
|
|
4952
4952
|
}
|
|
4953
4953
|
builder.emitOpcode(builtinOp);
|
|
@@ -5002,7 +5002,7 @@ function readDirection(parser) {
|
|
|
5002
5002
|
var RoundedParselet = class {
|
|
5003
5003
|
constructor() {
|
|
5004
5004
|
this.category = "Converters";
|
|
5005
|
-
this.bindingPower =
|
|
5005
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
5006
5006
|
}
|
|
5007
5007
|
parse(parser, _left, _token, builder) {
|
|
5008
5008
|
const direction = readDirection(parser);
|
|
@@ -5016,7 +5016,7 @@ var RoundedParselet = class {
|
|
|
5016
5016
|
var ToNearestParselet = class {
|
|
5017
5017
|
constructor() {
|
|
5018
5018
|
this.category = "Converters";
|
|
5019
|
-
this.bindingPower =
|
|
5019
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
5020
5020
|
}
|
|
5021
5021
|
parse(parser, _left, _token, builder) {
|
|
5022
5022
|
emitRoundToIncrement(builder, readIncrement(parser), "nearest");
|
|
@@ -5035,7 +5035,7 @@ function readIncrement(parser) {
|
|
|
5035
5035
|
const value = Number(next.value);
|
|
5036
5036
|
if (Number.isFinite(value) && value > 0) return value;
|
|
5037
5037
|
}
|
|
5038
|
-
throw
|
|
5038
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5039
5039
|
"INVALID_ROUNDING_INCREMENT",
|
|
5040
5040
|
`"to nearest ${next?.value ?? "?"}": expected a positive number or one of ${Object.keys(INCREMENT_WORDS).join(", ")}`
|
|
5041
5041
|
);
|
|
@@ -5043,12 +5043,12 @@ function readIncrement(parser) {
|
|
|
5043
5043
|
var DecimalPlacesParselet = class {
|
|
5044
5044
|
constructor() {
|
|
5045
5045
|
this.category = "Converters";
|
|
5046
|
-
this.bindingPower =
|
|
5046
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
5047
5047
|
}
|
|
5048
5048
|
parse(_parser, _left, token, builder) {
|
|
5049
5049
|
const places = Number(token.value);
|
|
5050
5050
|
if (!Number.isFinite(places) || places < 0 || places > 100) {
|
|
5051
|
-
throw
|
|
5051
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5052
5052
|
"INVALID_DECIMAL_PLACES",
|
|
5053
5053
|
`"to ${token.value} dp": expected a place count between 0 and 100`
|
|
5054
5054
|
);
|
|
@@ -5087,7 +5087,7 @@ function decimalPlacesNormalizerRule(priority = 66) {
|
|
|
5087
5087
|
return {
|
|
5088
5088
|
consumed,
|
|
5089
5089
|
replacement: [
|
|
5090
|
-
|
|
5090
|
+
chunkICEKS6YC_cjs.createFusedToken("DECIMAL_PLACES", count.value, tokens.slice(pos, pos + consumed))
|
|
5091
5091
|
],
|
|
5092
5092
|
ruleName: "converters:decimal-places"
|
|
5093
5093
|
};
|
|
@@ -5109,7 +5109,7 @@ function converterPrepositionNormalizerRule(priority = 67) {
|
|
|
5109
5109
|
if (!isConverterTarget) return null;
|
|
5110
5110
|
return {
|
|
5111
5111
|
consumed: 1,
|
|
5112
|
-
replacement: [
|
|
5112
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("AS", "as", [preposition])],
|
|
5113
5113
|
ruleName: "converters:preposition"
|
|
5114
5114
|
};
|
|
5115
5115
|
}
|
|
@@ -5146,10 +5146,10 @@ var VariadicAggregateParselet = class {
|
|
|
5146
5146
|
}
|
|
5147
5147
|
parse(parser, token, builder) {
|
|
5148
5148
|
let argCount = 0;
|
|
5149
|
-
parser.parseExpression(
|
|
5149
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conjunction, builder);
|
|
5150
5150
|
argCount++;
|
|
5151
5151
|
while (parser.match("COMMA") || parser.match("AND_CONJ")) {
|
|
5152
|
-
parser.parseExpression(
|
|
5152
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conjunction, builder);
|
|
5153
5153
|
argCount++;
|
|
5154
5154
|
}
|
|
5155
5155
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
@@ -5163,7 +5163,7 @@ function unaryPhraseParselet(builtinIndex) {
|
|
|
5163
5163
|
return {
|
|
5164
5164
|
category: "MathPhrases",
|
|
5165
5165
|
parse(parser, _token, builder) {
|
|
5166
|
-
parser.parseExpression(
|
|
5166
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5167
5167
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5168
5168
|
builder.emitIndex(builtinIndex);
|
|
5169
5169
|
builder.emitIndex(1);
|
|
@@ -5175,28 +5175,28 @@ function unaryPhraseParselet(builtinIndex) {
|
|
|
5175
5175
|
var remainderOfParselet = {
|
|
5176
5176
|
category: "MathPhrases",
|
|
5177
5177
|
parse(parser, _token, builder) {
|
|
5178
|
-
parser.parseExpression(
|
|
5178
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
5179
5179
|
if (!parser.match("DIVIDE_BY") && !parser.match("SLASH")) {
|
|
5180
|
-
throw
|
|
5180
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5181
5181
|
"REMAINDER_EXPECTED_DIVIDED_BY",
|
|
5182
5182
|
'Expected "divided by" or "/", as in "remainder of 21 divided by 5"'
|
|
5183
5183
|
);
|
|
5184
5184
|
}
|
|
5185
|
-
parser.parseExpression(
|
|
5185
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
5186
5186
|
builder.emitOpcode(24 /* MOD */);
|
|
5187
5187
|
}
|
|
5188
5188
|
};
|
|
5189
5189
|
var nthRootParselet = {
|
|
5190
5190
|
category: "MathPhrases",
|
|
5191
5191
|
parse(parser, _token, builder) {
|
|
5192
|
-
parser.parseExpression(
|
|
5192
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
5193
5193
|
if (!parser.match("OF")) {
|
|
5194
|
-
throw
|
|
5194
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5195
5195
|
"ROOT_EXPECTED_OF",
|
|
5196
5196
|
'Expected "of", as in "root 5 of 100"'
|
|
5197
5197
|
);
|
|
5198
5198
|
}
|
|
5199
|
-
parser.parseExpression(
|
|
5199
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5200
5200
|
builder.emitOpcode(2 /* SWAP */);
|
|
5201
5201
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
5202
5202
|
builder.emitNumber(1);
|
|
@@ -5208,15 +5208,15 @@ var nthRootParselet = {
|
|
|
5208
5208
|
var logBaseParselet = {
|
|
5209
5209
|
category: "MathPhrases",
|
|
5210
5210
|
parse(parser, _token, builder) {
|
|
5211
|
-
parser.parseExpression(
|
|
5211
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5212
5212
|
emitNaturalLog(builder);
|
|
5213
5213
|
if (!parser.match("LOG_BASE")) {
|
|
5214
|
-
throw
|
|
5214
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5215
5215
|
"LOG_EXPECTED_BASE",
|
|
5216
5216
|
'Expected "base", as in "log 20 base 4"'
|
|
5217
5217
|
);
|
|
5218
5218
|
}
|
|
5219
|
-
parser.parseExpression(
|
|
5219
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5220
5220
|
emitNaturalLog(builder);
|
|
5221
5221
|
builder.emitOpcode(23 /* DIV */);
|
|
5222
5222
|
}
|
|
@@ -5242,15 +5242,15 @@ function functionPhraseNormalizerRule(priority = 69) {
|
|
|
5242
5242
|
if (word === "root") {
|
|
5243
5243
|
return {
|
|
5244
5244
|
consumed: 1,
|
|
5245
|
-
replacement: [
|
|
5245
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("NTH_ROOT", "root", [head])],
|
|
5246
5246
|
ruleName: "mathphrases:function-phrase"
|
|
5247
5247
|
};
|
|
5248
5248
|
}
|
|
5249
5249
|
const baseAt = findBase(tokens, pos + 1);
|
|
5250
5250
|
if (baseAt === -1) return null;
|
|
5251
5251
|
const replacement = tokens.slice(pos, baseAt + 1).map((token, index) => {
|
|
5252
|
-
if (index === 0) return
|
|
5253
|
-
if (index === baseAt - pos) return
|
|
5252
|
+
if (index === 0) return chunkICEKS6YC_cjs.createFusedToken("LOG_PHRASE", "log", [token]);
|
|
5253
|
+
if (index === baseAt - pos) return chunkICEKS6YC_cjs.createFusedToken("LOG_BASE", "base", [token]);
|
|
5254
5254
|
return token;
|
|
5255
5255
|
});
|
|
5256
5256
|
return {
|
|
@@ -5275,9 +5275,9 @@ function largerSmallerParselet(builtinIndex) {
|
|
|
5275
5275
|
return {
|
|
5276
5276
|
category: "MathPhrases",
|
|
5277
5277
|
parse(parser, token, builder) {
|
|
5278
|
-
parser.parseExpression(
|
|
5278
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conjunction, builder);
|
|
5279
5279
|
parser.consume("AND_CONJ");
|
|
5280
|
-
parser.parseExpression(
|
|
5280
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5281
5281
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5282
5282
|
builder.emitIndex(builtinIndex);
|
|
5283
5283
|
builder.emitIndex(2);
|
|
@@ -5289,7 +5289,7 @@ function largerSmallerParselet(builtinIndex) {
|
|
|
5289
5289
|
var halfParselet = {
|
|
5290
5290
|
category: "MathPhrases",
|
|
5291
5291
|
parse(parser, token, builder) {
|
|
5292
|
-
parser.parseExpression(
|
|
5292
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5293
5293
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
5294
5294
|
builder.emitNumber(2);
|
|
5295
5295
|
builder.emitOpcode(23 /* DIV */);
|
|
@@ -5300,9 +5300,9 @@ var halfParselet = {
|
|
|
5300
5300
|
var midpointParselet = {
|
|
5301
5301
|
category: "MathPhrases",
|
|
5302
5302
|
parse(parser, token, builder) {
|
|
5303
|
-
parser.parseExpression(
|
|
5303
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conjunction, builder);
|
|
5304
5304
|
parser.consume("AND_CONJ");
|
|
5305
|
-
parser.parseExpression(
|
|
5305
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5306
5306
|
builder.emitOpcode(20 /* ADD */);
|
|
5307
5307
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
5308
5308
|
builder.emitNumber(2);
|
|
@@ -5317,7 +5317,7 @@ var randomNumberParselet = definePhrasePattern({
|
|
|
5317
5317
|
{
|
|
5318
5318
|
slots: [
|
|
5319
5319
|
{ kind: "keyword", tokenTypes: ["BETWEEN"] },
|
|
5320
|
-
{ kind: "expr", bindingPower:
|
|
5320
|
+
{ kind: "expr", bindingPower: chunkMI7OTUHL_cjs.BindingPower.Product },
|
|
5321
5321
|
{ kind: "keyword", tokenTypes: ["AND_CONJ"] },
|
|
5322
5322
|
{ kind: "expr" }
|
|
5323
5323
|
],
|
|
@@ -5337,20 +5337,20 @@ var ClampParselet = class {
|
|
|
5337
5337
|
this.category = "MathPhrases";
|
|
5338
5338
|
}
|
|
5339
5339
|
parse(parser, token, builder) {
|
|
5340
|
-
parser.parseExpression(
|
|
5340
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5341
5341
|
const mid = parser.peek();
|
|
5342
5342
|
if (mid?.type === "BETWEEN") {
|
|
5343
5343
|
parser.consume();
|
|
5344
|
-
parser.parseExpression(
|
|
5344
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
5345
5345
|
parser.consume("AND_CONJ");
|
|
5346
|
-
parser.parseExpression(
|
|
5346
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5347
5347
|
} else if (mid?.type === "FROM") {
|
|
5348
5348
|
parser.consume();
|
|
5349
|
-
parser.parseExpression(
|
|
5349
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5350
5350
|
parser.consume("TO");
|
|
5351
|
-
parser.parseExpression(
|
|
5351
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5352
5352
|
} else {
|
|
5353
|
-
throw
|
|
5353
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5354
5354
|
"CLAMP_EXPECTED_BETWEEN_OR_FROM",
|
|
5355
5355
|
`Expected "between" or "from" after "clamp <value>" but got ${mid ? `"${mid.value}"` : "end of input"}`
|
|
5356
5356
|
);
|
|
@@ -5366,7 +5366,7 @@ var PROPORTION_BUILTIN_INDEX = 46;
|
|
|
5366
5366
|
var ProportionParselet = class {
|
|
5367
5367
|
constructor() {
|
|
5368
5368
|
this.category = "MathPhrases";
|
|
5369
|
-
this.bindingPower =
|
|
5369
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
5370
5370
|
}
|
|
5371
5371
|
parse(parser, left, token, builder) {
|
|
5372
5372
|
parser.parseExpression(this.bindingPower, builder);
|
|
@@ -5375,7 +5375,7 @@ var ProportionParselet = class {
|
|
|
5375
5375
|
parser.consume("IS_TO");
|
|
5376
5376
|
const whatToken = parser.consume();
|
|
5377
5377
|
if (!whatToken || whatToken.value.toLowerCase() !== "what") {
|
|
5378
|
-
throw
|
|
5378
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5379
5379
|
"PROPORTION_EXPECTED_WHAT",
|
|
5380
5380
|
`Expected "what" but got ${whatToken ? `"${whatToken.value}"` : "end of input"}`
|
|
5381
5381
|
);
|
|
@@ -5467,7 +5467,7 @@ function readCompoundingInterval(parser) {
|
|
|
5467
5467
|
const name = (token?.text ?? token?.value ?? "").toLowerCase();
|
|
5468
5468
|
const periods = PERIODS_PER_YEAR[name];
|
|
5469
5469
|
if (periods === void 0) {
|
|
5470
|
-
throw
|
|
5470
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5471
5471
|
"UNKNOWN_COMPOUNDING_INTERVAL",
|
|
5472
5472
|
`compounding ${name || "?"}: expected one of ${Object.keys(PERIODS_PER_YEAR).join(", ")}`
|
|
5473
5473
|
);
|
|
@@ -5485,12 +5485,12 @@ var InvestmentGrowthParselet = class {
|
|
|
5485
5485
|
this.annualIndex = annualIndex;
|
|
5486
5486
|
this.intervalIndex = intervalIndex;
|
|
5487
5487
|
this.category = "Finance";
|
|
5488
|
-
this.bindingPower =
|
|
5488
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
5489
5489
|
}
|
|
5490
5490
|
parse(parser, _left, _token, builder) {
|
|
5491
|
-
parser.parseExpression(
|
|
5491
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5492
5492
|
if (!parser.match("RATE_AT")) parser.consume("AT");
|
|
5493
|
-
parser.parseExpression(
|
|
5493
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5494
5494
|
const periods = readCompoundingInterval(parser);
|
|
5495
5495
|
builder.emitOpcode(2 /* SWAP */);
|
|
5496
5496
|
if (periods === 1) {
|
|
@@ -5512,13 +5512,13 @@ var PresentValueParselet = class {
|
|
|
5512
5512
|
this.category = "Finance";
|
|
5513
5513
|
}
|
|
5514
5514
|
parse(parser, _token, builder) {
|
|
5515
|
-
parser.parseExpression(
|
|
5515
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5516
5516
|
if (!parser.match("AFTER") && !parser.match("OVER") && !parser.match("IN")) {
|
|
5517
5517
|
parser.consume("AFTER");
|
|
5518
5518
|
}
|
|
5519
|
-
parser.parseExpression(
|
|
5519
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5520
5520
|
if (!parser.match("RATE_AT")) parser.consume("AT");
|
|
5521
|
-
parser.parseExpression(
|
|
5521
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5522
5522
|
builder.emitOpcode(2 /* SWAP */);
|
|
5523
5523
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5524
5524
|
builder.emitIndex(this.builtinIndex);
|
|
@@ -5529,10 +5529,10 @@ var ReturnOnInvestmentParselet = class {
|
|
|
5529
5529
|
constructor(builtinIndex) {
|
|
5530
5530
|
this.builtinIndex = builtinIndex;
|
|
5531
5531
|
this.category = "Finance";
|
|
5532
|
-
this.bindingPower =
|
|
5532
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
5533
5533
|
}
|
|
5534
5534
|
parse(parser, _left, _token, builder) {
|
|
5535
|
-
parser.parseExpression(
|
|
5535
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5536
5536
|
parser.consume("RETURNED");
|
|
5537
5537
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5538
5538
|
builder.emitIndex(this.builtinIndex);
|
|
@@ -5545,14 +5545,14 @@ var AnnualReturnParselet = class {
|
|
|
5545
5545
|
this.category = "Finance";
|
|
5546
5546
|
}
|
|
5547
5547
|
parse(parser, _token, builder) {
|
|
5548
|
-
parser.parseExpression(
|
|
5548
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5549
5549
|
parser.consume("INVESTED");
|
|
5550
|
-
parser.parseExpression(
|
|
5550
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5551
5551
|
parser.consume("RETURNED");
|
|
5552
5552
|
if (!parser.match("AFTER") && !parser.match("OVER") && !parser.match("IN")) {
|
|
5553
5553
|
parser.consume("AFTER");
|
|
5554
5554
|
}
|
|
5555
|
-
parser.parseExpression(
|
|
5555
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5556
5556
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5557
5557
|
builder.emitIndex(this.builtinIndex);
|
|
5558
5558
|
builder.emitIndex(3);
|
|
@@ -5562,15 +5562,15 @@ var AnnualReturnParselet = class {
|
|
|
5562
5562
|
// src/packages/finance/parselets/TermRateClauses.ts
|
|
5563
5563
|
function parseTermAndRate(parser, builder, termWords) {
|
|
5564
5564
|
if (matchTerm(parser, termWords)) {
|
|
5565
|
-
parser.parseExpression(
|
|
5565
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5566
5566
|
consumeRate(parser);
|
|
5567
|
-
parser.parseExpression(
|
|
5567
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5568
5568
|
return { swap: true };
|
|
5569
5569
|
}
|
|
5570
5570
|
consumeRate(parser);
|
|
5571
|
-
parser.parseExpression(
|
|
5571
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5572
5572
|
consumeTerm(parser, termWords);
|
|
5573
|
-
parser.parseExpression(
|
|
5573
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5574
5574
|
return { swap: false };
|
|
5575
5575
|
}
|
|
5576
5576
|
function matchTerm(parser, termWords) {
|
|
@@ -5600,7 +5600,7 @@ var CompoundInterestParselet = class {
|
|
|
5600
5600
|
this.category = "Finance";
|
|
5601
5601
|
}
|
|
5602
5602
|
parse(parser, _token, builder) {
|
|
5603
|
-
parser.parseExpression(
|
|
5603
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5604
5604
|
const { swap } = parseTermAndRate(parser, builder, ["AFTER", "FOR_DURATION", "OVER"]);
|
|
5605
5605
|
const periods = readCompoundingInterval(parser);
|
|
5606
5606
|
if (swap) builder.emitOpcode(2 /* SWAP */);
|
|
@@ -5626,7 +5626,7 @@ var LoanRepaymentParselet = class {
|
|
|
5626
5626
|
this.category = "Finance";
|
|
5627
5627
|
}
|
|
5628
5628
|
parse(parser, _token, builder) {
|
|
5629
|
-
parser.parseExpression(
|
|
5629
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5630
5630
|
const { swap } = parseTermAndRate(parser, builder, ["OVER"]);
|
|
5631
5631
|
if (swap) builder.emitOpcode(2 /* SWAP */);
|
|
5632
5632
|
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
@@ -5637,6 +5637,105 @@ var LoanRepaymentParselet = class {
|
|
|
5637
5637
|
}
|
|
5638
5638
|
};
|
|
5639
5639
|
|
|
5640
|
+
// src/packages/finance/parselets/BillSplitParselets.ts
|
|
5641
|
+
var SplitBetweenParselet = class {
|
|
5642
|
+
constructor(builtinIndex) {
|
|
5643
|
+
this.builtinIndex = builtinIndex;
|
|
5644
|
+
this.category = "Finance";
|
|
5645
|
+
}
|
|
5646
|
+
parse(parser, _token, builder) {
|
|
5647
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5648
|
+
parser.consume("BETWEEN");
|
|
5649
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5650
|
+
parser.match("PEOPLE");
|
|
5651
|
+
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5652
|
+
builder.emitIndex(this.builtinIndex);
|
|
5653
|
+
builder.emitIndex(2);
|
|
5654
|
+
}
|
|
5655
|
+
};
|
|
5656
|
+
var SplitWaysParselet = class {
|
|
5657
|
+
constructor(builtinIndex) {
|
|
5658
|
+
this.builtinIndex = builtinIndex;
|
|
5659
|
+
this.category = "Finance";
|
|
5660
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Conditional;
|
|
5661
|
+
}
|
|
5662
|
+
parse(parser, _left, _token, builder) {
|
|
5663
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5664
|
+
parser.consume("WAYS");
|
|
5665
|
+
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5666
|
+
builder.emitIndex(this.builtinIndex);
|
|
5667
|
+
builder.emitIndex(2);
|
|
5668
|
+
}
|
|
5669
|
+
};
|
|
5670
|
+
|
|
5671
|
+
// src/packages/finance/parselets/SavingsGoalParselets.ts
|
|
5672
|
+
var SAVINGS_PERIODS = {
|
|
5673
|
+
daily: { perYear: 365, unit: "days" },
|
|
5674
|
+
weekly: { perYear: 52, unit: "weeks" },
|
|
5675
|
+
monthly: { perYear: 12, unit: "months" },
|
|
5676
|
+
yearly: { perYear: 1, unit: "years" },
|
|
5677
|
+
annually: { perYear: 1, unit: "years" }
|
|
5678
|
+
};
|
|
5679
|
+
function readSavingsPeriod(parser) {
|
|
5680
|
+
const token = parser.peek();
|
|
5681
|
+
const word = (token?.text ?? token?.value ?? "").toLowerCase();
|
|
5682
|
+
const period = SAVINGS_PERIODS[word];
|
|
5683
|
+
if (period === void 0) {
|
|
5684
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5685
|
+
"UNKNOWN_SAVINGS_PERIOD",
|
|
5686
|
+
`savings goal: expected a contribution period, one of ${Object.keys(SAVINGS_PERIODS).join(", ")}, not "${word || "?"}".`
|
|
5687
|
+
);
|
|
5688
|
+
}
|
|
5689
|
+
parser.consume();
|
|
5690
|
+
return period;
|
|
5691
|
+
}
|
|
5692
|
+
var SavingsDurationParselet = class {
|
|
5693
|
+
constructor(builtinIndex) {
|
|
5694
|
+
this.builtinIndex = builtinIndex;
|
|
5695
|
+
this.category = "Finance";
|
|
5696
|
+
}
|
|
5697
|
+
parse(parser, _token, builder) {
|
|
5698
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5699
|
+
if (!parser.match("RATE_AT")) parser.consume("AT");
|
|
5700
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
5701
|
+
parser.match("STAR");
|
|
5702
|
+
const period = readSavingsPeriod(parser);
|
|
5703
|
+
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
5704
|
+
builder.emitNumber(period.perYear);
|
|
5705
|
+
if (parser.match("RATE_AT") || parser.match("AT")) {
|
|
5706
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5707
|
+
} else {
|
|
5708
|
+
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
5709
|
+
builder.emitNumber(0);
|
|
5710
|
+
}
|
|
5711
|
+
builder.emitOpcode(13 /* PUSH_STRING */);
|
|
5712
|
+
builder.emitString(period.unit);
|
|
5713
|
+
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5714
|
+
builder.emitIndex(this.builtinIndex);
|
|
5715
|
+
builder.emitIndex(5);
|
|
5716
|
+
}
|
|
5717
|
+
};
|
|
5718
|
+
var SavingsContributionParselet = class {
|
|
5719
|
+
constructor(builtinIndex) {
|
|
5720
|
+
this.builtinIndex = builtinIndex;
|
|
5721
|
+
this.category = "Finance";
|
|
5722
|
+
}
|
|
5723
|
+
parse(parser, _token, builder) {
|
|
5724
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
5725
|
+
parser.consume("IN");
|
|
5726
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5727
|
+
if (parser.match("RATE_AT") || parser.match("AT")) {
|
|
5728
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Conditional, builder);
|
|
5729
|
+
} else {
|
|
5730
|
+
builder.emitOpcode(10 /* PUSH_NUMBER */);
|
|
5731
|
+
builder.emitNumber(0);
|
|
5732
|
+
}
|
|
5733
|
+
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5734
|
+
builder.emitIndex(this.builtinIndex);
|
|
5735
|
+
builder.emitIndex(3);
|
|
5736
|
+
}
|
|
5737
|
+
};
|
|
5738
|
+
|
|
5640
5739
|
// src/packages/finance/parselets/SalesTaxParselet.ts
|
|
5641
5740
|
var SalesTaxParselet = class {
|
|
5642
5741
|
constructor(builtinIndex) {
|
|
@@ -5644,9 +5743,9 @@ var SalesTaxParselet = class {
|
|
|
5644
5743
|
this.category = "Finance";
|
|
5645
5744
|
}
|
|
5646
5745
|
parse(parser, _token, builder) {
|
|
5647
|
-
parser.parseExpression(
|
|
5746
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5648
5747
|
parser.consume("RATE_AT");
|
|
5649
|
-
parser.parseExpression(
|
|
5748
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5650
5749
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5651
5750
|
builder.emitIndex(this.builtinIndex);
|
|
5652
5751
|
builder.emitIndex(2);
|
|
@@ -5654,30 +5753,30 @@ var SalesTaxParselet = class {
|
|
|
5654
5753
|
};
|
|
5655
5754
|
|
|
5656
5755
|
// src/packages/finance/parselets/InflationPluginFunctions.ts
|
|
5657
|
-
var INFLATION_FROM_YEAR_TO_PRESENT_IDX =
|
|
5658
|
-
var INFLATION_TO_YEAR_FROM_PRESENT_IDX =
|
|
5659
|
-
var INFLATION_FUTURE_VALUE_IDX =
|
|
5756
|
+
var INFLATION_FROM_YEAR_TO_PRESENT_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
5757
|
+
var INFLATION_TO_YEAR_FROM_PRESENT_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
5758
|
+
var INFLATION_FUTURE_VALUE_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
5660
5759
|
function yearRangeError(code, badYear) {
|
|
5661
|
-
return
|
|
5760
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
5662
5761
|
code,
|
|
5663
|
-
`Year ${badYear} is outside the bundled CPI table's range (${
|
|
5762
|
+
`Year ${badYear} is outside the bundled CPI table's range (${chunkFR7RNOPT_cjs.CPI_MIN_YEAR}-${chunkFR7RNOPT_cjs.CPI_MAX_YEAR})`
|
|
5664
5763
|
);
|
|
5665
5764
|
}
|
|
5666
5765
|
function inflationFromYearToPresentHandler(args) {
|
|
5667
5766
|
const amountValue = args[0];
|
|
5668
5767
|
const fromYear = args[1].toNumber();
|
|
5669
5768
|
const toYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
5670
|
-
const result =
|
|
5769
|
+
const result = chunkFR7RNOPT_cjs.adjustForInflation(amountValue.toNumber(), fromYear, toYear);
|
|
5671
5770
|
if (result === void 0) return yearRangeError("INFLATION_YEAR_OUT_OF_RANGE", fromYear);
|
|
5672
|
-
return amountValue.type === 6 /* Uom */ ?
|
|
5771
|
+
return amountValue.type === 6 /* Uom */ ? chunkIT74O4BE_cjs.uomValue(result, amountValue.unit) : chunkIT74O4BE_cjs.numberValue(result);
|
|
5673
5772
|
}
|
|
5674
5773
|
function inflationToYearFromPresentHandler(args) {
|
|
5675
5774
|
const amountValue = args[0];
|
|
5676
5775
|
const fromYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
5677
5776
|
const toYear = args[1].toNumber();
|
|
5678
|
-
const result =
|
|
5777
|
+
const result = chunkFR7RNOPT_cjs.adjustForInflation(amountValue.toNumber(), fromYear, toYear);
|
|
5679
5778
|
if (result === void 0) return yearRangeError("INFLATION_YEAR_OUT_OF_RANGE", toYear);
|
|
5680
|
-
return amountValue.type === 6 /* Uom */ ?
|
|
5779
|
+
return amountValue.type === 6 /* Uom */ ? chunkIT74O4BE_cjs.uomValue(result, amountValue.unit) : chunkIT74O4BE_cjs.numberValue(result);
|
|
5681
5780
|
}
|
|
5682
5781
|
function inflationFutureValueHandler(args) {
|
|
5683
5782
|
const amountValue = args[0];
|
|
@@ -5685,11 +5784,11 @@ function inflationFutureValueHandler(args) {
|
|
|
5685
5784
|
const rate = args[2].toNumber();
|
|
5686
5785
|
const years = futureYear - (/* @__PURE__ */ new Date()).getFullYear();
|
|
5687
5786
|
if (1 + rate <= 0) {
|
|
5688
|
-
return
|
|
5787
|
+
return chunkIT74O4BE_cjs.errorValue("INVALID_RATE", `inflationFutureValue: rate ${rate} makes (1 + rate) non-positive`);
|
|
5689
5788
|
}
|
|
5690
5789
|
const amount = amountValue.toNumber();
|
|
5691
5790
|
const worth = amount / Math.pow(1 + rate, years);
|
|
5692
|
-
return amountValue.type === 6 /* Uom */ ?
|
|
5791
|
+
return amountValue.type === 6 /* Uom */ ? chunkIT74O4BE_cjs.uomValue(worth, amountValue.unit) : chunkIT74O4BE_cjs.numberValue(worth);
|
|
5693
5792
|
}
|
|
5694
5793
|
|
|
5695
5794
|
// src/packages/finance/parselets/InflationQueryParselet.ts
|
|
@@ -5708,13 +5807,13 @@ var InflationQueryParselet = class {
|
|
|
5708
5807
|
}
|
|
5709
5808
|
parse(parser, _token, builder) {
|
|
5710
5809
|
if (!hasInflationKeyword(parser)) {
|
|
5711
|
-
parser.parseExpression(
|
|
5810
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5712
5811
|
return;
|
|
5713
5812
|
}
|
|
5714
|
-
parser.parseExpression(
|
|
5813
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
5715
5814
|
if (this.variant === "what-was") {
|
|
5716
5815
|
parser.consume("WORTH_IN");
|
|
5717
|
-
parser.parseExpression(
|
|
5816
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5718
5817
|
builder.emitOpcode(50 /* CALL_PLUGIN */);
|
|
5719
5818
|
builder.emitIndex(INFLATION_TO_YEAR_FROM_PRESENT_IDX);
|
|
5720
5819
|
builder.emitIndex(2);
|
|
@@ -5723,7 +5822,7 @@ var InflationQueryParselet = class {
|
|
|
5723
5822
|
const next = parser.peek();
|
|
5724
5823
|
if (next?.type === "FROM") {
|
|
5725
5824
|
parser.consume();
|
|
5726
|
-
parser.parseExpression(
|
|
5825
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5727
5826
|
builder.emitOpcode(50 /* CALL_PLUGIN */);
|
|
5728
5827
|
builder.emitIndex(INFLATION_FROM_YEAR_TO_PRESENT_IDX);
|
|
5729
5828
|
builder.emitIndex(2);
|
|
@@ -5731,16 +5830,16 @@ var InflationQueryParselet = class {
|
|
|
5731
5830
|
}
|
|
5732
5831
|
if (next?.type === "IN") {
|
|
5733
5832
|
parser.consume();
|
|
5734
|
-
parser.parseExpression(
|
|
5833
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5735
5834
|
parser.consume("WORTH_IN");
|
|
5736
|
-
parser.parseExpression(
|
|
5835
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5737
5836
|
builder.emitOpcode(51 /* CALL_BUILTIN */);
|
|
5738
5837
|
builder.emitIndex(INFLATION_ADJUST_BUILTIN_IDX);
|
|
5739
5838
|
builder.emitIndex(3);
|
|
5740
5839
|
return;
|
|
5741
5840
|
}
|
|
5742
5841
|
const gotType = next ? next.type : "end of input";
|
|
5743
|
-
throw
|
|
5842
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5744
5843
|
"INFLATION_EXPECTED_FROM_OR_IN",
|
|
5745
5844
|
`Expected "from <year>" or "in <year> worth in <year>" after "what is <amount>", got ${gotType}`
|
|
5746
5845
|
);
|
|
@@ -5753,16 +5852,16 @@ var InflationFutureValueParselet = class {
|
|
|
5753
5852
|
this.category = "Finance";
|
|
5754
5853
|
}
|
|
5755
5854
|
parse(parser, _token, builder) {
|
|
5756
|
-
parser.parseExpression(
|
|
5855
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
5757
5856
|
parser.consume("IN");
|
|
5758
|
-
parser.parseExpression(
|
|
5857
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5759
5858
|
parser.consume("ASSUMING");
|
|
5760
|
-
parser.parseExpression(
|
|
5859
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
5761
5860
|
const inflationToken = parser.peek();
|
|
5762
5861
|
const inflationWord = inflationToken && inflationToken.type === "IDENT" ? inflationToken.value.toLowerCase() : void 0;
|
|
5763
5862
|
if (inflationWord !== "inflation") {
|
|
5764
5863
|
const got = inflationToken ? inflationToken.value : "end of input";
|
|
5765
|
-
throw
|
|
5864
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
5766
5865
|
"INFLATION_EXPECTED_INFLATION_WORD",
|
|
5767
5866
|
`Expected the word "inflation" after "assuming <rate>%", got "${got}"`
|
|
5768
5867
|
);
|
|
@@ -5806,7 +5905,7 @@ function inYearDollarsNormalizerRule(priority = 70) {
|
|
|
5806
5905
|
if (word !== "dollars" && word !== "dollar") return null;
|
|
5807
5906
|
return {
|
|
5808
5907
|
consumed: 3,
|
|
5809
|
-
replacement: [
|
|
5908
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("IN_YEAR_DOLLARS", yearToken.value, tokens.slice(pos, pos + 3))],
|
|
5810
5909
|
ruleName: "finance:in-year-dollars"
|
|
5811
5910
|
};
|
|
5812
5911
|
}
|
|
@@ -5870,7 +5969,7 @@ function readPeriod(tokens, i) {
|
|
|
5870
5969
|
if (per === void 0) return null;
|
|
5871
5970
|
const n = Number((countToken.value ?? "").replace(/,/g, ""));
|
|
5872
5971
|
if (!(n > 0)) {
|
|
5873
|
-
throw
|
|
5972
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing({
|
|
5874
5973
|
code: RecurringScheduleErrorCodes.RECURRING_INTERVAL_NOT_POSITIVE,
|
|
5875
5974
|
message: `A recurring interval must be a positive number, not "${countToken.value}".`,
|
|
5876
5975
|
expected: "a positive interval, e.g. every 2 weeks",
|
|
@@ -5928,8 +6027,8 @@ function recurringScheduleNormalizerRule(priority = 78) {
|
|
|
5928
6027
|
// `pos` and pass through on their own.
|
|
5929
6028
|
replacement: [
|
|
5930
6029
|
amount,
|
|
5931
|
-
|
|
5932
|
-
|
|
6030
|
+
chunkICEKS6YC_cjs.createFusedToken("STAR", "*", source),
|
|
6031
|
+
chunkICEKS6YC_cjs.createFusedToken("NUMBER", String(count), source)
|
|
5933
6032
|
],
|
|
5934
6033
|
consumed,
|
|
5935
6034
|
ruleName: "finance:recurring-schedule"
|
|
@@ -5938,6 +6037,77 @@ function recurringScheduleNormalizerRule(priority = 78) {
|
|
|
5938
6037
|
};
|
|
5939
6038
|
}
|
|
5940
6039
|
|
|
6040
|
+
// src/packages/finance/normalizer/BillSplitNormalizerRule.ts
|
|
6041
|
+
function wordOf2(token) {
|
|
6042
|
+
if (token === void 0) return "";
|
|
6043
|
+
return (token.text ?? token.value ?? "").toLowerCase();
|
|
6044
|
+
}
|
|
6045
|
+
var VALUE_ENDERS2 = /* @__PURE__ */ new Set([
|
|
6046
|
+
"NUMBER",
|
|
6047
|
+
"FLOAT",
|
|
6048
|
+
"HEX",
|
|
6049
|
+
"BIGINT",
|
|
6050
|
+
"RPAREN",
|
|
6051
|
+
"RBRACKET",
|
|
6052
|
+
"IDENT",
|
|
6053
|
+
"PERCENT",
|
|
6054
|
+
"STRING"
|
|
6055
|
+
]);
|
|
6056
|
+
var NUMERIC = /* @__PURE__ */ new Set(["NUMBER", "FLOAT"]);
|
|
6057
|
+
function billSplitNormalizerRule(priority = 77) {
|
|
6058
|
+
return {
|
|
6059
|
+
name: "finance:bill-split",
|
|
6060
|
+
priority,
|
|
6061
|
+
match(tokens, pos) {
|
|
6062
|
+
const head = tokens[pos];
|
|
6063
|
+
if (head === void 0) return null;
|
|
6064
|
+
if (VALUE_ENDERS2.has(head.type)) {
|
|
6065
|
+
const split = tokens[pos + 1];
|
|
6066
|
+
const count2 = tokens[pos + 2];
|
|
6067
|
+
const ways = tokens[pos + 3];
|
|
6068
|
+
if (split?.type === "IDENT" && wordOf2(split) === "split" && count2 !== void 0 && NUMERIC.has(count2.type) && ways?.type === "IDENT" && wordOf2(ways) === "ways") {
|
|
6069
|
+
return {
|
|
6070
|
+
consumed: 4,
|
|
6071
|
+
replacement: [
|
|
6072
|
+
head,
|
|
6073
|
+
chunkICEKS6YC_cjs.createFusedToken("SPLIT_WAYS", "split", [split]),
|
|
6074
|
+
count2,
|
|
6075
|
+
chunkICEKS6YC_cjs.createFusedToken("WAYS", "ways", [ways])
|
|
6076
|
+
],
|
|
6077
|
+
ruleName: "finance:bill-split"
|
|
6078
|
+
};
|
|
6079
|
+
}
|
|
6080
|
+
}
|
|
6081
|
+
if (head.type !== "IDENT" || wordOf2(head) !== "split") return null;
|
|
6082
|
+
const before = tokens[pos - 1];
|
|
6083
|
+
if (before !== void 0 && VALUE_ENDERS2.has(before.type)) return null;
|
|
6084
|
+
let betweenIndex = -1;
|
|
6085
|
+
for (let i = pos + 1; i < tokens.length; i++) {
|
|
6086
|
+
if (tokens[i].type === "BETWEEN") {
|
|
6087
|
+
betweenIndex = i;
|
|
6088
|
+
break;
|
|
6089
|
+
}
|
|
6090
|
+
}
|
|
6091
|
+
if (betweenIndex === -1) return null;
|
|
6092
|
+
const count = tokens[betweenIndex + 1];
|
|
6093
|
+
if (count === void 0 || !NUMERIC.has(count.type)) return null;
|
|
6094
|
+
const peopleIndex = betweenIndex + 2;
|
|
6095
|
+
const hasPeople = tokens[peopleIndex]?.type === "IDENT" && wordOf2(tokens[peopleIndex]) === "people";
|
|
6096
|
+
const lastIndex = hasPeople ? peopleIndex : betweenIndex + 1;
|
|
6097
|
+
const replacement = [
|
|
6098
|
+
chunkICEKS6YC_cjs.createFusedToken("SPLIT", "split", [head]),
|
|
6099
|
+
...tokens.slice(pos + 1, betweenIndex + 2)
|
|
6100
|
+
];
|
|
6101
|
+
if (hasPeople) replacement.push(chunkICEKS6YC_cjs.createFusedToken("PEOPLE", "people", [tokens[peopleIndex]]));
|
|
6102
|
+
return {
|
|
6103
|
+
consumed: lastIndex - pos + 1,
|
|
6104
|
+
replacement,
|
|
6105
|
+
ruleName: "finance:bill-split"
|
|
6106
|
+
};
|
|
6107
|
+
}
|
|
6108
|
+
};
|
|
6109
|
+
}
|
|
6110
|
+
|
|
5941
6111
|
// src/packages/finance/FinancePackage.ts
|
|
5942
6112
|
var COMPOUND_FV = 51;
|
|
5943
6113
|
var COMPOUND_INTEREST = 52;
|
|
@@ -5951,6 +6121,9 @@ var ANNUAL_RETURN = 84;
|
|
|
5951
6121
|
var TAX_REMOVE = 59;
|
|
5952
6122
|
var TAX_IN = 85;
|
|
5953
6123
|
var TAX_ON = 86;
|
|
6124
|
+
var SPLIT_EACH = 98;
|
|
6125
|
+
var SAVINGS_PAYMENT = 99;
|
|
6126
|
+
var SAVINGS_PERIODS2 = 100;
|
|
5954
6127
|
var FINANCE_PACKAGE = {
|
|
5955
6128
|
name: "solve-finance",
|
|
5956
6129
|
phrases: {
|
|
@@ -5982,6 +6155,9 @@ var FINANCE_PACKAGE = {
|
|
|
5982
6155
|
"annual return on": "ANNUAL_RETURN_ON",
|
|
5983
6156
|
"value of": "VALUE_OF",
|
|
5984
6157
|
"worth in": "WORTH_IN",
|
|
6158
|
+
"how long to save": "SAVINGS_HOW_LONG",
|
|
6159
|
+
"how much per month to save": "SAVINGS_HOW_MUCH",
|
|
6160
|
+
"how much per month to reach": "SAVINGS_HOW_MUCH",
|
|
5985
6161
|
"assuming": "ASSUMING"
|
|
5986
6162
|
},
|
|
5987
6163
|
prefixParselets: [
|
|
@@ -6000,9 +6176,12 @@ var FINANCE_PACKAGE = {
|
|
|
6000
6176
|
{ tokenType: "TAX_ON", parselet: new SalesTaxParselet(TAX_ON) },
|
|
6001
6177
|
{ tokenType: "TAX_OFF", parselet: new SalesTaxParselet(TAX_REMOVE) },
|
|
6002
6178
|
{ tokenType: "TAX_IN_PHRASE", parselet: new SalesTaxParselet(TAX_IN) },
|
|
6179
|
+
{ tokenType: "SPLIT", parselet: new SplitBetweenParselet(SPLIT_EACH) },
|
|
6003
6180
|
{ tokenType: "WHAT_IS", parselet: new InflationQueryParselet("what-is") },
|
|
6004
6181
|
{ tokenType: "WHAT_WAS", parselet: new InflationQueryParselet("what-was") },
|
|
6005
|
-
{ tokenType: "VALUE_OF", parselet: new InflationFutureValueParselet() }
|
|
6182
|
+
{ tokenType: "VALUE_OF", parselet: new InflationFutureValueParselet() },
|
|
6183
|
+
{ tokenType: "SAVINGS_HOW_LONG", parselet: new SavingsDurationParselet(SAVINGS_PERIODS2) },
|
|
6184
|
+
{ tokenType: "SAVINGS_HOW_MUCH", parselet: new SavingsContributionParselet(SAVINGS_PAYMENT) }
|
|
6006
6185
|
],
|
|
6007
6186
|
infixParselets: [
|
|
6008
6187
|
// The documented bare forms: "$1,000 after 3 years at 7%" and the "for
|
|
@@ -6011,14 +6190,22 @@ var FINANCE_PACKAGE = {
|
|
|
6011
6190
|
{ tokenType: "AFTER", parselet: new InvestmentGrowthParselet(COMPOUND_FV, COMPOUND_FV_EVERY) },
|
|
6012
6191
|
{ tokenType: "FOR_DURATION", parselet: new InvestmentGrowthParselet(COMPOUND_FV, COMPOUND_FV_EVERY) },
|
|
6013
6192
|
{ tokenType: "INVESTED", parselet: new ReturnOnInvestmentParselet(ROI) },
|
|
6014
|
-
{ tokenType: "IN_YEAR_DOLLARS", parselet: new InYearDollarsParselet() }
|
|
6193
|
+
{ tokenType: "IN_YEAR_DOLLARS", parselet: new InYearDollarsParselet() },
|
|
6194
|
+
// The amount-first split spelling, `<amount> split N ways`. Infix so the
|
|
6195
|
+
// amount (which may be `$120 + 18%`) is the left operand. See
|
|
6196
|
+
// BillSplitParselets.ts.
|
|
6197
|
+
{ tokenType: "SPLIT_WAYS", parselet: new SplitWaysParselet(SPLIT_EACH) }
|
|
6015
6198
|
],
|
|
6016
6199
|
normalizerRules: [
|
|
6017
6200
|
inYearDollarsNormalizerRule(),
|
|
6018
6201
|
// `450 monthly for 18 months` -> `450 * 18`. A recurring schedule totalled
|
|
6019
6202
|
// as a plain multiplication, so a currency amount stays currency and an
|
|
6020
6203
|
// exact one stays exact. See RecurringScheduleNormalizerRule.ts.
|
|
6021
|
-
recurringScheduleNormalizerRule()
|
|
6204
|
+
recurringScheduleNormalizerRule(),
|
|
6205
|
+
// `split $180 between 4` / `$120 + 18% split 3 ways`. Retypes split/ways/
|
|
6206
|
+
// people contextually so those words stay ordinary names everywhere else.
|
|
6207
|
+
// See BillSplitNormalizerRule.ts.
|
|
6208
|
+
billSplitNormalizerRule()
|
|
6022
6209
|
],
|
|
6023
6210
|
pluginFunctions: [
|
|
6024
6211
|
{ index: INFLATION_FROM_YEAR_TO_PRESENT_IDX, handler: inflationFromYearToPresentHandler },
|
|
@@ -6029,7 +6216,7 @@ var FINANCE_PACKAGE = {
|
|
|
6029
6216
|
|
|
6030
6217
|
// src/resolvers/QueryResolver.ts
|
|
6031
6218
|
function defaultOnError(namespace) {
|
|
6032
|
-
return (query, error) =>
|
|
6219
|
+
return (query, error) => chunkIT74O4BE_cjs.errorValue(
|
|
6033
6220
|
`${namespace.toUpperCase()}_QUERY_FAILED`,
|
|
6034
6221
|
`Failed to resolve "${query}": ${error instanceof Error ? error.message : String(error)}`
|
|
6035
6222
|
);
|
|
@@ -6084,7 +6271,7 @@ function createQueryResolver(opts) {
|
|
|
6084
6271
|
i += 3;
|
|
6085
6272
|
continue;
|
|
6086
6273
|
}
|
|
6087
|
-
i =
|
|
6274
|
+
i = chunk4K5W7EH2_cjs.nextInstruction(opcodes, i);
|
|
6088
6275
|
}
|
|
6089
6276
|
return null;
|
|
6090
6277
|
},
|
|
@@ -6095,7 +6282,7 @@ function createQueryResolver(opts) {
|
|
|
6095
6282
|
const query = args[0]?.value;
|
|
6096
6283
|
const cached = chunkZ2XP767T_cjs.getActiveQueryClient()?.getQueryData(queryKeyFor(query));
|
|
6097
6284
|
if (cached !== void 0) return cached;
|
|
6098
|
-
return
|
|
6285
|
+
return chunkIT74O4BE_cjs.errorValue(`${opts.namespace.toUpperCase()}_NOT_PREFLIGHTED`, `No cached result for "${query}"`);
|
|
6099
6286
|
};
|
|
6100
6287
|
return { resolver, pluginFunction };
|
|
6101
6288
|
}
|
|
@@ -6107,7 +6294,7 @@ function consumeCityName(parser, triggerText) {
|
|
|
6107
6294
|
words.push(parser.consume().value);
|
|
6108
6295
|
}
|
|
6109
6296
|
if (words.length === 0) {
|
|
6110
|
-
throw
|
|
6297
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
6111
6298
|
"WEATHER_EXPECTED_CITY",
|
|
6112
6299
|
`Expected a city name after "${triggerText}" (e.g. "${triggerText} London")`
|
|
6113
6300
|
);
|
|
@@ -6183,7 +6370,7 @@ async function geocodeCity(city, signal) {
|
|
|
6183
6370
|
const url = `${GEOCODING_API_URL}?name=${encodeURIComponent(city)}&count=1&language=en&format=json`;
|
|
6184
6371
|
const response = await fetch(url, { signal });
|
|
6185
6372
|
if (!response.ok) {
|
|
6186
|
-
throw
|
|
6373
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.external(
|
|
6187
6374
|
WeatherErrorCodes.GEOCODING_API_ERROR,
|
|
6188
6375
|
`Open-Meteo geocoding API returned ${response.status} for "${city}"`,
|
|
6189
6376
|
{ city, status: response.status }
|
|
@@ -6192,7 +6379,7 @@ async function geocodeCity(city, signal) {
|
|
|
6192
6379
|
const json = await response.json();
|
|
6193
6380
|
const first = json?.results?.[0];
|
|
6194
6381
|
if (!first) {
|
|
6195
|
-
throw
|
|
6382
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.validation(
|
|
6196
6383
|
WeatherErrorCodes.CITY_NOT_FOUND,
|
|
6197
6384
|
`No location found for "${city}"`,
|
|
6198
6385
|
{ city }
|
|
@@ -6211,7 +6398,7 @@ async function fetchForecast(lat, lon, signal) {
|
|
|
6211
6398
|
});
|
|
6212
6399
|
const response = await fetch(`${FORECAST_API_URL}?${params.toString()}`, { signal });
|
|
6213
6400
|
if (!response.ok) {
|
|
6214
|
-
throw
|
|
6401
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.external(
|
|
6215
6402
|
WeatherErrorCodes.FORECAST_API_ERROR,
|
|
6216
6403
|
`Open-Meteo forecast API returned ${response.status}`,
|
|
6217
6404
|
{ status: response.status }
|
|
@@ -6221,7 +6408,7 @@ async function fetchForecast(lat, lon, signal) {
|
|
|
6221
6408
|
const current = json?.current;
|
|
6222
6409
|
const daily = json?.daily;
|
|
6223
6410
|
if (!current || !daily) {
|
|
6224
|
-
throw
|
|
6411
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.external(
|
|
6225
6412
|
WeatherErrorCodes.FORECAST_RESPONSE_MALFORMED,
|
|
6226
6413
|
"Open-Meteo forecast response missing current/daily blocks"
|
|
6227
6414
|
);
|
|
@@ -6272,7 +6459,7 @@ function fetchCityWeather(city, signal) {
|
|
|
6272
6459
|
}
|
|
6273
6460
|
|
|
6274
6461
|
// src/packages/weather/WeatherPackage.ts
|
|
6275
|
-
var WEATHER_FN_IDX =
|
|
6462
|
+
var WEATHER_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6276
6463
|
var { resolver: weatherResolver, pluginFunction: weatherPluginFunction } = createQueryResolver({
|
|
6277
6464
|
namespace: "weather",
|
|
6278
6465
|
pluginFunctionIndex: WEATHER_FN_IDX,
|
|
@@ -6285,17 +6472,17 @@ var { resolver: weatherResolver, pluginFunction: weatherPluginFunction } = creat
|
|
|
6285
6472
|
const data = await fetchCityWeather(city, signal);
|
|
6286
6473
|
switch (kind) {
|
|
6287
6474
|
case "current":
|
|
6288
|
-
return
|
|
6475
|
+
return chunkIT74O4BE_cjs.stringValue(`${Math.round(data.temperature)}\xB0C, ${data.description}`);
|
|
6289
6476
|
case "temperature":
|
|
6290
|
-
return
|
|
6477
|
+
return chunkIT74O4BE_cjs.uomValue(data.temperature, "C");
|
|
6291
6478
|
case "feelslike":
|
|
6292
|
-
return
|
|
6479
|
+
return chunkIT74O4BE_cjs.uomValue(data.apparentTemperature, "C");
|
|
6293
6480
|
case "high":
|
|
6294
|
-
return
|
|
6481
|
+
return chunkIT74O4BE_cjs.uomValue(data.high, "C");
|
|
6295
6482
|
case "low":
|
|
6296
|
-
return
|
|
6483
|
+
return chunkIT74O4BE_cjs.uomValue(data.low, "C");
|
|
6297
6484
|
default:
|
|
6298
|
-
throw
|
|
6485
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.internal(
|
|
6299
6486
|
WeatherErrorCodes.UNKNOWN_QUERY_KIND,
|
|
6300
6487
|
`Unknown weather query kind "${kind}"`,
|
|
6301
6488
|
{ kind }
|
|
@@ -6358,7 +6545,7 @@ function pad22(n) {
|
|
|
6358
6545
|
function validateAndFormat(year, monthIndex, day, raw) {
|
|
6359
6546
|
const d = new Date(year, monthIndex, day);
|
|
6360
6547
|
if (d.getFullYear() !== year || d.getMonth() !== monthIndex || d.getDate() !== day) {
|
|
6361
|
-
throw
|
|
6548
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
6362
6549
|
"STOCKS_INVALID_DATE",
|
|
6363
6550
|
`"${raw}" is not a valid calendar date`
|
|
6364
6551
|
);
|
|
@@ -6367,7 +6554,7 @@ function validateAndFormat(year, monthIndex, day, raw) {
|
|
|
6367
6554
|
}
|
|
6368
6555
|
function requireYear(text, raw) {
|
|
6369
6556
|
if (!/^\d{4}$/.test(text)) {
|
|
6370
|
-
throw
|
|
6557
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
6371
6558
|
"STOCKS_INVALID_DATE",
|
|
6372
6559
|
`Expected a 4-digit year in "${raw}", got "${text}"`
|
|
6373
6560
|
);
|
|
@@ -6424,7 +6611,7 @@ function tryParseDatePhrase(parser) {
|
|
|
6424
6611
|
const year = requireYear(yearTok.value, raw);
|
|
6425
6612
|
return validateAndFormat(year, monthIndex, parseInt(g1.value, 10), raw);
|
|
6426
6613
|
}
|
|
6427
|
-
throw
|
|
6614
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
6428
6615
|
"STOCKS_INVALID_DATE",
|
|
6429
6616
|
`Expected a date after "on" (e.g. "April 12, 2005" or "4/12/2005"), got "${g1.value}"`
|
|
6430
6617
|
);
|
|
@@ -6511,7 +6698,7 @@ var MAJOR_TICKERS = /* @__PURE__ */ new Set([
|
|
|
6511
6698
|
|
|
6512
6699
|
// src/packages/stocks/normalizer/StockTickerNormalizerRule.ts
|
|
6513
6700
|
var STOCK_TICKER_TYPE = "STOCK_TICKER";
|
|
6514
|
-
var STOCK_TICKER_TYPE_ID =
|
|
6701
|
+
var STOCK_TICKER_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId(STOCK_TICKER_TYPE);
|
|
6515
6702
|
function stockTickerNormalizerRule() {
|
|
6516
6703
|
return {
|
|
6517
6704
|
name: "stocks:bare-ticker",
|
|
@@ -6521,7 +6708,7 @@ function stockTickerNormalizerRule() {
|
|
|
6521
6708
|
if (!token || token.type !== "IDENT") return null;
|
|
6522
6709
|
if (!MAJOR_TICKERS.has(token.value)) return null;
|
|
6523
6710
|
if (pos > 0 && tokens[pos - 1].type === "COLON") return null;
|
|
6524
|
-
const fusedToken = new
|
|
6711
|
+
const fusedToken = new chunkYJHY7CMN_cjs.LexerToken(
|
|
6525
6712
|
STOCK_TICKER_TYPE,
|
|
6526
6713
|
STOCK_TICKER_TYPE_ID,
|
|
6527
6714
|
token.value,
|
|
@@ -6547,7 +6734,7 @@ function tryParseDateSuffix(parser) {
|
|
|
6547
6734
|
parser.consume();
|
|
6548
6735
|
const onTok = parser.peek();
|
|
6549
6736
|
if (!onTok || onTok.type !== "IDENT" || onTok.value.toLowerCase() !== "on") {
|
|
6550
|
-
throw
|
|
6737
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
6551
6738
|
"STOCKS_EXPECTED_ON",
|
|
6552
6739
|
`Expected "on <date>" after "${lower}" (e.g. "AAPL ${lower} on April 12, 2005")`
|
|
6553
6740
|
);
|
|
@@ -6560,7 +6747,7 @@ function tryParseDateSuffix(parser) {
|
|
|
6560
6747
|
}
|
|
6561
6748
|
const date = tryParseDatePhrase(parser);
|
|
6562
6749
|
if (!date) {
|
|
6563
|
-
throw
|
|
6750
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
6564
6751
|
"STOCKS_EXPECTED_DATE",
|
|
6565
6752
|
`Expected a date after "on" (e.g. "April 12, 2005" or "4/12/2005")`
|
|
6566
6753
|
);
|
|
@@ -6590,7 +6777,7 @@ function finishStockExpression(parser, builder, ticker, currentFnIdx, historical
|
|
|
6590
6777
|
const suffix = tryParseDateSuffix(parser);
|
|
6591
6778
|
if (sawStar && !suffix) {
|
|
6592
6779
|
emitStockQuery(builder, ticker, null, currentFnIdx, historicalFnIdx);
|
|
6593
|
-
parser.parseExpression(
|
|
6780
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Product, builder);
|
|
6594
6781
|
builder.emitOpcode(22 /* MUL */);
|
|
6595
6782
|
return;
|
|
6596
6783
|
}
|
|
@@ -6608,7 +6795,7 @@ function stockFnParselet(currentFnIdx, historicalFnIdx) {
|
|
|
6608
6795
|
} else if (tickerToken.type === "IDENT" || tickerToken.type === STOCK_TICKER_TYPE) {
|
|
6609
6796
|
ticker = tickerToken.value.toUpperCase();
|
|
6610
6797
|
} else {
|
|
6611
|
-
throw
|
|
6798
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
6612
6799
|
"STOCKS_INVALID_TICKER",
|
|
6613
6800
|
`Expected a ticker symbol inside stock(...), got "${tickerToken.value}" (${tickerToken.type})`
|
|
6614
6801
|
);
|
|
@@ -6630,10 +6817,10 @@ function bareStockTickerParselet(currentFnIdx, historicalFnIdx) {
|
|
|
6630
6817
|
|
|
6631
6818
|
// src/packages/stocks/StocksPackage.ts
|
|
6632
6819
|
function createStocksPackage(config = {}) {
|
|
6633
|
-
const currentFnIdx =
|
|
6634
|
-
const historicalFnIdx =
|
|
6820
|
+
const currentFnIdx = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6821
|
+
const historicalFnIdx = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6635
6822
|
function notConfigured(what) {
|
|
6636
|
-
return
|
|
6823
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
6637
6824
|
"STOCKS_NOT_CONFIGURED",
|
|
6638
6825
|
`Stock data provider not configured. Supply ${what} via createStocksPackage({ ... }); see the StocksPackage doc comment.`
|
|
6639
6826
|
);
|
|
@@ -6646,7 +6833,7 @@ function createStocksPackage(config = {}) {
|
|
|
6646
6833
|
fetchQuery: async (ticker, signal) => {
|
|
6647
6834
|
if (!config.fetchQuote) return notConfigured("fetchQuote");
|
|
6648
6835
|
const quote = await config.fetchQuote(ticker, signal);
|
|
6649
|
-
return
|
|
6836
|
+
return chunkIT74O4BE_cjs.uomValue(quote.price, quote.currency ?? "USD");
|
|
6650
6837
|
}
|
|
6651
6838
|
});
|
|
6652
6839
|
const { resolver: historicalResolver, pluginFunction: historicalPluginFunction } = createQueryResolver({
|
|
@@ -6658,8 +6845,8 @@ function createStocksPackage(config = {}) {
|
|
|
6658
6845
|
const [field, ticker, isoDate] = query.split(":");
|
|
6659
6846
|
if (!config.fetchHistoricalQuote) return notConfigured("fetchHistoricalQuote");
|
|
6660
6847
|
const quote = await config.fetchHistoricalQuote(ticker, isoDate, signal);
|
|
6661
|
-
if (field === "volume") return
|
|
6662
|
-
return
|
|
6848
|
+
if (field === "volume") return chunkIT74O4BE_cjs.numberValue(quote.volume ?? 0);
|
|
6849
|
+
return chunkIT74O4BE_cjs.uomValue(quote.close, quote.currency ?? "USD");
|
|
6663
6850
|
}
|
|
6664
6851
|
});
|
|
6665
6852
|
const pkg = {
|
|
@@ -6706,20 +6893,20 @@ function knowledgeQueryParselet(pluginFnIdx) {
|
|
|
6706
6893
|
|
|
6707
6894
|
// src/packages/knowledge/KnowledgePackage.ts
|
|
6708
6895
|
function createKnowledgePackage(config = {}) {
|
|
6709
|
-
const fnIdx =
|
|
6896
|
+
const fnIdx = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6710
6897
|
const { resolver, pluginFunction } = createQueryResolver({
|
|
6711
6898
|
namespace: "knowledge",
|
|
6712
6899
|
pluginFunctionIndex: fnIdx,
|
|
6713
6900
|
staleTimeMs: config.staleTimeMs ?? 5 * 60 * 1e3,
|
|
6714
6901
|
fetchQuery: async (query, signal) => {
|
|
6715
6902
|
if (!config.answerQuery) {
|
|
6716
|
-
return
|
|
6903
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
6717
6904
|
"KNOWLEDGE_NOT_CONFIGURED",
|
|
6718
6905
|
`Knowledge answer provider not configured. Supply answerQuery via createKnowledgePackage({ ... }); see the KnowledgePackage doc comment.`
|
|
6719
6906
|
);
|
|
6720
6907
|
}
|
|
6721
6908
|
const answer = await config.answerQuery(query, signal);
|
|
6722
|
-
return
|
|
6909
|
+
return chunkIT74O4BE_cjs.stringValue(answer);
|
|
6723
6910
|
}
|
|
6724
6911
|
});
|
|
6725
6912
|
return {
|
|
@@ -6746,23 +6933,23 @@ function createKnowledgePackage(config = {}) {
|
|
|
6746
6933
|
// src/packages/lines/LinesPluginFunctions.ts
|
|
6747
6934
|
function checkLineValue(v, lineNumber) {
|
|
6748
6935
|
if (v === void 0) {
|
|
6749
|
-
return
|
|
6936
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_NOT_YET_EVALUATED", `Line ${lineNumber} has not been evaluated yet (forward reference, or out of range)`);
|
|
6750
6937
|
}
|
|
6751
6938
|
if (v.type === 12 /* Pending */) {
|
|
6752
|
-
return
|
|
6939
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_RESULT_PENDING", `Line ${lineNumber}'s result is still resolving`);
|
|
6753
6940
|
}
|
|
6754
6941
|
if (v.type === 13 /* Error */) {
|
|
6755
|
-
return
|
|
6942
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_RESULT_ERROR", `Line ${lineNumber} has an error`);
|
|
6756
6943
|
}
|
|
6757
6944
|
return null;
|
|
6758
6945
|
}
|
|
6759
6946
|
function requireContext(context) {
|
|
6760
6947
|
if (!context?.getLineResult) {
|
|
6761
|
-
return
|
|
6948
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_REF_NO_DOCUMENT", "Cross-line references require a real document \u2014 not available outside one (e.g. evaluateExpression()'s single-expression path)");
|
|
6762
6949
|
}
|
|
6763
6950
|
return null;
|
|
6764
6951
|
}
|
|
6765
|
-
var PREV_FN_IDX =
|
|
6952
|
+
var PREV_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6766
6953
|
function prevHandler(_args, context) {
|
|
6767
6954
|
const ctxError = requireContext(context);
|
|
6768
6955
|
if (ctxError) return ctxError;
|
|
@@ -6771,7 +6958,7 @@ function prevHandler(_args, context) {
|
|
|
6771
6958
|
const err = checkLineValue(v, targetLine);
|
|
6772
6959
|
return err ?? v;
|
|
6773
6960
|
}
|
|
6774
|
-
var LINE_REF_FN_IDX =
|
|
6961
|
+
var LINE_REF_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6775
6962
|
function lineRefHandler(args, context) {
|
|
6776
6963
|
const ctxError = requireContext(context);
|
|
6777
6964
|
if (ctxError) return ctxError;
|
|
@@ -6791,28 +6978,28 @@ function aggregateRange(from, to, context, isAverage) {
|
|
|
6791
6978
|
const err = checkLineValue(v, n);
|
|
6792
6979
|
if (err) return err;
|
|
6793
6980
|
if (v.type !== 0 /* Number */ && v.type !== 6 /* Uom */) {
|
|
6794
|
-
return
|
|
6981
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_NON_NUMERIC", `Line ${n} is not a plain number or unit value \u2014 cannot include it in a sum/total/average range`);
|
|
6795
6982
|
}
|
|
6796
6983
|
if (v.type === 6 /* Uom */) {
|
|
6797
6984
|
sawUom = true;
|
|
6798
6985
|
if (commonUnit === void 0) commonUnit = v.unit;
|
|
6799
6986
|
else if (v.unit !== commonUnit) {
|
|
6800
|
-
return
|
|
6987
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_MIXED_UNITS", `Line ${n}'s unit (${v.unit}) doesn't match the range's first unit (${commonUnit}) \u2014 aggregating mixed units would silently misrepresent the result`);
|
|
6801
6988
|
}
|
|
6802
6989
|
}
|
|
6803
6990
|
total += v.toNumber();
|
|
6804
6991
|
count++;
|
|
6805
6992
|
}
|
|
6806
6993
|
const result = isAverage ? total / count : total;
|
|
6807
|
-
return sawUom ?
|
|
6994
|
+
return sawUom ? chunkIT74O4BE_cjs.uomValue(result, commonUnit) : chunkIT74O4BE_cjs.numberValue(result);
|
|
6808
6995
|
}
|
|
6809
|
-
var SUM_RANGE_FN_IDX =
|
|
6996
|
+
var SUM_RANGE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6810
6997
|
function sumRangeHandler(args, context) {
|
|
6811
6998
|
const ctxError = requireContext(context);
|
|
6812
6999
|
if (ctxError) return ctxError;
|
|
6813
7000
|
return aggregateRange(args[0].toNumber(), args[1].toNumber(), context, false);
|
|
6814
7001
|
}
|
|
6815
|
-
var AVERAGE_RANGE_FN_IDX =
|
|
7002
|
+
var AVERAGE_RANGE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6816
7003
|
function averageRangeHandler(args, context) {
|
|
6817
7004
|
const ctxError = requireContext(context);
|
|
6818
7005
|
if (ctxError) return ctxError;
|
|
@@ -6821,7 +7008,7 @@ function averageRangeHandler(args, context) {
|
|
|
6821
7008
|
function aggregateAbove(context, isAverage) {
|
|
6822
7009
|
const boundaryCheck = context.isLineBoundary;
|
|
6823
7010
|
if (!boundaryCheck) {
|
|
6824
|
-
return
|
|
7011
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_REF_NO_DOCUMENT", '"above" aggregation requires a real document');
|
|
6825
7012
|
}
|
|
6826
7013
|
let total = 0;
|
|
6827
7014
|
let count = 0;
|
|
@@ -6833,29 +7020,29 @@ function aggregateAbove(context, isAverage) {
|
|
|
6833
7020
|
const err = checkLineValue(v, n);
|
|
6834
7021
|
if (err) return err;
|
|
6835
7022
|
if (v.type !== 0 /* Number */ && v.type !== 6 /* Uom */) {
|
|
6836
|
-
return
|
|
7023
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_NON_NUMERIC", `Line ${n} is not a plain number or unit value \u2014 cannot include it in "above" aggregation`);
|
|
6837
7024
|
}
|
|
6838
7025
|
if (v.type === 6 /* Uom */) {
|
|
6839
7026
|
sawUom = true;
|
|
6840
7027
|
if (commonUnit === void 0) commonUnit = v.unit;
|
|
6841
7028
|
else if (v.unit !== commonUnit) {
|
|
6842
|
-
return
|
|
7029
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_MIXED_UNITS", `Line ${n}'s unit (${v.unit}) doesn't match the range's unit (${commonUnit})`);
|
|
6843
7030
|
}
|
|
6844
7031
|
}
|
|
6845
7032
|
total += v.toNumber();
|
|
6846
7033
|
count++;
|
|
6847
7034
|
}
|
|
6848
|
-
if (count === 0) return
|
|
7035
|
+
if (count === 0) return chunkIT74O4BE_cjs.errorValue("LINE_RANGE_EMPTY", "No lines above to aggregate (hit the top of the document, a blank line, or a heading immediately)");
|
|
6849
7036
|
const result = isAverage ? total / count : total;
|
|
6850
|
-
return sawUom ?
|
|
7037
|
+
return sawUom ? chunkIT74O4BE_cjs.uomValue(result, commonUnit) : chunkIT74O4BE_cjs.numberValue(result);
|
|
6851
7038
|
}
|
|
6852
|
-
var TOTAL_ABOVE_FN_IDX =
|
|
7039
|
+
var TOTAL_ABOVE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6853
7040
|
function totalAboveHandler(_args, context) {
|
|
6854
7041
|
const ctxError = requireContext(context);
|
|
6855
7042
|
if (ctxError) return ctxError;
|
|
6856
7043
|
return aggregateAbove(context, false);
|
|
6857
7044
|
}
|
|
6858
|
-
var AVERAGE_ABOVE_FN_IDX =
|
|
7045
|
+
var AVERAGE_ABOVE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
6859
7046
|
function averageAboveHandler(_args, context) {
|
|
6860
7047
|
const ctxError = requireContext(context);
|
|
6861
7048
|
if (ctxError) return ctxError;
|
|
@@ -6927,9 +7114,9 @@ var AboveAggregateParselet = class {
|
|
|
6927
7114
|
};
|
|
6928
7115
|
|
|
6929
7116
|
// src/packages/lines/normalizer/LineRefNormalizerRule.ts
|
|
6930
|
-
var LINE_REF_TYPE_ID =
|
|
6931
|
-
var SUM_RANGE_CALL_TYPE_ID =
|
|
6932
|
-
var AVERAGE_RANGE_CALL_TYPE_ID =
|
|
7117
|
+
var LINE_REF_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId("LINE_REF");
|
|
7118
|
+
var SUM_RANGE_CALL_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId("SUM_RANGE_CALL");
|
|
7119
|
+
var AVERAGE_RANGE_CALL_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId("AVERAGE_RANGE_CALL");
|
|
6933
7120
|
function lineRefNormalizerRule() {
|
|
6934
7121
|
return {
|
|
6935
7122
|
name: "lines:line-ref",
|
|
@@ -6966,7 +7153,7 @@ function lineRefNormalizerRule() {
|
|
|
6966
7153
|
};
|
|
6967
7154
|
}
|
|
6968
7155
|
function makeLineRefToken(lineNumberText, sourceToken) {
|
|
6969
|
-
return new
|
|
7156
|
+
return new chunkYJHY7CMN_cjs.LexerToken(
|
|
6970
7157
|
"LINE_REF",
|
|
6971
7158
|
LINE_REF_TYPE_ID,
|
|
6972
7159
|
lineNumberText,
|
|
@@ -6992,7 +7179,7 @@ function rangeCallNormalizerRule() {
|
|
|
6992
7179
|
return {
|
|
6993
7180
|
consumed: 1,
|
|
6994
7181
|
replacement: [
|
|
6995
|
-
new
|
|
7182
|
+
new chunkYJHY7CMN_cjs.LexerToken(tokenType, typeId, token.value, token.value, token.offset, 0, token.line, token.col)
|
|
6996
7183
|
],
|
|
6997
7184
|
ruleName: "lines:range-call"
|
|
6998
7185
|
};
|
|
@@ -7040,7 +7227,7 @@ var ColumnAggregateParselet = class {
|
|
|
7040
7227
|
parse(parser, _token, builder) {
|
|
7041
7228
|
const next = parser.peek();
|
|
7042
7229
|
if (!next || next.type !== "STRING") {
|
|
7043
|
-
throw
|
|
7230
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
7044
7231
|
"TABLE_COLUMN_NAME_EXPECTED",
|
|
7045
7232
|
`Expected a quoted column name after "... of column" but got ${next ? `"${next.value}"` : "end of input"}`
|
|
7046
7233
|
);
|
|
@@ -7191,14 +7378,14 @@ function reduce(op, cells) {
|
|
|
7191
7378
|
function aggregateColumn(op, columnName2, context) {
|
|
7192
7379
|
const getLineText = context?.getLineText;
|
|
7193
7380
|
if (!getLineText || context.lineIndex < 1) {
|
|
7194
|
-
return
|
|
7381
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7195
7382
|
TablesErrorCodes.TABLE_NO_DOCUMENT,
|
|
7196
7383
|
"Reading a table column needs a real document, which the single-expression path (evaluateExpression) does not have"
|
|
7197
7384
|
);
|
|
7198
7385
|
}
|
|
7199
7386
|
const table = findTableAbove(getLineText, context.lineIndex);
|
|
7200
7387
|
if (!table) {
|
|
7201
|
-
return
|
|
7388
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7202
7389
|
TablesErrorCodes.TABLE_NOT_FOUND,
|
|
7203
7390
|
'No markdown table found above this line (a table row starts with "|", and needs a "|---|" separator under its header)'
|
|
7204
7391
|
);
|
|
@@ -7206,20 +7393,20 @@ function aggregateColumn(op, columnName2, context) {
|
|
|
7206
7393
|
const index = columnIndex(table.header, columnName2);
|
|
7207
7394
|
if (index === -1) {
|
|
7208
7395
|
const names = table.header.map((h) => `"${h}"`).join(", ");
|
|
7209
|
-
return
|
|
7396
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7210
7397
|
TablesErrorCodes.TABLE_COLUMN_NOT_FOUND,
|
|
7211
7398
|
`The table above has no column named "${columnName2}". Its columns are: ${names}`
|
|
7212
7399
|
);
|
|
7213
7400
|
}
|
|
7214
7401
|
const cells = numericColumn(table, index);
|
|
7215
|
-
if (op === "count") return
|
|
7402
|
+
if (op === "count") return chunkIT74O4BE_cjs.numberValue(cells.length);
|
|
7216
7403
|
if (cells.length === 0) {
|
|
7217
|
-
return
|
|
7404
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7218
7405
|
TablesErrorCodes.TABLE_COLUMN_NO_NUMERIC_CELLS,
|
|
7219
7406
|
`Column "${columnName2}" has no plain-number cells to aggregate (currency and unit cells are not read yet)`
|
|
7220
7407
|
);
|
|
7221
7408
|
}
|
|
7222
|
-
return
|
|
7409
|
+
return chunkIT74O4BE_cjs.numberValue(reduce(op, cells));
|
|
7223
7410
|
}
|
|
7224
7411
|
function columnName(args) {
|
|
7225
7412
|
const value = args[0];
|
|
@@ -7228,27 +7415,27 @@ function columnName(args) {
|
|
|
7228
7415
|
}
|
|
7229
7416
|
return String(value?.value ?? "");
|
|
7230
7417
|
}
|
|
7231
|
-
var TABLE_COLUMN_SUM_FN_IDX =
|
|
7418
|
+
var TABLE_COLUMN_SUM_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7232
7419
|
function tableColumnSumHandler(args, context) {
|
|
7233
7420
|
return aggregateColumn("sum", columnName(args), context);
|
|
7234
7421
|
}
|
|
7235
|
-
var TABLE_COLUMN_AVERAGE_FN_IDX =
|
|
7422
|
+
var TABLE_COLUMN_AVERAGE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7236
7423
|
function tableColumnAverageHandler(args, context) {
|
|
7237
7424
|
return aggregateColumn("average", columnName(args), context);
|
|
7238
7425
|
}
|
|
7239
|
-
var TABLE_COLUMN_MIN_FN_IDX =
|
|
7426
|
+
var TABLE_COLUMN_MIN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7240
7427
|
function tableColumnMinHandler(args, context) {
|
|
7241
7428
|
return aggregateColumn("min", columnName(args), context);
|
|
7242
7429
|
}
|
|
7243
|
-
var TABLE_COLUMN_MAX_FN_IDX =
|
|
7430
|
+
var TABLE_COLUMN_MAX_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7244
7431
|
function tableColumnMaxHandler(args, context) {
|
|
7245
7432
|
return aggregateColumn("max", columnName(args), context);
|
|
7246
7433
|
}
|
|
7247
|
-
var TABLE_COLUMN_COUNT_FN_IDX =
|
|
7434
|
+
var TABLE_COLUMN_COUNT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7248
7435
|
function tableColumnCountHandler(args, context) {
|
|
7249
7436
|
return aggregateColumn("count", columnName(args), context);
|
|
7250
7437
|
}
|
|
7251
|
-
var TABLE_COLUMN_MEDIAN_FN_IDX =
|
|
7438
|
+
var TABLE_COLUMN_MEDIAN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7252
7439
|
function tableColumnMedianHandler(args, context) {
|
|
7253
7440
|
return aggregateColumn("median", columnName(args), context);
|
|
7254
7441
|
}
|
|
@@ -7286,11 +7473,190 @@ var TABLES_PACKAGE = {
|
|
|
7286
7473
|
]
|
|
7287
7474
|
};
|
|
7288
7475
|
|
|
7476
|
+
// src/packages/tags/parselets/TagAggregateParselet.ts
|
|
7477
|
+
var TagAggregateParselet = class {
|
|
7478
|
+
constructor(pluginFnIndex) {
|
|
7479
|
+
this.pluginFnIndex = pluginFnIndex;
|
|
7480
|
+
this.category = "Tags";
|
|
7481
|
+
}
|
|
7482
|
+
parse(_parser, token, builder) {
|
|
7483
|
+
builder.emitOpcode(13 /* PUSH_STRING */);
|
|
7484
|
+
builder.emitString(token.value);
|
|
7485
|
+
builder.emitOpcode(50 /* CALL_PLUGIN */);
|
|
7486
|
+
builder.emitIndex(this.pluginFnIndex);
|
|
7487
|
+
builder.emitIndex(1);
|
|
7488
|
+
}
|
|
7489
|
+
};
|
|
7490
|
+
|
|
7491
|
+
// src/packages/tags/normalizer/TagAggregateNormalizerRule.ts
|
|
7492
|
+
function wordOf3(token) {
|
|
7493
|
+
if (token === void 0) return "";
|
|
7494
|
+
return (token.text ?? token.value ?? "").toLowerCase();
|
|
7495
|
+
}
|
|
7496
|
+
var AGGREGATE_TOKEN = {
|
|
7497
|
+
TOTAL_OF: "TAG_SUM",
|
|
7498
|
+
COUNT_OF: "TAG_COUNT",
|
|
7499
|
+
AVERAGE_OF: "TAG_AVERAGE"
|
|
7500
|
+
};
|
|
7501
|
+
var AGGREGATE_WORDS = /* @__PURE__ */ new Set(["total", "sum", "count", "average"]);
|
|
7502
|
+
function tagAggregateNormalizerRule(priority = 80) {
|
|
7503
|
+
return {
|
|
7504
|
+
name: "tags:aggregate",
|
|
7505
|
+
priority,
|
|
7506
|
+
match(tokens, pos) {
|
|
7507
|
+
const head = tokens[pos];
|
|
7508
|
+
if (head === void 0) return null;
|
|
7509
|
+
const fused = AGGREGATE_TOKEN[head.type];
|
|
7510
|
+
if (fused !== void 0) {
|
|
7511
|
+
const tag = tokens[pos + 1];
|
|
7512
|
+
if (tag?.type !== "TAG") return null;
|
|
7513
|
+
return {
|
|
7514
|
+
consumed: 2,
|
|
7515
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken(fused, tag.value ?? "", [head, tag])],
|
|
7516
|
+
ruleName: "tags:aggregate"
|
|
7517
|
+
};
|
|
7518
|
+
}
|
|
7519
|
+
if (head.type === "IDENT" && wordOf3(head) === "sum") {
|
|
7520
|
+
const of = tokens[pos + 1];
|
|
7521
|
+
const tag = tokens[pos + 2];
|
|
7522
|
+
if (wordOf3(of) !== "of") return null;
|
|
7523
|
+
if (tag?.type !== "TAG") return null;
|
|
7524
|
+
return {
|
|
7525
|
+
consumed: 3,
|
|
7526
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("TAG_SUM", tag.value ?? "", [head, of, tag])],
|
|
7527
|
+
ruleName: "tags:aggregate"
|
|
7528
|
+
};
|
|
7529
|
+
}
|
|
7530
|
+
return null;
|
|
7531
|
+
}
|
|
7532
|
+
};
|
|
7533
|
+
}
|
|
7534
|
+
function tagStripNormalizerRule(priority = 40) {
|
|
7535
|
+
return {
|
|
7536
|
+
name: "tags:strip",
|
|
7537
|
+
priority,
|
|
7538
|
+
match(tokens, pos) {
|
|
7539
|
+
if (tokens[pos]?.type !== "TAG") return null;
|
|
7540
|
+
const before = tokens[pos - 1];
|
|
7541
|
+
if (before !== void 0) {
|
|
7542
|
+
if (AGGREGATE_TOKEN[before.type] !== void 0) return null;
|
|
7543
|
+
if (wordOf3(before) === "of" && AGGREGATE_WORDS.has(wordOf3(tokens[pos - 2]))) return null;
|
|
7544
|
+
}
|
|
7545
|
+
return { consumed: 1, replacement: [], ruleName: "tags:strip" };
|
|
7546
|
+
}
|
|
7547
|
+
};
|
|
7548
|
+
}
|
|
7549
|
+
|
|
7550
|
+
// src/packages/tags/TagScanner.ts
|
|
7551
|
+
function escapeTag(name) {
|
|
7552
|
+
return name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
7553
|
+
}
|
|
7554
|
+
function lineCarriesTag(rawText, tag) {
|
|
7555
|
+
if (tag === "") return false;
|
|
7556
|
+
const re = new RegExp(`(?:^|[^0-9A-Za-z_])#${escapeTag(tag)}(?![0-9A-Za-z_-])`, "i");
|
|
7557
|
+
const m = re.exec(rawText);
|
|
7558
|
+
if (m === null) return false;
|
|
7559
|
+
const hashIndex = m.index + m[0].indexOf("#");
|
|
7560
|
+
return rawText.slice(0, hashIndex).trim().length > 0;
|
|
7561
|
+
}
|
|
7562
|
+
|
|
7563
|
+
// src/packages/tags/TagsPluginFunctions.ts
|
|
7564
|
+
function checkLineValue2(v, lineNumber) {
|
|
7565
|
+
if (v === void 0) {
|
|
7566
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_NOT_YET_EVALUATED", `Line ${lineNumber} has not been evaluated yet`);
|
|
7567
|
+
}
|
|
7568
|
+
if (v.type === 12 /* Pending */) {
|
|
7569
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_RESULT_PENDING", `Line ${lineNumber}'s result is still resolving`);
|
|
7570
|
+
}
|
|
7571
|
+
if (v.type === 13 /* Error */) {
|
|
7572
|
+
return chunkIT74O4BE_cjs.errorValue("LINE_RESULT_ERROR", `Line ${lineNumber} has an error`);
|
|
7573
|
+
}
|
|
7574
|
+
return null;
|
|
7575
|
+
}
|
|
7576
|
+
function requireContext2(context) {
|
|
7577
|
+
if (!context?.getLineResult || !context.getLineText) {
|
|
7578
|
+
return chunkIT74O4BE_cjs.errorValue("TAG_NO_DOCUMENT", "Category tag sums require a real document, not available outside one (e.g. evaluateExpression()'s single-expression path)");
|
|
7579
|
+
}
|
|
7580
|
+
return null;
|
|
7581
|
+
}
|
|
7582
|
+
function aggregateTagged(context, tag, mode) {
|
|
7583
|
+
const getText = context.getLineText;
|
|
7584
|
+
const getResult = context.getLineResult;
|
|
7585
|
+
const isBoundary = context.isLineBoundary;
|
|
7586
|
+
const needle = tag.toLowerCase();
|
|
7587
|
+
let total = 0;
|
|
7588
|
+
let count = 0;
|
|
7589
|
+
let commonUnit;
|
|
7590
|
+
let sawUom = false;
|
|
7591
|
+
for (let n = 1; ; n++) {
|
|
7592
|
+
const text = getText(n);
|
|
7593
|
+
if (text === void 0) break;
|
|
7594
|
+
if (n === context.lineIndex) continue;
|
|
7595
|
+
if (isBoundary && isBoundary(n)) continue;
|
|
7596
|
+
if (!lineCarriesTag(text, needle)) continue;
|
|
7597
|
+
const v = getResult(n);
|
|
7598
|
+
const err = checkLineValue2(v, n);
|
|
7599
|
+
if (err) return err;
|
|
7600
|
+
if (mode !== "count") {
|
|
7601
|
+
if (v.type !== 0 /* Number */ && v.type !== 6 /* Uom */) {
|
|
7602
|
+
return chunkIT74O4BE_cjs.errorValue("TAG_NON_NUMERIC", `Line ${n}, tagged #${tag}, is not a plain number or unit value.`);
|
|
7603
|
+
}
|
|
7604
|
+
if (v.type === 6 /* Uom */) {
|
|
7605
|
+
sawUom = true;
|
|
7606
|
+
if (commonUnit === void 0) commonUnit = v.unit;
|
|
7607
|
+
else if (v.unit !== commonUnit) {
|
|
7608
|
+
return chunkIT74O4BE_cjs.errorValue("TAG_MIXED_UNITS", `Line ${n}'s unit (${v.unit}) doesn't match #${tag}'s first unit (${commonUnit}), aggregating mixed units would misrepresent the result.`);
|
|
7609
|
+
}
|
|
7610
|
+
}
|
|
7611
|
+
total += v.toNumber();
|
|
7612
|
+
}
|
|
7613
|
+
count++;
|
|
7614
|
+
}
|
|
7615
|
+
if (mode === "count") return chunkIT74O4BE_cjs.numberValue(count);
|
|
7616
|
+
if (count === 0) return chunkIT74O4BE_cjs.errorValue("TAG_EMPTY", `No lines are tagged #${tag}.`);
|
|
7617
|
+
const result = mode === "average" ? total / count : total;
|
|
7618
|
+
return sawUom ? chunkIT74O4BE_cjs.uomValue(result, commonUnit) : chunkIT74O4BE_cjs.numberValue(result);
|
|
7619
|
+
}
|
|
7620
|
+
var TAG_SUM_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7621
|
+
function tagSumHandler(args, context) {
|
|
7622
|
+
const ctxError = requireContext2(context);
|
|
7623
|
+
if (ctxError) return ctxError;
|
|
7624
|
+
return aggregateTagged(context, String(args[0].value), "sum");
|
|
7625
|
+
}
|
|
7626
|
+
var TAG_AVERAGE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7627
|
+
function tagAverageHandler(args, context) {
|
|
7628
|
+
const ctxError = requireContext2(context);
|
|
7629
|
+
if (ctxError) return ctxError;
|
|
7630
|
+
return aggregateTagged(context, String(args[0].value), "average");
|
|
7631
|
+
}
|
|
7632
|
+
var TAG_COUNT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7633
|
+
function tagCountHandler(args, context) {
|
|
7634
|
+
const ctxError = requireContext2(context);
|
|
7635
|
+
if (ctxError) return ctxError;
|
|
7636
|
+
return aggregateTagged(context, String(args[0].value), "count");
|
|
7637
|
+
}
|
|
7638
|
+
|
|
7639
|
+
// src/packages/tags/TagsPackage.ts
|
|
7640
|
+
var TAGS_PACKAGE = {
|
|
7641
|
+
name: "solve-tags",
|
|
7642
|
+
normalizerRules: [tagAggregateNormalizerRule(), tagStripNormalizerRule()],
|
|
7643
|
+
prefixParselets: [
|
|
7644
|
+
{ tokenType: "TAG_SUM", parselet: new TagAggregateParselet(TAG_SUM_FN_IDX) },
|
|
7645
|
+
{ tokenType: "TAG_AVERAGE", parselet: new TagAggregateParselet(TAG_AVERAGE_FN_IDX) },
|
|
7646
|
+
{ tokenType: "TAG_COUNT", parselet: new TagAggregateParselet(TAG_COUNT_FN_IDX) }
|
|
7647
|
+
],
|
|
7648
|
+
pluginFunctions: [
|
|
7649
|
+
{ index: TAG_SUM_FN_IDX, handler: tagSumHandler },
|
|
7650
|
+
{ index: TAG_AVERAGE_FN_IDX, handler: tagAverageHandler },
|
|
7651
|
+
{ index: TAG_COUNT_FN_IDX, handler: tagCountHandler }
|
|
7652
|
+
]
|
|
7653
|
+
};
|
|
7654
|
+
|
|
7289
7655
|
// src/packages/uncertainty/parselets/UncertaintyParselet.ts
|
|
7290
7656
|
var UncertaintyParselet = class {
|
|
7291
7657
|
constructor() {
|
|
7292
7658
|
this.category = "operator";
|
|
7293
|
-
this.bindingPower =
|
|
7659
|
+
this.bindingPower = chunkMI7OTUHL_cjs.BindingPower.Uncertainty;
|
|
7294
7660
|
}
|
|
7295
7661
|
parse(parser, _left, _token, builder) {
|
|
7296
7662
|
parser.parseExpression(this.bindingPower, builder);
|
|
@@ -7312,7 +7678,7 @@ function asciiPlusMinusNormalizerRule(priority = 90) {
|
|
|
7312
7678
|
if (minus?.type !== "MINUS") return null;
|
|
7313
7679
|
return {
|
|
7314
7680
|
consumed: 3,
|
|
7315
|
-
replacement: [
|
|
7681
|
+
replacement: [chunkICEKS6YC_cjs.createFusedToken("PLUS_MINUS", "\xB1", [plus, slash, minus])],
|
|
7316
7682
|
ruleName: "uncertainty:ascii-plus-minus"
|
|
7317
7683
|
};
|
|
7318
7684
|
}
|
|
@@ -7338,12 +7704,12 @@ var ABSOLUTE_VALUE_TOLERANCE = 1e-9;
|
|
|
7338
7704
|
var RELATIVE_VALUE_TOLERANCE = 1e-9;
|
|
7339
7705
|
var INTERVAL_COLLAPSE_WIDTH = 1e-12;
|
|
7340
7706
|
var REAL_ROOT_IMAGINARY_TOLERANCE = 1e-9;
|
|
7341
|
-
var GOAL_SEEK_FN_IDX =
|
|
7707
|
+
var GOAL_SEEK_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7342
7708
|
function goalSeekHandler(args, context) {
|
|
7343
7709
|
const probe = context?.evaluateLineWithBinding;
|
|
7344
7710
|
const getLineReads = context?.getLineReads;
|
|
7345
7711
|
if (!probe || !getLineReads) {
|
|
7346
|
-
return
|
|
7712
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7347
7713
|
"GOAL_SEEK_NO_DOCUMENT",
|
|
7348
7714
|
"Goal seek only works inside a document, since it re-runs another line. The single-expression entry point has no document to solve against."
|
|
7349
7715
|
);
|
|
@@ -7352,41 +7718,41 @@ function goalSeekHandler(args, context) {
|
|
|
7352
7718
|
const varName = typeof args[1].value === "string" ? args[1].value : String(args[1].value);
|
|
7353
7719
|
const targetArg = args[2];
|
|
7354
7720
|
if (targetArg.type !== 0 /* Number */ && targetArg.type !== 6 /* Uom */) {
|
|
7355
|
-
return
|
|
7721
|
+
return chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", `Goal seek's target must be a number, as in "solve line ${targetLine} for ${varName} = 900".`);
|
|
7356
7722
|
}
|
|
7357
7723
|
const target = targetArg.toNumber();
|
|
7358
7724
|
if (!Number.isFinite(target)) {
|
|
7359
|
-
return
|
|
7725
|
+
return chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", "Goal seek's target is not a finite number.");
|
|
7360
7726
|
}
|
|
7361
7727
|
const reads = getLineReads(targetLine);
|
|
7362
7728
|
if (reads === void 0) {
|
|
7363
|
-
return
|
|
7729
|
+
return chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_LINE_NOT_READY", `Line ${targetLine} has no evaluated expression to solve (forward reference, out of range, or not an expression).`);
|
|
7364
7730
|
}
|
|
7365
7731
|
if (!reads.includes(varName)) {
|
|
7366
|
-
return
|
|
7732
|
+
return chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_VARIABLE_NOT_USED", `Line ${targetLine} does not use ${varName}, so changing ${varName} cannot move its result toward ${target}.`);
|
|
7367
7733
|
}
|
|
7368
|
-
const symbolic = probe(targetLine, varName,
|
|
7734
|
+
const symbolic = probe(targetLine, varName, chunkIT74O4BE_cjs.symbolicValue(chunkA2DZ5BEJ_cjs.varNode(varName)), true);
|
|
7369
7735
|
if (symbolic.type === 9 /* Symbolic */) {
|
|
7370
7736
|
const exact = solveClosedForm(symbolic.value, target, varName);
|
|
7371
|
-
if (exact !== null) return
|
|
7737
|
+
if (exact !== null) return chunkIT74O4BE_cjs.numberValue(exact);
|
|
7372
7738
|
}
|
|
7373
7739
|
const maxIterations = context.goalSeekMaxIterations ?? FALLBACK_MAX_ITERATIONS;
|
|
7374
7740
|
return bisect(probe, targetLine, varName, target, maxIterations);
|
|
7375
7741
|
}
|
|
7376
7742
|
function solveClosedForm(lhs, target, variable) {
|
|
7377
|
-
const rhs =
|
|
7743
|
+
const rhs = chunkA2DZ5BEJ_cjs.constNode(chunkA2DZ5BEJ_cjs.rationalFromNumber(target));
|
|
7378
7744
|
let outcome;
|
|
7379
7745
|
try {
|
|
7380
|
-
outcome =
|
|
7746
|
+
outcome = chunkFR7RNOPT_cjs.solveForVariable(lhs, rhs, variable);
|
|
7381
7747
|
} catch {
|
|
7382
7748
|
return null;
|
|
7383
7749
|
}
|
|
7384
7750
|
if (outcome.kind !== "roots") return null;
|
|
7385
7751
|
const candidates = [];
|
|
7386
7752
|
for (const node of outcome.exact) {
|
|
7387
|
-
const simplified =
|
|
7753
|
+
const simplified = chunkA2DZ5BEJ_cjs.simplifySymbolic(node);
|
|
7388
7754
|
if (simplified.kind === "const") {
|
|
7389
|
-
const value =
|
|
7755
|
+
const value = chunkA2DZ5BEJ_cjs.rationalToNumber(simplified.value);
|
|
7390
7756
|
if (Number.isFinite(value)) candidates.push(value);
|
|
7391
7757
|
}
|
|
7392
7758
|
}
|
|
@@ -7401,13 +7767,13 @@ function solveClosedForm(lhs, target, variable) {
|
|
|
7401
7767
|
}
|
|
7402
7768
|
function bisect(probe, targetLine, variable, target, maxIterations) {
|
|
7403
7769
|
const sample = (candidate) => {
|
|
7404
|
-
const result = probe(targetLine, variable,
|
|
7770
|
+
const result = probe(targetLine, variable, chunkIT74O4BE_cjs.numberValue(candidate), false);
|
|
7405
7771
|
if (result.type === 13 /* Error */) return { error: result };
|
|
7406
7772
|
if (result.type !== 0 /* Number */ && result.type !== 6 /* Uom */) {
|
|
7407
|
-
return { error:
|
|
7773
|
+
return { error: chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_TARGET_NOT_NUMERIC", `Line ${targetLine} did not produce a number when ${variable} was set to ${candidate}, so goal seek cannot compare it to the target.`) };
|
|
7408
7774
|
}
|
|
7409
7775
|
const numeric = result.toNumber();
|
|
7410
|
-
if (!Number.isFinite(numeric)) return { error:
|
|
7776
|
+
if (!Number.isFinite(numeric)) return { error: chunkIT74O4BE_cjs.errorValue("GOAL_SEEK_NON_FINITE", `Line ${targetLine}'s result is not finite when ${variable} is ${candidate}.`) };
|
|
7411
7777
|
return { value: numeric };
|
|
7412
7778
|
};
|
|
7413
7779
|
let lo = SEARCH_LOWER_BOUND;
|
|
@@ -7419,10 +7785,10 @@ function bisect(probe, targetLine, variable, target, maxIterations) {
|
|
|
7419
7785
|
const tolerance = Math.max(ABSOLUTE_VALUE_TOLERANCE, Math.abs(target) * RELATIVE_VALUE_TOLERANCE);
|
|
7420
7786
|
let flo = loSample.value - target;
|
|
7421
7787
|
const fhi = hiSample.value - target;
|
|
7422
|
-
if (Math.abs(flo) <= tolerance) return
|
|
7423
|
-
if (Math.abs(fhi) <= tolerance) return
|
|
7788
|
+
if (Math.abs(flo) <= tolerance) return chunkIT74O4BE_cjs.numberValue(lo);
|
|
7789
|
+
if (Math.abs(fhi) <= tolerance) return chunkIT74O4BE_cjs.numberValue(hi);
|
|
7424
7790
|
if (Math.sign(flo) === Math.sign(fhi)) {
|
|
7425
|
-
return
|
|
7791
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7426
7792
|
"GOAL_SEEK_NO_SOLUTION",
|
|
7427
7793
|
`No value of ${variable} between ${lo} and ${hi} makes line ${targetLine} equal ${target}: across that whole range its result stays on one side of the target.`
|
|
7428
7794
|
);
|
|
@@ -7432,9 +7798,9 @@ function bisect(probe, targetLine, variable, target, maxIterations) {
|
|
|
7432
7798
|
const midSample = sample(mid);
|
|
7433
7799
|
if ("error" in midSample) return midSample.error;
|
|
7434
7800
|
const fmid = midSample.value - target;
|
|
7435
|
-
if (Math.abs(fmid) <= tolerance) return
|
|
7801
|
+
if (Math.abs(fmid) <= tolerance) return chunkIT74O4BE_cjs.numberValue(mid);
|
|
7436
7802
|
if (hi - lo <= INTERVAL_COLLAPSE_WIDTH) {
|
|
7437
|
-
return
|
|
7803
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7438
7804
|
"GOAL_SEEK_DID_NOT_CONVERGE",
|
|
7439
7805
|
`Goal seek narrowed ${variable} to a single point near ${mid} without line ${targetLine} reaching ${target}: the relationship jumps across the target rather than passing through it.`
|
|
7440
7806
|
);
|
|
@@ -7446,7 +7812,7 @@ function bisect(probe, targetLine, variable, target, maxIterations) {
|
|
|
7446
7812
|
hi = mid;
|
|
7447
7813
|
}
|
|
7448
7814
|
}
|
|
7449
|
-
return
|
|
7815
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7450
7816
|
"GOAL_SEEK_DID_NOT_CONVERGE",
|
|
7451
7817
|
`Goal seek did not bring line ${targetLine} within tolerance of ${target} by varying ${variable} in ${maxIterations} steps.`
|
|
7452
7818
|
);
|
|
@@ -7460,7 +7826,7 @@ var GoalSeekParselet = class {
|
|
|
7460
7826
|
parse(parser, _token, builder) {
|
|
7461
7827
|
const lineRef = parser.peek();
|
|
7462
7828
|
if (!lineRef || lineRef.type !== "LINE_REF") {
|
|
7463
|
-
throw
|
|
7829
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
7464
7830
|
"GOAL_SEEK_SYNTAX",
|
|
7465
7831
|
`Goal seek reads "solve line N for <var> = <target>", for example "solve line 4 for rate = 900".`,
|
|
7466
7832
|
{ found: lineRef?.type ?? "end of input" }
|
|
@@ -7471,7 +7837,7 @@ var GoalSeekParselet = class {
|
|
|
7471
7837
|
const connective = parser.peek();
|
|
7472
7838
|
const isFor = !!connective && (connective.type === "FOR_DURATION" || connective.type === "IDENT" && connective.value.toLowerCase() === "for");
|
|
7473
7839
|
if (!isFor) {
|
|
7474
|
-
throw
|
|
7840
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
7475
7841
|
"GOAL_SEEK_SYNTAX",
|
|
7476
7842
|
`Goal seek reads "solve line N for <var> = <target>". Expected "for" after the line reference.`,
|
|
7477
7843
|
{ found: connective?.type ?? "end of input" }
|
|
@@ -7480,7 +7846,7 @@ var GoalSeekParselet = class {
|
|
|
7480
7846
|
parser.consume();
|
|
7481
7847
|
const variable = parser.peek();
|
|
7482
7848
|
if (!variable || variable.type !== "IDENT" && variable.type !== "UNIT") {
|
|
7483
|
-
throw
|
|
7849
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.parsing(
|
|
7484
7850
|
"GOAL_SEEK_REQUIRES_VARIABLE_NAME",
|
|
7485
7851
|
`Goal seek needs the name of the variable to vary here, as in "solve line 4 for rate = 900".`,
|
|
7486
7852
|
{ found: variable?.type ?? "end of input" }
|
|
@@ -7492,7 +7858,7 @@ var GoalSeekParselet = class {
|
|
|
7492
7858
|
builder.emitNumber(targetLine);
|
|
7493
7859
|
builder.emitOpcode(13 /* PUSH_STRING */);
|
|
7494
7860
|
builder.emitString(variable.value);
|
|
7495
|
-
parser.parseExpression(
|
|
7861
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
7496
7862
|
builder.emitOpcode(50 /* CALL_PLUGIN */);
|
|
7497
7863
|
builder.emitIndex(GOAL_SEEK_FN_IDX);
|
|
7498
7864
|
builder.emitIndex(3);
|
|
@@ -7500,7 +7866,7 @@ var GoalSeekParselet = class {
|
|
|
7500
7866
|
};
|
|
7501
7867
|
|
|
7502
7868
|
// src/packages/goalseek/normalizer/GoalSeekNormalizerRule.ts
|
|
7503
|
-
var GOAL_SEEK_TYPE_ID =
|
|
7869
|
+
var GOAL_SEEK_TYPE_ID = chunkG2YPPLGX_cjs.tokenTypeId("GOAL_SEEK");
|
|
7504
7870
|
function goalSeekNormalizerRule(priority = 75) {
|
|
7505
7871
|
return {
|
|
7506
7872
|
name: "goalseek:solve-line",
|
|
@@ -7513,7 +7879,7 @@ function goalSeekNormalizerRule(priority = 75) {
|
|
|
7513
7879
|
return {
|
|
7514
7880
|
consumed: 1,
|
|
7515
7881
|
replacement: [
|
|
7516
|
-
new
|
|
7882
|
+
new chunkYJHY7CMN_cjs.LexerToken("GOAL_SEEK", GOAL_SEEK_TYPE_ID, token.value, token.value, token.offset, 0, token.line, token.col)
|
|
7517
7883
|
],
|
|
7518
7884
|
ruleName: "goalseek:solve-line"
|
|
7519
7885
|
};
|
|
@@ -7552,12 +7918,12 @@ function readAmount(v) {
|
|
|
7552
7918
|
return n > 1 ? n / 100 : n;
|
|
7553
7919
|
}
|
|
7554
7920
|
function badArgs(fn, expected) {
|
|
7555
|
-
return
|
|
7921
|
+
return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_BAD_ARGUMENTS, `${fn}(...) expects ${expected}`);
|
|
7556
7922
|
}
|
|
7557
7923
|
function notAColour(fn) {
|
|
7558
|
-
return
|
|
7924
|
+
return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, `${fn}(...) expects a colour as its first argument`);
|
|
7559
7925
|
}
|
|
7560
|
-
var COLOUR_PARSE_FN_IDX =
|
|
7926
|
+
var COLOUR_PARSE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7561
7927
|
function colourParseHandler(args) {
|
|
7562
7928
|
const arg = args[0];
|
|
7563
7929
|
if (!arg || arg.type !== 3 /* String */ || typeof arg.value !== "string") {
|
|
@@ -7565,17 +7931,17 @@ function colourParseHandler(args) {
|
|
|
7565
7931
|
}
|
|
7566
7932
|
const parsed = chunkALYRJ72W_cjs.parseColour(arg.value);
|
|
7567
7933
|
if (!parsed) {
|
|
7568
|
-
return
|
|
7934
|
+
return chunkIT74O4BE_cjs.errorValue(
|
|
7569
7935
|
ColourErrorCodes.COLOUR_INVALID,
|
|
7570
7936
|
`"${arg.value}" is not a hex colour (#rgb, #rgba, #rrggbb, #rrggbbaa) or a CSS colour name`
|
|
7571
7937
|
);
|
|
7572
7938
|
}
|
|
7573
|
-
return
|
|
7939
|
+
return chunkIT74O4BE_cjs.colourValue(parsed);
|
|
7574
7940
|
}
|
|
7575
|
-
var COLOUR_RGB_FN_IDX =
|
|
7941
|
+
var COLOUR_RGB_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7576
7942
|
function rgbHandler(args) {
|
|
7577
7943
|
if (args.length !== 3) return badArgs("rgb", "three numbers: rgb(red, green, blue)");
|
|
7578
|
-
return
|
|
7944
|
+
return chunkIT74O4BE_cjs.colourValue({
|
|
7579
7945
|
r: chunkALYRJ72W_cjs.clamp255(args[0].toNumber()),
|
|
7580
7946
|
g: chunkALYRJ72W_cjs.clamp255(args[1].toNumber()),
|
|
7581
7947
|
b: chunkALYRJ72W_cjs.clamp255(args[2].toNumber()),
|
|
@@ -7583,10 +7949,10 @@ function rgbHandler(args) {
|
|
|
7583
7949
|
format: "rgb"
|
|
7584
7950
|
});
|
|
7585
7951
|
}
|
|
7586
|
-
var COLOUR_RGBA_FN_IDX =
|
|
7952
|
+
var COLOUR_RGBA_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7587
7953
|
function rgbaHandler(args) {
|
|
7588
7954
|
if (args.length !== 4) return badArgs("rgba", "four numbers: rgba(red, green, blue, alpha)");
|
|
7589
|
-
return
|
|
7955
|
+
return chunkIT74O4BE_cjs.colourValue({
|
|
7590
7956
|
r: chunkALYRJ72W_cjs.clamp255(args[0].toNumber()),
|
|
7591
7957
|
g: chunkALYRJ72W_cjs.clamp255(args[1].toNumber()),
|
|
7592
7958
|
b: chunkALYRJ72W_cjs.clamp255(args[2].toNumber()),
|
|
@@ -7594,146 +7960,146 @@ function rgbaHandler(args) {
|
|
|
7594
7960
|
format: "rgba"
|
|
7595
7961
|
});
|
|
7596
7962
|
}
|
|
7597
|
-
var COLOUR_HSL_FN_IDX =
|
|
7963
|
+
var COLOUR_HSL_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7598
7964
|
function hslHandler(args) {
|
|
7599
7965
|
if (args.length !== 3) return badArgs("hsl", "three values: hsl(hue, saturation%, lightness%)");
|
|
7600
7966
|
const { r, g, b } = chunkALYRJ72W_cjs.hslToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
|
|
7601
|
-
return
|
|
7967
|
+
return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: 1, format: "hsl" });
|
|
7602
7968
|
}
|
|
7603
|
-
var COLOUR_HSLA_FN_IDX =
|
|
7969
|
+
var COLOUR_HSLA_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7604
7970
|
function hslaHandler(args) {
|
|
7605
7971
|
if (args.length !== 4) return badArgs("hsla", "four values: hsla(hue, saturation%, lightness%, alpha)");
|
|
7606
7972
|
const { r, g, b } = chunkALYRJ72W_cjs.hslToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
|
|
7607
|
-
return
|
|
7973
|
+
return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: chunkALYRJ72W_cjs.clamp01(readAmount(args[3])), format: "hsla" });
|
|
7608
7974
|
}
|
|
7609
7975
|
function adjuster(name, op) {
|
|
7610
7976
|
return (args) => {
|
|
7611
7977
|
const c = colourOf(args[0]);
|
|
7612
7978
|
if (!c) return notAColour(name);
|
|
7613
7979
|
if (args.length < 2) return badArgs(name, `a colour and an amount, e.g. ${name}(#3366cc, 20%)`);
|
|
7614
|
-
return
|
|
7980
|
+
return chunkIT74O4BE_cjs.colourValue(op(c, readAmount(args[1])));
|
|
7615
7981
|
};
|
|
7616
7982
|
}
|
|
7617
|
-
var COLOUR_LIGHTEN_FN_IDX =
|
|
7983
|
+
var COLOUR_LIGHTEN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7618
7984
|
var lightenHandler = adjuster("lighten", chunkALYRJ72W_cjs.lighten);
|
|
7619
|
-
var COLOUR_DARKEN_FN_IDX =
|
|
7985
|
+
var COLOUR_DARKEN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7620
7986
|
var darkenHandler = adjuster("darken", chunkALYRJ72W_cjs.darken);
|
|
7621
|
-
var COLOUR_SATURATE_FN_IDX =
|
|
7987
|
+
var COLOUR_SATURATE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7622
7988
|
var saturateHandler = adjuster("saturate", chunkALYRJ72W_cjs.saturate);
|
|
7623
|
-
var COLOUR_DESATURATE_FN_IDX =
|
|
7989
|
+
var COLOUR_DESATURATE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7624
7990
|
var desaturateHandler = adjuster("desaturate", chunkALYRJ72W_cjs.desaturate);
|
|
7625
|
-
var COLOUR_ROTATE_FN_IDX =
|
|
7991
|
+
var COLOUR_ROTATE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7626
7992
|
function rotateHandler(args) {
|
|
7627
7993
|
const c = colourOf(args[0]);
|
|
7628
7994
|
if (!c) return notAColour("rotate");
|
|
7629
7995
|
if (args.length < 2) return badArgs("rotate", "a colour and a hue angle in degrees, e.g. rotate(#ff0000, 90)");
|
|
7630
|
-
return
|
|
7996
|
+
return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.rotateHue(c, args[1].toNumber()));
|
|
7631
7997
|
}
|
|
7632
|
-
var COLOUR_COMPLEMENT_FN_IDX =
|
|
7998
|
+
var COLOUR_COMPLEMENT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7633
7999
|
function complementHandler(args) {
|
|
7634
8000
|
const c = colourOf(args[0]);
|
|
7635
8001
|
if (!c) return notAColour("complement");
|
|
7636
|
-
return
|
|
8002
|
+
return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.complement(c));
|
|
7637
8003
|
}
|
|
7638
|
-
var COLOUR_GRAYSCALE_FN_IDX =
|
|
8004
|
+
var COLOUR_GRAYSCALE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7639
8005
|
function grayscaleHandler(args) {
|
|
7640
8006
|
const c = colourOf(args[0]);
|
|
7641
8007
|
if (!c) return notAColour("grayscale");
|
|
7642
|
-
return
|
|
8008
|
+
return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.grayscale(c));
|
|
7643
8009
|
}
|
|
7644
|
-
var COLOUR_INVERT_FN_IDX =
|
|
8010
|
+
var COLOUR_INVERT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7645
8011
|
function invertHandler(args) {
|
|
7646
8012
|
const c = colourOf(args[0]);
|
|
7647
8013
|
if (!c) return notAColour("invert");
|
|
7648
|
-
return
|
|
8014
|
+
return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.invert(c, args.length > 1 ? readAmount(args[1]) : 1));
|
|
7649
8015
|
}
|
|
7650
|
-
var COLOUR_MIX_FN_IDX =
|
|
8016
|
+
var COLOUR_MIX_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7651
8017
|
function mixHandler(args) {
|
|
7652
8018
|
const a = colourOf(args[0]);
|
|
7653
8019
|
const b = colourOf(args[1]);
|
|
7654
|
-
if (!a || !b) return
|
|
7655
|
-
return
|
|
8020
|
+
if (!a || !b) return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "mix(...) expects two colours to blend");
|
|
8021
|
+
return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.mix(a, b, args.length > 2 ? readAmount(args[2]) : 0.5));
|
|
7656
8022
|
}
|
|
7657
|
-
var COLOUR_ALPHA_FN_IDX =
|
|
8023
|
+
var COLOUR_ALPHA_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7658
8024
|
function alphaHandler(args) {
|
|
7659
8025
|
const c = colourOf(args[0]);
|
|
7660
8026
|
if (!c) return notAColour("alpha");
|
|
7661
|
-
if (args.length < 2) return
|
|
7662
|
-
return
|
|
8027
|
+
if (args.length < 2) return chunkIT74O4BE_cjs.numberValue(c.a);
|
|
8028
|
+
return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.withAlpha(c, readAmount(args[1])));
|
|
7663
8029
|
}
|
|
7664
|
-
var COLOUR_CONTRAST_FN_IDX =
|
|
8030
|
+
var COLOUR_CONTRAST_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7665
8031
|
function contrastHandler(args) {
|
|
7666
8032
|
const a = colourOf(args[0]);
|
|
7667
8033
|
const b = colourOf(args[1]);
|
|
7668
|
-
if (!a || !b) return
|
|
7669
|
-
return
|
|
8034
|
+
if (!a || !b) return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "contrast(...) expects two colours");
|
|
8035
|
+
return chunkIT74O4BE_cjs.numberValue(chunkALYRJ72W_cjs.contrastRatio(a, b));
|
|
7670
8036
|
}
|
|
7671
|
-
var COLOUR_LUMINANCE_FN_IDX =
|
|
8037
|
+
var COLOUR_LUMINANCE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7672
8038
|
function luminanceHandler(args) {
|
|
7673
8039
|
const c = colourOf(args[0]);
|
|
7674
8040
|
if (!c) return notAColour("luminance");
|
|
7675
|
-
return
|
|
8041
|
+
return chunkIT74O4BE_cjs.numberValue(chunkALYRJ72W_cjs.relativeLuminance(c));
|
|
7676
8042
|
}
|
|
7677
8043
|
function extractor(name, get) {
|
|
7678
8044
|
return (args) => {
|
|
7679
8045
|
const c = colourOf(args[0]);
|
|
7680
8046
|
if (!c) return notAColour(name);
|
|
7681
|
-
return
|
|
8047
|
+
return chunkIT74O4BE_cjs.numberValue(get(c));
|
|
7682
8048
|
};
|
|
7683
8049
|
}
|
|
7684
|
-
var COLOUR_RED_FN_IDX =
|
|
8050
|
+
var COLOUR_RED_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7685
8051
|
var redHandler = extractor("red", (c) => c.r);
|
|
7686
|
-
var COLOUR_GREEN_FN_IDX =
|
|
8052
|
+
var COLOUR_GREEN_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7687
8053
|
var greenHandler = extractor("green", (c) => c.g);
|
|
7688
|
-
var COLOUR_BLUE_FN_IDX =
|
|
8054
|
+
var COLOUR_BLUE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7689
8055
|
var blueHandler = extractor("blue", (c) => c.b);
|
|
7690
|
-
var COLOUR_HUE_FN_IDX =
|
|
8056
|
+
var COLOUR_HUE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7691
8057
|
var hueHandler = extractor("hue", (c) => chunkALYRJ72W_cjs.rgbToHsl(c.r, c.g, c.b).h);
|
|
7692
|
-
var COLOUR_SATURATION_FN_IDX =
|
|
8058
|
+
var COLOUR_SATURATION_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7693
8059
|
var saturationHandler = extractor("saturation", (c) => chunkALYRJ72W_cjs.rgbToHsl(c.r, c.g, c.b).s * 100);
|
|
7694
|
-
var COLOUR_LIGHTNESS_FN_IDX =
|
|
8060
|
+
var COLOUR_LIGHTNESS_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7695
8061
|
var lightnessHandler = extractor("lightness", (c) => chunkALYRJ72W_cjs.rgbToHsl(c.r, c.g, c.b).l * 100);
|
|
7696
|
-
var COLOUR_HSV_FN_IDX =
|
|
8062
|
+
var COLOUR_HSV_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7697
8063
|
function hsvHandler(args) {
|
|
7698
8064
|
if (args.length !== 3) return badArgs("hsv", "three values: hsv(hue, saturation%, value%)");
|
|
7699
8065
|
const { r, g, b } = chunkALYRJ72W_cjs.hsvToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
|
|
7700
|
-
return
|
|
8066
|
+
return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: 1, format: "hex" });
|
|
7701
8067
|
}
|
|
7702
|
-
var COLOUR_HSVA_FN_IDX =
|
|
8068
|
+
var COLOUR_HSVA_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7703
8069
|
function hsvaHandler(args) {
|
|
7704
8070
|
if (args.length !== 4) return badArgs("hsva", "four values: hsva(hue, saturation%, value%, alpha)");
|
|
7705
8071
|
const { r, g, b } = chunkALYRJ72W_cjs.hsvToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
|
|
7706
|
-
return
|
|
8072
|
+
return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: chunkALYRJ72W_cjs.clamp01(readAmount(args[3])), format: "hex" });
|
|
7707
8073
|
}
|
|
7708
|
-
var COLOUR_HWB_FN_IDX =
|
|
8074
|
+
var COLOUR_HWB_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7709
8075
|
function hwbHandler(args) {
|
|
7710
8076
|
if (args.length !== 3) return badArgs("hwb", "three values: hwb(hue, whiteness%, blackness%)");
|
|
7711
8077
|
const { r, g, b } = chunkALYRJ72W_cjs.hwbToRgb(args[0].toNumber(), readAmount(args[1]), readAmount(args[2]));
|
|
7712
|
-
return
|
|
8078
|
+
return chunkIT74O4BE_cjs.colourValue({ r, g, b, a: 1, format: "hex" });
|
|
7713
8079
|
}
|
|
7714
|
-
var COLOUR_TINT_FN_IDX =
|
|
8080
|
+
var COLOUR_TINT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7715
8081
|
var tintHandler = adjuster("tint", chunkALYRJ72W_cjs.tint);
|
|
7716
|
-
var COLOUR_SHADE_FN_IDX =
|
|
8082
|
+
var COLOUR_SHADE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7717
8083
|
var shadeHandler = adjuster("shade", chunkALYRJ72W_cjs.shade);
|
|
7718
|
-
var COLOUR_TONE_FN_IDX =
|
|
8084
|
+
var COLOUR_TONE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7719
8085
|
var toneHandler = adjuster("tone", chunkALYRJ72W_cjs.tone);
|
|
7720
|
-
var COLOUR_ISDARK_FN_IDX =
|
|
8086
|
+
var COLOUR_ISDARK_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7721
8087
|
function isdarkHandler(args) {
|
|
7722
8088
|
const c = colourOf(args[0]);
|
|
7723
8089
|
if (!c) return notAColour("isdark");
|
|
7724
|
-
return
|
|
8090
|
+
return chunkIT74O4BE_cjs.boolValue(chunkALYRJ72W_cjs.isDark(c));
|
|
7725
8091
|
}
|
|
7726
|
-
var COLOUR_ISLIGHT_FN_IDX =
|
|
8092
|
+
var COLOUR_ISLIGHT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7727
8093
|
function islightHandler(args) {
|
|
7728
8094
|
const c = colourOf(args[0]);
|
|
7729
8095
|
if (!c) return notAColour("islight");
|
|
7730
|
-
return
|
|
8096
|
+
return chunkIT74O4BE_cjs.boolValue(!chunkALYRJ72W_cjs.isDark(c));
|
|
7731
8097
|
}
|
|
7732
|
-
var COLOUR_READABLE_FN_IDX =
|
|
8098
|
+
var COLOUR_READABLE_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7733
8099
|
function readableHandler(args) {
|
|
7734
8100
|
const c = colourOf(args[0]);
|
|
7735
8101
|
if (!c) return notAColour("readable");
|
|
7736
|
-
return
|
|
8102
|
+
return chunkIT74O4BE_cjs.colourValue(chunkALYRJ72W_cjs.readableColour(c));
|
|
7737
8103
|
}
|
|
7738
8104
|
function readWcagThreshold(v) {
|
|
7739
8105
|
if (!v) return chunkALYRJ72W_cjs.WCAG_THRESHOLDS.aa;
|
|
@@ -7746,21 +8112,21 @@ function readWcagThreshold(v) {
|
|
|
7746
8112
|
}
|
|
7747
8113
|
return chunkALYRJ72W_cjs.WCAG_THRESHOLDS.aa;
|
|
7748
8114
|
}
|
|
7749
|
-
var COLOUR_CONTRAST_COMPLIANT_FN_IDX =
|
|
8115
|
+
var COLOUR_CONTRAST_COMPLIANT_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7750
8116
|
function contrastCompliantHandler(args) {
|
|
7751
8117
|
const a = colourOf(args[0]);
|
|
7752
8118
|
const b = colourOf(args[1]);
|
|
7753
8119
|
if (!a || !b) {
|
|
7754
|
-
return
|
|
8120
|
+
return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "iscontrastcompliant(...) expects two colours");
|
|
7755
8121
|
}
|
|
7756
|
-
return
|
|
8122
|
+
return chunkIT74O4BE_cjs.boolValue(chunkALYRJ72W_cjs.contrastRatio(a, b) >= readWcagThreshold(args[2]));
|
|
7757
8123
|
}
|
|
7758
|
-
var COLOUR_WCAG_LEVEL_FN_IDX =
|
|
8124
|
+
var COLOUR_WCAG_LEVEL_FN_IDX = chunkFR7RNOPT_cjs.allocatePluginFunctionIndex();
|
|
7759
8125
|
function wcagLevelHandler(args) {
|
|
7760
8126
|
const a = colourOf(args[0]);
|
|
7761
8127
|
const b = colourOf(args[1]);
|
|
7762
|
-
if (!a || !b) return
|
|
7763
|
-
return
|
|
8128
|
+
if (!a || !b) return chunkIT74O4BE_cjs.errorValue(ColourErrorCodes.COLOUR_EXPECTED_COLOUR, "wcaglevel(...) expects two colours");
|
|
8129
|
+
return chunkIT74O4BE_cjs.stringValue(chunkALYRJ72W_cjs.wcagLevel(a, b));
|
|
7764
8130
|
}
|
|
7765
8131
|
var COLOUR_FUNCTION_INDEX = {
|
|
7766
8132
|
color: COLOUR_PARSE_FN_IDX,
|
|
@@ -7870,17 +8236,17 @@ var ColourCallParselet = class {
|
|
|
7870
8236
|
const name = token.value.toLowerCase();
|
|
7871
8237
|
const fnIdx = COLOUR_FUNCTION_INDEX[name];
|
|
7872
8238
|
if (fnIdx === void 0) {
|
|
7873
|
-
throw
|
|
8239
|
+
throw chunkMIGXCBXT_cjs.ErrorFactory.execution("UNKNOWN_COLOUR_FUNCTION", `Unknown colour function: ${name}`, {
|
|
7874
8240
|
functionName: name
|
|
7875
8241
|
});
|
|
7876
8242
|
}
|
|
7877
8243
|
parser.consume("LPAREN");
|
|
7878
8244
|
let argCount = 0;
|
|
7879
8245
|
if (parser.peek()?.type !== "RPAREN") {
|
|
7880
|
-
parser.parseExpression(
|
|
8246
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
7881
8247
|
argCount++;
|
|
7882
8248
|
while (parser.match("COMMA")) {
|
|
7883
|
-
parser.parseExpression(
|
|
8249
|
+
parser.parseExpression(chunkMI7OTUHL_cjs.BindingPower.Lowest, builder);
|
|
7884
8250
|
argCount++;
|
|
7885
8251
|
}
|
|
7886
8252
|
}
|
|
@@ -7905,9 +8271,9 @@ function colourCallNormalizerRule(priority = 80) {
|
|
|
7905
8271
|
return {
|
|
7906
8272
|
consumed: 1,
|
|
7907
8273
|
replacement: [
|
|
7908
|
-
new
|
|
8274
|
+
new chunkYJHY7CMN_cjs.LexerToken(
|
|
7909
8275
|
"COLOUR_CALL",
|
|
7910
|
-
|
|
8276
|
+
chunkG2YPPLGX_cjs.tokenTypeId("COLOUR_CALL"),
|
|
7911
8277
|
token.value,
|
|
7912
8278
|
token.value,
|
|
7913
8279
|
token.offset,
|
|
@@ -7926,7 +8292,7 @@ function colourCallNormalizerRule(priority = 80) {
|
|
|
7926
8292
|
var retag = (format) => (v) => {
|
|
7927
8293
|
if (v.type !== 14 /* Colour */) return v;
|
|
7928
8294
|
const c = v.value;
|
|
7929
|
-
return
|
|
8295
|
+
return chunkIT74O4BE_cjs.colourValue({ r: c.r, g: c.g, b: c.b, a: c.a, format });
|
|
7930
8296
|
};
|
|
7931
8297
|
var completionItems = Object.keys(COLOUR_FUNCTION_INDEX).map((label) => ({
|
|
7932
8298
|
label,
|
|
@@ -7979,7 +8345,11 @@ var BUILTIN_PACKAGES = [
|
|
|
7979
8345
|
// rule mints, and its parselet targets a line reference.
|
|
7980
8346
|
GOALSEEK_PACKAGE,
|
|
7981
8347
|
TABLES_PACKAGE,
|
|
7982
|
-
COLOUR_PACKAGE
|
|
8348
|
+
COLOUR_PACKAGE,
|
|
8349
|
+
// After MATHPHRASES_PACKAGE and LINES_PACKAGE: tag aggregates reuse the
|
|
8350
|
+
// `total of`/`count of`/`average of` fusions and walk the document the same
|
|
8351
|
+
// way the lines cross-line reads do.
|
|
8352
|
+
TAGS_PACKAGE
|
|
7983
8353
|
];
|
|
7984
8354
|
|
|
7985
8355
|
exports.ARITHMETIC_PACKAGE = ARITHMETIC_PACKAGE;
|
|
@@ -7999,6 +8369,7 @@ exports.MATRIX_PACKAGE = MATRIX_PACKAGE;
|
|
|
7999
8369
|
exports.PERCENTAGE_PACKAGE = PERCENTAGE_PACKAGE;
|
|
8000
8370
|
exports.SYMBOLIC_PACKAGE = SYMBOLIC_PACKAGE;
|
|
8001
8371
|
exports.TABLES_PACKAGE = TABLES_PACKAGE;
|
|
8372
|
+
exports.TAGS_PACKAGE = TAGS_PACKAGE;
|
|
8002
8373
|
exports.TIME_PACKAGE = TIME_PACKAGE;
|
|
8003
8374
|
exports.UOM_PACKAGE = UOM_PACKAGE;
|
|
8004
8375
|
exports.VARIABLES_PACKAGE = VARIABLES_PACKAGE;
|
|
@@ -8008,5 +8379,5 @@ exports.containsSymbolicCall = containsSymbolicCall;
|
|
|
8008
8379
|
exports.createCurrencyPackage = createCurrencyPackage;
|
|
8009
8380
|
exports.createKnowledgePackage = createKnowledgePackage;
|
|
8010
8381
|
exports.createStocksPackage = createStocksPackage;
|
|
8011
|
-
//# sourceMappingURL=chunk-
|
|
8012
|
-
//# sourceMappingURL=chunk-
|
|
8382
|
+
//# sourceMappingURL=chunk-HKTQCQ4Z.cjs.map
|
|
8383
|
+
//# sourceMappingURL=chunk-HKTQCQ4Z.cjs.map
|