@fieldia/core 0.11.0 → 0.12.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/README.md +5 -0
- package/package.json +1 -1
- package/schema/page.schema.json +3996 -904
- package/src/index.d.mts +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.js +4 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs +1 -1
- package/src/index.mjs.map +1 -1
- package/src/lib/expression/built-ins.d.mts +4 -0
- package/src/lib/expression/built-ins.d.ts +4 -0
- package/src/lib/expression/built-ins.js +8 -0
- package/src/lib/expression/built-ins.js.map +1 -0
- package/src/lib/expression/built-ins.mjs +5 -0
- package/src/lib/expression/built-ins.mjs.map +1 -0
- package/src/lib/expression/evaluator.js +17 -7
- package/src/lib/expression/evaluator.js.map +1 -1
- package/src/lib/expression/evaluator.mjs +17 -7
- package/src/lib/expression/evaluator.mjs.map +1 -1
- package/src/lib/expression/expression.d.mts +7 -0
- package/src/lib/expression/expression.d.ts +7 -0
- package/src/lib/expression/expression.js +2 -0
- package/src/lib/expression/expression.js.map +1 -1
- package/src/lib/expression/expression.mjs +3 -1
- package/src/lib/expression/expression.mjs.map +1 -1
- package/src/lib/expression/functions.d.mts +2 -0
- package/src/lib/expression/functions.d.ts +2 -0
- package/src/lib/expression/functions.js +38 -5
- package/src/lib/expression/functions.js.map +1 -1
- package/src/lib/expression/functions.mjs +38 -5
- package/src/lib/expression/functions.mjs.map +1 -1
- package/src/lib/expression/modifier.d.mts +7 -0
- package/src/lib/expression/modifier.d.ts +7 -0
- package/src/lib/expression/modifier.js +3 -1
- package/src/lib/expression/modifier.js.map +1 -1
- package/src/lib/expression/modifier.mjs +4 -2
- package/src/lib/expression/modifier.mjs.map +1 -1
- package/src/lib/expression/parser.d.mts +8 -1
- package/src/lib/expression/parser.d.ts +8 -1
- package/src/lib/expression/parser.js +30 -2
- package/src/lib/expression/parser.js.map +1 -1
- package/src/lib/expression/parser.mjs +30 -2
- package/src/lib/expression/parser.mjs.map +1 -1
- package/src/lib/expression/reads.d.mts +7 -0
- package/src/lib/expression/reads.d.ts +7 -0
- package/src/lib/expression/reads.js +23 -0
- package/src/lib/expression/reads.js.map +1 -1
- package/src/lib/expression/reads.mjs +21 -0
- package/src/lib/expression/reads.mjs.map +1 -1
- package/src/lib/format/actions.d.mts +486 -2
- package/src/lib/format/actions.d.ts +486 -2
- package/src/lib/format/actions.js +9 -0
- package/src/lib/format/actions.js.map +1 -1
- package/src/lib/format/actions.mjs +9 -0
- package/src/lib/format/actions.mjs.map +1 -1
- package/src/lib/format/check-page.d.mts +7 -2
- package/src/lib/format/check-page.d.ts +7 -2
- package/src/lib/format/check-page.js +6 -3
- package/src/lib/format/check-page.js.map +1 -1
- package/src/lib/format/check-page.mjs +6 -3
- package/src/lib/format/check-page.mjs.map +1 -1
- package/src/lib/format/field.d.mts +3285 -214
- package/src/lib/format/field.d.ts +3285 -214
- package/src/lib/format/field.js +101 -14
- package/src/lib/format/field.js.map +1 -1
- package/src/lib/format/field.mjs +100 -13
- package/src/lib/format/field.mjs.map +1 -1
- package/src/lib/format/hotkeys.d.mts +6 -0
- package/src/lib/format/hotkeys.d.ts +6 -0
- package/src/lib/format/hotkeys.js +11 -0
- package/src/lib/format/hotkeys.js.map +1 -0
- package/src/lib/format/hotkeys.mjs +7 -0
- package/src/lib/format/hotkeys.mjs.map +1 -0
- package/src/lib/format/layout.d.mts +4184 -352
- package/src/lib/format/layout.d.ts +4184 -352
- package/src/lib/format/layout.js +131 -20
- package/src/lib/format/layout.js.map +1 -1
- package/src/lib/format/layout.mjs +130 -19
- package/src/lib/format/layout.mjs.map +1 -1
- package/src/lib/format/page.d.mts +2957 -229
- package/src/lib/format/page.d.ts +2957 -229
- package/src/lib/format/page.js +2 -0
- package/src/lib/format/page.js.map +1 -1
- package/src/lib/format/page.mjs +3 -1
- package/src/lib/format/page.mjs.map +1 -1
- package/src/lib/format/references.d.mts +35 -2
- package/src/lib/format/references.d.ts +35 -2
- package/src/lib/format/references.js +321 -43
- package/src/lib/format/references.js.map +1 -1
- package/src/lib/format/references.mjs +321 -43
- package/src/lib/format/references.mjs.map +1 -1
- package/src/lib/format/translate.js +5 -3
- package/src/lib/format/translate.js.map +1 -1
- package/src/lib/format/translate.mjs +5 -3
- package/src/lib/format/translate.mjs.map +1 -1
- package/src/lib/format/words.d.mts +9 -0
- package/src/lib/format/words.d.ts +9 -0
- package/src/lib/format/words.js +35 -0
- package/src/lib/format/words.js.map +1 -0
- package/src/lib/format/words.mjs +30 -0
- package/src/lib/format/words.mjs.map +1 -0
- package/src/lib/record/cells.d.mts +37 -0
- package/src/lib/record/cells.d.ts +37 -0
- package/src/lib/record/cells.js +59 -0
- package/src/lib/record/cells.js.map +1 -0
- package/src/lib/record/cells.mjs +54 -0
- package/src/lib/record/cells.mjs.map +1 -0
- package/src/lib/record/compute.d.mts +5 -4
- package/src/lib/record/compute.d.ts +5 -4
- package/src/lib/record/compute.js +11 -10
- package/src/lib/record/compute.js.map +1 -1
- package/src/lib/record/compute.mjs +12 -11
- package/src/lib/record/compute.mjs.map +1 -1
- package/src/lib/record/data-source.d.mts +32 -2
- package/src/lib/record/data-source.d.ts +32 -2
- package/src/lib/record/data-source.js.map +1 -1
- package/src/lib/record/data-source.mjs.map +1 -1
- package/src/lib/record/env.d.mts +38 -1
- package/src/lib/record/env.d.ts +38 -1
- package/src/lib/record/env.js +41 -3
- package/src/lib/record/env.js.map +1 -1
- package/src/lib/record/env.mjs +38 -3
- package/src/lib/record/env.mjs.map +1 -1
- package/src/lib/record/filter.d.mts +10 -0
- package/src/lib/record/filter.d.ts +10 -0
- package/src/lib/record/filter.js +49 -0
- package/src/lib/record/filter.js.map +1 -1
- package/src/lib/record/filter.mjs +48 -0
- package/src/lib/record/filter.mjs.map +1 -1
- package/src/lib/record/form.d.mts +141 -8
- package/src/lib/record/form.d.ts +141 -8
- package/src/lib/record/form.js +462 -57
- package/src/lib/record/form.js.map +1 -1
- package/src/lib/record/form.mjs +464 -59
- package/src/lib/record/form.mjs.map +1 -1
- package/src/lib/record/locales/ar.js +3 -0
- package/src/lib/record/locales/ar.js.map +1 -1
- package/src/lib/record/locales/ar.mjs +3 -0
- package/src/lib/record/locales/ar.mjs.map +1 -1
- package/src/lib/record/locales/de.js +3 -0
- package/src/lib/record/locales/de.js.map +1 -1
- package/src/lib/record/locales/de.mjs +3 -0
- package/src/lib/record/locales/de.mjs.map +1 -1
- package/src/lib/record/locales/fr.js +3 -0
- package/src/lib/record/locales/fr.js.map +1 -1
- package/src/lib/record/locales/fr.mjs +3 -0
- package/src/lib/record/locales/fr.mjs.map +1 -1
- package/src/lib/record/memory-data-source.d.mts +26 -2
- package/src/lib/record/memory-data-source.d.ts +26 -2
- package/src/lib/record/memory-data-source.js +98 -7
- package/src/lib/record/memory-data-source.js.map +1 -1
- package/src/lib/record/memory-data-source.mjs +98 -7
- package/src/lib/record/memory-data-source.mjs.map +1 -1
- package/src/lib/record/messages.d.mts +5 -0
- package/src/lib/record/messages.d.ts +5 -0
- package/src/lib/record/messages.js +3 -0
- package/src/lib/record/messages.js.map +1 -1
- package/src/lib/record/messages.mjs +3 -0
- package/src/lib/record/messages.mjs.map +1 -1
- package/src/lib/record/roles.d.mts +10 -0
- package/src/lib/record/roles.d.ts +10 -0
- package/src/lib/record/roles.js +21 -0
- package/src/lib/record/roles.js.map +1 -0
- package/src/lib/record/roles.mjs +18 -0
- package/src/lib/record/roles.mjs.map +1 -0
- package/src/lib/record/rules.js +30 -0
- package/src/lib/record/rules.js.map +1 -1
- package/src/lib/record/rules.mjs +31 -1
- package/src/lib/record/rules.mjs.map +1 -1
- package/src/lib/record/run.d.mts +79 -0
- package/src/lib/record/run.d.ts +79 -0
- package/src/lib/record/run.js +105 -0
- package/src/lib/record/run.js.map +1 -1
- package/src/lib/record/run.mjs +105 -0
- package/src/lib/record/run.mjs.map +1 -1
- package/src/lib/record/set-when.d.mts +5 -2
- package/src/lib/record/set-when.d.ts +5 -2
- package/src/lib/record/set-when.js +28 -12
- package/src/lib/record/set-when.js.map +1 -1
- package/src/lib/record/set-when.mjs +30 -14
- package/src/lib/record/set-when.mjs.map +1 -1
- package/src/lib/record/value-map.d.mts +41 -0
- package/src/lib/record/value-map.d.ts +41 -0
- package/src/lib/record/value-map.js +80 -0
- package/src/lib/record/value-map.js.map +1 -0
- package/src/lib/record/value-map.mjs +73 -0
- package/src/lib/record/value-map.mjs.map +1 -0
- package/src/lib/record/values.d.mts +10 -0
- package/src/lib/record/values.d.ts +10 -0
- package/src/lib/record/values.js.map +1 -1
- package/src/lib/record/values.mjs.map +1 -1
- package/src/runtime.d.mts +10 -6
- package/src/runtime.d.ts +10 -6
- package/src/runtime.js +11 -1
- package/src/runtime.js.map +1 -1
- package/src/runtime.mjs +3 -0
- package/src/runtime.mjs.map +1 -1
package/src/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './runtime.mjs';
|
|
2
2
|
export { FieldSchema, FieldsSchema, LineFieldSchema, LineKindsSchema, OptionSchema, PropertyDefinitionSchema, FilterConditionSchema, FilterItemSchema, } from './lib/format/field.mjs';
|
|
3
|
-
export { ModifierSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout.mjs';
|
|
3
|
+
export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout.mjs';
|
|
4
4
|
export { PageSchema } from './lib/format/page.mjs';
|
|
5
5
|
export { ActionStepSchema, PageEventsSchema } from './lib/format/actions.mjs';
|
|
6
6
|
export { validatePage } from './lib/format/validate.mjs';
|
package/src/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './runtime';
|
|
2
2
|
export { FieldSchema, FieldsSchema, LineFieldSchema, LineKindsSchema, OptionSchema, PropertyDefinitionSchema, FilterConditionSchema, FilterItemSchema, } from './lib/format/field';
|
|
3
|
-
export { ModifierSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout';
|
|
3
|
+
export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout';
|
|
4
4
|
export { PageSchema } from './lib/format/page';
|
|
5
5
|
export { ActionStepSchema, PageEventsSchema } from './lib/format/actions';
|
|
6
6
|
export { validatePage } from './lib/format/validate';
|
package/src/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pageJsonSchema = exports.validatePage = exports.PageEventsSchema = exports.ActionStepSchema = exports.PageSchema = exports.ListNodeSchema = exports.RootLayoutSchema = exports.LayoutNodeSchema = exports.ModifierSchema = exports.FilterItemSchema = exports.FilterConditionSchema = exports.PropertyDefinitionSchema = exports.OptionSchema = exports.LineKindsSchema = exports.LineFieldSchema = exports.FieldsSchema = exports.FieldSchema = void 0;
|
|
3
|
+
exports.pageJsonSchema = exports.validatePage = exports.PageEventsSchema = exports.ActionStepSchema = exports.PageSchema = exports.ListNodeSchema = exports.RootLayoutSchema = exports.LayoutNodeSchema = exports.ToneWhenSchema = exports.CellRulesSchema = exports.RolesSchema = exports.ModifierSchema = exports.FilterItemSchema = exports.FilterConditionSchema = exports.PropertyDefinitionSchema = exports.OptionSchema = exports.LineKindsSchema = exports.LineFieldSchema = exports.FieldsSchema = exports.FieldSchema = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
tslib_1.__exportStar(require("./runtime"), exports);
|
|
6
6
|
var field_1 = require("./lib/format/field");
|
|
@@ -14,6 +14,9 @@ Object.defineProperty(exports, "FilterConditionSchema", { enumerable: true, get:
|
|
|
14
14
|
Object.defineProperty(exports, "FilterItemSchema", { enumerable: true, get: function () { return field_1.FilterItemSchema; } });
|
|
15
15
|
var layout_1 = require("./lib/format/layout");
|
|
16
16
|
Object.defineProperty(exports, "ModifierSchema", { enumerable: true, get: function () { return layout_1.ModifierSchema; } });
|
|
17
|
+
Object.defineProperty(exports, "RolesSchema", { enumerable: true, get: function () { return layout_1.RolesSchema; } });
|
|
18
|
+
Object.defineProperty(exports, "CellRulesSchema", { enumerable: true, get: function () { return layout_1.CellRulesSchema; } });
|
|
19
|
+
Object.defineProperty(exports, "ToneWhenSchema", { enumerable: true, get: function () { return layout_1.ToneWhenSchema; } });
|
|
17
20
|
Object.defineProperty(exports, "LayoutNodeSchema", { enumerable: true, get: function () { return layout_1.LayoutNodeSchema; } });
|
|
18
21
|
Object.defineProperty(exports, "RootLayoutSchema", { enumerable: true, get: function () { return layout_1.RootLayoutSchema; } });
|
|
19
22
|
Object.defineProperty(exports, "ListNodeSchema", { enumerable: true, get: function () { return layout_1.ListNodeSchema; } });
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":";;;;AAAA,oDAA0B;AAC1B,4CAS4B;AAR1B,oGAAA,WAAW,OAAA;AACX,qGAAA,YAAY,OAAA;AACZ,wGAAA,eAAe,OAAA;AACf,wGAAA,eAAe,OAAA;AACf,qGAAA,YAAY,OAAA;AACZ,iHAAA,wBAAwB,OAAA;AACxB,8GAAA,qBAAqB,OAAA;AACrB,yGAAA,gBAAgB,OAAA;AAElB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":";;;;AAAA,oDAA0B;AAC1B,4CAS4B;AAR1B,oGAAA,WAAW,OAAA;AACX,qGAAA,YAAY,OAAA;AACZ,wGAAA,eAAe,OAAA;AACf,wGAAA,eAAe,OAAA;AACf,qGAAA,YAAY,OAAA;AACZ,iHAAA,wBAAwB,OAAA;AACxB,8GAAA,qBAAqB,OAAA;AACrB,yGAAA,gBAAgB,OAAA;AAElB,8CAAuJ;AAA9I,wGAAA,cAAc,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAAE,wGAAA,cAAc,OAAA;AACzH,0CAA+C;AAAtC,kGAAA,UAAU,OAAA;AACnB,gDAA0E;AAAjE,2GAAA,gBAAgB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAC3C,kDAAqD;AAA5C,wGAAA,YAAY,OAAA;AACrB,wDAA0D;AAAjD,6GAAA,cAAc,OAAA"}
|
package/src/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './runtime.mjs';
|
|
2
2
|
export { FieldSchema, FieldsSchema, LineFieldSchema, LineKindsSchema, OptionSchema, PropertyDefinitionSchema, FilterConditionSchema, FilterItemSchema, } from './lib/format/field.mjs';
|
|
3
|
-
export { ModifierSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout.mjs';
|
|
3
|
+
export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout.mjs';
|
|
4
4
|
export { PageSchema } from './lib/format/page.mjs';
|
|
5
5
|
export { ActionStepSchema, PageEventsSchema } from './lib/format/actions.mjs';
|
|
6
6
|
export { validatePage } from './lib/format/validate.mjs';
|
package/src/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvJ,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** The names every expression on a record may read besides its fields: the record's id, the person using the form, whether it is edited, and the values the app passes in. */
|
|
2
|
+
export declare const BUILT_IN_NAMES: readonly ["id", "user", "editing", "context"];
|
|
3
|
+
/** What `user` holds. */
|
|
4
|
+
export declare const USER_PARTS: readonly ["id", "name", "roles"];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** The names every expression on a record may read besides its fields: the record's id, the person using the form, whether it is edited, and the values the app passes in. */
|
|
2
|
+
export declare const BUILT_IN_NAMES: readonly ["id", "user", "editing", "context"];
|
|
3
|
+
/** What `user` holds. */
|
|
4
|
+
export declare const USER_PARTS: readonly ["id", "name", "roles"];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.USER_PARTS = exports.BUILT_IN_NAMES = void 0;
|
|
4
|
+
/** The names every expression on a record may read besides its fields: the record's id, the person using the form, whether it is edited, and the values the app passes in. */
|
|
5
|
+
exports.BUILT_IN_NAMES = ['id', 'user', 'editing', 'context'];
|
|
6
|
+
/** What `user` holds. */
|
|
7
|
+
exports.USER_PARTS = ['id', 'name', 'roles'];
|
|
8
|
+
//# sourceMappingURL=built-ins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"built-ins.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/built-ins.ts"],"names":[],"mappings":";;;AAAA,8KAA8K;AACjK,QAAA,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAE5E,yBAAyB;AACZ,QAAA,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The names every expression on a record may read besides its fields: the record's id, the person using the form, whether it is edited, and the values the app passes in. */
|
|
2
|
+
export const BUILT_IN_NAMES = ['id', 'user', 'editing', 'context'];
|
|
3
|
+
/** What `user` holds. */
|
|
4
|
+
export const USER_PARTS = ['id', 'name', 'roles'];
|
|
5
|
+
//# sourceMappingURL=built-ins.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"built-ins.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/built-ins.ts"],"names":[],"mappings":"AAAA,8KAA8K;AAC9K,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAE5E,yBAAyB;AACzB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC"}
|
|
@@ -11,6 +11,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
11
11
|
exports.truthy = void 0;
|
|
12
12
|
exports.evaluate = evaluate;
|
|
13
13
|
const functions_1 = require("./functions");
|
|
14
|
+
const parser_1 = require("./parser");
|
|
15
|
+
const tokenizer_1 = require("./tokenizer");
|
|
14
16
|
const operations_1 = require("./operations");
|
|
15
17
|
var operations_2 = require("./operations");
|
|
16
18
|
Object.defineProperty(exports, "truthy", { enumerable: true, get: function () { return operations_2.truthy; } });
|
|
@@ -46,9 +48,14 @@ function evaluate(ast, context, env = {}) {
|
|
|
46
48
|
* Evaluate binary operations
|
|
47
49
|
*/
|
|
48
50
|
function evaluateBinaryOp(node, context, env) {
|
|
51
|
+
const operator = node.operator.toLowerCase();
|
|
52
|
+
// As Python's: the value that decided, so `discount or 0` gives a number; the right side read only when needed.
|
|
53
|
+
if (operator === 'and' || operator === 'or') {
|
|
54
|
+
const first = normalize(evaluate(node.left, context, env));
|
|
55
|
+
return (0, operations_1.truthy)(first) === (operator === 'or') ? first : normalize(evaluate(node.right, context, env));
|
|
56
|
+
}
|
|
49
57
|
const left = normalize(evaluate(node.left, context, env));
|
|
50
58
|
const right = normalize(evaluate(node.right, context, env));
|
|
51
|
-
const operator = node.operator.toLowerCase();
|
|
52
59
|
const ordered = left !== null && right !== null;
|
|
53
60
|
switch (operator) {
|
|
54
61
|
// Comparison operators
|
|
@@ -77,11 +84,6 @@ function evaluateBinaryOp(node, context, env) {
|
|
|
77
84
|
case '/':
|
|
78
85
|
case '%':
|
|
79
86
|
return (0, operations_1.arithmetic)(operator, left, right);
|
|
80
|
-
// Logical operators (use truthiness)
|
|
81
|
-
case 'and':
|
|
82
|
-
return (0, operations_1.truthy)(left) && (0, operations_1.truthy)(right);
|
|
83
|
-
case 'or':
|
|
84
|
-
return (0, operations_1.truthy)(left) || (0, operations_1.truthy)(right);
|
|
85
87
|
default:
|
|
86
88
|
throw new Error(`Unknown binary operator: ${node.operator}`);
|
|
87
89
|
}
|
|
@@ -106,7 +108,15 @@ function evaluateCall(node, context, env) {
|
|
|
106
108
|
const fn = functions_1.FUNCTIONS.get(node.name);
|
|
107
109
|
if (!fn)
|
|
108
110
|
throw new Error(`Unknown function: ${node.name}`);
|
|
109
|
-
return fn.call({ args: node.args, value: (arg) => evaluate(arg, context, env), env });
|
|
111
|
+
return fn.call({ args: node.args, value: (arg) => evaluate(arg, context, env), env, holds: (condition, row) => (0, operations_1.truthy)(evaluate(conditionAst(condition), row, env)) });
|
|
112
|
+
}
|
|
113
|
+
/** Conditions on lines, as `count` and `sum` take them in quotes: each read once. */
|
|
114
|
+
const conditions = new Map();
|
|
115
|
+
function conditionAst(source) {
|
|
116
|
+
let ast = conditions.get(source);
|
|
117
|
+
if (!ast)
|
|
118
|
+
conditions.set(source, (ast = new parser_1.ExpressionParser((0, tokenizer_1.tokenize)(source)).parse()));
|
|
119
|
+
return ast;
|
|
110
120
|
}
|
|
111
121
|
/** A missing value compares like None. */
|
|
112
122
|
function normalize(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/evaluator.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* and functions give null for what they cannot work out, never an error.
|
|
8
8
|
*/
|
|
9
9
|
import { FUNCTIONS } from './functions.mjs';
|
|
10
|
+
import { ExpressionParser } from './parser.mjs';
|
|
11
|
+
import { tokenize } from './tokenizer.mjs';
|
|
10
12
|
import { arithmetic, negate, truthy } from './operations.mjs';
|
|
11
13
|
export { truthy } from './operations.mjs';
|
|
12
14
|
/**
|
|
@@ -41,9 +43,14 @@ export function evaluate(ast, context, env = {}) {
|
|
|
41
43
|
* Evaluate binary operations
|
|
42
44
|
*/
|
|
43
45
|
function evaluateBinaryOp(node, context, env) {
|
|
46
|
+
const operator = node.operator.toLowerCase();
|
|
47
|
+
// As Python's: the value that decided, so `discount or 0` gives a number; the right side read only when needed.
|
|
48
|
+
if (operator === 'and' || operator === 'or') {
|
|
49
|
+
const first = normalize(evaluate(node.left, context, env));
|
|
50
|
+
return truthy(first) === (operator === 'or') ? first : normalize(evaluate(node.right, context, env));
|
|
51
|
+
}
|
|
44
52
|
const left = normalize(evaluate(node.left, context, env));
|
|
45
53
|
const right = normalize(evaluate(node.right, context, env));
|
|
46
|
-
const operator = node.operator.toLowerCase();
|
|
47
54
|
const ordered = left !== null && right !== null;
|
|
48
55
|
switch (operator) {
|
|
49
56
|
// Comparison operators
|
|
@@ -72,11 +79,6 @@ function evaluateBinaryOp(node, context, env) {
|
|
|
72
79
|
case '/':
|
|
73
80
|
case '%':
|
|
74
81
|
return arithmetic(operator, left, right);
|
|
75
|
-
// Logical operators (use truthiness)
|
|
76
|
-
case 'and':
|
|
77
|
-
return truthy(left) && truthy(right);
|
|
78
|
-
case 'or':
|
|
79
|
-
return truthy(left) || truthy(right);
|
|
80
82
|
default:
|
|
81
83
|
throw new Error(`Unknown binary operator: ${node.operator}`);
|
|
82
84
|
}
|
|
@@ -101,7 +103,15 @@ function evaluateCall(node, context, env) {
|
|
|
101
103
|
const fn = FUNCTIONS.get(node.name);
|
|
102
104
|
if (!fn)
|
|
103
105
|
throw new Error(`Unknown function: ${node.name}`);
|
|
104
|
-
return fn.call({ args: node.args, value: (arg) => evaluate(arg, context, env), env });
|
|
106
|
+
return fn.call({ args: node.args, value: (arg) => evaluate(arg, context, env), env, holds: (condition, row) => truthy(evaluate(conditionAst(condition), row, env)) });
|
|
107
|
+
}
|
|
108
|
+
/** Conditions on lines, as `count` and `sum` take them in quotes: each read once. */
|
|
109
|
+
const conditions = new Map();
|
|
110
|
+
function conditionAst(source) {
|
|
111
|
+
let ast = conditions.get(source);
|
|
112
|
+
if (!ast)
|
|
113
|
+
conditions.set(source, (ast = new ExpressionParser(tokenize(source)).parse()));
|
|
114
|
+
return ast;
|
|
105
115
|
}
|
|
106
116
|
/** A missing value compares like None. */
|
|
107
117
|
function normalize(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,SAAS,EAAsB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAY,EAAE,OAAgC,EAAE,MAAqB,EAAE;IAC9F,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAE7C,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAE5C,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAEzC,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC,KAAK,CAAC;QAEnB,KAAK,YAAY;YACf,OAAO,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE3C;YACE,MAAM,IAAI,KAAK,CAAC,0BAA2B,GAAwB,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAkB,EAAE,OAAgC,EAAE,GAAkB;IAChG,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluator.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,13 @@ export interface CompiledExpression {
|
|
|
5
5
|
readonly source: string;
|
|
6
6
|
/** The fields it reads, by their first name, in order of appearance. */
|
|
7
7
|
readonly fields: readonly string[];
|
|
8
|
+
/** The names it reads, whole: `user.roles`, `partner_id.country_id`. */
|
|
9
|
+
readonly paths: readonly string[];
|
|
10
|
+
/** The conditions on lines it counts or adds up by. */
|
|
11
|
+
readonly wheres: readonly {
|
|
12
|
+
lines: string;
|
|
13
|
+
condition: string;
|
|
14
|
+
}[];
|
|
8
15
|
/** The line fields it adds up, as `sum(lines, 'subtotal')` names them. */
|
|
9
16
|
readonly sums: readonly {
|
|
10
17
|
lines: string;
|
|
@@ -5,6 +5,13 @@ export interface CompiledExpression {
|
|
|
5
5
|
readonly source: string;
|
|
6
6
|
/** The fields it reads, by their first name, in order of appearance. */
|
|
7
7
|
readonly fields: readonly string[];
|
|
8
|
+
/** The names it reads, whole: `user.roles`, `partner_id.country_id`. */
|
|
9
|
+
readonly paths: readonly string[];
|
|
10
|
+
/** The conditions on lines it counts or adds up by. */
|
|
11
|
+
readonly wheres: readonly {
|
|
12
|
+
lines: string;
|
|
13
|
+
condition: string;
|
|
14
|
+
}[];
|
|
8
15
|
/** The line fields it adds up, as `sum(lines, 'subtotal')` names them. */
|
|
9
16
|
readonly sums: readonly {
|
|
10
17
|
lines: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/expression.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/expression.ts"],"names":[],"mappings":";;AA4BA,8CAgBC;AA5CD,2CAAuC;AAEvC,qCAA4C;AAC5C,mCAAsE;AACtE,2CAAuC;AAmBvC;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,MAAc;IAC9C,MAAM,GAAG,GAAG,IAAI,yBAAgB,CAAC,IAAA,oBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3D,OAAO;QACL,MAAM;QACN,MAAM,EAAE,IAAA,kBAAU,EAAC,GAAG,CAAC;QACvB,KAAK,EAAE,IAAA,iBAAS,EAAC,GAAG,CAAC;QACrB,MAAM,EAAE,IAAA,kBAAU,EAAC,GAAG,CAAC;QACvB,IAAI,EAAE,IAAA,gBAAQ,EAAC,GAAG,CAAC;QACnB,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC;gBACH,OAAO,IAAA,oBAAQ,EAAC,GAAG,EAAE,MAAiC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;YACvE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { evaluate } from './evaluator.mjs';
|
|
2
2
|
import { ExpressionParser } from './parser.mjs';
|
|
3
|
-
import { fieldsRead, sumsRead } from './reads.mjs';
|
|
3
|
+
import { fieldsRead, pathsRead, sumsRead, wheresRead } from './reads.mjs';
|
|
4
4
|
import { tokenize } from './tokenizer.mjs';
|
|
5
5
|
/**
|
|
6
6
|
* Read an expression for a value, such as `price * qty` or
|
|
@@ -12,6 +12,8 @@ export function compileExpression(source) {
|
|
|
12
12
|
return {
|
|
13
13
|
source,
|
|
14
14
|
fields: fieldsRead(ast),
|
|
15
|
+
paths: pathsRead(ast),
|
|
16
|
+
wheres: wheresRead(ast),
|
|
15
17
|
sums: sumsRead(ast),
|
|
16
18
|
evaluate(values, env = {}) {
|
|
17
19
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/expression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"expression.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/expression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmBvC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3D,OAAO;QACL,MAAM;QACN,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC;QACvB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC;QACrB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC;QACvB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;QACnB,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC;gBACH,OAAO,QAAQ,CAAC,GAAG,EAAE,MAAiC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;YACvE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -19,6 +19,8 @@ interface Call {
|
|
|
19
19
|
args: readonly ASTNode[];
|
|
20
20
|
value(node: ASTNode): unknown;
|
|
21
21
|
env: ExpressionEnv;
|
|
22
|
+
/** Whether a condition, written in quotes, holds for one line's values. */
|
|
23
|
+
holds(condition: string, row: Readonly<Record<string, unknown>>): boolean;
|
|
22
24
|
}
|
|
23
25
|
interface ExpressionFunction {
|
|
24
26
|
/** How many values it takes: at least, at most. */
|
|
@@ -19,6 +19,8 @@ interface Call {
|
|
|
19
19
|
args: readonly ASTNode[];
|
|
20
20
|
value(node: ASTNode): unknown;
|
|
21
21
|
env: ExpressionEnv;
|
|
22
|
+
/** Whether a condition, written in quotes, holds for one line's values. */
|
|
23
|
+
holds(condition: string, row: Readonly<Record<string, unknown>>): boolean;
|
|
22
24
|
}
|
|
23
25
|
interface ExpressionFunction {
|
|
24
26
|
/** How many values it takes: at least, at most. */
|
|
@@ -15,6 +15,26 @@ function listOf(call) {
|
|
|
15
15
|
const rows = first.type === 'Identifier' ? call.env.lines?.(first.name) : undefined;
|
|
16
16
|
return rows ?? call.value(first);
|
|
17
17
|
}
|
|
18
|
+
/** A condition given in quotes as the value at `at`: refused when it is anything else. */
|
|
19
|
+
function conditionAt(args, at, name, example) {
|
|
20
|
+
const arg = args[at];
|
|
21
|
+
return arg && !(arg.type === 'Literal' && typeof arg.value === 'string') ? `${name} takes a condition, in quotes, on the lines: ${example}` : undefined;
|
|
22
|
+
}
|
|
23
|
+
/** The rows a function counts or adds up, only those where the condition at `at` holds when there is one. */
|
|
24
|
+
function rowsWhere(call, list, at) {
|
|
25
|
+
const condition = call.args[at];
|
|
26
|
+
if (condition?.type !== 'Literal' || typeof condition.value !== 'string')
|
|
27
|
+
return list;
|
|
28
|
+
const source = condition.value;
|
|
29
|
+
return list.filter((row) => row !== null && typeof row === 'object' && call.holds(source, row));
|
|
30
|
+
}
|
|
31
|
+
/** A day from a date or a datetime, as days since 1970: null when it is not one. */
|
|
32
|
+
function dayNumber(value) {
|
|
33
|
+
if (typeof value !== 'string')
|
|
34
|
+
return null;
|
|
35
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})/.exec(value);
|
|
36
|
+
return match ? Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3])) / 86_400_000 : null;
|
|
37
|
+
}
|
|
18
38
|
/** The smallest or largest of the values, lists opened: empty ones left out, numbers or text but not both. */
|
|
19
39
|
function extreme(call, smaller) {
|
|
20
40
|
const items = call.args
|
|
@@ -70,13 +90,13 @@ exports.FUNCTIONS = new Map([
|
|
|
70
90
|
[
|
|
71
91
|
'sum',
|
|
72
92
|
{
|
|
73
|
-
takes: [1,
|
|
93
|
+
takes: [1, 3],
|
|
74
94
|
check(args) {
|
|
75
95
|
const field = args[1];
|
|
76
96
|
if (field && !(field.type === 'Literal' && typeof field.value === 'string')) {
|
|
77
97
|
return "sum takes the name of a field, in quotes, after the lines: sum(lines, 'subtotal')";
|
|
78
98
|
}
|
|
79
|
-
return
|
|
99
|
+
return conditionAt(args, 2, 'sum', `sum(lines, 'amount', "state == 'done'")`);
|
|
80
100
|
},
|
|
81
101
|
call(call) {
|
|
82
102
|
const list = listOf(call);
|
|
@@ -86,7 +106,7 @@ exports.FUNCTIONS = new Map([
|
|
|
86
106
|
return null;
|
|
87
107
|
const field = call.args[1]?.type === 'Literal' ? call.args[1].value : undefined;
|
|
88
108
|
let total = 0;
|
|
89
|
-
for (const item of list) {
|
|
109
|
+
for (const item of rowsWhere(call, list, 2)) {
|
|
90
110
|
const n = field === undefined ? item : item?.[field];
|
|
91
111
|
if ((0, operations_1.isNumber)(n))
|
|
92
112
|
total += n;
|
|
@@ -98,12 +118,25 @@ exports.FUNCTIONS = new Map([
|
|
|
98
118
|
[
|
|
99
119
|
'count',
|
|
100
120
|
{
|
|
101
|
-
takes: [1,
|
|
121
|
+
takes: [1, 2],
|
|
122
|
+
check: (args) => conditionAt(args, 1, 'count', `count(lines, "state == 'done'")`),
|
|
102
123
|
call(call) {
|
|
103
124
|
const list = listOf(call);
|
|
104
125
|
if (list === null || list === undefined)
|
|
105
126
|
return 0;
|
|
106
|
-
return Array.isArray(list) ? list.length : null;
|
|
127
|
+
return Array.isArray(list) ? rowsWhere(call, list, 1).length : null;
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
[
|
|
132
|
+
'days',
|
|
133
|
+
{
|
|
134
|
+
takes: [2, 2],
|
|
135
|
+
// From one day to another: negative when the second comes first. A datetime counts by its day.
|
|
136
|
+
call({ args, value }) {
|
|
137
|
+
const from = dayNumber(value(args[0]));
|
|
138
|
+
const to = dayNumber(value(args[1]));
|
|
139
|
+
return from === null || to === null ? null : to - from;
|
|
107
140
|
},
|
|
108
141
|
},
|
|
109
142
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/functions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,26 @@ function listOf(call) {
|
|
|
10
10
|
const rows = first.type === 'Identifier' ? call.env.lines?.(first.name) : undefined;
|
|
11
11
|
return rows ?? call.value(first);
|
|
12
12
|
}
|
|
13
|
+
/** A condition given in quotes as the value at `at`: refused when it is anything else. */
|
|
14
|
+
function conditionAt(args, at, name, example) {
|
|
15
|
+
const arg = args[at];
|
|
16
|
+
return arg && !(arg.type === 'Literal' && typeof arg.value === 'string') ? `${name} takes a condition, in quotes, on the lines: ${example}` : undefined;
|
|
17
|
+
}
|
|
18
|
+
/** The rows a function counts or adds up, only those where the condition at `at` holds when there is one. */
|
|
19
|
+
function rowsWhere(call, list, at) {
|
|
20
|
+
const condition = call.args[at];
|
|
21
|
+
if (condition?.type !== 'Literal' || typeof condition.value !== 'string')
|
|
22
|
+
return list;
|
|
23
|
+
const source = condition.value;
|
|
24
|
+
return list.filter((row) => row !== null && typeof row === 'object' && call.holds(source, row));
|
|
25
|
+
}
|
|
26
|
+
/** A day from a date or a datetime, as days since 1970: null when it is not one. */
|
|
27
|
+
function dayNumber(value) {
|
|
28
|
+
if (typeof value !== 'string')
|
|
29
|
+
return null;
|
|
30
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})/.exec(value);
|
|
31
|
+
return match ? Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3])) / 86_400_000 : null;
|
|
32
|
+
}
|
|
13
33
|
/** The smallest or largest of the values, lists opened: empty ones left out, numbers or text but not both. */
|
|
14
34
|
function extreme(call, smaller) {
|
|
15
35
|
const items = call.args
|
|
@@ -65,13 +85,13 @@ export const FUNCTIONS = new Map([
|
|
|
65
85
|
[
|
|
66
86
|
'sum',
|
|
67
87
|
{
|
|
68
|
-
takes: [1,
|
|
88
|
+
takes: [1, 3],
|
|
69
89
|
check(args) {
|
|
70
90
|
const field = args[1];
|
|
71
91
|
if (field && !(field.type === 'Literal' && typeof field.value === 'string')) {
|
|
72
92
|
return "sum takes the name of a field, in quotes, after the lines: sum(lines, 'subtotal')";
|
|
73
93
|
}
|
|
74
|
-
return
|
|
94
|
+
return conditionAt(args, 2, 'sum', `sum(lines, 'amount', "state == 'done'")`);
|
|
75
95
|
},
|
|
76
96
|
call(call) {
|
|
77
97
|
const list = listOf(call);
|
|
@@ -81,7 +101,7 @@ export const FUNCTIONS = new Map([
|
|
|
81
101
|
return null;
|
|
82
102
|
const field = call.args[1]?.type === 'Literal' ? call.args[1].value : undefined;
|
|
83
103
|
let total = 0;
|
|
84
|
-
for (const item of list) {
|
|
104
|
+
for (const item of rowsWhere(call, list, 2)) {
|
|
85
105
|
const n = field === undefined ? item : item?.[field];
|
|
86
106
|
if (isNumber(n))
|
|
87
107
|
total += n;
|
|
@@ -93,12 +113,25 @@ export const FUNCTIONS = new Map([
|
|
|
93
113
|
[
|
|
94
114
|
'count',
|
|
95
115
|
{
|
|
96
|
-
takes: [1,
|
|
116
|
+
takes: [1, 2],
|
|
117
|
+
check: (args) => conditionAt(args, 1, 'count', `count(lines, "state == 'done'")`),
|
|
97
118
|
call(call) {
|
|
98
119
|
const list = listOf(call);
|
|
99
120
|
if (list === null || list === undefined)
|
|
100
121
|
return 0;
|
|
101
|
-
return Array.isArray(list) ? list.length : null;
|
|
122
|
+
return Array.isArray(list) ? rowsWhere(call, list, 1).length : null;
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
[
|
|
127
|
+
'days',
|
|
128
|
+
{
|
|
129
|
+
takes: [2, 2],
|
|
130
|
+
// From one day to another: negative when the second comes first. A datetime counts by its day.
|
|
131
|
+
call({ args, value }) {
|
|
132
|
+
const from = dayNumber(value(args[0]));
|
|
133
|
+
const to = dayNumber(value(args[1]));
|
|
134
|
+
return from === null || to === null ? null : to - from;
|
|
102
135
|
},
|
|
103
136
|
},
|
|
104
137
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/functions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"functions.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/functions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAoC/D,4DAA4D;AAC5D,MAAM,UAAU,QAAQ,CAAC,IAAU;IACjC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,qGAAqG;AACrG,SAAS,MAAM,CAAC,IAAU;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpF,OAAO,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,0FAA0F;AAC1F,SAAS,WAAW,CAAC,IAAwB,EAAE,EAAU,EAAE,IAAY,EAAE,OAAe;IACtF,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,gDAAgD,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1J,CAAC;AAED,6GAA6G;AAC7G,SAAS,SAAS,CAAC,IAAU,EAAE,IAAe,EAAE,EAAU;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,SAAS,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACtF,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;IAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAA8B,CAAC,CAAC,CAAC;AAC7H,CAAC;AAED,oFAAoF;AACpF,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,KAAK,GAAG,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACxG,CAAC;AAED,8GAA8G;AAC9G,SAAS,OAAO,CAAC,IAAU,EAAE,OAAgB;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI;SACpB,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9F,MAAM,OAAO,GAAG,KAA4B,CAAC;IAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAA4C,IAAI,GAAG,CAA6B;IACpG;QACE,OAAO;QACP;YACE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;gBAClB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,CAAC;SACF;KACF;IACD;QACE,KAAK;QACL;YACE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;gBAClB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1C,CAAC;SACF;KACF;IACD,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;IACtE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;IACvE;QACE,KAAK;QACL;YACE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;gBAClB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO,CAAC,CAAC;gBAC5C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,CAAC;SACF;KACF;IACD,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;IACtF;QACE,KAAK;QACL;YACE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACb,KAAK,CAAC,IAAI;gBACR,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;oBAC5E,OAAO,mFAAmF,CAAC;gBAC7F,CAAC;gBACD,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,yCAAyC,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,CAAC,IAAI;gBACP,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;oBAAE,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACtC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC5F,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC5C,MAAM,CAAC,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAAuC,EAAE,CAAC,KAAK,CAAC,CAAC;oBACzF,IAAI,QAAQ,CAAC,CAAC,CAAC;wBAAE,KAAK,IAAI,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;SACF;KACF;IACD;QACE,OAAO;QACP;YACE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACb,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,iCAAiC,CAAC;YACjF,IAAI,CAAC,IAAI;gBACP,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;oBAAE,OAAO,CAAC,CAAC;gBAClD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACtE,CAAC;SACF;KACF;IACD;QACE,MAAM;QACN;YACE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACb,+FAA+F;YAC/F,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;gBAClB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,OAAO,IAAI,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC;YACzD,CAAC;SACF;KACF;IACD;QACE,IAAI;QACJ;YACE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACb,wCAAwC;YACxC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACtF;KACF;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,CAAC,KAAK,EAAE,IAAI,CAA4B;IACjF,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,IAAI,kBAAkB,CAAC;IACjD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,GAAG,IAAI,UAAU,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACnF,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,UAAU,KAAK,iBAAiB,CAAC;IACtE,OAAO,GAAG,IAAI,UAAU,KAAK,OAAO,IAAI,SAAS,CAAC;AACpD,CAAC"}
|
|
@@ -5,6 +5,13 @@ export interface CompiledModifier {
|
|
|
5
5
|
readonly source: Modifier | undefined;
|
|
6
6
|
/** The fields it reads, by their first name, in order of appearance. */
|
|
7
7
|
readonly fields: readonly string[];
|
|
8
|
+
/** The names it reads, whole: `user.roles`, `partner_id.country_id`. */
|
|
9
|
+
readonly paths: readonly string[];
|
|
10
|
+
/** The conditions on lines it counts or adds up by. */
|
|
11
|
+
readonly wheres: readonly {
|
|
12
|
+
lines: string;
|
|
13
|
+
condition: string;
|
|
14
|
+
}[];
|
|
8
15
|
/** Whether it holds for these values; `env` gives `sum` and `count` the lines, and `today()` its day. */
|
|
9
16
|
evaluate(values: Readonly<Record<string, unknown>>, env?: ExpressionEnv): boolean;
|
|
10
17
|
}
|
|
@@ -5,6 +5,13 @@ export interface CompiledModifier {
|
|
|
5
5
|
readonly source: Modifier | undefined;
|
|
6
6
|
/** The fields it reads, by their first name, in order of appearance. */
|
|
7
7
|
readonly fields: readonly string[];
|
|
8
|
+
/** The names it reads, whole: `user.roles`, `partner_id.country_id`. */
|
|
9
|
+
readonly paths: readonly string[];
|
|
10
|
+
/** The conditions on lines it counts or adds up by. */
|
|
11
|
+
readonly wheres: readonly {
|
|
12
|
+
lines: string;
|
|
13
|
+
condition: string;
|
|
14
|
+
}[];
|
|
8
15
|
/** Whether it holds for these values; `env` gives `sum` and `count` the lines, and `today()` its day. */
|
|
9
16
|
evaluate(values: Readonly<Record<string, unknown>>, env?: ExpressionEnv): boolean;
|
|
10
17
|
}
|
|
@@ -13,12 +13,14 @@ const tokenizer_1 = require("./tokenizer");
|
|
|
13
13
|
function compileModifier(modifier) {
|
|
14
14
|
if (typeof modifier !== 'string') {
|
|
15
15
|
const value = modifier === true;
|
|
16
|
-
return { source: modifier, fields: [], evaluate: () => value };
|
|
16
|
+
return { source: modifier, fields: [], paths: [], wheres: [], evaluate: () => value };
|
|
17
17
|
}
|
|
18
18
|
const ast = new parser_1.ExpressionParser((0, tokenizer_1.tokenize)(modifier)).parse();
|
|
19
19
|
return {
|
|
20
20
|
source: modifier,
|
|
21
21
|
fields: (0, reads_1.fieldsRead)(ast),
|
|
22
|
+
paths: (0, reads_1.pathsRead)(ast),
|
|
23
|
+
wheres: (0, reads_1.wheresRead)(ast),
|
|
22
24
|
evaluate(values, env) {
|
|
23
25
|
try {
|
|
24
26
|
return (0, evaluator_1.truthy)((0, evaluator_1.evaluate)(ast, values, env));
|