@bessemer/cornerstone 0.5.60 → 0.5.62

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.
@@ -1,23 +1,4 @@
1
- import Zod, { ZodType } from 'zod';
2
- export declare const schema: <T>(type: ZodType<T>) => Zod.ZodObject<{
3
- isSuccess: Zod.ZodBoolean;
4
- isError: Zod.ZodBoolean;
5
- isLoading: Zod.ZodBoolean;
6
- isFetching: Zod.ZodBoolean;
7
- data: Zod.ZodUnion<[Zod.ZodType<T, Zod.ZodTypeDef, T>, Zod.ZodUnknown]>;
8
- }, "strip", Zod.ZodTypeAny, {
9
- isSuccess: boolean;
10
- isError: boolean;
11
- isLoading: boolean;
12
- isFetching: boolean;
13
- data?: unknown;
14
- }, {
15
- isSuccess: boolean;
16
- isError: boolean;
17
- isLoading: boolean;
18
- isFetching: boolean;
19
- data?: unknown;
20
- }>;
1
+ import { ZodType } from 'zod';
21
2
  export type PendingValue = {
22
3
  isSuccess: false;
23
4
  isError: false;
@@ -61,6 +42,7 @@ export type SettledValue<T> = {
61
42
  data: T;
62
43
  };
63
44
  export type AsyncValue<T> = PendingValue | LoadingValue | ErrorValue | FetchingValueSuccess<T> | FetchingValueError | SettledValue<T>;
45
+ export declare const schema: <T>(_: ZodType<T>) => ZodType<AsyncValue<T>>;
64
46
  export declare const isSettled: <T>(value: AsyncValue<T>) => value is SettledValue<T>;
65
47
  export declare const loading: () => LoadingValue;
66
48
  export declare const fetching: <T>(data: T) => FetchingValueSuccess<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"async-value.d.ts","sourceRoot":"","sources":["../src/async-value.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"async-value.d.ts","sourceRoot":"","sources":["../src/async-value.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAGlC,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,KAAK,CAAA;IAChB,OAAO,EAAE,KAAK,CAAA;IACd,SAAS,EAAE,KAAK,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,KAAK,CAAA;IAChB,OAAO,EAAE,KAAK,CAAA;IACd,SAAS,EAAE,IAAI,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,KAAK,CAAA;IAChB,OAAO,EAAE,IAAI,CAAA;IACb,SAAS,EAAE,KAAK,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IACpC,SAAS,EAAE,IAAI,CAAA;IACf,OAAO,EAAE,KAAK,CAAA;IACd,SAAS,EAAE,KAAK,CAAA;IAChB,UAAU,EAAE,IAAI,CAAA;IAChB,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,KAAK,CAAA;IAChB,OAAO,EAAE,IAAI,CAAA;IACb,SAAS,EAAE,KAAK,CAAA;IAChB,UAAU,EAAE,IAAI,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,SAAS,EAAE,IAAI,CAAA;IACf,OAAO,EAAE,KAAK,CAAA;IACd,SAAS,EAAE,KAAK,CAAA;IAChB,UAAU,EAAE,KAAK,CAAA;IACjB,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,oBAAoB,CAAC,CAAC,CAAC,GAAG,kBAAkB,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;AAErI,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAQ9D,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,KAAG,KAAK,IAAI,YAAY,CAAC,CAAC,CAE1E,CAAA;AAED,eAAO,MAAM,OAAO,QAAO,YAA0G,CAAA;AAErI,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,MAAM,CAAC,KAAG,oBAAoB,CAAC,CAAC,CAM1D,CAAA;AAEF,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,MAAM,CAAC,KAAG,YAAY,CAAC,CAAC,CAAqF,CAAA;AAExI,eAAO,MAAM,KAAK,GAAI,OAAO,OAAO,KAAG,UAAqG,CAAA;AAE5I,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,EACzB,OAAO,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,EAC3B,UAAU;IAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;CAAE,KACrG,CAYF,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAG,UAAU,CAAC,CAAC,CAMrF,CAAA"}
@@ -1,13 +1,13 @@
1
1
  // src/async-value.ts
2
2
  import Zod from "zod";
3
3
  import { Objects } from "@bessemer/cornerstone/index";
4
- var schema = (type) => {
4
+ var schema = (_) => {
5
5
  return Zod.object({
6
6
  isSuccess: Zod.boolean(),
7
7
  isError: Zod.boolean(),
8
8
  isLoading: Zod.boolean(),
9
9
  isFetching: Zod.boolean(),
10
- data: Zod.union([type, Zod.unknown()])
10
+ data: Zod.unknown()
11
11
  });
12
12
  };
13
13
  var isSettled = (value) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/async-value.ts"],"sourcesContent":["import Zod, { ZodType } from 'zod'\nimport { Objects } from '@bessemer/cornerstone/index'\n\nexport const schema = <T>(type: ZodType<T>) => {\n return Zod.object({\n isSuccess: Zod.boolean(),\n isError: Zod.boolean(),\n isLoading: Zod.boolean(),\n isFetching: Zod.boolean(),\n data: Zod.union([type, Zod.unknown()]),\n })\n}\n\nexport type PendingValue = {\n isSuccess: false\n isError: false\n isLoading: false\n isFetching: boolean\n data: undefined\n}\n\nexport type LoadingValue = {\n isSuccess: false\n isError: false\n isLoading: true\n isFetching: boolean\n data: undefined\n}\n\nexport type ErrorValue = {\n isSuccess: false\n isError: true\n isLoading: false\n isFetching: boolean\n data: unknown\n}\n\nexport type FetchingValueSuccess<T> = {\n isSuccess: true\n isError: false\n isLoading: false\n isFetching: true\n data: T\n}\n\nexport type FetchingValueError = {\n isSuccess: false\n isError: true\n isLoading: false\n isFetching: true\n data: unknown\n}\n\nexport type SettledValue<T> = {\n isSuccess: true\n isError: false\n isLoading: false\n isFetching: false\n data: T\n}\n\nexport type AsyncValue<T> = PendingValue | LoadingValue | ErrorValue | FetchingValueSuccess<T> | FetchingValueError | SettledValue<T>\n\nexport const isSettled = <T>(value: AsyncValue<T>): value is SettledValue<T> => {\n return value.isSuccess && !value.isError && !value.isLoading && !value.isFetching\n}\n\nexport const loading = (): LoadingValue => ({ isSuccess: false, isError: false, isLoading: true, isFetching: true, data: undefined })\n\nexport const fetching = <T>(data: T): FetchingValueSuccess<T> => ({\n isSuccess: true,\n isError: false,\n isLoading: false,\n isFetching: true,\n data,\n})\n\nexport const settled = <T>(data: T): SettledValue<T> => ({ isSuccess: true, isError: false, isLoading: false, isFetching: false, data })\n\nexport const error = (error: unknown): ErrorValue => ({ isSuccess: false, isError: true, isLoading: false, isFetching: false, data: error })\n\nexport const handle = <T, N>(\n value: AsyncValue<T | null>,\n handlers: { loading: () => N; error: (error: unknown) => N; absent: () => N; success: (data: T) => N }\n): N => {\n if (value.isLoading || (value.isError && value.isFetching)) {\n return handlers.loading()\n }\n if (value.isError) {\n return handlers.error(value.data)\n }\n if (Objects.isNil(value.data)) {\n return handlers.absent()\n }\n\n return handlers.success(value.data)\n}\n\nexport const map = <T, N>(value: AsyncValue<T>, mapper: (value: T) => N): AsyncValue<N> => {\n if (!value.isSuccess) {\n return value\n }\n\n return { ...value, data: mapper(value.data) }\n}\n"],"mappings":";AAAA,OAAO,SAAsB;AAC7B,SAAS,eAAe;AAEjB,IAAM,SAAS,CAAI,SAAqB;AAC7C,SAAO,IAAI,OAAO;AAAA,IAChB,WAAW,IAAI,QAAQ;AAAA,IACvB,SAAS,IAAI,QAAQ;AAAA,IACrB,WAAW,IAAI,QAAQ;AAAA,IACvB,YAAY,IAAI,QAAQ;AAAA,IACxB,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;AAAA,EACvC,CAAC;AACH;AAoDO,IAAM,YAAY,CAAI,UAAmD;AAC9E,SAAO,MAAM,aAAa,CAAC,MAAM,WAAW,CAAC,MAAM,aAAa,CAAC,MAAM;AACzE;AAEO,IAAM,UAAU,OAAqB,EAAE,WAAW,OAAO,SAAS,OAAO,WAAW,MAAM,YAAY,MAAM,MAAM,OAAU;AAE5H,IAAM,WAAW,CAAI,UAAsC;AAAA,EAChE,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AACF;AAEO,IAAM,UAAU,CAAI,UAA8B,EAAE,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,YAAY,OAAO,KAAK;AAE/H,IAAM,QAAQ,CAACA,YAAgC,EAAE,WAAW,OAAO,SAAS,MAAM,WAAW,OAAO,YAAY,OAAO,MAAMA,OAAM;AAEnI,IAAM,SAAS,CACpB,OACA,aACM;AACN,MAAI,MAAM,aAAc,MAAM,WAAW,MAAM,YAAa;AAC1D,WAAO,SAAS,QAAQ;AAAA,EAC1B;AACA,MAAI,MAAM,SAAS;AACjB,WAAO,SAAS,MAAM,MAAM,IAAI;AAAA,EAClC;AACA,MAAI,QAAQ,MAAM,MAAM,IAAI,GAAG;AAC7B,WAAO,SAAS,OAAO;AAAA,EACzB;AAEA,SAAO,SAAS,QAAQ,MAAM,IAAI;AACpC;AAEO,IAAM,MAAM,CAAO,OAAsB,WAA2C;AACzF,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,OAAO,MAAM,OAAO,MAAM,IAAI,EAAE;AAC9C;","names":["error"]}
1
+ {"version":3,"sources":["../src/async-value.ts"],"sourcesContent":["import Zod, { ZodType } from 'zod'\nimport { Objects } from '@bessemer/cornerstone/index'\n\nexport type PendingValue = {\n isSuccess: false\n isError: false\n isLoading: false\n isFetching: boolean\n data: undefined\n}\n\nexport type LoadingValue = {\n isSuccess: false\n isError: false\n isLoading: true\n isFetching: boolean\n data: undefined\n}\n\nexport type ErrorValue = {\n isSuccess: false\n isError: true\n isLoading: false\n isFetching: boolean\n data: unknown\n}\n\nexport type FetchingValueSuccess<T> = {\n isSuccess: true\n isError: false\n isLoading: false\n isFetching: true\n data: T\n}\n\nexport type FetchingValueError = {\n isSuccess: false\n isError: true\n isLoading: false\n isFetching: true\n data: unknown\n}\n\nexport type SettledValue<T> = {\n isSuccess: true\n isError: false\n isLoading: false\n isFetching: false\n data: T\n}\n\nexport type AsyncValue<T> = PendingValue | LoadingValue | ErrorValue | FetchingValueSuccess<T> | FetchingValueError | SettledValue<T>\n\nexport const schema = <T>(_: ZodType<T>): ZodType<AsyncValue<T>> => {\n return Zod.object({\n isSuccess: Zod.boolean(),\n isError: Zod.boolean(),\n isLoading: Zod.boolean(),\n isFetching: Zod.boolean(),\n data: Zod.unknown(),\n }) as any\n}\n\nexport const isSettled = <T>(value: AsyncValue<T>): value is SettledValue<T> => {\n return value.isSuccess && !value.isError && !value.isLoading && !value.isFetching\n}\n\nexport const loading = (): LoadingValue => ({ isSuccess: false, isError: false, isLoading: true, isFetching: true, data: undefined })\n\nexport const fetching = <T>(data: T): FetchingValueSuccess<T> => ({\n isSuccess: true,\n isError: false,\n isLoading: false,\n isFetching: true,\n data,\n})\n\nexport const settled = <T>(data: T): SettledValue<T> => ({ isSuccess: true, isError: false, isLoading: false, isFetching: false, data })\n\nexport const error = (error: unknown): ErrorValue => ({ isSuccess: false, isError: true, isLoading: false, isFetching: false, data: error })\n\nexport const handle = <T, N>(\n value: AsyncValue<T | null>,\n handlers: { loading: () => N; error: (error: unknown) => N; absent: () => N; success: (data: T) => N }\n): N => {\n if (value.isLoading || (value.isError && value.isFetching)) {\n return handlers.loading()\n }\n if (value.isError) {\n return handlers.error(value.data)\n }\n if (Objects.isNil(value.data)) {\n return handlers.absent()\n }\n\n return handlers.success(value.data)\n}\n\nexport const map = <T, N>(value: AsyncValue<T>, mapper: (value: T) => N): AsyncValue<N> => {\n if (!value.isSuccess) {\n return value\n }\n\n return { ...value, data: mapper(value.data) }\n}\n"],"mappings":";AAAA,OAAO,SAAsB;AAC7B,SAAS,eAAe;AAoDjB,IAAM,SAAS,CAAI,MAA0C;AAClE,SAAO,IAAI,OAAO;AAAA,IAChB,WAAW,IAAI,QAAQ;AAAA,IACvB,SAAS,IAAI,QAAQ;AAAA,IACrB,WAAW,IAAI,QAAQ;AAAA,IACvB,YAAY,IAAI,QAAQ;AAAA,IACxB,MAAM,IAAI,QAAQ;AAAA,EACpB,CAAC;AACH;AAEO,IAAM,YAAY,CAAI,UAAmD;AAC9E,SAAO,MAAM,aAAa,CAAC,MAAM,WAAW,CAAC,MAAM,aAAa,CAAC,MAAM;AACzE;AAEO,IAAM,UAAU,OAAqB,EAAE,WAAW,OAAO,SAAS,OAAO,WAAW,MAAM,YAAY,MAAM,MAAM,OAAU;AAE5H,IAAM,WAAW,CAAI,UAAsC;AAAA,EAChE,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AACF;AAEO,IAAM,UAAU,CAAI,UAA8B,EAAE,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,YAAY,OAAO,KAAK;AAE/H,IAAM,QAAQ,CAACA,YAAgC,EAAE,WAAW,OAAO,SAAS,MAAM,WAAW,OAAO,YAAY,OAAO,MAAMA,OAAM;AAEnI,IAAM,SAAS,CACpB,OACA,aACM;AACN,MAAI,MAAM,aAAc,MAAM,WAAW,MAAM,YAAa;AAC1D,WAAO,SAAS,QAAQ;AAAA,EAC1B;AACA,MAAI,MAAM,SAAS;AACjB,WAAO,SAAS,MAAM,MAAM,IAAI;AAAA,EAClC;AACA,MAAI,QAAQ,MAAM,MAAM,IAAI,GAAG;AAC7B,WAAO,SAAS,OAAO;AAAA,EACzB;AAEA,SAAO,SAAS,QAAQ,MAAM,IAAI;AACpC;AAEO,IAAM,MAAM,CAAO,OAAsB,WAA2C;AACzF,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,OAAO,MAAM,OAAO,MAAM,IAAI,EAAE;AAC9C;","names":["error"]}
@@ -1,9 +1,12 @@
1
1
  import { Expression } from '@bessemer/cornerstone/expression';
2
2
  import { BasicType } from '@bessemer/cornerstone/types';
3
3
  import { Signatures } from '@bessemer/cornerstone';
4
+ import { Result } from '@bessemer/cornerstone/result';
4
5
  export declare const ValueExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<unknown, [value: unknown], {
5
6
  value: unknown;
6
7
  }>;
8
+ export declare const isValue: <T>(expression: Expression<T>) => boolean;
9
+ export declare const getValue: <T>(expression: Expression<T>) => Result<T>;
7
10
  export declare const VariableExpression: import("@bessemer/cornerstone/expression").ExpressionDefinition<{}, [name: string], Expression<{}> & {
8
11
  name: string;
9
12
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"core-expression.d.ts","sourceRoot":"","sources":["../../src/expression/core-expression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAA+B,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAG/E,eAAO,MAAM,eAAe;;EAQ1B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;EAU7B,CAAA;AAEF,eAAO,MAAM,aAAa;;EAQxB,CAAA;AAEF,eAAO,MAAM,aAAa;;EAUxB,CAAA;AAEF,eAAO,MAAM,YAAY;;EAUvB,CAAA;AAEF,eAAO,MAAM,gBAAgB;;EAe3B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;EAU7B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;EAQ7B,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;EAQpC,CAAA;AAEF,eAAO,MAAM,qBAAqB;;;EAQhC,CAAA;AAEF,eAAO,MAAM,4BAA4B;;;EAQvC,CAAA"}
1
+ {"version":3,"file":"core-expression.d.ts","sourceRoot":"","sources":["../../src/expression/core-expression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAA+B,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAE/E,OAAO,EAAW,MAAM,EAAW,MAAM,8BAA8B,CAAA;AAEvE,eAAO,MAAM,eAAe;;EAQ1B,CAAA;AAEF,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,KAAG,OAEtD,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAQ/D,CAAA;AAED,eAAO,MAAM,kBAAkB;;EAU7B,CAAA;AAEF,eAAO,MAAM,aAAa;;EAQxB,CAAA;AAEF,eAAO,MAAM,aAAa;;EAUxB,CAAA;AAEF,eAAO,MAAM,YAAY;;EAUvB,CAAA;AAEF,eAAO,MAAM,gBAAgB;;EAe3B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;EAU7B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;EAQ7B,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;EAQpC,CAAA;AAEF,eAAO,MAAM,qBAAqB;;;EAQhC,CAAA;AAEF,eAAO,MAAM,4BAA4B;;;EAQvC,CAAA"}
@@ -1,6 +1,7 @@
1
1
  // src/expression/core-expression.ts
2
- import { defineExpression } from "@bessemer/cornerstone/expression/internal";
2
+ import { defineExpression, isRawValue, isType } from "@bessemer/cornerstone/expression/internal";
3
3
  import { Arrays, Assertions, Objects, Signatures } from "@bessemer/cornerstone";
4
+ import { failure, success } from "@bessemer/cornerstone/result";
4
5
  var ValueExpression = defineExpression({
5
6
  expressionKey: "Value",
6
7
  builder: (value) => {
@@ -10,6 +11,18 @@ var ValueExpression = defineExpression({
10
11
  return value;
11
12
  }
12
13
  });
14
+ var isValue = (expression) => {
15
+ return isRawValue(expression) || isType(expression, ValueExpression);
16
+ };
17
+ var getValue = (expression) => {
18
+ if (isType(expression, ValueExpression)) {
19
+ return success(expression.value);
20
+ } else if (isRawValue(expression)) {
21
+ return success(expression);
22
+ } else {
23
+ return failure();
24
+ }
25
+ };
13
26
  var VariableExpression = defineExpression({
14
27
  expressionKey: "Variable",
15
28
  builder: (name) => {
@@ -124,6 +137,8 @@ export {
124
137
  NotExpression,
125
138
  OrExpression,
126
139
  ValueExpression,
127
- VariableExpression
140
+ VariableExpression,
141
+ getValue,
142
+ isValue
128
143
  };
129
144
  //# sourceMappingURL=core-expression.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/expression/core-expression.ts"],"sourcesContent":["import { defineExpression } from '@bessemer/cornerstone/expression/internal'\nimport { Expression } from '@bessemer/cornerstone/expression'\nimport { BasicType } from '@bessemer/cornerstone/types'\nimport { Arrays, Assertions, Objects, Signatures } from '@bessemer/cornerstone'\nimport { Signable } from '@bessemer/cornerstone/signature'\n\nexport const ValueExpression = defineExpression({\n expressionKey: 'Value',\n builder: (value: unknown) => {\n return { value }\n },\n resolver: ({ value }, evaluate, context) => {\n return value\n },\n})\n\nexport const VariableExpression = defineExpression({\n expressionKey: 'Variable',\n builder: (name: string) => {\n return { name }\n },\n resolver: ({ name }, evaluate, context) => {\n const value = context.variables[name]\n Assertions.assertPresent(value)\n return value\n },\n})\n\nexport const NotExpression = defineExpression({\n expressionKey: 'Not',\n builder: (value: Expression<boolean>) => {\n return { value }\n },\n resolver: (expression, evaluate) => {\n return !evaluate(expression.value)\n },\n})\n\nexport const AndExpression = defineExpression({\n expressionKey: 'And',\n builder: (operands: Array<Expression<boolean>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it))\n const falseValue = values.find((it) => !it)\n return Objects.isNil(falseValue)\n },\n})\n\nexport const OrExpression = defineExpression({\n expressionKey: 'Or',\n builder: (operands: Array<Expression<boolean>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it))\n const trueValue = values.find((it) => it)\n return Objects.isPresent(trueValue)\n },\n})\n\nexport const EqualsExpression = defineExpression({\n expressionKey: 'Equals',\n builder: (operands: Array<Expression<Signable>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it)).map(Signatures.sign)\n\n if (values.length === 0) {\n return true\n }\n\n const first = values[0]\n return values.every((val) => val === first)\n },\n})\n\nexport const ContainsExpression = defineExpression({\n expressionKey: 'Contains',\n builder: (collection: Expression<Array<Signable>>, operands: Array<Expression<Signable>>) => {\n return { collection, operands }\n },\n resolver: (expression, evaluate) => {\n const collection = evaluate(expression.collection)\n const values = expression.operands.map((it) => evaluate(it))\n return Arrays.containsAll(collection, values)\n },\n})\n\nexport const LessThanExpression = defineExpression({\n expressionKey: 'Basic.LessThan',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) < evaluate(right)\n },\n})\n\nexport const LessThanOrEqualExpression = defineExpression({\n expressionKey: 'Basic.LessThanOrEqual',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) <= evaluate(right)\n },\n})\n\nexport const GreaterThanExpression = defineExpression({\n expressionKey: 'Basic.GreaterThan',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) > evaluate(right)\n },\n})\n\nexport const GreaterThanOrEqualExpression = defineExpression({\n expressionKey: 'Basic.GreaterThanOrEqual',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) >= evaluate(right)\n },\n})\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/expression/core-expression.ts"],"sourcesContent":["import { defineExpression, isRawValue, isType } from '@bessemer/cornerstone/expression/internal'\nimport { Expression } from '@bessemer/cornerstone/expression'\nimport { BasicType } from '@bessemer/cornerstone/types'\nimport { Arrays, Assertions, Objects, Signatures } from '@bessemer/cornerstone'\nimport { Signable } from '@bessemer/cornerstone/signature'\nimport { failure, Result, success } from '@bessemer/cornerstone/result'\n\nexport const ValueExpression = defineExpression({\n expressionKey: 'Value',\n builder: (value: unknown) => {\n return { value }\n },\n resolver: ({ value }, evaluate, context) => {\n return value\n },\n})\n\nexport const isValue = <T>(expression: Expression<T>): boolean => {\n return isRawValue(expression) || isType(expression, ValueExpression)\n}\n\nexport const getValue = <T>(expression: Expression<T>): Result<T> => {\n if (isType(expression, ValueExpression)) {\n return success(expression.value as T)\n } else if (isRawValue(expression)) {\n return success(expression)\n } else {\n return failure()\n }\n}\n\nexport const VariableExpression = defineExpression({\n expressionKey: 'Variable',\n builder: (name: string) => {\n return { name }\n },\n resolver: ({ name }, evaluate, context) => {\n const value = context.variables[name]\n Assertions.assertPresent(value)\n return value\n },\n})\n\nexport const NotExpression = defineExpression({\n expressionKey: 'Not',\n builder: (value: Expression<boolean>) => {\n return { value }\n },\n resolver: (expression, evaluate) => {\n return !evaluate(expression.value)\n },\n})\n\nexport const AndExpression = defineExpression({\n expressionKey: 'And',\n builder: (operands: Array<Expression<boolean>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it))\n const falseValue = values.find((it) => !it)\n return Objects.isNil(falseValue)\n },\n})\n\nexport const OrExpression = defineExpression({\n expressionKey: 'Or',\n builder: (operands: Array<Expression<boolean>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it))\n const trueValue = values.find((it) => it)\n return Objects.isPresent(trueValue)\n },\n})\n\nexport const EqualsExpression = defineExpression({\n expressionKey: 'Equals',\n builder: (operands: Array<Expression<Signable>>) => {\n return { operands }\n },\n resolver: (expression, evaluate) => {\n const values = expression.operands.map((it) => evaluate(it)).map(Signatures.sign)\n\n if (values.length === 0) {\n return true\n }\n\n const first = values[0]\n return values.every((val) => val === first)\n },\n})\n\nexport const ContainsExpression = defineExpression({\n expressionKey: 'Contains',\n builder: (collection: Expression<Array<Signable>>, operands: Array<Expression<Signable>>) => {\n return { collection, operands }\n },\n resolver: (expression, evaluate) => {\n const collection = evaluate(expression.collection)\n const values = expression.operands.map((it) => evaluate(it))\n return Arrays.containsAll(collection, values)\n },\n})\n\nexport const LessThanExpression = defineExpression({\n expressionKey: 'Basic.LessThan',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) < evaluate(right)\n },\n})\n\nexport const LessThanOrEqualExpression = defineExpression({\n expressionKey: 'Basic.LessThanOrEqual',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) <= evaluate(right)\n },\n})\n\nexport const GreaterThanExpression = defineExpression({\n expressionKey: 'Basic.GreaterThan',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) > evaluate(right)\n },\n})\n\nexport const GreaterThanOrEqualExpression = defineExpression({\n expressionKey: 'Basic.GreaterThanOrEqual',\n builder: (left: Expression<BasicType>, right: Expression<BasicType>) => {\n return { left, right }\n },\n resolver: ({ left, right }, evaluate) => {\n return evaluate(left) >= evaluate(right)\n },\n})\n"],"mappings":"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","names":[]}
@@ -1,12 +1,12 @@
1
1
  // src/expression/expression-evaluator.ts
2
2
  import { Assertions } from "@bessemer/cornerstone";
3
- import { isValue } from "@bessemer/cornerstone/expression/internal";
3
+ import { isRawValue } from "@bessemer/cornerstone/expression/internal";
4
4
  var ExpressionEvaluator = class {
5
5
  constructor(expressionDefinitions) {
6
6
  this.expressionDefinitions = expressionDefinitions;
7
7
  }
8
8
  evaluate(expression, context) {
9
- if (isValue(expression)) {
9
+ if (isRawValue(expression)) {
10
10
  return expression;
11
11
  }
12
12
  const matchingExpressionDefinition = this.expressionDefinitions.find((it) => it.expressionKey === expression.expressionKey);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/expression/expression-evaluator.ts"],"sourcesContent":["import { Expression, ExpressionContext, ExpressionDefinition, ExpressionReference } from '@bessemer/cornerstone/expression'\nimport { Assertions } from '@bessemer/cornerstone'\nimport { isValue } from '@bessemer/cornerstone/expression/internal'\n\n// JOHN need to add tests...\nexport class ExpressionEvaluator {\n constructor(private readonly expressionDefinitions: Array<ExpressionDefinition<unknown, Array<any>, Expression<any>>>) {}\n\n evaluate<T>(expression: Expression<T>, context: ExpressionContext): T {\n if (isValue(expression)) {\n return expression\n }\n\n const matchingExpressionDefinition = this.expressionDefinitions.find((it) => it.expressionKey === expression.expressionKey)\n Assertions.assertPresent(matchingExpressionDefinition)\n return matchingExpressionDefinition.resolver(expression, (expression) => this.evaluate(expression, context), context) as T\n }\n\n dereference<ReturnType, ArgumentType extends Array<unknown>>(\n reference: ExpressionReference<ReturnType, ArgumentType>,\n ...args: ArgumentType\n ): Expression<ReturnType> {\n const matchingExpressionDefinition = this.expressionDefinitions.find((it) => it.expressionKey === reference.expressionKey)\n Assertions.assertPresent(matchingExpressionDefinition, () => `Unable to find Expression Definition for type: ${reference.expressionKey}`)\n return matchingExpressionDefinition.builder(...args)\n }\n}\n"],"mappings":";AACA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAGjB,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,uBAA0F;AAA1F;AAAA,EAA2F;AAAA,EAExH,SAAY,YAA2B,SAA+B;AACpE,QAAI,QAAQ,UAAU,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,+BAA+B,KAAK,sBAAsB,KAAK,CAAC,OAAO,GAAG,kBAAkB,WAAW,aAAa;AAC1H,eAAW,cAAc,4BAA4B;AACrD,WAAO,6BAA6B,SAAS,YAAY,CAACA,gBAAe,KAAK,SAASA,aAAY,OAAO,GAAG,OAAO;AAAA,EACtH;AAAA,EAEA,YACE,cACG,MACqB;AACxB,UAAM,+BAA+B,KAAK,sBAAsB,KAAK,CAAC,OAAO,GAAG,kBAAkB,UAAU,aAAa;AACzH,eAAW,cAAc,8BAA8B,MAAM,kDAAkD,UAAU,aAAa,EAAE;AACxI,WAAO,6BAA6B,QAAQ,GAAG,IAAI;AAAA,EACrD;AACF;","names":["expression"]}
1
+ {"version":3,"sources":["../../src/expression/expression-evaluator.ts"],"sourcesContent":["import { Expression, ExpressionContext, ExpressionDefinition, ExpressionReference } from '@bessemer/cornerstone/expression'\nimport { Assertions } from '@bessemer/cornerstone'\nimport { isRawValue } from '@bessemer/cornerstone/expression/internal'\n\n// JOHN need to add tests...\nexport class ExpressionEvaluator {\n constructor(private readonly expressionDefinitions: Array<ExpressionDefinition<unknown, Array<any>, Expression<any>>>) {}\n\n evaluate<T>(expression: Expression<T>, context: ExpressionContext): T {\n if (isRawValue(expression)) {\n return expression\n }\n\n const matchingExpressionDefinition = this.expressionDefinitions.find((it) => it.expressionKey === expression.expressionKey)\n Assertions.assertPresent(matchingExpressionDefinition)\n return matchingExpressionDefinition.resolver(expression, (expression) => this.evaluate(expression, context), context) as T\n }\n\n dereference<ReturnType, ArgumentType extends Array<unknown>>(\n reference: ExpressionReference<ReturnType, ArgumentType>,\n ...args: ArgumentType\n ): Expression<ReturnType> {\n const matchingExpressionDefinition = this.expressionDefinitions.find((it) => it.expressionKey === reference.expressionKey)\n Assertions.assertPresent(matchingExpressionDefinition, () => `Unable to find Expression Definition for type: ${reference.expressionKey}`)\n return matchingExpressionDefinition.builder(...args)\n }\n}\n"],"mappings":";AACA,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAGpB,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,uBAA0F;AAA1F;AAAA,EAA2F;AAAA,EAExH,SAAY,YAA2B,SAA+B;AACpE,QAAI,WAAW,UAAU,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,+BAA+B,KAAK,sBAAsB,KAAK,CAAC,OAAO,GAAG,kBAAkB,WAAW,aAAa;AAC1H,eAAW,cAAc,4BAA4B;AACrD,WAAO,6BAA6B,SAAS,YAAY,CAACA,gBAAe,KAAK,SAASA,aAAY,OAAO,GAAG,OAAO;AAAA,EACtH;AAAA,EAEA,YACE,cACG,MACqB;AACxB,UAAM,+BAA+B,KAAK,sBAAsB,KAAK,CAAC,OAAO,GAAG,kBAAkB,UAAU,aAAa;AACzH,eAAW,cAAc,8BAA8B,MAAM,kDAAkD,UAAU,aAAa,EAAE;AACxI,WAAO,6BAA6B,QAAQ,GAAG,IAAI;AAAA,EACrD;AACF;","names":["expression"]}
@@ -1,9 +1,8 @@
1
1
  import { Expression, ExpressionDefinition } from '@bessemer/cornerstone/expression';
2
- type ExpressionResolver<ExpressionType, MappingType, ContextType> = (expression: ExpressionType, map: (expression: Expression<unknown>) => MappingType, context: ContextType) => MappingType;
2
+ export type ExpressionResolver<ExpressionType, MappingType, ContextType> = (expression: ExpressionType, map: (expression: Expression<unknown>) => MappingType, context: ContextType) => MappingType;
3
3
  export declare class ExpressionMapper<MappingType, ContextType> {
4
4
  private readonly resolverMap;
5
5
  map(expression: Expression<unknown>, context: ContextType): MappingType;
6
6
  register<ExpressionType>(definition: ExpressionDefinition<any, any, ExpressionType>, resolver: ExpressionResolver<ExpressionType, MappingType, ContextType>): void;
7
7
  }
8
- export {};
9
8
  //# sourceMappingURL=expression-mapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expression-mapper.d.ts","sourceRoot":"","sources":["../../src/expression/expression-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAOnF,KAAK,kBAAkB,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,IAAI,CAClE,UAAU,EAAE,cAAc,EAC1B,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,WAAW,EACrD,OAAO,EAAE,WAAW,KACjB,WAAW,CAAA;AAEhB,qBAAa,gBAAgB,CAAC,WAAW,EAAE,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoE;IAEhG,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW;IAuBvE,QAAQ,CAAC,cAAc,EACrB,UAAU,EAAE,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,EAC1D,QAAQ,EAAE,kBAAkB,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,GACrE,IAAI;CAGR"}
1
+ {"version":3,"file":"expression-mapper.d.ts","sourceRoot":"","sources":["../../src/expression/expression-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAOnF,MAAM,MAAM,kBAAkB,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,IAAI,CACzE,UAAU,EAAE,cAAc,EAC1B,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,WAAW,EACrD,OAAO,EAAE,WAAW,KACjB,WAAW,CAAA;AAEhB,qBAAa,gBAAgB,CAAC,WAAW,EAAE,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoE;IAEhG,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW;IAuBvE,QAAQ,CAAC,cAAc,EACrB,UAAU,EAAE,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,EAC1D,QAAQ,EAAE,kBAAkB,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,GACrE,IAAI;CAGR"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/expression/expression-mapper.ts"],"sourcesContent":["import { Expression, ExpressionDefinition } from '@bessemer/cornerstone/expression'\nimport { Dictionary } from '@bessemer/cornerstone/types'\nimport { isExpression } from '@bessemer/cornerstone/expression/internal'\nimport { Assertions } from '@bessemer/cornerstone'\nimport { value } from '@bessemer/cornerstone/expression/expression'\nimport { ValueExpression } from '@bessemer/cornerstone/expression/core-expression'\n\ntype ExpressionResolver<ExpressionType, MappingType, ContextType> = (\n expression: ExpressionType,\n map: (expression: Expression<unknown>) => MappingType,\n context: ContextType\n) => MappingType\n\nexport class ExpressionMapper<MappingType, ContextType> {\n private readonly resolverMap: Dictionary<ExpressionResolver<any, MappingType, ContextType>> = {}\n\n map(expression: Expression<unknown>, context: ContextType): MappingType {\n if (isExpression(expression)) {\n const resolver = this.resolverMap[expression.expressionKey]\n Assertions.assertPresent(\n resolver,\n () =>\n `Illegal Argument - Attempted to map unknown expression: ${expression.expressionKey}. You must register(...) a handler for this expression type.`\n )\n\n return resolver(expression, (expression) => this.map(expression, context), context)\n } else {\n const resolver = this.resolverMap[ValueExpression.expressionKey]\n Assertions.assertPresent(\n resolver,\n () =>\n `Illegal Argument - Attempted to map unknown expression: ${ValueExpression.expressionKey}. You must register(...) a handler for this expression type.`\n )\n\n const valueExpression = value(expression)\n return resolver(valueExpression, (expression) => this.map(expression, context), context)\n }\n }\n\n register<ExpressionType>(\n definition: ExpressionDefinition<any, any, ExpressionType>,\n resolver: ExpressionResolver<ExpressionType, MappingType, ContextType>\n ): void {\n this.resolverMap[definition.expressionKey] = resolver\n }\n}\n"],"mappings":";AAEA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAQzB,IAAM,mBAAN,MAAiD;AAAA,EACrC,cAA6E,CAAC;AAAA,EAE/F,IAAI,YAAiC,SAAmC;AACtE,QAAI,aAAa,UAAU,GAAG;AAC5B,YAAM,WAAW,KAAK,YAAY,WAAW,aAAa;AAC1D,iBAAW;AAAA,QACT;AAAA,QACA,MACE,2DAA2D,WAAW,aAAa;AAAA,MACvF;AAEA,aAAO,SAAS,YAAY,CAACA,gBAAe,KAAK,IAAIA,aAAY,OAAO,GAAG,OAAO;AAAA,IACpF,OAAO;AACL,YAAM,WAAW,KAAK,YAAY,gBAAgB,aAAa;AAC/D,iBAAW;AAAA,QACT;AAAA,QACA,MACE,2DAA2D,gBAAgB,aAAa;AAAA,MAC5F;AAEA,YAAM,kBAAkB,MAAM,UAAU;AACxC,aAAO,SAAS,iBAAiB,CAACA,gBAAe,KAAK,IAAIA,aAAY,OAAO,GAAG,OAAO;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,SACE,YACA,UACM;AACN,SAAK,YAAY,WAAW,aAAa,IAAI;AAAA,EAC/C;AACF;","names":["expression"]}
1
+ {"version":3,"sources":["../../src/expression/expression-mapper.ts"],"sourcesContent":["import { Expression, ExpressionDefinition } from '@bessemer/cornerstone/expression'\nimport { Dictionary } from '@bessemer/cornerstone/types'\nimport { isExpression } from '@bessemer/cornerstone/expression/internal'\nimport { Assertions } from '@bessemer/cornerstone'\nimport { value } from '@bessemer/cornerstone/expression/expression'\nimport { ValueExpression } from '@bessemer/cornerstone/expression/core-expression'\n\nexport type ExpressionResolver<ExpressionType, MappingType, ContextType> = (\n expression: ExpressionType,\n map: (expression: Expression<unknown>) => MappingType,\n context: ContextType\n) => MappingType\n\nexport class ExpressionMapper<MappingType, ContextType> {\n private readonly resolverMap: Dictionary<ExpressionResolver<any, MappingType, ContextType>> = {}\n\n map(expression: Expression<unknown>, context: ContextType): MappingType {\n if (isExpression(expression)) {\n const resolver = this.resolverMap[expression.expressionKey]\n Assertions.assertPresent(\n resolver,\n () =>\n `Illegal Argument - Attempted to map unknown expression: ${expression.expressionKey}. You must register(...) a handler for this expression type.`\n )\n\n return resolver(expression, (expression) => this.map(expression, context), context)\n } else {\n const resolver = this.resolverMap[ValueExpression.expressionKey]\n Assertions.assertPresent(\n resolver,\n () =>\n `Illegal Argument - Attempted to map unknown expression: ${ValueExpression.expressionKey}. You must register(...) a handler for this expression type.`\n )\n\n const valueExpression = value(expression)\n return resolver(valueExpression, (expression) => this.map(expression, context), context)\n }\n }\n\n register<ExpressionType>(\n definition: ExpressionDefinition<any, any, ExpressionType>,\n resolver: ExpressionResolver<ExpressionType, MappingType, ContextType>\n ): void {\n this.resolverMap[definition.expressionKey] = resolver\n }\n}\n"],"mappings":";AAEA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAQzB,IAAM,mBAAN,MAAiD;AAAA,EACrC,cAA6E,CAAC;AAAA,EAE/F,IAAI,YAAiC,SAAmC;AACtE,QAAI,aAAa,UAAU,GAAG;AAC5B,YAAM,WAAW,KAAK,YAAY,WAAW,aAAa;AAC1D,iBAAW;AAAA,QACT;AAAA,QACA,MACE,2DAA2D,WAAW,aAAa;AAAA,MACvF;AAEA,aAAO,SAAS,YAAY,CAACA,gBAAe,KAAK,IAAIA,aAAY,OAAO,GAAG,OAAO;AAAA,IACpF,OAAO;AACL,YAAM,WAAW,KAAK,YAAY,gBAAgB,aAAa;AAC/D,iBAAW;AAAA,QACT;AAAA,QACA,MACE,2DAA2D,gBAAgB,aAAa;AAAA,MAC5F;AAEA,YAAM,kBAAkB,MAAM,UAAU;AACxC,aAAO,SAAS,iBAAiB,CAACA,gBAAe,KAAK,IAAIA,aAAY,OAAO,GAAG,OAAO;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,SACE,YACA,UACM;AACN,SAAK,YAAY,WAAW,aAAa,IAAI;AAAA,EAC/C;AACF;","names":["expression"]}
@@ -7,5 +7,5 @@ export declare const defineExpression: <ReturnType, ArgumentType extends Array<u
7
7
  }) => ExpressionDefinition<ReturnType, ArgumentType, Expression<ReturnType> & PayloadType>;
8
8
  export declare const isType: <ReturnValue, ArgumentType extends Array<any>, ExpressionType extends Expression<ReturnValue>>(expression: Expression<ReturnValue>, expressionDefinition: ExpressionDefinition<ReturnValue, ArgumentType, ExpressionType>) => expression is ReturnType<(typeof expressionDefinition)["builder"]>;
9
9
  export declare const isExpression: <T>(expression: Expression<any>) => expression is IExpression<T>;
10
- export declare const isValue: <T>(expression: Expression<T>) => expression is T;
10
+ export declare const isRawValue: <T>(expression: Expression<T>) => expression is T;
11
11
  //# sourceMappingURL=internal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/expression/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAEtJ,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,eAAO,MAAM,gBAAgB,GAAI,UAAU,EAAE,YAAY,SAAS,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,SAAS,aAAa,EAAE,SAAS;IAC5H,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IACtD,OAAO,EAAE,CAAC,GAAG,UAAU,EAAE,YAAY,KAAK,WAAW,CAAA;IACrD,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,KAAK,UAAU,CAAA;CAC5G,KAAG,oBAAoB,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,WAAW,CAUtF,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,WAAW,EAAE,YAAY,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,cAAc,SAAS,UAAU,CAAC,WAAW,CAAC,EACjH,YAAY,UAAU,CAAC,WAAW,CAAC,EACnC,sBAAsB,oBAAoB,CAAC,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,KACpF,UAAU,IAAI,UAAU,CAAC,CAAA,OAAO,oBAAoB,EAAC,SAAS,CAAC,CAMjE,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,YAAY,UAAU,CAAC,GAAG,CAAC,KAAG,UAAU,IAAI,WAAW,CAAC,CAAC,CAExF,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,KAAG,UAAU,IAAI,CAOpE,CAAA"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/expression/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACtJ,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,eAAO,MAAM,gBAAgB,GAAI,UAAU,EAAE,YAAY,SAAS,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,SAAS,aAAa,EAAE,SAAS;IAC5H,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IACtD,OAAO,EAAE,CAAC,GAAG,UAAU,EAAE,YAAY,KAAK,WAAW,CAAA;IACrD,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,KAAK,UAAU,CAAA;CAC5G,KAAG,oBAAoB,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,WAAW,CAUtF,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,WAAW,EAAE,YAAY,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,cAAc,SAAS,UAAU,CAAC,WAAW,CAAC,EACjH,YAAY,UAAU,CAAC,WAAW,CAAC,EACnC,sBAAsB,oBAAoB,CAAC,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,KACpF,UAAU,IAAI,UAAU,CAAC,CAAA,OAAO,oBAAoB,EAAC,SAAS,CAAC,CAMjE,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,YAAY,UAAU,CAAC,GAAG,CAAC,KAAG,UAAU,IAAI,WAAW,CAAC,CAAC,CAExF,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,KAAG,UAAU,IAAI,CAOvE,CAAA"}
@@ -1,5 +1,5 @@
1
1
  // src/expression/internal.ts
2
- import { Objects } from "@bessemer/cornerstone";
2
+ import { isObject } from "@bessemer/cornerstone/object";
3
3
  var defineExpression = (options) => {
4
4
  return {
5
5
  expressionKey: options.expressionKey,
@@ -18,10 +18,10 @@ var isType = (expression, expressionDefinition) => {
18
18
  return expression.expressionKey === expressionDefinition.expressionKey;
19
19
  };
20
20
  var isExpression = (expression) => {
21
- return Objects.isObject(expression) && "expressionKey" in expression;
21
+ return isObject(expression) && "expressionKey" in expression;
22
22
  };
23
- var isValue = (expression) => {
24
- if (!Objects.isObject(expression)) {
23
+ var isRawValue = (expression) => {
24
+ if (!isObject(expression)) {
25
25
  return true;
26
26
  }
27
27
  const result = expression.expressionKey === void 0;
@@ -30,7 +30,7 @@ var isValue = (expression) => {
30
30
  export {
31
31
  defineExpression,
32
32
  isExpression,
33
- isType,
34
- isValue
33
+ isRawValue,
34
+ isType
35
35
  };
36
36
  //# sourceMappingURL=internal.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/expression/internal.ts"],"sourcesContent":["import { EvaluateExpression, Expression, ExpressionContext, ExpressionDefinition, ExpressionKey, IExpression } from '@bessemer/cornerstone/expression'\nimport { Objects } from '@bessemer/cornerstone'\nimport { UnknownRecord } from 'type-fest'\n\nexport const defineExpression = <ReturnType, ArgumentType extends Array<unknown>, PayloadType extends UnknownRecord>(options: {\n expressionKey: ExpressionKey<ReturnType, ArgumentType>\n builder: (...parameters: ArgumentType) => PayloadType\n resolver: (expression: PayloadType, evaluate: EvaluateExpression, context: ExpressionContext) => ReturnType\n}): ExpressionDefinition<ReturnType, ArgumentType, Expression<ReturnType> & PayloadType> => {\n return {\n expressionKey: options.expressionKey,\n builder: (...parameters) => {\n return { expressionKey: options.expressionKey, ...options.builder(...parameters) }\n },\n resolver: (expression, evaluate, context) => {\n return options.resolver(expression as any, evaluate, context)\n },\n }\n}\n\nexport const isType = <ReturnValue, ArgumentType extends Array<any>, ExpressionType extends Expression<ReturnValue>>(\n expression: Expression<ReturnValue>,\n expressionDefinition: ExpressionDefinition<ReturnValue, ArgumentType, ExpressionType>\n): expression is ReturnType<typeof expressionDefinition['builder']> => {\n if (!isExpression(expression)) {\n return false\n }\n\n return expression.expressionKey === expressionDefinition.expressionKey\n}\n\nexport const isExpression = <T>(expression: Expression<any>): expression is IExpression<T> => {\n return Objects.isObject(expression) && 'expressionKey' in expression\n}\n\nexport const isValue = <T>(expression: Expression<T>): expression is T => {\n if (!Objects.isObject(expression)) {\n return true\n }\n\n const result = (expression as unknown as IExpression<T>).expressionKey === undefined\n return result\n}\n"],"mappings":";AACA,SAAS,eAAe;AAGjB,IAAM,mBAAmB,CAAqF,YAIzB;AAC1F,SAAO;AAAA,IACL,eAAe,QAAQ;AAAA,IACvB,SAAS,IAAI,eAAe;AAC1B,aAAO,EAAE,eAAe,QAAQ,eAAe,GAAG,QAAQ,QAAQ,GAAG,UAAU,EAAE;AAAA,IACnF;AAAA,IACA,UAAU,CAAC,YAAY,UAAU,YAAY;AAC3C,aAAO,QAAQ,SAAS,YAAmB,UAAU,OAAO;AAAA,IAC9D;AAAA,EACF;AACF;AAEO,IAAM,SAAS,CACpB,YACA,yBACqE;AACrE,MAAI,CAAC,aAAa,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,kBAAkB,qBAAqB;AAC3D;AAEO,IAAM,eAAe,CAAI,eAA8D;AAC5F,SAAO,QAAQ,SAAS,UAAU,KAAK,mBAAmB;AAC5D;AAEO,IAAM,UAAU,CAAI,eAA+C;AACxE,MAAI,CAAC,QAAQ,SAAS,UAAU,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,SAAU,WAAyC,kBAAkB;AAC3E,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/expression/internal.ts"],"sourcesContent":["import { EvaluateExpression, Expression, ExpressionContext, ExpressionDefinition, ExpressionKey, IExpression } from '@bessemer/cornerstone/expression'\nimport { UnknownRecord } from 'type-fest'\nimport { isObject } from '@bessemer/cornerstone/object'\n\nexport const defineExpression = <ReturnType, ArgumentType extends Array<unknown>, PayloadType extends UnknownRecord>(options: {\n expressionKey: ExpressionKey<ReturnType, ArgumentType>\n builder: (...parameters: ArgumentType) => PayloadType\n resolver: (expression: PayloadType, evaluate: EvaluateExpression, context: ExpressionContext) => ReturnType\n}): ExpressionDefinition<ReturnType, ArgumentType, Expression<ReturnType> & PayloadType> => {\n return {\n expressionKey: options.expressionKey,\n builder: (...parameters) => {\n return { expressionKey: options.expressionKey, ...options.builder(...parameters) }\n },\n resolver: (expression, evaluate, context) => {\n return options.resolver(expression as any, evaluate, context)\n },\n }\n}\n\nexport const isType = <ReturnValue, ArgumentType extends Array<any>, ExpressionType extends Expression<ReturnValue>>(\n expression: Expression<ReturnValue>,\n expressionDefinition: ExpressionDefinition<ReturnValue, ArgumentType, ExpressionType>\n): expression is ReturnType<typeof expressionDefinition['builder']> => {\n if (!isExpression(expression)) {\n return false\n }\n\n return expression.expressionKey === expressionDefinition.expressionKey\n}\n\nexport const isExpression = <T>(expression: Expression<any>): expression is IExpression<T> => {\n return isObject(expression) && 'expressionKey' in expression\n}\n\nexport const isRawValue = <T>(expression: Expression<T>): expression is T => {\n if (!isObject(expression)) {\n return true\n }\n\n const result = (expression as unknown as IExpression<T>).expressionKey === undefined\n return result\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AAElB,IAAM,mBAAmB,CAAqF,YAIzB;AAC1F,SAAO;AAAA,IACL,eAAe,QAAQ;AAAA,IACvB,SAAS,IAAI,eAAe;AAC1B,aAAO,EAAE,eAAe,QAAQ,eAAe,GAAG,QAAQ,QAAQ,GAAG,UAAU,EAAE;AAAA,IACnF;AAAA,IACA,UAAU,CAAC,YAAY,UAAU,YAAY;AAC3C,aAAO,QAAQ,SAAS,YAAmB,UAAU,OAAO;AAAA,IAC9D;AAAA,EACF;AACF;AAEO,IAAM,SAAS,CACpB,YACA,yBACqE;AACrE,MAAI,CAAC,aAAa,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,kBAAkB,qBAAqB;AAC3D;AAEO,IAAM,eAAe,CAAI,eAA8D;AAC5F,SAAO,SAAS,UAAU,KAAK,mBAAmB;AACpD;AAEO,IAAM,aAAa,CAAI,eAA+C;AAC3E,MAAI,CAAC,SAAS,UAAU,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,SAAU,WAAyC,kBAAkB;AAC3E,SAAO;AACT;","names":[]}
@@ -1,10 +1,10 @@
1
1
  import { Reference } from '@bessemer/cornerstone/reference';
2
2
  import { BasicType } from '@bessemer/cornerstone/types';
3
- export type Signable = BasicType | {
3
+ export type Signable = BasicType | null | {
4
4
  id: string;
5
5
  } | {
6
6
  reference: Reference<string>;
7
7
  };
8
- export declare const sign: (value: Signable) => string | number;
9
- export declare const signAll: (values: Array<Signable>) => Array<string | number>;
8
+ export declare const sign: (value: Signable) => string | number | null;
9
+ export declare const signAll: (values: Array<Signable>) => Array<string | number | null>;
10
10
  //# sourceMappingURL=signature.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAKvD,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAEpF,eAAO,MAAM,IAAI,GAAI,OAAO,QAAQ,KAAG,MAAM,GAAG,MAqB/C,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,QAAQ,KAAK,CAAC,QAAQ,CAAC,KAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAEtE,CAAA"}
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAKvD,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAE3F,eAAO,MAAM,IAAI,GAAI,OAAO,QAAQ,KAAG,MAAM,GAAG,MAAM,GAAG,IAyBxD,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,QAAQ,KAAK,CAAC,QAAQ,CAAC,KAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7E,CAAA"}
package/dist/signature.js CHANGED
@@ -1,6 +1,9 @@
1
1
  // src/signature.ts
2
2
  import { Dates, Objects, References } from "@bessemer/cornerstone";
3
3
  var sign = (value) => {
4
+ if (value === null) {
5
+ return null;
6
+ }
4
7
  if (Objects.isObject(value)) {
5
8
  if (References.isReferencable(value)) {
6
9
  return value.reference.id;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signature.ts"],"sourcesContent":["import { Dates, Objects, References } from '@bessemer/cornerstone'\nimport { Reference } from '@bessemer/cornerstone/reference'\nimport { BasicType } from '@bessemer/cornerstone/types'\n\n// JOHN it is probably worth revisiting this in the context of using this library code more frequently... in particular\n// all of these things have similar properties (\"primitives\", sortable, value equality, etc.) but this method of implementation\n// forces them all to be converted to strings or numbers first which is an expensive operation.\nexport type Signable = BasicType | { id: string } | { reference: Reference<string> }\n\nexport const sign = (value: Signable): string | number => {\n if (Objects.isObject(value)) {\n if (References.isReferencable(value)) {\n return value.reference.id\n } else {\n return value.id\n }\n }\n\n if (Dates.isDate(value)) {\n return value.getTime()\n }\n\n if (value === true) {\n return 1\n }\n if (value === false) {\n return 0\n }\n\n return value\n}\n\nexport const signAll = (values: Array<Signable>): Array<string | number> => {\n return values.map(sign)\n}\n"],"mappings":";AAAA,SAAS,OAAO,SAAS,kBAAkB;AASpC,IAAM,OAAO,CAAC,UAAqC;AACxD,MAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,QAAI,WAAW,eAAe,KAAK,GAAG;AACpC,aAAO,MAAM,UAAU;AAAA,IACzB,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,MAAI,MAAM,OAAO,KAAK,GAAG;AACvB,WAAO,MAAM,QAAQ;AAAA,EACvB;AAEA,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,WAAoD;AAC1E,SAAO,OAAO,IAAI,IAAI;AACxB;","names":[]}
1
+ {"version":3,"sources":["../src/signature.ts"],"sourcesContent":["import { Dates, Objects, References } from '@bessemer/cornerstone'\nimport { Reference } from '@bessemer/cornerstone/reference'\nimport { BasicType } from '@bessemer/cornerstone/types'\n\n// JOHN it is probably worth revisiting this in the context of using this library code more frequently... in particular\n// all of these things have similar properties (\"primitives\", sortable, value equality, etc.) but this method of implementation\n// forces them all to be converted to strings or numbers first which is an expensive operation.\nexport type Signable = BasicType | null | { id: string } | { reference: Reference<string> }\n\nexport const sign = (value: Signable): string | number | null => {\n if (value === null) {\n return null\n }\n\n if (Objects.isObject(value)) {\n if (References.isReferencable(value)) {\n return value.reference.id\n } else {\n return value.id\n }\n }\n\n if (Dates.isDate(value)) {\n return value.getTime()\n }\n\n if (value === true) {\n return 1\n }\n if (value === false) {\n return 0\n }\n\n return value\n}\n\nexport const signAll = (values: Array<Signable>): Array<string | number | null> => {\n return values.map(sign)\n}\n"],"mappings":";AAAA,SAAS,OAAO,SAAS,kBAAkB;AASpC,IAAM,OAAO,CAAC,UAA4C;AAC/D,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,QAAI,WAAW,eAAe,KAAK,GAAG;AACpC,aAAO,MAAM,UAAU;AAAA,IACzB,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,MAAI,MAAM,OAAO,KAAK,GAAG;AACvB,WAAO,MAAM,QAAQ;AAAA,EACvB;AAEA,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,WAA2D;AACjF,SAAO,OAAO,IAAI,IAAI;AACxB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"sql-expression-parser.d.ts","sourceRoot":"","sources":["../../src/sql/sql-expression-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAA;AAErF,OAAO,EAAa,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAenE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAExE,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,eAAe,CAAA;CAC5B,CAAA;AACD,qBAAa,mBAAoB,SAAQ,gBAAgB,CAAC,WAAW,EAAE,0BAA0B,CAAC;CAAG;AAErG,eAAO,MAAM,0BAA0B,qBAA4B,CAAA"}
1
+ {"version":3,"file":"sql-expression-parser.d.ts","sourceRoot":"","sources":["../../src/sql/sql-expression-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAsB,MAAM,oDAAoD,CAAA;AAEzG,OAAO,EAAa,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAgBnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAExE,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,eAAe,CAAA;CAC5B,CAAA;AACD,qBAAa,mBAAoB,SAAQ,gBAAgB,CAAC,WAAW,EAAE,0BAA0B,CAAC;CAAG;AAwCrG,eAAO,MAAM,0BAA0B,qBAA4B,CAAA"}
@@ -5,6 +5,7 @@ import {
5
5
  AndExpression,
6
6
  ContainsExpression,
7
7
  EqualsExpression,
8
+ getValue,
8
9
  GreaterThanExpression,
9
10
  GreaterThanOrEqualExpression,
10
11
  LessThanExpression,
@@ -14,9 +15,30 @@ import {
14
15
  ValueExpression,
15
16
  VariableExpression
16
17
  } from "@bessemer/cornerstone/expression/core-expression";
17
- import { isType, isValue } from "@bessemer/cornerstone/expression/internal";
18
+ import { isType } from "@bessemer/cornerstone/expression/internal";
18
19
  var SqlExpressionParser = class extends ExpressionMapper {
19
20
  };
21
+ var resolveContainsExpression = (expression, map, context) => {
22
+ const collection = expression.collection;
23
+ const parsedValue = getValue(collection);
24
+ if (!parsedValue.isSuccess) {
25
+ throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`);
26
+ }
27
+ const value = parsedValue.value;
28
+ value.forEach((it) => {
29
+ if (!Objects.isBasic(it)) {
30
+ throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`);
31
+ }
32
+ });
33
+ const parameters = value.map((it) => Entries.of(`_${Ulids.generate()}`, it));
34
+ parameters.forEach(([key, value2]) => {
35
+ context.parameters[key] = value2;
36
+ });
37
+ const containsExpression = expression.operands.map(map).map(
38
+ (sql) => `(${sql} IN (${Entries.keys(parameters).map((it) => `:${it}`).join(",")}))`
39
+ ).join(" AND ");
40
+ return `(${containsExpression})`;
41
+ };
20
42
  var DefaultSqlExpressionParser = new SqlExpressionParser();
21
43
  DefaultSqlExpressionParser.register(ValueExpression, (expression, _, context) => {
22
44
  const value = expression.value;
@@ -33,28 +55,7 @@ DefaultSqlExpressionParser.register(VariableExpression, (expression, _, context)
33
55
  });
34
56
  DefaultSqlExpressionParser.register(NotExpression, (expression, map, context) => {
35
57
  if (isType(expression.value, ContainsExpression)) {
36
- const collection = expression.value.collection;
37
- let value = [];
38
- if (isType(collection, ValueExpression)) {
39
- value = collection.value;
40
- } else if (isValue(collection)) {
41
- value = collection;
42
- } else {
43
- throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`);
44
- }
45
- value.forEach((it) => {
46
- if (!Objects.isBasic(it)) {
47
- throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`);
48
- }
49
- });
50
- const parameters = value.map((it) => Entries.of(`_${Ulids.generate()}`, it));
51
- parameters.forEach(([key, value2]) => {
52
- context.parameters[key] = value2;
53
- });
54
- const containsExpression = expression.value.operands.map(map).map(
55
- (sql) => `(${sql} NOT IN (${Entries.keys(parameters).map((it) => `:${it}`).join(",")}))`
56
- ).join(" AND ");
57
- return `(${containsExpression})`;
58
+ return resolveContainsExpression(expression.value, map, context);
58
59
  } else {
59
60
  return `(NOT ${map(expression.value)})`;
60
61
  }
@@ -69,33 +70,21 @@ DefaultSqlExpressionParser.register(EqualsExpression, (expression, map) => {
69
70
  const first = Arrays.first(expression.operands);
70
71
  const rest = Arrays.rest(expression.operands);
71
72
  const mappedFirst = map(first);
72
- const equalsExpressions = rest.map((it) => `(${mappedFirst} = ${map(it)})`).join(" AND ");
73
- return `(${equalsExpressions})`;
74
- });
75
- DefaultSqlExpressionParser.register(ContainsExpression, (expression, map, context) => {
76
- const collection = expression.collection;
77
- let value = [];
78
- if (isType(collection, ValueExpression)) {
79
- value = collection.value;
80
- } else if (isValue(collection)) {
81
- value = collection;
82
- } else {
83
- throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`);
84
- }
85
- value.forEach((it) => {
86
- if (!Objects.isBasic(it)) {
87
- throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`);
73
+ const equalsExpressions = rest.map((it) => {
74
+ const parsedValue = getValue(it);
75
+ if (parsedValue.isSuccess) {
76
+ if (parsedValue.value === null) {
77
+ return `(${mappedFirst} IS NULL)`;
78
+ } else {
79
+ return `(${mappedFirst} = ${map(it)})`;
80
+ }
81
+ } else {
82
+ return `(${mappedFirst} = ${map(it)})`;
88
83
  }
89
- });
90
- const parameters = value.map((it) => Entries.of(`_${Ulids.generate()}`, it));
91
- parameters.forEach(([key, value2]) => {
92
- context.parameters[key] = value2;
93
- });
94
- const containsExpression = expression.operands.map(map).map(
95
- (sql) => `(${sql} IN (${Entries.keys(parameters).map((it) => `:${it}`).join(",")}))`
96
- ).join(" AND ");
97
- return `(${containsExpression})`;
84
+ }).join(" AND ");
85
+ return `(${equalsExpressions})`;
98
86
  });
87
+ DefaultSqlExpressionParser.register(ContainsExpression, resolveContainsExpression);
99
88
  DefaultSqlExpressionParser.register(LessThanExpression, (expression, map) => {
100
89
  return `(${map(expression.left)} < ${map(expression.right)})`;
101
90
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sql/sql-expression-parser.ts"],"sourcesContent":["import { ExpressionMapper } from '@bessemer/cornerstone/expression/expression-mapper'\nimport { Arrays, Entries, Objects, Ulids } from '@bessemer/cornerstone'\nimport { BasicType, Dictionary } from '@bessemer/cornerstone/types'\nimport {\n AndExpression,\n ContainsExpression,\n EqualsExpression,\n GreaterThanExpression,\n GreaterThanOrEqualExpression,\n LessThanExpression,\n LessThanOrEqualExpression,\n NotExpression,\n OrExpression,\n ValueExpression,\n VariableExpression,\n} from '@bessemer/cornerstone/expression/core-expression'\nimport { isType, isValue } from '@bessemer/cornerstone/expression/internal'\nimport { SqlFragment, SqlParameterMap } from '@bessemer/cornerstone/sql'\n\nexport type SqlExpressionParserContext = {\n variables: Dictionary<string>\n parameters: SqlParameterMap\n}\nexport class SqlExpressionParser extends ExpressionMapper<SqlFragment, SqlExpressionParserContext> {}\n\nexport const DefaultSqlExpressionParser = new SqlExpressionParser()\nDefaultSqlExpressionParser.register(ValueExpression, (expression, _, context) => {\n const value = expression.value\n const parameterName = `_${Ulids.generate()}`\n if (!Objects.isBasic(value)) {\n throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(value)}`)\n }\n\n context.parameters[parameterName] = value\n return `:${parameterName}`\n})\nDefaultSqlExpressionParser.register(VariableExpression, (expression, _, context) => {\n const variableName = context.variables[expression.name]\n return variableName ?? expression.name\n})\nDefaultSqlExpressionParser.register(NotExpression, (expression, map, context) => {\n if (isType(expression.value, ContainsExpression)) {\n // JOHN tons of gross duplicated code that is duped across the contains resolver\n const collection = expression.value.collection\n\n // JOHN parsing expressions like this should be easier...\n let value: Array<BasicType> = []\n if (isType(collection, ValueExpression)) {\n value = collection.value as Array<BasicType>\n } else if (isValue(collection)) {\n value = collection as Array<BasicType>\n } else {\n throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`)\n }\n\n value.forEach((it) => {\n if (!Objects.isBasic(it)) {\n throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`)\n }\n })\n\n const parameters = value.map((it) => Entries.of(`_${Ulids.generate()}`, it))\n parameters.forEach(([key, value]) => {\n context.parameters[key] = value\n })\n\n const containsExpression = expression.value.operands\n .map(map)\n .map(\n (sql) =>\n `(${sql} NOT IN (${Entries.keys(parameters)\n .map((it) => `:${it}`)\n .join(',')}))`\n )\n .join(' AND ')\n\n return `(${containsExpression})`\n } else {\n return `(NOT ${map(expression.value)})`\n }\n})\nDefaultSqlExpressionParser.register(AndExpression, (expression, map) => {\n return `(${expression.operands.map(map).join(' AND ')})`\n})\nDefaultSqlExpressionParser.register(OrExpression, (expression, map) => {\n return `(${expression.operands.map(map).join(' OR ')})`\n})\nDefaultSqlExpressionParser.register(EqualsExpression, (expression, map) => {\n const first = Arrays.first(expression.operands)!\n const rest = Arrays.rest(expression.operands)\n\n const mappedFirst = map(first)\n const equalsExpressions = rest.map((it) => `(${mappedFirst} = ${map(it)})`).join(' AND ')\n return `(${equalsExpressions})`\n})\nDefaultSqlExpressionParser.register(ContainsExpression, (expression, map, context) => {\n const collection = expression.collection\n\n // JOHN parsing expressions like this should be easier...\n let value: Array<BasicType> = []\n if (isType(collection, ValueExpression)) {\n value = collection.value as Array<BasicType>\n } else if (isValue(collection)) {\n value = collection as Array<BasicType>\n } else {\n throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`)\n }\n\n value.forEach((it) => {\n if (!Objects.isBasic(it)) {\n throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`)\n }\n })\n\n const parameters = value.map((it) => Entries.of(`_${Ulids.generate()}`, it))\n parameters.forEach(([key, value]) => {\n context.parameters[key] = value\n })\n\n const containsExpression = expression.operands\n .map(map)\n .map(\n (sql) =>\n `(${sql} IN (${Entries.keys(parameters)\n .map((it) => `:${it}`)\n .join(',')}))`\n )\n .join(' AND ')\n\n return `(${containsExpression})`\n})\nDefaultSqlExpressionParser.register(LessThanExpression, (expression, map) => {\n return `(${map(expression.left)} < ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(LessThanOrEqualExpression, (expression, map) => {\n return `(${map(expression.left)} <= ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(GreaterThanExpression, (expression, map) => {\n return `(${map(expression.left)} > ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(GreaterThanOrEqualExpression, (expression, map) => {\n return `(${map(expression.left)} >= ${map(expression.right)})`\n})\n"],"mappings":";AAAA,SAAS,wBAAwB;AACjC,SAAS,QAAQ,SAAS,SAAS,aAAa;AAEhD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,QAAQ,eAAe;AAOzB,IAAM,sBAAN,cAAkC,iBAA0D;AAAC;AAE7F,IAAM,6BAA6B,IAAI,oBAAoB;AAClE,2BAA2B,SAAS,iBAAiB,CAAC,YAAY,GAAG,YAAY;AAC/E,QAAM,QAAQ,WAAW;AACzB,QAAM,gBAAgB,IAAI,MAAM,SAAS,CAAC;AAC1C,MAAI,CAAC,QAAQ,QAAQ,KAAK,GAAG;AAC3B,UAAM,IAAI,MAAM,2EAA2E,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,EACpH;AAEA,UAAQ,WAAW,aAAa,IAAI;AACpC,SAAO,IAAI,aAAa;AAC1B,CAAC;AACD,2BAA2B,SAAS,oBAAoB,CAAC,YAAY,GAAG,YAAY;AAClF,QAAM,eAAe,QAAQ,UAAU,WAAW,IAAI;AACtD,SAAO,gBAAgB,WAAW;AACpC,CAAC;AACD,2BAA2B,SAAS,eAAe,CAAC,YAAY,KAAK,YAAY;AAC/E,MAAI,OAAO,WAAW,OAAO,kBAAkB,GAAG;AAEhD,UAAM,aAAa,WAAW,MAAM;AAGpC,QAAI,QAA0B,CAAC;AAC/B,QAAI,OAAO,YAAY,eAAe,GAAG;AACvC,cAAQ,WAAW;AAAA,IACrB,WAAW,QAAQ,UAAU,GAAG;AAC9B,cAAQ;AAAA,IACV,OAAO;AACL,YAAM,IAAI,MAAM,yFAAyF,KAAK,UAAU,UAAU,CAAC,EAAE;AAAA,IACvI;AAEA,UAAM,QAAQ,CAAC,OAAO;AACpB,UAAI,CAAC,QAAQ,QAAQ,EAAE,GAAG;AACxB,cAAM,IAAI,MAAM,2EAA2E,KAAK,UAAU,EAAE,CAAC,EAAE;AAAA,MACjH;AAAA,IACF,CAAC;AAED,UAAM,aAAa,MAAM,IAAI,CAAC,OAAO,QAAQ,GAAG,IAAI,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;AAC3E,eAAW,QAAQ,CAAC,CAAC,KAAKA,MAAK,MAAM;AACnC,cAAQ,WAAW,GAAG,IAAIA;AAAA,IAC5B,CAAC;AAED,UAAM,qBAAqB,WAAW,MAAM,SACzC,IAAI,GAAG,EACP;AAAA,MACC,CAAC,QACC,IAAI,GAAG,YAAY,QAAQ,KAAK,UAAU,EACvC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,EACpB,KAAK,GAAG,CAAC;AAAA,IAChB,EACC,KAAK,OAAO;AAEf,WAAO,IAAI,kBAAkB;AAAA,EAC/B,OAAO;AACL,WAAO,QAAQ,IAAI,WAAW,KAAK,CAAC;AAAA,EACtC;AACF,CAAC;AACD,2BAA2B,SAAS,eAAe,CAAC,YAAY,QAAQ;AACtE,SAAO,IAAI,WAAW,SAAS,IAAI,GAAG,EAAE,KAAK,OAAO,CAAC;AACvD,CAAC;AACD,2BAA2B,SAAS,cAAc,CAAC,YAAY,QAAQ;AACrE,SAAO,IAAI,WAAW,SAAS,IAAI,GAAG,EAAE,KAAK,MAAM,CAAC;AACtD,CAAC;AACD,2BAA2B,SAAS,kBAAkB,CAAC,YAAY,QAAQ;AACzE,QAAM,QAAQ,OAAO,MAAM,WAAW,QAAQ;AAC9C,QAAM,OAAO,OAAO,KAAK,WAAW,QAAQ;AAE5C,QAAM,cAAc,IAAI,KAAK;AAC7B,QAAM,oBAAoB,KAAK,IAAI,CAAC,OAAO,IAAI,WAAW,MAAM,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,OAAO;AACxF,SAAO,IAAI,iBAAiB;AAC9B,CAAC;AACD,2BAA2B,SAAS,oBAAoB,CAAC,YAAY,KAAK,YAAY;AACpF,QAAM,aAAa,WAAW;AAG9B,MAAI,QAA0B,CAAC;AAC/B,MAAI,OAAO,YAAY,eAAe,GAAG;AACvC,YAAQ,WAAW;AAAA,EACrB,WAAW,QAAQ,UAAU,GAAG;AAC9B,YAAQ;AAAA,EACV,OAAO;AACL,UAAM,IAAI,MAAM,yFAAyF,KAAK,UAAU,UAAU,CAAC,EAAE;AAAA,EACvI;AAEA,QAAM,QAAQ,CAAC,OAAO;AACpB,QAAI,CAAC,QAAQ,QAAQ,EAAE,GAAG;AACxB,YAAM,IAAI,MAAM,2EAA2E,KAAK,UAAU,EAAE,CAAC,EAAE;AAAA,IACjH;AAAA,EACF,CAAC;AAED,QAAM,aAAa,MAAM,IAAI,CAAC,OAAO,QAAQ,GAAG,IAAI,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;AAC3E,aAAW,QAAQ,CAAC,CAAC,KAAKA,MAAK,MAAM;AACnC,YAAQ,WAAW,GAAG,IAAIA;AAAA,EAC5B,CAAC;AAED,QAAM,qBAAqB,WAAW,SACnC,IAAI,GAAG,EACP;AAAA,IACC,CAAC,QACC,IAAI,GAAG,QAAQ,QAAQ,KAAK,UAAU,EACnC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,EACpB,KAAK,GAAG,CAAC;AAAA,EAChB,EACC,KAAK,OAAO;AAEf,SAAO,IAAI,kBAAkB;AAC/B,CAAC;AACD,2BAA2B,SAAS,oBAAoB,CAAC,YAAY,QAAQ;AAC3E,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,IAAI,WAAW,KAAK,CAAC;AAC5D,CAAC;AACD,2BAA2B,SAAS,2BAA2B,CAAC,YAAY,QAAQ;AAClF,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,OAAO,IAAI,WAAW,KAAK,CAAC;AAC7D,CAAC;AACD,2BAA2B,SAAS,uBAAuB,CAAC,YAAY,QAAQ;AAC9E,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,IAAI,WAAW,KAAK,CAAC;AAC5D,CAAC;AACD,2BAA2B,SAAS,8BAA8B,CAAC,YAAY,QAAQ;AACrF,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,OAAO,IAAI,WAAW,KAAK,CAAC;AAC7D,CAAC;","names":["value"]}
1
+ {"version":3,"sources":["../../src/sql/sql-expression-parser.ts"],"sourcesContent":["import { ExpressionMapper, ExpressionResolver } from '@bessemer/cornerstone/expression/expression-mapper'\nimport { Arrays, Entries, Objects, Ulids } from '@bessemer/cornerstone'\nimport { BasicType, Dictionary } from '@bessemer/cornerstone/types'\nimport {\n AndExpression,\n ContainsExpression,\n EqualsExpression,\n getValue,\n GreaterThanExpression,\n GreaterThanOrEqualExpression,\n LessThanExpression,\n LessThanOrEqualExpression,\n NotExpression,\n OrExpression,\n ValueExpression,\n VariableExpression,\n} from '@bessemer/cornerstone/expression/core-expression'\nimport { isType } from '@bessemer/cornerstone/expression/internal'\nimport { SqlFragment, SqlParameterMap } from '@bessemer/cornerstone/sql'\n\nexport type SqlExpressionParserContext = {\n variables: Dictionary<string>\n parameters: SqlParameterMap\n}\nexport class SqlExpressionParser extends ExpressionMapper<SqlFragment, SqlExpressionParserContext> {}\n\n// JOHN should be easier to define this type\nconst resolveContainsExpression: ExpressionResolver<ReturnType<typeof ContainsExpression.builder>, SqlFragment, SqlExpressionParserContext> = (\n expression,\n map,\n context\n) => {\n const collection = expression.collection\n\n const parsedValue = getValue(collection)\n if (!parsedValue.isSuccess) {\n throw new Error(`SqlExpressionParser - Unable to resolve ContainsExpression with non-value collection: ${JSON.stringify(collection)}`)\n }\n const value = parsedValue.value as Array<BasicType>\n\n value.forEach((it) => {\n if (!Objects.isBasic(it)) {\n throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(it)}`)\n }\n })\n\n const parameters = value.map((it) => Entries.of(`_${Ulids.generate()}`, it))\n parameters.forEach(([key, value]) => {\n context.parameters[key] = value\n })\n\n const containsExpression = expression.operands\n .map(map)\n .map(\n (sql) =>\n `(${sql} IN (${Entries.keys(parameters)\n .map((it) => `:${it}`)\n .join(',')}))`\n )\n .join(' AND ')\n\n return `(${containsExpression})`\n}\n\nexport const DefaultSqlExpressionParser = new SqlExpressionParser()\nDefaultSqlExpressionParser.register(ValueExpression, (expression, _, context) => {\n const value = expression.value\n const parameterName = `_${Ulids.generate()}`\n if (!Objects.isBasic(value)) {\n throw new Error(`SqlExpressionParser - Unable to resolve complex ValueExpression as Sql: ${JSON.stringify(value)}`)\n }\n\n context.parameters[parameterName] = value\n return `:${parameterName}`\n})\nDefaultSqlExpressionParser.register(VariableExpression, (expression, _, context) => {\n const variableName = context.variables[expression.name]\n return variableName ?? expression.name\n})\nDefaultSqlExpressionParser.register(NotExpression, (expression, map, context) => {\n if (isType(expression.value, ContainsExpression)) {\n return resolveContainsExpression(expression.value, map, context)\n } else {\n return `(NOT ${map(expression.value)})`\n }\n})\nDefaultSqlExpressionParser.register(AndExpression, (expression, map) => {\n return `(${expression.operands.map(map).join(' AND ')})`\n})\nDefaultSqlExpressionParser.register(OrExpression, (expression, map) => {\n return `(${expression.operands.map(map).join(' OR ')})`\n})\nDefaultSqlExpressionParser.register(EqualsExpression, (expression, map) => {\n const first = Arrays.first(expression.operands)!\n const rest = Arrays.rest(expression.operands)\n\n const mappedFirst = map(first)\n const equalsExpressions = rest\n .map((it) => {\n const parsedValue = getValue(it)\n if (parsedValue.isSuccess) {\n if (parsedValue.value === null) {\n return `(${mappedFirst} IS NULL)`\n } else {\n return `(${mappedFirst} = ${map(it)})`\n }\n } else {\n return `(${mappedFirst} = ${map(it)})`\n }\n })\n .join(' AND ')\n return `(${equalsExpressions})`\n})\nDefaultSqlExpressionParser.register(ContainsExpression, resolveContainsExpression)\nDefaultSqlExpressionParser.register(LessThanExpression, (expression, map) => {\n return `(${map(expression.left)} < ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(LessThanOrEqualExpression, (expression, map) => {\n return `(${map(expression.left)} <= ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(GreaterThanExpression, (expression, map) => {\n return `(${map(expression.left)} > ${map(expression.right)})`\n})\nDefaultSqlExpressionParser.register(GreaterThanOrEqualExpression, (expression, map) => {\n return `(${map(expression.left)} >= ${map(expression.right)})`\n})\n"],"mappings":"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","names":["value"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bessemer/cornerstone",
3
3
  "type": "module",
4
- "version": "0.5.60",
4
+ "version": "0.5.62",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "sideEffects": false,