@bessemer/cornerstone 0.5.68 → 0.5.70

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,4 +1,4 @@
1
- import { ZodType } from 'zod';
1
+ import Zod, { ZodType } from 'zod';
2
2
  export type PendingValue = {
3
3
  isSuccess: false;
4
4
  isError: false;
@@ -42,7 +42,7 @@ export type SettledValue<T> = {
42
42
  data: T;
43
43
  };
44
44
  export type AsyncValue<T> = PendingValue | LoadingValue | ErrorValue | FetchingValueSuccess<T> | FetchingValueError | SettledValue<T>;
45
- export declare const schema: <T>(_: ZodType<T>) => ZodType<AsyncValue<T>>;
45
+ export declare const schema: <T extends ZodType>(_: T) => ZodType<AsyncValue<Zod.infer<T>>>;
46
46
  export declare const isSettled: <T>(value: AsyncValue<T>) => value is SettledValue<T>;
47
47
  export declare const loading: () => LoadingValue;
48
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":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/async-value.ts"],"sourcesContent":["import Zod, { ZodType } from 'zod'\nimport { isNil } from '@bessemer/cornerstone/object'\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 (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,aAAa;AAoDf,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,MAAM,MAAM,IAAI,GAAG;AACrB,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 { isNil } from '@bessemer/cornerstone/object'\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 extends ZodType>(_: T): ZodType<AsyncValue<Zod.infer<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 (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,aAAa;AAoDf,IAAM,SAAS,CAAoB,MAA4C;AACpF,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,MAAM,MAAM,IAAI,GAAG;AACrB,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,7 +1,7 @@
1
1
  import { TaggedType } from '@bessemer/cornerstone/types';
2
2
  import { ZodType } from 'zod';
3
3
  export type CurrencyCode = TaggedType<string, 'CurrencyCode'>;
4
- export declare const Schema: ZodType<CurrencyCode>;
4
+ export declare const Schema: ZodType<CurrencyCode, CurrencyCode>;
5
5
  export declare const of: (value: string) => CurrencyCode;
6
6
  export declare const fromString: (value: string) => CurrencyCode;
7
7
  export declare const USD: CurrencyCode;
@@ -1 +1 @@
1
- {"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../src/currency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAElC,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAC7D,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,YAAY,CAGM,CAAA;AAE/C,eAAO,MAAM,EAAE,GAAI,OAAO,MAAM,KAAG,YAElC,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,YAE1C,CAAA;AAED,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA"}
1
+ {"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../src/currency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAElC,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAC7D,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,YAAY,CAGR,CAAA;AAE/C,eAAO,MAAM,EAAE,GAAI,OAAO,MAAM,KAAG,YAElC,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,YAE1C,CAAA;AAED,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA;AAC5B,eAAO,MAAM,GAAG,cAAY,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/currency.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport Zod, { ZodType } from 'zod'\n\nexport type CurrencyCode = TaggedType<string, 'CurrencyCode'>\nexport const Schema: ZodType<CurrencyCode> = Zod.string()\n .trim()\n .regex(/^[a-zA-Z]{3}$/, 'Currency Code must be exactly 3 letters')\n .transform((val) => val.toUpperCase()) as any\n\nexport const of = (value: string): CurrencyCode => {\n return value as CurrencyCode\n}\n\nexport const fromString = (value: string): CurrencyCode => {\n return Schema.parse(value)\n}\n\nexport const USD = of('USD')\nexport const EUR = of('EUR')\nexport const GBP = of('GBP')\nexport const JPY = of('JPY')\nexport const CAD = of('CAD')\nexport const AUD = of('AUD')\n"],"mappings":";AACA,OAAO,SAAsB;AAGtB,IAAM,SAAgC,IAAI,OAAO,EACrD,KAAK,EACL,MAAM,iBAAiB,yCAAyC,EAChE,UAAU,CAAC,QAAQ,IAAI,YAAY,CAAC;AAEhC,IAAM,KAAK,CAAC,UAAgC;AACjD,SAAO;AACT;AAEO,IAAM,aAAa,CAAC,UAAgC;AACzD,SAAO,OAAO,MAAM,KAAK;AAC3B;AAEO,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;","names":[]}
1
+ {"version":3,"sources":["../src/currency.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport Zod, { ZodType } from 'zod'\n\nexport type CurrencyCode = TaggedType<string, 'CurrencyCode'>\nexport const Schema: ZodType<CurrencyCode, CurrencyCode> = Zod.string()\n .trim()\n .regex(/^[a-zA-Z]{3}$/, 'Currency Code must be exactly 3 letters')\n .transform((val) => val.toUpperCase()) as any\n\nexport const of = (value: string): CurrencyCode => {\n return value as CurrencyCode\n}\n\nexport const fromString = (value: string): CurrencyCode => {\n return Schema.parse(value)\n}\n\nexport const USD = of('USD')\nexport const EUR = of('EUR')\nexport const GBP = of('GBP')\nexport const JPY = of('JPY')\nexport const CAD = of('CAD')\nexport const AUD = of('AUD')\n"],"mappings":";AACA,OAAO,SAAsB;AAGtB,IAAM,SAA8C,IAAI,OAAO,EACnE,KAAK,EACL,MAAM,iBAAiB,yCAAyC,EAChE,UAAU,CAAC,QAAQ,IAAI,YAAY,CAAC;AAEhC,IAAM,KAAK,CAAC,UAAgC;AACjD,SAAO;AACT;AAEO,IAAM,aAAa,CAAC,UAAgC;AACzD,SAAO,OAAO,MAAM,KAAK;AAC3B;AAEO,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;AACpB,IAAM,MAAM,GAAG,KAAK;","names":[]}
@@ -5,7 +5,7 @@ export type MonetaryAmount = {
5
5
  amount: number;
6
6
  currency: CurrencyCode;
7
7
  };
8
- export declare const Schema: ZodType<MonetaryAmount>;
8
+ export declare const Schema: ZodType<MonetaryAmount, MonetaryAmount>;
9
9
  export declare const Comparator: IComparator<MonetaryAmount>;
10
10
  export declare const Equalitor: import("@bessemer/cornerstone/equalitor").Equalitor<MonetaryAmount>;
11
11
  export declare const of: (amount: number, currency: CurrencyCode) => MonetaryAmount;
@@ -1 +1 @@
1
- {"version":3,"file":"monetary-amount.d.ts","sourceRoot":"","sources":["../src/monetary-amount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgC,MAAM,gCAAgC,CAAA;AAC3F,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAGlC,OAAO,EAAE,UAAU,IAAI,WAAW,EAAW,MAAM,kCAAkC,CAAA;AAIrF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,cAAc,CAGzC,CAAA;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,cAAc,CAElD,CAAA;AAED,eAAO,MAAM,SAAS,qEAA6B,CAAA;AAEnD,eAAO,MAAM,EAAE,GAAI,QAAQ,MAAM,EAAE,UAAU,YAAY,KAAG,cAG3D,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,UAAU,YAAY,KAAG,cAE7C,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,OAAO,cAAc,EAAE,QAAQ,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,KAAG,CAMxH,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,KAAG,cAE5H,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,KAAK,GAAI,QAAQ,cAAc,GAAG,IAAI,EAAE,SAAS,cAAc,GAAG,IAAI,KAAG,OASrF,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,OAAO,cAAc,EAAE,SAAS,cAAc,GAAG,IAAI,KAAG,cAE3E,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,cAExE,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,OAAO,MAAM,KAAG,cAE/D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,cAAc,EAAE,OAAO,MAAM,KAAG,cAE7D,CAAA;AAED,wBAAgB,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC,GAAG,cAAc,CAAA;AACvG,wBAAgB,MAAM,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,cAAc,CAAA;AAM1G,eAAO,MAAM,MAAM,GAAI,gBAAgB,cAAc,KAAG,cAOvD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,gBAAgB,cAAc,KAAG,OAEvD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAE3E,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAExE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAElF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAE/E,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,QAAQ,cAAc,EAAE,YAAY,MAAM,EAAE,UAAU,2BAA2B,KAAG,MAgB1G,CAAA"}
1
+ {"version":3,"file":"monetary-amount.d.ts","sourceRoot":"","sources":["../src/monetary-amount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgC,MAAM,gCAAgC,CAAA;AAC3F,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAGlC,OAAO,EAAE,UAAU,IAAI,WAAW,EAAW,MAAM,kCAAkC,CAAA;AAIrF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,CAGzD,CAAA;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,cAAc,CAElD,CAAA;AAED,eAAO,MAAM,SAAS,qEAA6B,CAAA;AAEnD,eAAO,MAAM,EAAE,GAAI,QAAQ,MAAM,EAAE,UAAU,YAAY,KAAG,cAG3D,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,UAAU,YAAY,KAAG,cAE7C,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,OAAO,cAAc,EAAE,QAAQ,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,KAAG,CAMxH,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,KAAG,cAE5H,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,KAAK,GAAI,QAAQ,cAAc,GAAG,IAAI,EAAE,SAAS,cAAc,GAAG,IAAI,KAAG,OASrF,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,OAAO,cAAc,EAAE,SAAS,cAAc,GAAG,IAAI,KAAG,cAE3E,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,cAExE,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,OAAO,MAAM,KAAG,cAE/D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,cAAc,EAAE,OAAO,MAAM,KAAG,cAE7D,CAAA;AAED,wBAAgB,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC,GAAG,cAAc,CAAA;AACvG,wBAAgB,MAAM,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,cAAc,CAAA;AAM1G,eAAO,MAAM,MAAM,GAAI,gBAAgB,cAAc,KAAG,cAOvD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,gBAAgB,cAAc,KAAG,OAEvD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAE3E,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAExE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAElF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAE/E,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,QAAQ,cAAc,EAAE,YAAY,MAAM,EAAE,UAAU,2BAA2B,KAAG,MAgB1G,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/monetary-amount.ts"],"sourcesContent":["import { CurrencyCode, Schema as CurrencyCodeSchema } from '@bessemer/cornerstone/currency'\nimport Zod, { ZodType } from 'zod'\nimport { isNil } from '@bessemer/cornerstone/object'\nimport { roundHalfEven } from '@bessemer/cornerstone/math'\nimport { Comparator as IComparator, natural } from '@bessemer/cornerstone/comparator'\nimport { fromComparator } from '@bessemer/cornerstone/equalitor'\nimport { assert } from '@bessemer/cornerstone/assertion'\n\nexport type MonetaryAmount = {\n amount: number\n currency: CurrencyCode\n}\n\nexport const Schema: ZodType<MonetaryAmount> = Zod.object({\n amount: Zod.number().int(),\n currency: CurrencyCodeSchema,\n})\n\nexport const Comparator: IComparator<MonetaryAmount> = (first: MonetaryAmount, second: MonetaryAmount): number => {\n return apply(first, second, natural())\n}\n\nexport const Equalitor = fromComparator(Comparator)\n\nexport const of = (amount: number, currency: CurrencyCode): MonetaryAmount => {\n assert(Number.isInteger(amount))\n return { amount, currency }\n}\n\nexport const zero = (currency: CurrencyCode): MonetaryAmount => {\n return { amount: 0, currency }\n}\n\nexport const apply = <T>(first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => T): T => {\n if (first.currency !== second.currency) {\n throw new Error(`Currency mismatch in operation on MonetaryAmount: ${first.currency}, ${second.currency}`)\n }\n\n return operator(first.amount, second.amount)\n}\n\nexport const operate = (first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => number): MonetaryAmount => {\n return of(apply(first, second, operator), first.currency)\n}\n\n/** Determines whether two MonetaryAmounts are considered equivalent */\nexport const equal = (first?: MonetaryAmount | null, second?: MonetaryAmount | null): boolean => {\n if (isNil(first) && isNil(second)) {\n return true\n }\n if (isNil(first) || isNil(second)) {\n return false\n }\n\n return apply(first, second, (first, second) => first === second)\n}\n\nexport const sum = (first: MonetaryAmount, second?: MonetaryAmount | null): MonetaryAmount => {\n return operate(first, second ?? zero(first.currency), (first, second) => first + second)\n}\n\nexport const subtract = (first: MonetaryAmount, second: MonetaryAmount): MonetaryAmount => {\n return operate(first, second, (first, second) => first - second)\n}\n\nexport const multiply = (money: MonetaryAmount, value: number): MonetaryAmount => {\n return of(roundHalfEven(money.amount * value, 0), money.currency)\n}\n\nexport const divide = (money: MonetaryAmount, value: number): MonetaryAmount => {\n return of(roundHalfEven(money.amount / value, 0), money.currency)\n}\n\nexport function sumAll(monetaryAmounts: readonly [MonetaryAmount, ...MonetaryAmount[]]): MonetaryAmount\nexport function sumAll(monetaryAmounts: readonly MonetaryAmount[], currency: CurrencyCode): MonetaryAmount\nexport function sumAll(monetaryAmounts: readonly MonetaryAmount[], currency?: CurrencyCode): MonetaryAmount {\n const resolvedCurrency = currency ?? monetaryAmounts[0]!.currency\n return monetaryAmounts.reduce<MonetaryAmount>((first, second) => sum(second, first), zero(resolvedCurrency))\n}\n\nexport const negate = (monetaryAmount: MonetaryAmount): MonetaryAmount => {\n // Avoid creating a negative 0, which is a real thing!\n if (isZero(monetaryAmount)) {\n return monetaryAmount\n }\n\n return of(-monetaryAmount.amount, monetaryAmount.currency)\n}\n\nexport const isZero = (monetaryAmount: MonetaryAmount): boolean => {\n return monetaryAmount.amount === 0\n}\n\nexport const greaterThan = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first > second)\n}\n\nexport const lessThan = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first < second)\n}\n\nexport const greaterThanOrEqual = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first >= second)\n}\n\nexport const lessThanOrEqual = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first <= second)\n}\n\nexport type MonetaryAmountFormatOptions = {\n hideCents?: boolean\n}\n\nexport const format = (amount: MonetaryAmount, alpha2Code: string, options?: MonetaryAmountFormatOptions): string => {\n const hideCents = options?.hideCents ?? false\n const isWholeNumber = amount.amount % 100 === 0\n\n const formatCurrency = new Intl.NumberFormat(alpha2Code, {\n style: 'currency',\n currency: amount.currency,\n ...(hideCents\n ? {\n minimumFractionDigits: isWholeNumber ? 0 : 2,\n maximumFractionDigits: 2,\n }\n : {}),\n })\n\n return formatCurrency.format(amount.amount / 100)\n}\n"],"mappings":"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","names":["first","second"]}
1
+ {"version":3,"sources":["../src/monetary-amount.ts"],"sourcesContent":["import { CurrencyCode, Schema as CurrencyCodeSchema } from '@bessemer/cornerstone/currency'\nimport Zod, { ZodType } from 'zod'\nimport { isNil } from '@bessemer/cornerstone/object'\nimport { roundHalfEven } from '@bessemer/cornerstone/math'\nimport { Comparator as IComparator, natural } from '@bessemer/cornerstone/comparator'\nimport { fromComparator } from '@bessemer/cornerstone/equalitor'\nimport { assert } from '@bessemer/cornerstone/assertion'\n\nexport type MonetaryAmount = {\n amount: number\n currency: CurrencyCode\n}\n\nexport const Schema: ZodType<MonetaryAmount, MonetaryAmount> = Zod.object({\n amount: Zod.number().int(),\n currency: CurrencyCodeSchema,\n})\n\nexport const Comparator: IComparator<MonetaryAmount> = (first: MonetaryAmount, second: MonetaryAmount): number => {\n return apply(first, second, natural())\n}\n\nexport const Equalitor = fromComparator(Comparator)\n\nexport const of = (amount: number, currency: CurrencyCode): MonetaryAmount => {\n assert(Number.isInteger(amount))\n return { amount, currency }\n}\n\nexport const zero = (currency: CurrencyCode): MonetaryAmount => {\n return { amount: 0, currency }\n}\n\nexport const apply = <T>(first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => T): T => {\n if (first.currency !== second.currency) {\n throw new Error(`Currency mismatch in operation on MonetaryAmount: ${first.currency}, ${second.currency}`)\n }\n\n return operator(first.amount, second.amount)\n}\n\nexport const operate = (first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => number): MonetaryAmount => {\n return of(apply(first, second, operator), first.currency)\n}\n\n/** Determines whether two MonetaryAmounts are considered equivalent */\nexport const equal = (first?: MonetaryAmount | null, second?: MonetaryAmount | null): boolean => {\n if (isNil(first) && isNil(second)) {\n return true\n }\n if (isNil(first) || isNil(second)) {\n return false\n }\n\n return apply(first, second, (first, second) => first === second)\n}\n\nexport const sum = (first: MonetaryAmount, second?: MonetaryAmount | null): MonetaryAmount => {\n return operate(first, second ?? zero(first.currency), (first, second) => first + second)\n}\n\nexport const subtract = (first: MonetaryAmount, second: MonetaryAmount): MonetaryAmount => {\n return operate(first, second, (first, second) => first - second)\n}\n\nexport const multiply = (money: MonetaryAmount, value: number): MonetaryAmount => {\n return of(roundHalfEven(money.amount * value, 0), money.currency)\n}\n\nexport const divide = (money: MonetaryAmount, value: number): MonetaryAmount => {\n return of(roundHalfEven(money.amount / value, 0), money.currency)\n}\n\nexport function sumAll(monetaryAmounts: readonly [MonetaryAmount, ...MonetaryAmount[]]): MonetaryAmount\nexport function sumAll(monetaryAmounts: readonly MonetaryAmount[], currency: CurrencyCode): MonetaryAmount\nexport function sumAll(monetaryAmounts: readonly MonetaryAmount[], currency?: CurrencyCode): MonetaryAmount {\n const resolvedCurrency = currency ?? monetaryAmounts[0]!.currency\n return monetaryAmounts.reduce<MonetaryAmount>((first, second) => sum(second, first), zero(resolvedCurrency))\n}\n\nexport const negate = (monetaryAmount: MonetaryAmount): MonetaryAmount => {\n // Avoid creating a negative 0, which is a real thing!\n if (isZero(monetaryAmount)) {\n return monetaryAmount\n }\n\n return of(-monetaryAmount.amount, monetaryAmount.currency)\n}\n\nexport const isZero = (monetaryAmount: MonetaryAmount): boolean => {\n return monetaryAmount.amount === 0\n}\n\nexport const greaterThan = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first > second)\n}\n\nexport const lessThan = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first < second)\n}\n\nexport const greaterThanOrEqual = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first >= second)\n}\n\nexport const lessThanOrEqual = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first <= second)\n}\n\nexport type MonetaryAmountFormatOptions = {\n hideCents?: boolean\n}\n\nexport const format = (amount: MonetaryAmount, alpha2Code: string, options?: MonetaryAmountFormatOptions): string => {\n const hideCents = options?.hideCents ?? false\n const isWholeNumber = amount.amount % 100 === 0\n\n const formatCurrency = new Intl.NumberFormat(alpha2Code, {\n style: 'currency',\n currency: amount.currency,\n ...(hideCents\n ? {\n minimumFractionDigits: isWholeNumber ? 0 : 2,\n maximumFractionDigits: 2,\n }\n : {}),\n })\n\n return formatCurrency.format(amount.amount / 100)\n}\n"],"mappings":"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","names":["first","second"]}
@@ -6,5 +6,6 @@ export declare const Schema: ZodType<ObjectPath>;
6
6
  export declare const of: (value: Array<string | number>) => ObjectPath;
7
7
  export declare const fromString: (path: string) => ObjectPath;
8
8
  export declare const getValue: (object: UnknownRecord, path: ObjectPath) => unknown;
9
+ export declare const findValue: (object: UnknownRecord, path: ObjectPath) => unknown | undefined;
9
10
  export declare const applyValue: (object: UnknownRecord, path: ObjectPath, valueToApply: unknown) => unknown;
10
11
  //# sourceMappingURL=object-path.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"object-path.d.ts","sourceRoot":"","sources":["../src/object-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAQzC,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,YAAY,CAAC,CAAA;AACzE,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,UAAU,CAA6D,CAAA;AAEpG,eAAO,MAAM,EAAE,GAAI,OAAO,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAG,UAElD,CAAA;AAKD,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,UAoBzC,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,QAAQ,aAAa,EAAE,MAAM,UAAU,KAAG,OAOlE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,aAAa,EAAE,MAAM,UAAU,EAAE,cAAc,OAAO,KAAG,OAc3F,CAAA"}
1
+ {"version":3,"file":"object-path.d.ts","sourceRoot":"","sources":["../src/object-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AASzC,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,YAAY,CAAC,CAAA;AACzE,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,UAAU,CAA6D,CAAA;AAEpG,eAAO,MAAM,EAAE,GAAI,OAAO,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAG,UAElD,CAAA;AAKD,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,UAoBzC,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,QAAQ,aAAa,EAAE,MAAM,UAAU,KAAG,OAQlE,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,QAAQ,aAAa,EAAE,MAAM,UAAU,KAAG,OAAO,GAAG,SAQ7E,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,aAAa,EAAE,MAAM,UAAU,EAAE,cAAc,OAAO,KAAG,OAc3F,CAAA"}
@@ -6,6 +6,7 @@ import { isNumber } from "@bessemer/cornerstone/math";
6
6
  import { isString } from "@bessemer/cornerstone/string";
7
7
  import { assert } from "@bessemer/cornerstone/assertion";
8
8
  import { isEmpty } from "@bessemer/cornerstone/array";
9
+ import { failure, success } from "@bessemer/cornerstone/result";
9
10
  var Schema = Zod.array(Zod.union([Zod.string(), Zod.number()]));
10
11
  var of = (value) => {
11
12
  return value;
@@ -28,11 +29,20 @@ var fromString = (path) => {
28
29
  return of(result);
29
30
  };
30
31
  var getValue = (object, path) => {
31
- let value = object;
32
- for (const key of path) {
33
- value = getIndexValueOrThrow(value, key, object, path);
32
+ const result = getValueResult(object, path);
33
+ if (result.isSuccess) {
34
+ return result.value;
35
+ } else {
36
+ throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
37
+ }
38
+ };
39
+ var findValue = (object, path) => {
40
+ const result = getValueResult(object, path);
41
+ if (result.isSuccess) {
42
+ return result.value;
43
+ } else {
44
+ return void 0;
34
45
  }
35
- return value;
36
46
  };
37
47
  var applyValue = (object, path, valueToApply) => {
38
48
  if (isEmpty(path)) {
@@ -46,20 +56,24 @@ var applyValue = (object, path, valueToApply) => {
46
56
  parent[last] = valueToApply;
47
57
  });
48
58
  };
49
- var getIndexValueOrThrow = (value, key, object, path) => {
50
- if (isNumber(key) && Array.isArray(value)) {
51
- if (key < 0 || key >= value.length) {
52
- throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
53
- }
54
- return value[key];
55
- } else if (isString(key) && isObject(value)) {
56
- if (!(key in value)) {
57
- throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
59
+ var getValueResult = (object, path) => {
60
+ let value = object;
61
+ for (const key of path) {
62
+ if (isNumber(key) && Array.isArray(value)) {
63
+ if (key < 0 || key >= value.length) {
64
+ return failure();
65
+ }
66
+ value = value[key];
67
+ } else if (isString(key) && isObject(value)) {
68
+ if (!(key in value)) {
69
+ return failure();
70
+ }
71
+ value = value[key];
72
+ } else {
73
+ return failure();
58
74
  }
59
- return value[key];
60
- } else {
61
- throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
62
75
  }
76
+ return success(value);
63
77
  };
64
78
  var assertLegalIndex = (value, key, object, path) => {
65
79
  if (isNumber(key) && Array.isArray(value)) {
@@ -73,6 +87,7 @@ var assertLegalIndex = (value, key, object, path) => {
73
87
  export {
74
88
  Schema,
75
89
  applyValue,
90
+ findValue,
76
91
  fromString,
77
92
  getValue,
78
93
  of
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/object-path.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport Zod, { ZodType } from 'zod'\nimport { UnknownRecord } from 'type-fest'\nimport { isObject } from '@bessemer/cornerstone/object'\nimport { produce } from 'immer'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { isString } from '@bessemer/cornerstone/string'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport { isEmpty } from '@bessemer/cornerstone/array'\n\nexport type ObjectPath = TaggedType<Array<string | number>, 'ObjectPath'>\nexport const Schema: ZodType<ObjectPath> = Zod.array(Zod.union([Zod.string(), Zod.number()])) as any\n\nexport const of = (value: Array<string | number>): ObjectPath => {\n return value as ObjectPath\n}\n\nconst ObjectPathRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*(?:\\.[a-zA-Z_$][a-zA-Z0-9_$]*|\\.\\d+|\\[\\d+])*$/\nconst ObjectPathPartRegex = /([a-zA-Z_$][a-zA-Z0-9_$]*)|\\[(\\d+)]|\\.(\\d+)/g\n\nexport const fromString = (path: string): ObjectPath => {\n assert(ObjectPathRegex.test(path), () => `Unable to parse ObjectPath from string: ${path}`)\n\n const result: Array<string | number> = []\n\n let match: RegExpExecArray | null\n while ((match = ObjectPathPartRegex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n // Property name (e.g., 'users', 'profile')\n result.push(match[1])\n } else if (match[2] !== undefined) {\n // Bracket notation array index (e.g., [0])\n result.push(Number(match[2]))\n } else if (match[3] !== undefined) {\n // Dot notation array index (e.g., .0)\n result.push(Number(match[3]))\n }\n }\n\n return of(result)\n}\n\nexport const getValue = (object: UnknownRecord, path: ObjectPath): unknown => {\n let value: any = object\n for (const key of path) {\n value = getIndexValueOrThrow(value, key, object, path)\n }\n\n return value\n}\n\nexport const applyValue = (object: UnknownRecord, path: ObjectPath, valueToApply: unknown): unknown => {\n if (isEmpty(path)) {\n return valueToApply\n }\n\n return produce(object, (draft) => {\n const rest = path.slice(0, -1)\n const last = path[path.length - 1]!\n const parent: any = isEmpty(rest) ? draft : getValue(draft, of(rest))\n\n // Check to make sure the last index is ok\n assertLegalIndex(parent, last, object, path)\n parent[last] = valueToApply\n })\n}\n\nconst getIndexValueOrThrow = (value: any, key: string | number, object: UnknownRecord, path: ObjectPath): any => {\n if (isNumber(key) && Array.isArray(value)) {\n if (key < 0 || key >= value.length) {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n\n return value[key]\n } else if (isString(key) && isObject(value)) {\n if (!(key in value)) {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n\n return value[key]\n } else {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n}\n\nconst assertLegalIndex = (value: any, key: string | number, object: UnknownRecord, path: ObjectPath): void => {\n if (isNumber(key) && Array.isArray(value)) {\n return\n } else if (isString(key) && isObject(value)) {\n return\n } else {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n}\n"],"mappings":";AACA,OAAO,SAAsB;AAE7B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,eAAe;AAGjB,IAAM,SAA8B,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;AAErF,IAAM,KAAK,CAAC,UAA8C;AAC/D,SAAO;AACT;AAEA,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAErB,IAAM,aAAa,CAAC,SAA6B;AACtD,SAAO,gBAAgB,KAAK,IAAI,GAAG,MAAM,2CAA2C,IAAI,EAAE;AAE1F,QAAM,SAAiC,CAAC;AAExC,MAAI;AACJ,UAAQ,QAAQ,oBAAoB,KAAK,IAAI,OAAO,MAAM;AACxD,QAAI,MAAM,CAAC,MAAM,QAAW;AAE1B,aAAO,KAAK,MAAM,CAAC,CAAC;AAAA,IACtB,WAAW,MAAM,CAAC,MAAM,QAAW;AAEjC,aAAO,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,IAC9B,WAAW,MAAM,CAAC,MAAM,QAAW;AAEjC,aAAO,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO,GAAG,MAAM;AAClB;AAEO,IAAM,WAAW,CAAC,QAAuB,SAA8B;AAC5E,MAAI,QAAa;AACjB,aAAW,OAAO,MAAM;AACtB,YAAQ,qBAAqB,OAAO,KAAK,QAAQ,IAAI;AAAA,EACvD;AAEA,SAAO;AACT;AAEO,IAAM,aAAa,CAAC,QAAuB,MAAkB,iBAAmC;AACrG,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,OAAO,KAAK,MAAM,GAAG,EAAE;AAC7B,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAM,SAAc,QAAQ,IAAI,IAAI,QAAQ,SAAS,OAAO,GAAG,IAAI,CAAC;AAGpE,qBAAiB,QAAQ,MAAM,QAAQ,IAAI;AAC3C,WAAO,IAAI,IAAI;AAAA,EACjB,CAAC;AACH;AAEA,IAAM,uBAAuB,CAAC,OAAY,KAAsB,QAAuB,SAA0B;AAC/G,MAAI,SAAS,GAAG,KAAK,MAAM,QAAQ,KAAK,GAAG;AACzC,QAAI,MAAM,KAAK,OAAO,MAAM,QAAQ;AAClC,YAAM,IAAI,MAAM,iCAAiC,IAAI,oBAAoB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,IACnG;AAEA,WAAO,MAAM,GAAG;AAAA,EAClB,WAAW,SAAS,GAAG,KAAK,SAAS,KAAK,GAAG;AAC3C,QAAI,EAAE,OAAO,QAAQ;AACnB,YAAM,IAAI,MAAM,iCAAiC,IAAI,oBAAoB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,IACnG;AAEA,WAAO,MAAM,GAAG;AAAA,EAClB,OAAO;AACL,UAAM,IAAI,MAAM,iCAAiC,IAAI,oBAAoB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EACnG;AACF;AAEA,IAAM,mBAAmB,CAAC,OAAY,KAAsB,QAAuB,SAA2B;AAC5G,MAAI,SAAS,GAAG,KAAK,MAAM,QAAQ,KAAK,GAAG;AACzC;AAAA,EACF,WAAW,SAAS,GAAG,KAAK,SAAS,KAAK,GAAG;AAC3C;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,iCAAiC,IAAI,oBAAoB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EACnG;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/object-path.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport Zod, { ZodType } from 'zod'\nimport { UnknownRecord } from 'type-fest'\nimport { isObject } from '@bessemer/cornerstone/object'\nimport { produce } from 'immer'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { isString } from '@bessemer/cornerstone/string'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport { isEmpty } from '@bessemer/cornerstone/array'\nimport { failure, Result, success } from '@bessemer/cornerstone/result'\n\nexport type ObjectPath = TaggedType<Array<string | number>, 'ObjectPath'>\nexport const Schema: ZodType<ObjectPath> = Zod.array(Zod.union([Zod.string(), Zod.number()])) as any\n\nexport const of = (value: Array<string | number>): ObjectPath => {\n return value as ObjectPath\n}\n\nconst ObjectPathRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*(?:\\.[a-zA-Z_$][a-zA-Z0-9_$]*|\\.\\d+|\\[\\d+])*$/\nconst ObjectPathPartRegex = /([a-zA-Z_$][a-zA-Z0-9_$]*)|\\[(\\d+)]|\\.(\\d+)/g\n\nexport const fromString = (path: string): ObjectPath => {\n assert(ObjectPathRegex.test(path), () => `Unable to parse ObjectPath from string: ${path}`)\n\n const result: Array<string | number> = []\n\n let match: RegExpExecArray | null\n while ((match = ObjectPathPartRegex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n // Property name (e.g., 'users', 'profile')\n result.push(match[1])\n } else if (match[2] !== undefined) {\n // Bracket notation array index (e.g., [0])\n result.push(Number(match[2]))\n } else if (match[3] !== undefined) {\n // Dot notation array index (e.g., .0)\n result.push(Number(match[3]))\n }\n }\n\n return of(result)\n}\n\nexport const getValue = (object: UnknownRecord, path: ObjectPath): unknown => {\n const result = getValueResult(object, path)\n\n if (result.isSuccess) {\n return result.value\n } else {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n}\n\nexport const findValue = (object: UnknownRecord, path: ObjectPath): unknown | undefined => {\n const result = getValueResult(object, path)\n\n if (result.isSuccess) {\n return result.value\n } else {\n return undefined\n }\n}\n\nexport const applyValue = (object: UnknownRecord, path: ObjectPath, valueToApply: unknown): unknown => {\n if (isEmpty(path)) {\n return valueToApply\n }\n\n return produce(object, (draft) => {\n const rest = path.slice(0, -1)\n const last = path[path.length - 1]!\n const parent: any = isEmpty(rest) ? draft : getValue(draft, of(rest))\n\n // Check to make sure the last index is ok\n assertLegalIndex(parent, last, object, path)\n parent[last] = valueToApply\n })\n}\n\nconst getValueResult = (object: UnknownRecord, path: ObjectPath): Result<any> => {\n let value: any = object\n\n for (const key of path) {\n if (isNumber(key) && Array.isArray(value)) {\n if (key < 0 || key >= value.length) {\n return failure()\n }\n\n value = value[key]\n } else if (isString(key) && isObject(value)) {\n if (!(key in value)) {\n return failure()\n }\n\n value = value[key]\n } else {\n return failure()\n }\n }\n\n return success(value)\n}\n\nconst assertLegalIndex = (value: any, key: string | number, object: UnknownRecord, path: ObjectPath): void => {\n if (isNumber(key) && Array.isArray(value)) {\n return\n } else if (isString(key) && isObject(value)) {\n return\n } else {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bessemer/cornerstone",
3
3
  "type": "module",
4
- "version": "0.5.68",
4
+ "version": "0.5.70",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "sideEffects": false,