@pie-players/pie-context 0.3.61 → 0.3.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/consumer.js CHANGED
@@ -53,4 +53,3 @@ export const requestContext = (host, context) => {
53
53
  }, false));
54
54
  return value;
55
55
  };
56
- //# sourceMappingURL=consumer.js.map
package/dist/events.js CHANGED
@@ -20,4 +20,3 @@ export class ContextProviderEvent extends Event {
20
20
  this.contextTarget = contextTarget;
21
21
  }
22
22
  }
23
- //# sourceMappingURL=events.js.map
package/dist/index.js CHANGED
@@ -3,4 +3,3 @@ export { consumeContext, ContextConsumer, requestContext, } from "./consumer.js"
3
3
  export { provideContext, ContextProvider } from "./provider.js";
4
4
  export { ContextRoot } from "./root.js";
5
5
  export { createContext } from "./types.js";
6
- //# sourceMappingURL=index.js.map
package/dist/provider.js CHANGED
@@ -90,4 +90,3 @@ export class ContextProvider {
90
90
  }
91
91
  }
92
92
  export const provideContext = (host, options) => new ContextProvider(host, options);
93
- //# sourceMappingURL=provider.js.map
package/dist/root.js CHANGED
@@ -71,4 +71,3 @@ export class ContextRoot {
71
71
  }
72
72
  };
73
73
  }
74
- //# sourceMappingURL=root.js.map
package/dist/types.js CHANGED
@@ -1,2 +1 @@
1
1
  export const createContext = (key) => key;
2
- //# sourceMappingURL=types.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-players/pie-context",
3
- "version": "0.3.61",
3
+ "version": "0.3.62",
4
4
  "type": "module",
5
5
  "description": "Framework-agnostic Context Protocol helpers for PIE web components",
6
6
  "repository": {
@@ -32,7 +32,7 @@
32
32
  "test": "bun test"
33
33
  },
34
34
  "devDependencies": {
35
- "@biomejs/biome": "^2.4.12",
35
+ "@biomejs/biome": "^2.5.6",
36
36
  "typescript": "^5.9.3"
37
37
  },
38
38
  "homepage": "https://github.com/pie-framework/pie-players/tree/master/packages/pie-context#readme",
@@ -1 +0,0 @@
1
- {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../src/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AASlD,MAAM,OAAO,eAAe;IACV,IAAI,CAAU;IACd,OAAO,CAAI;IACX,SAAS,CAAU;IACnB,OAAO,CAAmC;IACnD,WAAW,GAAG,KAAK,CAAC;IACpB,WAAW,CAAc;IACzB,YAAY,CAAkB;IAEtC,YAAmB,IAAa,EAAE,OAAkC;QACnE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,CAAC;IAEM,OAAO;QACb,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,YAAY,EAAE,CAAC;IACrB,CAAC;IAEM,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,IAAW,KAAK;QACf,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEgB,WAAW,GAAG,CAC9B,KAAqB,EACrB,WAAwB,EACjB,EAAE;QACT,IAAI,WAAW,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEK,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,aAAa,CACtB,IAAI,mBAAmB,CACtB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,SAAS,CACd,CACD,CAAC;IACH,CAAC;CACD;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,IAAa,EACb,OAAkC,EACb,EAAE,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,IAAa,EACb,OAAU,EACmB,EAAE;IAC/B,IAAI,KAAiC,CAAC;IACtC,IAAI,CAAC,aAAa,CACjB,IAAI,mBAAmB,CACtB,OAAO,EACP,IAAI,EACJ,CAAC,SAAS,EAAE,EAAE;QACb,KAAK,GAAG,SAAS,CAAC;IACnB,CAAC,EACD,KAAK,CACL,CACD,CAAC;IACF,OAAO,KAAK,CAAC;AACd,CAAC,CAAC","sourcesContent":["import { ContextRequestEvent } from \"./events.js\";\nimport type { ContextType, UnknownContext } from \"./types.js\";\n\nexport interface ContextConsumerOptions<T extends UnknownContext> {\n\tcontext: T;\n\tsubscribe?: boolean;\n\tonValue?: (value: ContextType<T>) => void;\n}\n\nexport class ContextConsumer<T extends UnknownContext> {\n\tprivate readonly host: Element;\n\tprivate readonly context: T;\n\tprivate readonly subscribe: boolean;\n\tprivate readonly onValue?: (value: ContextType<T>) => void;\n\tprivate isConnected = false;\n\tprivate unsubscribe?: () => void;\n\tprivate currentValue?: ContextType<T>;\n\n\tpublic constructor(host: Element, options: ContextConsumerOptions<T>) {\n\t\tthis.host = host;\n\t\tthis.context = options.context;\n\t\tthis.subscribe = options.subscribe ?? true;\n\t\tthis.onValue = options.onValue;\n\t}\n\n\tpublic connect(): void {\n\t\tif (this.isConnected) return;\n\t\tthis.isConnected = true;\n\t\tthis.requestValue();\n\t}\n\n\tpublic disconnect(): void {\n\t\tif (!this.isConnected) return;\n\t\tthis.isConnected = false;\n\t\tthis.unsubscribe?.();\n\t\tthis.unsubscribe = undefined;\n\t}\n\n\tpublic get value(): ContextType<T> | undefined {\n\t\treturn this.currentValue;\n\t}\n\n\tprivate readonly handleValue = (\n\t\tvalue: ContextType<T>,\n\t\tunsubscribe?: () => void,\n\t): void => {\n\t\tif (unsubscribe !== this.unsubscribe) {\n\t\t\tthis.unsubscribe?.();\n\t\t\tthis.unsubscribe = unsubscribe;\n\t\t}\n\t\tif (!this.subscribe && this.unsubscribe) {\n\t\t\tthis.unsubscribe();\n\t\t\tthis.unsubscribe = undefined;\n\t\t}\n\t\tthis.currentValue = value;\n\t\tthis.onValue?.(value);\n\t};\n\n\tpublic requestValue(): void {\n\t\tthis.host.dispatchEvent(\n\t\t\tnew ContextRequestEvent(\n\t\t\t\tthis.context,\n\t\t\t\tthis.host,\n\t\t\t\tthis.handleValue,\n\t\t\t\tthis.subscribe,\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport const consumeContext = <T extends UnknownContext>(\n\thost: Element,\n\toptions: ContextConsumerOptions<T>,\n): ContextConsumer<T> => new ContextConsumer(host, options);\n\nexport const requestContext = <T extends UnknownContext>(\n\thost: Element,\n\tcontext: T,\n): ContextType<T> | undefined => {\n\tlet value: ContextType<T> | undefined;\n\thost.dispatchEvent(\n\t\tnew ContextRequestEvent(\n\t\t\tcontext,\n\t\t\thost,\n\t\t\t(nextValue) => {\n\t\t\t\tvalue = nextValue;\n\t\t\t},\n\t\t\tfalse,\n\t\t),\n\t);\n\treturn value;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,mBAEX,SAAQ,KAAK;IACE,OAAO,CAAI;IACX,aAAa,CAAU;IACvB,QAAQ,CAAkC;IAC1C,SAAS,CAAW;IAEpC,YACC,OAAU,EACV,aAAsB,EACtB,QAAyC,EACzC,SAAmB;QAEnB,KAAK,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,KAAK,CAAC;IACrC,CAAC;CACD;AAED,MAAM,OAAO,oBAEX,SAAQ,KAAK;IACE,OAAO,CAAI;IACX,aAAa,CAAU;IAEvC,YAAmB,OAAU,EAAE,aAAsB;QACpD,KAAK,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACpC,CAAC;CACD","sourcesContent":["import type { ContextCallback, ContextType, UnknownContext } from \"./types.js\";\n\nexport class ContextRequestEvent<\n\tT extends UnknownContext = UnknownContext,\n> extends Event {\n\tpublic readonly context: T;\n\tpublic readonly contextTarget: Element;\n\tpublic readonly callback: ContextCallback<ContextType<T>>;\n\tpublic readonly subscribe?: boolean;\n\n\tpublic constructor(\n\t\tcontext: T,\n\t\tcontextTarget: Element,\n\t\tcallback: ContextCallback<ContextType<T>>,\n\t\tsubscribe?: boolean,\n\t) {\n\t\tsuper(\"context-request\", { bubbles: true, composed: true });\n\t\tthis.context = context;\n\t\tthis.contextTarget = contextTarget;\n\t\tthis.callback = callback;\n\t\tthis.subscribe = subscribe ?? false;\n\t}\n}\n\nexport class ContextProviderEvent<\n\tT extends UnknownContext = UnknownContext,\n> extends Event {\n\tpublic readonly context: T;\n\tpublic readonly contextTarget: Element;\n\n\tpublic constructor(context: T, contextTarget: Element) {\n\t\tsuper(\"context-provider\", { bubbles: true, composed: true });\n\t\tthis.context = context;\n\t\tthis.contextTarget = contextTarget;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementEventMap {\n\t\t\"context-request\": ContextRequestEvent<UnknownContext>;\n\t\t\"context-provider\": ContextProviderEvent<UnknownContext>;\n\t}\n}\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,cAAc,EACd,eAAe,EACf,cAAc,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export {\n\tContextProviderEvent,\n\tContextRequestEvent,\n} from \"./events.js\";\nexport {\n\tconsumeContext,\n\tContextConsumer,\n\trequestContext,\n} from \"./consumer.js\";\nexport { provideContext, ContextProvider } from \"./provider.js\";\nexport { ContextRoot } from \"./root.js\";\nexport type {\n\tContext,\n\tContextCallback,\n\tContextType,\n\tUnknownContext,\n} from \"./types.js\";\nexport { createContext } from \"./types.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAcxE,MAAM,OAAO,eAAe;IACV,IAAI,CAAU;IACd,OAAO,CAAI;IACpB,YAAY,CAAiB;IACpB,aAAa,GAAG,IAAI,GAAG,EAGrC,CAAC;IACI,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAmB,IAAa,EAAE,OAAkC;QACnE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,CAAC;IAEM,OAAO;QACb,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CACzB,iBAAiB,EACjB,IAAI,CAAC,oBAAqC,CAC1C,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,CACzB,kBAAkB,EAClB,IAAI,CAAC,qBAAsC,CAC3C,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IAEM,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC5B,iBAAiB,EACjB,IAAI,CAAC,oBAAqC,CAC1C,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC5B,kBAAkB,EAClB,IAAI,CAAC,qBAAsC,CAC3C,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEM,QAAQ,CAAC,KAAqB,EAAE,KAAK,GAAG,KAAK;QACnD,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC;YAAE,OAAO;QAC1D,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1B,CAAC;IAED,IAAW,KAAK;QACf,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEO,gBAAgB,CAAC,KAAY,EAAE,QAAiB;QACvD,IAAI,eAAe,IAAI,KAAK,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC,aAAwB,CAAC;QACvC,CAAC;QACD,MAAM,IAAI,GACT,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,eAAe,CAAC,CAAC,CAAE,eAA2B,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClE,CAAC;IAEgB,oBAAoB,GAAG,CAAC,KAA0B,EAAE,EAAE;QACtE,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;YAAE,OAAO;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,YAAY,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvC,8CAA8C;QAC9C,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACtB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxD,QAAQ,EAAE,WAAW,EAAE,CAAC;QAExB,MAAM,WAAW,GAAG,GAAG,EAAE;YACxB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;YACtC,YAAY;YACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW;SACX,CAAC,CAAC;QACH,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC;IAEe,qBAAqB,GAAG,CAAC,KAA2B,EAAE,EAAE;QACxE,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;YAAE,OAAO;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,YAAY,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvC,yEAAyE;QACzE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;QAChC,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnB,YAAY,CAAC,aAAa,CACzB,IAAI,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CACnE,CAAC;QACH,CAAC;QACD,KAAK,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC;IAEM,iBAAiB;QACxB,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YACxD,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;QACpE,CAAC;IACF,CAAC;CACD;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,IAAa,EACb,OAAkC,EACb,EAAE,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC","sourcesContent":["import { ContextProviderEvent, ContextRequestEvent } from \"./events.js\";\nimport type { ContextType, UnknownContext } from \"./types.js\";\n\ninterface Subscription<ValueType> {\n\tconsumerHost: Element;\n\tcallback: (value: ValueType, unsubscribe?: () => void) => void;\n\tunsubscribe: () => void;\n}\n\nexport interface ContextProviderOptions<T extends UnknownContext> {\n\tcontext: T;\n\tinitialValue: ContextType<T>;\n}\n\nexport class ContextProvider<T extends UnknownContext> {\n\tprivate readonly host: Element;\n\tprivate readonly context: T;\n\tprivate currentValue: ContextType<T>;\n\tprivate readonly subscriptions = new Map<\n\t\t(value: ContextType<T>, unsubscribe?: () => void) => void,\n\t\tSubscription<ContextType<T>>\n\t>();\n\tprivate isConnected = false;\n\n\tpublic constructor(host: Element, options: ContextProviderOptions<T>) {\n\t\tthis.host = host;\n\t\tthis.context = options.context;\n\t\tthis.currentValue = options.initialValue;\n\t}\n\n\tpublic connect(): void {\n\t\tif (this.isConnected) return;\n\t\tthis.isConnected = true;\n\t\tthis.host.addEventListener(\n\t\t\t\"context-request\",\n\t\t\tthis.handleContextRequest as EventListener,\n\t\t);\n\t\tthis.host.addEventListener(\n\t\t\t\"context-provider\",\n\t\t\tthis.handleContextProvider as EventListener,\n\t\t);\n\t\tthis.host.dispatchEvent(new ContextProviderEvent(this.context, this.host));\n\t}\n\n\tpublic disconnect(): void {\n\t\tif (!this.isConnected) return;\n\t\tthis.isConnected = false;\n\t\tthis.host.removeEventListener(\n\t\t\t\"context-request\",\n\t\t\tthis.handleContextRequest as EventListener,\n\t\t);\n\t\tthis.host.removeEventListener(\n\t\t\t\"context-provider\",\n\t\t\tthis.handleContextProvider as EventListener,\n\t\t);\n\t\tthis.subscriptions.clear();\n\t}\n\n\tpublic setValue(value: ContextType<T>, force = false): void {\n\t\tif (!force && Object.is(this.currentValue, value)) return;\n\t\tthis.currentValue = value;\n\t\tthis.notifySubscribers();\n\t}\n\n\tpublic get value(): ContextType<T> {\n\t\treturn this.currentValue;\n\t}\n\n\tprivate getContextTarget(event: Event, fallback: Element): Element {\n\t\tif (\"contextTarget\" in event && event.contextTarget) {\n\t\t\treturn event.contextTarget as Element;\n\t\t}\n\t\tconst path =\n\t\t\ttypeof event.composedPath === \"function\" ? event.composedPath() : [];\n\t\tconst firstPathTarget = path[0];\n\t\treturn firstPathTarget ? (firstPathTarget as Element) : fallback;\n\t}\n\n\tprivate readonly handleContextRequest = (event: ContextRequestEvent) => {\n\t\tif (event.context !== this.context) return;\n\t\tconst consumerHost = this.getContextTarget(event, this.host);\n\t\tif (consumerHost === this.host) return;\n\n\t\t// Closest provider wins for this context key.\n\t\tevent.stopPropagation();\n\n\t\tif (!event.subscribe) {\n\t\t\tevent.callback(this.currentValue);\n\t\t\treturn;\n\t\t}\n\n\t\tconst existing = this.subscriptions.get(event.callback);\n\t\texisting?.unsubscribe();\n\n\t\tconst unsubscribe = () => {\n\t\t\tthis.subscriptions.delete(event.callback);\n\t\t};\n\n\t\tthis.subscriptions.set(event.callback, {\n\t\t\tconsumerHost,\n\t\t\tcallback: event.callback,\n\t\t\tunsubscribe,\n\t\t});\n\t\tevent.callback(this.currentValue, unsubscribe);\n\t};\n\n\tprivate readonly handleContextProvider = (event: ContextProviderEvent) => {\n\t\tif (event.context !== this.context) return;\n\t\tconst providerHost = this.getContextTarget(event, this.host);\n\t\tif (providerHost === this.host) return;\n\n\t\t// A newly connected nested provider should take over matching consumers.\n\t\tconst seen = new Set<unknown>();\n\t\tfor (const [callback, { consumerHost }] of this.subscriptions) {\n\t\t\tif (seen.has(callback)) continue;\n\t\t\tseen.add(callback);\n\t\t\tconsumerHost.dispatchEvent(\n\t\t\t\tnew ContextRequestEvent(this.context, consumerHost, callback, true),\n\t\t\t);\n\t\t}\n\t\tevent.stopPropagation();\n\t};\n\n\tprivate notifySubscribers(): void {\n\t\tfor (const subscription of this.subscriptions.values()) {\n\t\t\tsubscription.callback(this.currentValue, subscription.unsubscribe);\n\t\t}\n\t}\n}\n\nexport const provideContext = <T extends UnknownContext>(\n\thost: Element,\n\toptions: ContextProviderOptions<T>,\n): ContextProvider<T> => new ContextProvider(host, options);\n"]}
package/dist/root.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ContextProviderEvent, ContextRequestEvent } from \"./events.js\";\nimport type { UnknownContext } from \"./types.js\";\n\ntype ContextCallback = (value: unknown, unsubscribe?: () => void) => void;\n\ninterface PendingRequest {\n\trequestorRef: WeakRef<Element>;\n\tcallbackRef: WeakRef<ContextCallback>;\n}\n\ninterface PendingContext {\n\tcallbacks: WeakMap<Element, WeakSet<ContextCallback>>;\n\trequests: PendingRequest[];\n}\n\nconst getLivePending = (pending: PendingRequest[]) => {\n\tconst requests: PendingRequest[] = [];\n\tfor (const entry of pending) {\n\t\tif (entry.requestorRef.deref() && entry.callbackRef.deref()) {\n\t\t\trequests.push(entry);\n\t\t}\n\t}\n\treturn requests;\n};\n\nexport class ContextRoot {\n\tprivate readonly host: Element;\n\tprivate readonly pendingByContext = new Map<UnknownContext, PendingContext>();\n\tprivate attached = false;\n\n\tpublic constructor(host: Element) {\n\t\tthis.host = host;\n\t}\n\n\tpublic attach(): void {\n\t\tif (this.attached) return;\n\t\tthis.attached = true;\n\t\tthis.host.addEventListener(\n\t\t\t\"context-request\",\n\t\t\tthis.onContextRequest as EventListener,\n\t\t);\n\t\tthis.host.addEventListener(\n\t\t\t\"context-provider\",\n\t\t\tthis.onContextProvider as EventListener,\n\t\t);\n\t}\n\n\tpublic detach(): void {\n\t\tif (!this.attached) return;\n\t\tthis.attached = false;\n\t\tthis.host.removeEventListener(\n\t\t\t\"context-request\",\n\t\t\tthis.onContextRequest as EventListener,\n\t\t);\n\t\tthis.host.removeEventListener(\n\t\t\t\"context-provider\",\n\t\t\tthis.onContextProvider as EventListener,\n\t\t);\n\t\tthis.pendingByContext.clear();\n\t}\n\n\tprivate readonly onContextRequest = (event: ContextRequestEvent) => {\n\t\tif (!event.subscribe) return;\n\n\t\tlet pending = this.pendingByContext.get(event.context);\n\t\tif (!pending) {\n\t\t\tpending = {\n\t\t\t\tcallbacks: new WeakMap<Element, WeakSet<ContextCallback>>(),\n\t\t\t\trequests: [],\n\t\t\t};\n\t\t\tthis.pendingByContext.set(event.context, pending);\n\t\t}\n\n\t\tconst requestor = event.contextTarget;\n\t\tconst callback = event.callback as ContextCallback;\n\t\tlet seenForRequestor = pending.callbacks.get(requestor);\n\t\tif (!seenForRequestor) {\n\t\t\tseenForRequestor = new WeakSet<ContextCallback>();\n\t\t\tpending.callbacks.set(requestor, seenForRequestor);\n\t\t}\n\t\tif (seenForRequestor.has(callback)) return;\n\n\t\tseenForRequestor.add(callback);\n\t\tpending.requests.push({\n\t\t\trequestorRef: new WeakRef(requestor),\n\t\t\tcallbackRef: new WeakRef(callback),\n\t\t});\n\t\tpending.requests = getLivePending(pending.requests);\n\t};\n\n\tprivate readonly onContextProvider = (event: ContextProviderEvent) => {\n\t\tconst pending = this.pendingByContext.get(event.context);\n\t\tif (!pending || pending.requests.length === 0) return;\n\n\t\tthis.pendingByContext.delete(event.context);\n\t\tfor (const entry of pending.requests) {\n\t\t\tconst requestor = entry.requestorRef.deref();\n\t\t\tconst callback = entry.callbackRef.deref();\n\t\t\tif (!requestor || !callback) continue;\n\t\t\trequestor.dispatchEvent(\n\t\t\t\tnew ContextRequestEvent(event.context, requestor, callback, true),\n\t\t\t);\n\t\t}\n\t};\n}\n"]}
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,aAAa,GAAG,CAA+B,GAAY,EAAE,EAAE,CAC3E,GAAkC,CAAC","sourcesContent":["export type Context<KeyType, ValueType> = KeyType & { __context__: ValueType };\n\nexport type UnknownContext = Context<unknown, unknown>;\n\nexport type ContextType<T extends UnknownContext> =\n\tT extends Context<infer _K, infer V> ? V : never;\n\nexport type ContextCallback<ValueType> = (\n\tvalue: ValueType,\n\tunsubscribe?: () => void,\n) => void;\n\nexport const createContext = <ValueType, KeyType = unknown>(key: KeyType) =>\n\tkey as Context<KeyType, ValueType>;\n"]}