solid-use
Version:
A collection of SolidJS utilities
8 lines (7 loc) • 2.72 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/provider.ts"],
"sourcesContent": ["import type { Component } from 'solid-js';\nimport { onCleanup } from 'solid-js';\n\nlet PROVIDER: ProviderTree | undefined;\n\ninterface ProviderData<T> {\n value: T;\n}\n\ninterface ProviderTree {\n parent?: ProviderTree;\n data: Record<string, ProviderData<any> | undefined>;\n}\n\nexport function capturedProvider<T extends any[], R>(\n callback: (...args: T) => R,\n): (...args: T) => R {\n const current = PROVIDER;\n return (...args) => {\n const parent = PROVIDER;\n PROVIDER = current;\n try {\n return callback(...args);\n } finally {\n PROVIDER = parent;\n }\n };\n}\n\nexport function providerScope<T>(callback: () => T): T {\n const parent = PROVIDER;\n PROVIDER = {\n parent,\n data: {},\n };\n try {\n return callback();\n } finally {\n PROVIDER = parent;\n }\n}\n\nexport interface Provider<T> {\n id: number;\n defaultValue: T;\n}\n\nlet ID = 0;\n\nexport function createProvider<T>(defaultValue: T): Provider<T> {\n return {\n id: ID++,\n defaultValue,\n };\n}\n\nexport function provide<T>(context: Provider<T>, value: T): void {\n const parent = PROVIDER;\n if (parent) {\n parent.data[context.id] = { value };\n\n onCleanup(() => {\n parent.data[context.id] = undefined;\n });\n }\n}\n\nexport function inject<T>(context: Provider<T>): T {\n let current = PROVIDER;\n while (current) {\n const currentData = current.data[context.id];\n if (currentData) {\n return currentData.value;\n }\n current = current.parent;\n }\n return context.defaultValue;\n}\n\nexport function withProvider<T extends Record<string, any>>(\n Comp: Component<T>,\n): Component<T> {\n return props => providerScope(() => Comp(props));\n}\n"],
"mappings": ";AACA,SAAS,iBAAiB;AAE1B,IAAI;AAWG,SAAS,iBACd,UACmB;AACnB,QAAM,UAAU;AAChB,SAAO,IAAI,SAAS;AAClB,UAAM,SAAS;AACf,eAAW;AACX,QAAI;AACF,aAAO,SAAS,GAAG,IAAI;AAAA,IACzB,UAAE;AACA,iBAAW;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,cAAiB,UAAsB;AACrD,QAAM,SAAS;AACf,aAAW;AAAA,IACT;AAAA,IACA,MAAM,CAAC;AAAA,EACT;AACA,MAAI;AACF,WAAO,SAAS;AAAA,EAClB,UAAE;AACA,eAAW;AAAA,EACb;AACF;AAOA,IAAI,KAAK;AAEF,SAAS,eAAkB,cAA8B;AAC9D,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,EACF;AACF;AAEO,SAAS,QAAW,SAAsB,OAAgB;AAC/D,QAAM,SAAS;AACf,MAAI,QAAQ;AACV,WAAO,KAAK,QAAQ,EAAE,IAAI,EAAE,MAAM;AAElC,cAAU,MAAM;AACd,aAAO,KAAK,QAAQ,EAAE,IAAI;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAEO,SAAS,OAAU,SAAyB;AACjD,MAAI,UAAU;AACd,SAAO,SAAS;AACd,UAAM,cAAc,QAAQ,KAAK,QAAQ,EAAE;AAC3C,QAAI,aAAa;AACf,aAAO,YAAY;AAAA,IACrB;AACA,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO,QAAQ;AACjB;AAEO,SAAS,aACd,MACc;AACd,SAAO,WAAS,cAAc,MAAM,KAAK,KAAK,CAAC;AACjD;",
"names": []
}