context 3.0.11 → 3.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/context.development.js +1 -0
- package/dist/cjs/context.development.js.map +1 -0
- package/dist/cjs/context.production.js +1 -0
- package/dist/cjs/context.production.js.map +1 -0
- package/dist/es/context.development.js +1 -0
- package/dist/es/context.development.js.map +1 -0
- package/dist/es/context.production.js +1 -0
- package/dist/es/context.production.js.map +1 -0
- package/dist/umd/context.development.js +1 -0
- package/dist/umd/context.development.js.map +1 -0
- package/dist/umd/context.production.js +1 -0
- package/dist/umd/context.production.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.development.js","sources":["../../src/context.ts"],"sourcesContent":["import type { CB, Maybe } from 'vest-utils';\nimport {\n assign,\n defaultTo,\n invariant,\n optionalFunctionValue,\n Nullable,\n} from 'vest-utils';\n\nconst USEX_DEFAULT_ERROR_MESSAGE = 'Not inside of a running context.';\nconst EMPTY_CONTEXT = Symbol();\n\n/**\n * Base context interface.\n */\nexport function createContext<T>(defaultContextValue?: T): CtxApi<T> {\n let contextValue: T | symbol = EMPTY_CONTEXT;\n\n return {\n run,\n use,\n useX,\n };\n\n function use(): T {\n return (isInsideContext() ? contextValue : defaultContextValue) as T;\n }\n\n function useX(errorMessage?: string): T {\n invariant(\n isInsideContext(),\n defaultTo(errorMessage, USEX_DEFAULT_ERROR_MESSAGE)\n );\n return contextValue as T;\n }\n\n function run<R>(value: T, cb: () => R): R {\n const parentContext = isInsideContext() ? use() : EMPTY_CONTEXT;\n\n contextValue = value;\n\n const res = cb();\n\n contextValue = parentContext;\n return res;\n }\n\n function isInsideContext(): boolean {\n return contextValue !== EMPTY_CONTEXT;\n }\n}\n\n/**\n * Cascading context - another implementation of context, that assumes the context value is an object.\n * When nesting context runs, the the values of the current layer merges with the layers above it.\n */\nexport function createCascade<T extends Record<string, unknown>>(\n init?: (value: Partial<T>, parentContext: Maybe<T>) => Nullable<T>\n): CtxCascadeApi<T> {\n const ctx = createContext<T>();\n\n return {\n bind,\n run,\n use: ctx.use,\n useX: ctx.useX,\n };\n\n function run<R>(value: Partial<T>, fn: () => R): R {\n const parentContext = ctx.use();\n\n const out = assign(\n {},\n parentContext ? parentContext : {},\n optionalFunctionValue(init, value, parentContext) ?? value\n ) as T;\n\n return ctx.run(Object.freeze(out), fn) as R;\n }\n\n function bind<Fn extends CB>(value: Partial<T>, fn: Fn) {\n return function (...runTimeArgs: Parameters<Fn>) {\n return run<ReturnType<Fn>>(value, function () {\n return fn(...runTimeArgs);\n });\n } as Fn;\n }\n}\n\ntype ContextConsumptionApi<T> = {\n use: () => T;\n useX: (errorMessage?: string) => T;\n};\n\nexport type CtxApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: T, cb: () => R) => R;\n};\n\nexport type CtxCascadeApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: Partial<T>, fn: () => R) => R;\n bind: <Fn extends CB>(value: Partial<T>, fn: Fn) => Fn;\n};\n"],"names":["invariant","defaultTo","assign","optionalFunctionValue"],"mappings":";;;;AASA,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AACtE,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC;AAE/B;;AAEG;AACG,SAAU,aAAa,CAAI,mBAAuB,EAAA;IACtD,IAAI,YAAY,GAAe,aAAa,CAAC;IAE7C,OAAO;QACL,GAAG;QACH,GAAG;QACH,IAAI;KACL,CAAC;AAEF,IAAA,SAAS,GAAG,GAAA;AACV,QAAA,QAAQ,eAAe,EAAE,GAAG,YAAY,GAAG,mBAAmB,EAAO;KACtE;IAED,SAAS,IAAI,CAAC,YAAqB,EAAA;QACjCA,mBAAS,CACP,eAAe,EAAE,EACjBC,mBAAS,CAAC,YAAY,EAAE,0BAA0B,CAAC,CACpD,CAAC;AACF,QAAA,OAAO,YAAiB,CAAC;KAC1B;AAED,IAAA,SAAS,GAAG,CAAI,KAAQ,EAAE,EAAW,EAAA;AACnC,QAAA,MAAM,aAAa,GAAG,eAAe,EAAE,GAAG,GAAG,EAAE,GAAG,aAAa,CAAC;QAEhE,YAAY,GAAG,KAAK,CAAC;AAErB,QAAA,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC;QAEjB,YAAY,GAAG,aAAa,CAAC;AAC7B,QAAA,OAAO,GAAG,CAAC;KACZ;AAED,IAAA,SAAS,eAAe,GAAA;QACtB,OAAO,YAAY,KAAK,aAAa,CAAC;KACvC;AACH,CAAC;AAED;;;AAGG;AACG,SAAU,aAAa,CAC3B,IAAkE,EAAA;AAElE,IAAA,MAAM,GAAG,GAAG,aAAa,EAAK,CAAC;IAE/B,OAAO;QACL,IAAI;QACJ,GAAG;QACH,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC;AAEF,IAAA,SAAS,GAAG,CAAI,KAAiB,EAAE,EAAW,EAAA;;AAC5C,QAAA,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;AAEhC,QAAA,MAAM,GAAG,GAAGC,gBAAM,CAChB,EAAE,EACF,aAAa,GAAG,aAAa,GAAG,EAAE,EAClC,CAAA,EAAA,GAAAC,+BAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,KAAK,CACtD,CAAC;AAEP,QAAA,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAM,CAAC;KAC7C;AAED,IAAA,SAAS,IAAI,CAAgB,KAAiB,EAAE,EAAM,EAAA;QACpD,OAAO,UAAU,GAAG,WAA2B,EAAA;YAC7C,OAAO,GAAG,CAAiB,KAAK,EAAE,YAAA;AAChC,gBAAA,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;AAC5B,aAAC,CAAC,CAAC;AACL,SAAO,CAAC;KACT;AACH;;;;;"}
|
|
@@ -1 +1,2 @@
|
|
|
1
1
|
"use strict";var n=require("vest-utils");const t=Symbol();function e(e){let u=t;return{run:function(n,e){const i=o()?r():t;u=n;const c=e();return u=i,c},use:r,useX:function(t){return n.invariant(o(),n.defaultTo(t,"Not inside of a running context.")),u}};function r(){return o()?u:e}function o(){return u!==t}}exports.createCascade=function(t){const u=e();return{bind:function(n,t){return function(...e){return r(n,(function(){return t(...e)}))}},run:r,use:u.use,useX:u.useX};function r(e,r){var o;const i=u.use(),c=n.assign({},i||{},null!==(o=n.optionalFunctionValue(t,e,i))&&void 0!==o?o:e);return u.run(Object.freeze(c),r)}},exports.createContext=e;
|
|
2
|
+
//# sourceMappingURL=context.production.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.production.js","sources":["../../src/context.ts"],"sourcesContent":["import type { CB, Maybe } from 'vest-utils';\nimport {\n assign,\n defaultTo,\n invariant,\n optionalFunctionValue,\n Nullable,\n} from 'vest-utils';\n\nconst USEX_DEFAULT_ERROR_MESSAGE = 'Not inside of a running context.';\nconst EMPTY_CONTEXT = Symbol();\n\n/**\n * Base context interface.\n */\nexport function createContext<T>(defaultContextValue?: T): CtxApi<T> {\n let contextValue: T | symbol = EMPTY_CONTEXT;\n\n return {\n run,\n use,\n useX,\n };\n\n function use(): T {\n return (isInsideContext() ? contextValue : defaultContextValue) as T;\n }\n\n function useX(errorMessage?: string): T {\n invariant(\n isInsideContext(),\n defaultTo(errorMessage, USEX_DEFAULT_ERROR_MESSAGE)\n );\n return contextValue as T;\n }\n\n function run<R>(value: T, cb: () => R): R {\n const parentContext = isInsideContext() ? use() : EMPTY_CONTEXT;\n\n contextValue = value;\n\n const res = cb();\n\n contextValue = parentContext;\n return res;\n }\n\n function isInsideContext(): boolean {\n return contextValue !== EMPTY_CONTEXT;\n }\n}\n\n/**\n * Cascading context - another implementation of context, that assumes the context value is an object.\n * When nesting context runs, the the values of the current layer merges with the layers above it.\n */\nexport function createCascade<T extends Record<string, unknown>>(\n init?: (value: Partial<T>, parentContext: Maybe<T>) => Nullable<T>\n): CtxCascadeApi<T> {\n const ctx = createContext<T>();\n\n return {\n bind,\n run,\n use: ctx.use,\n useX: ctx.useX,\n };\n\n function run<R>(value: Partial<T>, fn: () => R): R {\n const parentContext = ctx.use();\n\n const out = assign(\n {},\n parentContext ? parentContext : {},\n optionalFunctionValue(init, value, parentContext) ?? value\n ) as T;\n\n return ctx.run(Object.freeze(out), fn) as R;\n }\n\n function bind<Fn extends CB>(value: Partial<T>, fn: Fn) {\n return function (...runTimeArgs: Parameters<Fn>) {\n return run<ReturnType<Fn>>(value, function () {\n return fn(...runTimeArgs);\n });\n } as Fn;\n }\n}\n\ntype ContextConsumptionApi<T> = {\n use: () => T;\n useX: (errorMessage?: string) => T;\n};\n\nexport type CtxApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: T, cb: () => R) => R;\n};\n\nexport type CtxCascadeApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: Partial<T>, fn: () => R) => R;\n bind: <Fn extends CB>(value: Partial<T>, fn: Fn) => Fn;\n};\n"],"names":["EMPTY_CONTEXT","Symbol","createContext","defaultContextValue","contextValue","run","value","cb","parentContext","isInsideContext","use","res","useX","errorMessage","invariant","defaultTo","init","ctx","bind","fn","runTimeArgs","out","assign","_a","optionalFunctionValue","Object","freeze"],"mappings":"yCASA,MACMA,EAAgBC,SAKhB,SAAUC,EAAiBC,GAC/B,IAAIC,EAA2BJ,EAE/B,MAAO,CACLK,IAiBF,SAAgBC,EAAUC,GACxB,MAAMC,EAAgBC,IAAoBC,IAAQV,EAElDI,EAAeE,EAEf,MAAMK,EAAMJ,IAGZ,OADAH,EAAeI,EACRG,CACR,EAzBCD,MACAE,KAOF,SAAcC,GAKZ,OAJAC,EAASA,UACPL,IACAM,EAAAA,UAAUF,EAtBmB,qCAwBxBT,CACR,GAVD,SAASM,IACP,OAAQD,IAAoBL,EAAeD,CAC5C,CAqBD,SAASM,IACP,OAAOL,IAAiBJ,CACzB,CACH,uBAMM,SACJgB,GAEA,MAAMC,EAAMf,IAEZ,MAAO,CACLgB,KAkBF,SAA6BZ,EAAmBa,GAC9C,OAAO,YAAaC,GAClB,OAAOf,EAAoBC,GAAO,WAChC,OAAOa,KAAMC,EACf,GACF,CACD,EAvBCf,MACAK,IAAKO,EAAIP,IACTE,KAAMK,EAAIL,MAGZ,SAASP,EAAOC,EAAmBa,SACjC,MAAMX,EAAgBS,EAAIP,MAEpBW,EAAMC,EAAMA,OAChB,GACAd,GAAgC,CAAE,EACe,QAAjDe,EAAAC,EAAqBA,sBAACR,EAAMV,EAAOE,UAAc,IAAAe,EAAAA,EAAIjB,GAGvD,OAAOW,EAAIZ,IAAIoB,OAAOC,OAAOL,GAAMF,EACpC,CASH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.development.js","sources":["../../src/context.ts"],"sourcesContent":["import type { CB, Maybe } from 'vest-utils';\nimport {\n assign,\n defaultTo,\n invariant,\n optionalFunctionValue,\n Nullable,\n} from 'vest-utils';\n\nconst USEX_DEFAULT_ERROR_MESSAGE = 'Not inside of a running context.';\nconst EMPTY_CONTEXT = Symbol();\n\n/**\n * Base context interface.\n */\nexport function createContext<T>(defaultContextValue?: T): CtxApi<T> {\n let contextValue: T | symbol = EMPTY_CONTEXT;\n\n return {\n run,\n use,\n useX,\n };\n\n function use(): T {\n return (isInsideContext() ? contextValue : defaultContextValue) as T;\n }\n\n function useX(errorMessage?: string): T {\n invariant(\n isInsideContext(),\n defaultTo(errorMessage, USEX_DEFAULT_ERROR_MESSAGE)\n );\n return contextValue as T;\n }\n\n function run<R>(value: T, cb: () => R): R {\n const parentContext = isInsideContext() ? use() : EMPTY_CONTEXT;\n\n contextValue = value;\n\n const res = cb();\n\n contextValue = parentContext;\n return res;\n }\n\n function isInsideContext(): boolean {\n return contextValue !== EMPTY_CONTEXT;\n }\n}\n\n/**\n * Cascading context - another implementation of context, that assumes the context value is an object.\n * When nesting context runs, the the values of the current layer merges with the layers above it.\n */\nexport function createCascade<T extends Record<string, unknown>>(\n init?: (value: Partial<T>, parentContext: Maybe<T>) => Nullable<T>\n): CtxCascadeApi<T> {\n const ctx = createContext<T>();\n\n return {\n bind,\n run,\n use: ctx.use,\n useX: ctx.useX,\n };\n\n function run<R>(value: Partial<T>, fn: () => R): R {\n const parentContext = ctx.use();\n\n const out = assign(\n {},\n parentContext ? parentContext : {},\n optionalFunctionValue(init, value, parentContext) ?? value\n ) as T;\n\n return ctx.run(Object.freeze(out), fn) as R;\n }\n\n function bind<Fn extends CB>(value: Partial<T>, fn: Fn) {\n return function (...runTimeArgs: Parameters<Fn>) {\n return run<ReturnType<Fn>>(value, function () {\n return fn(...runTimeArgs);\n });\n } as Fn;\n }\n}\n\ntype ContextConsumptionApi<T> = {\n use: () => T;\n useX: (errorMessage?: string) => T;\n};\n\nexport type CtxApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: T, cb: () => R) => R;\n};\n\nexport type CtxCascadeApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: Partial<T>, fn: () => R) => R;\n bind: <Fn extends CB>(value: Partial<T>, fn: Fn) => Fn;\n};\n"],"names":[],"mappings":";;AASA,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AACtE,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC;AAE/B;;AAEG;AACG,SAAU,aAAa,CAAI,mBAAuB,EAAA;IACtD,IAAI,YAAY,GAAe,aAAa,CAAC;IAE7C,OAAO;QACL,GAAG;QACH,GAAG;QACH,IAAI;KACL,CAAC;AAEF,IAAA,SAAS,GAAG,GAAA;AACV,QAAA,QAAQ,eAAe,EAAE,GAAG,YAAY,GAAG,mBAAmB,EAAO;KACtE;IAED,SAAS,IAAI,CAAC,YAAqB,EAAA;QACjC,SAAS,CACP,eAAe,EAAE,EACjB,SAAS,CAAC,YAAY,EAAE,0BAA0B,CAAC,CACpD,CAAC;AACF,QAAA,OAAO,YAAiB,CAAC;KAC1B;AAED,IAAA,SAAS,GAAG,CAAI,KAAQ,EAAE,EAAW,EAAA;AACnC,QAAA,MAAM,aAAa,GAAG,eAAe,EAAE,GAAG,GAAG,EAAE,GAAG,aAAa,CAAC;QAEhE,YAAY,GAAG,KAAK,CAAC;AAErB,QAAA,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC;QAEjB,YAAY,GAAG,aAAa,CAAC;AAC7B,QAAA,OAAO,GAAG,CAAC;KACZ;AAED,IAAA,SAAS,eAAe,GAAA;QACtB,OAAO,YAAY,KAAK,aAAa,CAAC;KACvC;AACH,CAAC;AAED;;;AAGG;AACG,SAAU,aAAa,CAC3B,IAAkE,EAAA;AAElE,IAAA,MAAM,GAAG,GAAG,aAAa,EAAK,CAAC;IAE/B,OAAO;QACL,IAAI;QACJ,GAAG;QACH,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC;AAEF,IAAA,SAAS,GAAG,CAAI,KAAiB,EAAE,EAAW,EAAA;;AAC5C,QAAA,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;AAEhC,QAAA,MAAM,GAAG,GAAG,MAAM,CAChB,EAAE,EACF,aAAa,GAAG,aAAa,GAAG,EAAE,EAClC,CAAA,EAAA,GAAA,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,KAAK,CACtD,CAAC;AAEP,QAAA,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAM,CAAC;KAC7C;AAED,IAAA,SAAS,IAAI,CAAgB,KAAiB,EAAE,EAAM,EAAA;QACpD,OAAO,UAAU,GAAG,WAA2B,EAAA;YAC7C,OAAO,GAAG,CAAiB,KAAK,EAAE,YAAA;AAChC,gBAAA,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;AAC5B,aAAC,CAAC,CAAC;AACL,SAAO,CAAC;KACT;AACH;;;;"}
|
|
@@ -1 +1,2 @@
|
|
|
1
1
|
import{invariant as n,defaultTo as t,assign as u,optionalFunctionValue as r}from"vest-utils";const e=Symbol();function o(u){let r=e;return{run:function(n,t){const u=c()?o():e;r=n;const i=t();return r=u,i},use:o,useX:function(u){return n(c(),t(u,"Not inside of a running context.")),r}};function o(){return c()?r:u}function c(){return r!==e}}function c(n){const t=o();return{bind:function(n,t){return function(...u){return e(n,(function(){return t(...u)}))}},run:e,use:t.use,useX:t.useX};function e(e,o){var c;const i=t.use(),s=u({},i||{},null!==(c=r(n,e,i))&&void 0!==c?c:e);return t.run(Object.freeze(s),o)}}export{c as createCascade,o as createContext};
|
|
2
|
+
//# sourceMappingURL=context.production.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.production.js","sources":["../../src/context.ts"],"sourcesContent":["import type { CB, Maybe } from 'vest-utils';\nimport {\n assign,\n defaultTo,\n invariant,\n optionalFunctionValue,\n Nullable,\n} from 'vest-utils';\n\nconst USEX_DEFAULT_ERROR_MESSAGE = 'Not inside of a running context.';\nconst EMPTY_CONTEXT = Symbol();\n\n/**\n * Base context interface.\n */\nexport function createContext<T>(defaultContextValue?: T): CtxApi<T> {\n let contextValue: T | symbol = EMPTY_CONTEXT;\n\n return {\n run,\n use,\n useX,\n };\n\n function use(): T {\n return (isInsideContext() ? contextValue : defaultContextValue) as T;\n }\n\n function useX(errorMessage?: string): T {\n invariant(\n isInsideContext(),\n defaultTo(errorMessage, USEX_DEFAULT_ERROR_MESSAGE)\n );\n return contextValue as T;\n }\n\n function run<R>(value: T, cb: () => R): R {\n const parentContext = isInsideContext() ? use() : EMPTY_CONTEXT;\n\n contextValue = value;\n\n const res = cb();\n\n contextValue = parentContext;\n return res;\n }\n\n function isInsideContext(): boolean {\n return contextValue !== EMPTY_CONTEXT;\n }\n}\n\n/**\n * Cascading context - another implementation of context, that assumes the context value is an object.\n * When nesting context runs, the the values of the current layer merges with the layers above it.\n */\nexport function createCascade<T extends Record<string, unknown>>(\n init?: (value: Partial<T>, parentContext: Maybe<T>) => Nullable<T>\n): CtxCascadeApi<T> {\n const ctx = createContext<T>();\n\n return {\n bind,\n run,\n use: ctx.use,\n useX: ctx.useX,\n };\n\n function run<R>(value: Partial<T>, fn: () => R): R {\n const parentContext = ctx.use();\n\n const out = assign(\n {},\n parentContext ? parentContext : {},\n optionalFunctionValue(init, value, parentContext) ?? value\n ) as T;\n\n return ctx.run(Object.freeze(out), fn) as R;\n }\n\n function bind<Fn extends CB>(value: Partial<T>, fn: Fn) {\n return function (...runTimeArgs: Parameters<Fn>) {\n return run<ReturnType<Fn>>(value, function () {\n return fn(...runTimeArgs);\n });\n } as Fn;\n }\n}\n\ntype ContextConsumptionApi<T> = {\n use: () => T;\n useX: (errorMessage?: string) => T;\n};\n\nexport type CtxApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: T, cb: () => R) => R;\n};\n\nexport type CtxCascadeApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: Partial<T>, fn: () => R) => R;\n bind: <Fn extends CB>(value: Partial<T>, fn: Fn) => Fn;\n};\n"],"names":["EMPTY_CONTEXT","Symbol","createContext","defaultContextValue","contextValue","run","value","cb","parentContext","isInsideContext","use","res","useX","errorMessage","invariant","defaultTo","createCascade","init","ctx","bind","fn","runTimeArgs","out","assign","_a","optionalFunctionValue","Object","freeze"],"mappings":"6FASA,MACMA,EAAgBC,SAKhB,SAAUC,EAAiBC,GAC/B,IAAIC,EAA2BJ,EAE/B,MAAO,CACLK,IAiBF,SAAgBC,EAAUC,GACxB,MAAMC,EAAgBC,IAAoBC,IAAQV,EAElDI,EAAeE,EAEf,MAAMK,EAAMJ,IAGZ,OADAH,EAAeI,EACRG,CACR,EAzBCD,MACAE,KAOF,SAAcC,GAKZ,OAJAC,EACEL,IACAM,EAAUF,EAtBmB,qCAwBxBT,CACR,GAVD,SAASM,IACP,OAAQD,IAAoBL,EAAeD,CAC5C,CAqBD,SAASM,IACP,OAAOL,IAAiBJ,CACzB,CACH,CAMM,SAAUgB,EACdC,GAEA,MAAMC,EAAMhB,IAEZ,MAAO,CACLiB,KAkBF,SAA6Bb,EAAmBc,GAC9C,OAAO,YAAaC,GAClB,OAAOhB,EAAoBC,GAAO,WAChC,OAAOc,KAAMC,EACf,GACF,CACD,EAvBChB,MACAK,IAAKQ,EAAIR,IACTE,KAAMM,EAAIN,MAGZ,SAASP,EAAOC,EAAmBc,SACjC,MAAMZ,EAAgBU,EAAIR,MAEpBY,EAAMC,EACV,GACAf,GAAgC,CAAE,EACe,QAAjDgB,EAAAC,EAAsBR,EAAMX,EAAOE,UAAc,IAAAgB,EAAAA,EAAIlB,GAGvD,OAAOY,EAAIb,IAAIqB,OAAOC,OAAOL,GAAMF,EACpC,CASH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.development.js","sources":["../../src/context.ts"],"sourcesContent":["import type { CB, Maybe } from 'vest-utils';\nimport {\n assign,\n defaultTo,\n invariant,\n optionalFunctionValue,\n Nullable,\n} from 'vest-utils';\n\nconst USEX_DEFAULT_ERROR_MESSAGE = 'Not inside of a running context.';\nconst EMPTY_CONTEXT = Symbol();\n\n/**\n * Base context interface.\n */\nexport function createContext<T>(defaultContextValue?: T): CtxApi<T> {\n let contextValue: T | symbol = EMPTY_CONTEXT;\n\n return {\n run,\n use,\n useX,\n };\n\n function use(): T {\n return (isInsideContext() ? contextValue : defaultContextValue) as T;\n }\n\n function useX(errorMessage?: string): T {\n invariant(\n isInsideContext(),\n defaultTo(errorMessage, USEX_DEFAULT_ERROR_MESSAGE)\n );\n return contextValue as T;\n }\n\n function run<R>(value: T, cb: () => R): R {\n const parentContext = isInsideContext() ? use() : EMPTY_CONTEXT;\n\n contextValue = value;\n\n const res = cb();\n\n contextValue = parentContext;\n return res;\n }\n\n function isInsideContext(): boolean {\n return contextValue !== EMPTY_CONTEXT;\n }\n}\n\n/**\n * Cascading context - another implementation of context, that assumes the context value is an object.\n * When nesting context runs, the the values of the current layer merges with the layers above it.\n */\nexport function createCascade<T extends Record<string, unknown>>(\n init?: (value: Partial<T>, parentContext: Maybe<T>) => Nullable<T>\n): CtxCascadeApi<T> {\n const ctx = createContext<T>();\n\n return {\n bind,\n run,\n use: ctx.use,\n useX: ctx.useX,\n };\n\n function run<R>(value: Partial<T>, fn: () => R): R {\n const parentContext = ctx.use();\n\n const out = assign(\n {},\n parentContext ? parentContext : {},\n optionalFunctionValue(init, value, parentContext) ?? value\n ) as T;\n\n return ctx.run(Object.freeze(out), fn) as R;\n }\n\n function bind<Fn extends CB>(value: Partial<T>, fn: Fn) {\n return function (...runTimeArgs: Parameters<Fn>) {\n return run<ReturnType<Fn>>(value, function () {\n return fn(...runTimeArgs);\n });\n } as Fn;\n }\n}\n\ntype ContextConsumptionApi<T> = {\n use: () => T;\n useX: (errorMessage?: string) => T;\n};\n\nexport type CtxApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: T, cb: () => R) => R;\n};\n\nexport type CtxCascadeApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: Partial<T>, fn: () => R) => R;\n bind: <Fn extends CB>(value: Partial<T>, fn: Fn) => Fn;\n};\n"],"names":["invariant","defaultTo","assign","optionalFunctionValue"],"mappings":";;;;;;EASA,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;EACtE,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC;EAE/B;;EAEG;EACG,SAAU,aAAa,CAAI,mBAAuB,EAAA;MACtD,IAAI,YAAY,GAAe,aAAa,CAAC;MAE7C,OAAO;UACL,GAAG;UACH,GAAG;UACH,IAAI;OACL,CAAC;EAEF,IAAA,SAAS,GAAG,GAAA;EACV,QAAA,QAAQ,eAAe,EAAE,GAAG,YAAY,GAAG,mBAAmB,EAAO;OACtE;MAED,SAAS,IAAI,CAAC,YAAqB,EAAA;UACjCA,mBAAS,CACP,eAAe,EAAE,EACjBC,mBAAS,CAAC,YAAY,EAAE,0BAA0B,CAAC,CACpD,CAAC;EACF,QAAA,OAAO,YAAiB,CAAC;OAC1B;EAED,IAAA,SAAS,GAAG,CAAI,KAAQ,EAAE,EAAW,EAAA;EACnC,QAAA,MAAM,aAAa,GAAG,eAAe,EAAE,GAAG,GAAG,EAAE,GAAG,aAAa,CAAC;UAEhE,YAAY,GAAG,KAAK,CAAC;EAErB,QAAA,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC;UAEjB,YAAY,GAAG,aAAa,CAAC;EAC7B,QAAA,OAAO,GAAG,CAAC;OACZ;EAED,IAAA,SAAS,eAAe,GAAA;UACtB,OAAO,YAAY,KAAK,aAAa,CAAC;OACvC;EACH,CAAC;EAED;;;EAGG;EACG,SAAU,aAAa,CAC3B,IAAkE,EAAA;EAElE,IAAA,MAAM,GAAG,GAAG,aAAa,EAAK,CAAC;MAE/B,OAAO;UACL,IAAI;UACJ,GAAG;UACH,GAAG,EAAE,GAAG,CAAC,GAAG;UACZ,IAAI,EAAE,GAAG,CAAC,IAAI;OACf,CAAC;EAEF,IAAA,SAAS,GAAG,CAAI,KAAiB,EAAE,EAAW,EAAA;;EAC5C,QAAA,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;EAEhC,QAAA,MAAM,GAAG,GAAGC,gBAAM,CAChB,EAAE,EACF,aAAa,GAAG,aAAa,GAAG,EAAE,EAClC,CAAA,EAAA,GAAAC,+BAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,KAAK,CACtD,CAAC;EAEP,QAAA,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAM,CAAC;OAC7C;EAED,IAAA,SAAS,IAAI,CAAgB,KAAiB,EAAE,EAAM,EAAA;UACpD,OAAO,UAAU,GAAG,WAA2B,EAAA;cAC7C,OAAO,GAAG,CAAiB,KAAK,EAAE,YAAA;EAChC,gBAAA,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;EAC5B,aAAC,CAAC,CAAC;EACL,SAAO,CAAC;OACT;EACH;;;;;;;;;"}
|
|
@@ -1 +1,2 @@
|
|
|
1
1
|
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vest-utils")):"function"==typeof define&&define.amd?define(["exports","vest-utils"],t):t((n="undefined"!=typeof globalThis?globalThis:n||self).context={},n["vest-utils"])}(this,(function(n,t){"use strict";const e=Symbol();function u(n){let u=e;return{run:function(n,t){const r=i()?o():e;u=n;const s=t();return u=r,s},use:o,useX:function(n){return t.invariant(i(),t.defaultTo(n,"Not inside of a running context.")),u}};function o(){return i()?u:n}function i(){return u!==e}}n.createCascade=function(n){const e=u();return{bind:function(n,t){return function(...e){return o(n,(function(){return t(...e)}))}},run:o,use:e.use,useX:e.useX};function o(u,o){var i;const r=e.use(),s=t.assign({},r||{},null!==(i=t.optionalFunctionValue(n,u,r))&&void 0!==i?i:u);return e.run(Object.freeze(s),o)}},n.createContext=u}));
|
|
2
|
+
//# sourceMappingURL=context.production.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.production.js","sources":["../../src/context.ts"],"sourcesContent":["import type { CB, Maybe } from 'vest-utils';\nimport {\n assign,\n defaultTo,\n invariant,\n optionalFunctionValue,\n Nullable,\n} from 'vest-utils';\n\nconst USEX_DEFAULT_ERROR_MESSAGE = 'Not inside of a running context.';\nconst EMPTY_CONTEXT = Symbol();\n\n/**\n * Base context interface.\n */\nexport function createContext<T>(defaultContextValue?: T): CtxApi<T> {\n let contextValue: T | symbol = EMPTY_CONTEXT;\n\n return {\n run,\n use,\n useX,\n };\n\n function use(): T {\n return (isInsideContext() ? contextValue : defaultContextValue) as T;\n }\n\n function useX(errorMessage?: string): T {\n invariant(\n isInsideContext(),\n defaultTo(errorMessage, USEX_DEFAULT_ERROR_MESSAGE)\n );\n return contextValue as T;\n }\n\n function run<R>(value: T, cb: () => R): R {\n const parentContext = isInsideContext() ? use() : EMPTY_CONTEXT;\n\n contextValue = value;\n\n const res = cb();\n\n contextValue = parentContext;\n return res;\n }\n\n function isInsideContext(): boolean {\n return contextValue !== EMPTY_CONTEXT;\n }\n}\n\n/**\n * Cascading context - another implementation of context, that assumes the context value is an object.\n * When nesting context runs, the the values of the current layer merges with the layers above it.\n */\nexport function createCascade<T extends Record<string, unknown>>(\n init?: (value: Partial<T>, parentContext: Maybe<T>) => Nullable<T>\n): CtxCascadeApi<T> {\n const ctx = createContext<T>();\n\n return {\n bind,\n run,\n use: ctx.use,\n useX: ctx.useX,\n };\n\n function run<R>(value: Partial<T>, fn: () => R): R {\n const parentContext = ctx.use();\n\n const out = assign(\n {},\n parentContext ? parentContext : {},\n optionalFunctionValue(init, value, parentContext) ?? value\n ) as T;\n\n return ctx.run(Object.freeze(out), fn) as R;\n }\n\n function bind<Fn extends CB>(value: Partial<T>, fn: Fn) {\n return function (...runTimeArgs: Parameters<Fn>) {\n return run<ReturnType<Fn>>(value, function () {\n return fn(...runTimeArgs);\n });\n } as Fn;\n }\n}\n\ntype ContextConsumptionApi<T> = {\n use: () => T;\n useX: (errorMessage?: string) => T;\n};\n\nexport type CtxApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: T, cb: () => R) => R;\n};\n\nexport type CtxCascadeApi<T> = ContextConsumptionApi<T> & {\n run: <R>(value: Partial<T>, fn: () => R) => R;\n bind: <Fn extends CB>(value: Partial<T>, fn: Fn) => Fn;\n};\n"],"names":["EMPTY_CONTEXT","Symbol","createContext","defaultContextValue","contextValue","run","value","cb","parentContext","isInsideContext","use","res","useX","errorMessage","invariant","defaultTo","init","ctx","bind","fn","runTimeArgs","out","assign","_a","optionalFunctionValue","Object","freeze"],"mappings":"oSASA,MACMA,EAAgBC,SAKhB,SAAUC,EAAiBC,GAC/B,IAAIC,EAA2BJ,EAE/B,MAAO,CACLK,IAiBF,SAAgBC,EAAUC,GACxB,MAAMC,EAAgBC,IAAoBC,IAAQV,EAElDI,EAAeE,EAEf,MAAMK,EAAMJ,IAGZ,OADAH,EAAeI,EACRG,CACR,EAzBCD,MACAE,KAOF,SAAcC,GAKZ,OAJAC,EAASA,UACPL,IACAM,EAAAA,UAAUF,EAtBmB,qCAwBxBT,CACR,GAVD,SAASM,IACP,OAAQD,IAAoBL,EAAeD,CAC5C,CAqBD,SAASM,IACP,OAAOL,IAAiBJ,CACzB,CACH,iBAMM,SACJgB,GAEA,MAAMC,EAAMf,IAEZ,MAAO,CACLgB,KAkBF,SAA6BZ,EAAmBa,GAC9C,OAAO,YAAaC,GAClB,OAAOf,EAAoBC,GAAO,WAChC,OAAOa,KAAMC,EACf,GACF,CACD,EAvBCf,MACAK,IAAKO,EAAIP,IACTE,KAAMK,EAAIL,MAGZ,SAASP,EAAOC,EAAmBa,SACjC,MAAMX,EAAgBS,EAAIP,MAEpBW,EAAMC,EAAMA,OAChB,GACAd,GAAgC,CAAE,EACe,QAAjDe,EAAAC,EAAqBA,sBAACR,EAAMV,EAAOE,UAAc,IAAAe,EAAAA,EAAIjB,GAGvD,OAAOW,EAAIZ,IAAIoB,OAAOC,OAAOL,GAAMF,EACpC,CASH"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.0.
|
|
2
|
+
"version": "3.0.12",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"main": "./dist/cjs/context.js",
|
|
5
5
|
"types": "./types/context.d.ts",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"release": "vx release"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"vest-utils": "^1.0.
|
|
14
|
+
"vest-utils": "^1.0.3"
|
|
15
15
|
},
|
|
16
16
|
"module": "./dist/es/context.production.js",
|
|
17
17
|
"exports": {
|