context 3.0.30 → 3.0.31-dev-20240807-42bc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cjs/context.development.js.map +1 -1
- package/dist/cjs/context.production.js +1 -1
- package/dist/cjs/context.production.js.map +1 -1
- package/dist/es/context.development.js.map +1 -1
- package/dist/es/context.production.js +1 -1
- package/dist/es/context.production.js.map +1 -1
- package/dist/umd/context.development.js.map +1 -1
- package/dist/umd/context.production.js +1 -1
- package/dist/umd/context.production.js.map +1 -1
- package/package.json +2 -2
- package/vitest.config.ts +16 -0
package/README.md
CHANGED
|
@@ -146,7 +146,7 @@ import ctx from './ctx';
|
|
|
146
146
|
|
|
147
147
|
function handleCart() {
|
|
148
148
|
const context = ctx.useX(
|
|
149
|
-
'handleCart was called outside of a running context'
|
|
149
|
+
'handleCart was called outside of a running context',
|
|
150
150
|
); // { cart: { items: [ 'foo', 'bar' ] } }
|
|
151
151
|
// This throws an error if we're not within a `run` call.
|
|
152
152
|
// You should catch this error and handle it somewhere above this function.
|
|
@@ -1 +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)
|
|
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,2 +1,2 @@
|
|
|
1
|
-
"use strict";var n=require("vest-utils");const t=Symbol();function
|
|
1
|
+
"use strict";var n=require("vest-utils");const t="Not inside of a running context.",e=Symbol();function u(u){let r=e;return{run:function(n,t){const u=i()?o():e;r=n;const c=t();return r=u,c},use:o,useX:function(e){return n.invariant(i(),n.defaultTo(e,t)),r}};function o(){return i()?r:u}function i(){return r!==e}}exports.createCascade=function(t){const e=u();return{bind:function(n,t){return function(...e){return r(n,(function(){return t(...e)}))}},run:r,use:e.use,useX:e.useX};function r(u,r){var o;const i=e.use(),c=n.assign({},i||{},null!==(o=n.optionalFunctionValue(t,u,i))&&void 0!==o?o:u);return e.run(Object.freeze(c),r)}},exports.createContext=u;
|
|
2
2
|
//# sourceMappingURL=context.production.js.map
|
|
@@ -1 +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)
|
|
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":["USEX_DEFAULT_ERROR_MESSAGE","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,MAAMA,EAA6B,mCAC7BC,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,EAAcd,IAEnBK,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"}
|
|
@@ -1 +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)
|
|
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,2 +1,2 @@
|
|
|
1
|
-
import{invariant as n,defaultTo as t,assign as u,optionalFunctionValue as r}from"vest-utils";const e=Symbol();function
|
|
1
|
+
import{invariant as n,defaultTo as t,assign as u,optionalFunctionValue as r}from"vest-utils";const e="Not inside of a running context.",o=Symbol();function c(u){let r=o;return{run:function(n,t){const u=i()?c():o;r=n;const e=t();return r=u,e},use:c,useX:function(u){return n(i(),t(u,e)),r}};function c(){return i()?r:u}function i(){return r!==o}}function i(n){const t=c();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{i as createCascade,c as createContext};
|
|
2
2
|
//# sourceMappingURL=context.production.js.map
|
|
@@ -1 +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)
|
|
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":["USEX_DEFAULT_ERROR_MESSAGE","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,MAAMA,EAA6B,mCAC7BC,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,EAAcd,IAEnBK,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"}
|
|
@@ -1 +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)
|
|
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,2 +1,2 @@
|
|
|
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
|
|
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="Not inside of a running context.",u=Symbol();function o(n){let o=u;return{run:function(n,t){const e=r()?i():u;o=n;const s=t();return o=e,s},use:i,useX:function(n){return t.invariant(r(),t.defaultTo(n,e)),o}};function i(){return r()?o:n}function r(){return o!==u}}n.createCascade=function(n){const e=o();return{bind:function(n,t){return function(...e){return u(n,(function(){return t(...e)}))}},run:u,use:e.use,useX:e.useX};function u(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=o}));
|
|
2
2
|
//# sourceMappingURL=context.production.js.map
|
|
@@ -1 +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)
|
|
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":["USEX_DEFAULT_ERROR_MESSAGE","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,MAAMA,EAA6B,mCAC7BC,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,EAAcd,IAEnBK,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.31-dev-20240807-42bc",
|
|
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": "
|
|
14
|
+
"vest-utils": "1.3.1-dev-20240807-42bc"
|
|
15
15
|
},
|
|
16
16
|
"module": "./dist/es/context.production.js",
|
|
17
17
|
"exports": {
|
package/vitest.config.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
test: {
|
|
6
|
+
globals: true,
|
|
7
|
+
include: ['./**/__tests__/*.test.ts'],
|
|
8
|
+
setupFiles: [resolve(__dirname, '../../', 'vx/config/vitest/customMatchers.ts')],
|
|
9
|
+
},
|
|
10
|
+
root: __dirname,
|
|
11
|
+
resolve: {
|
|
12
|
+
alias: {
|
|
13
|
+
context: resolve(__dirname, 'src/context.ts')
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
});
|