@assistant-ui/tap 0.3.3 → 0.3.4

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 +1 @@
1
- {"version":3,"file":"createResource.d.ts","sourceRoot":"","sources":["../../src/core/createResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,eAAe,EAAE,MAAM,SAAS,CAAC;AAexD,yBAAiB,cAAc,CAAC;IAC9B,KAAY,WAAW,GAAG,MAAM,IAAI,CAAC;IAErC,UAAiB,MAAM,CAAC,CAAC,EAAE,CAAC;QAC1B,QAAQ,IAAI,CAAC,CAAC;QACd,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;QAC7C,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QAC7C,OAAO,IAAI,IAAI,CAAC;KACjB;CACF;AA0CD,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EACjC,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,YAAkB;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,KACzC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAsC5B,CAAC"}
1
+ {"version":3,"file":"createResource.d.ts","sourceRoot":"","sources":["../../src/core/createResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,eAAe,EAAE,MAAM,SAAS,CAAC;AAexD,yBAAiB,cAAc,CAAC;IAC9B,KAAY,WAAW,GAAG,MAAM,IAAI,CAAC;IAErC,UAAiB,MAAM,CAAC,CAAC,EAAE,CAAC;QAC1B,QAAQ,IAAI,CAAC,CAAC;QACd,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;QAC7C,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QAC7C,OAAO,IAAI,IAAI,CAAC;KACjB;CACF;AA4CD,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EACjC,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,YAAkB;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,KACzC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CA4C5B,CAAC"}
@@ -32,9 +32,11 @@ var HandleWrapperResource = resource(
32
32
  return () => subscribers.delete(callback);
33
33
  },
34
34
  render: (element) => {
35
+ const changed = state.element !== element;
35
36
  state.element = element;
36
- setElement(element);
37
- state.onRender();
37
+ if (state.onRender(changed)) {
38
+ setElement(element);
39
+ }
38
40
  },
39
41
  unmount: state.onUnmount
40
42
  }),
@@ -48,16 +50,20 @@ var createResource = (element, { mount = true } = {}) => {
48
50
  let render;
49
51
  const props = {
50
52
  element,
51
- onRender: () => {
52
- if (isMounted) return;
53
+ onRender: (changed) => {
54
+ if (isMounted) return changed;
53
55
  isMounted = true;
54
- if (scheduler.isDirty) return;
55
56
  flushSync(() => {
57
+ if (changed) {
58
+ render = renderResourceFiber(fiber, props);
59
+ }
60
+ if (scheduler.isDirty) return;
56
61
  commitResourceFiber(fiber, render);
57
62
  });
63
+ return false;
58
64
  },
59
65
  onUnmount: () => {
60
- if (!isMounted) return;
66
+ if (!isMounted) throw new Error("Resource not mounted");
61
67
  isMounted = false;
62
68
  unmountResourceFiber(fiber);
63
69
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/createResource.ts"],"sourcesContent":["import { RenderResult, ResourceElement } from \"./types\";\nimport {\n createResourceFiber,\n unmountResourceFiber,\n renderResourceFiber,\n commitResourceFiber,\n} from \"./ResourceFiber\";\nimport { flushSync, UpdateScheduler } from \"./scheduler\";\nimport { tapRef } from \"../hooks/tap-ref\";\nimport { tapState } from \"../hooks/tap-state\";\nimport { tapMemo } from \"../hooks/tap-memo\";\nimport { tapEffect } from \"../hooks/tap-effect\";\nimport { resource } from \"./resource\";\nimport { tapResource } from \"../hooks/tap-resource\";\n\nexport namespace createResource {\n export type Unsubscribe = () => void;\n\n export interface Handle<R, P> {\n getState(): R;\n subscribe(callback: () => void): Unsubscribe;\n render(element: ResourceElement<R, P>): void;\n unmount(): void;\n }\n}\n\nconst HandleWrapperResource = resource(\n <R, P>(state: {\n element: ResourceElement<R, P>;\n onRender: () => void;\n onUnmount: () => void;\n }): createResource.Handle<R, P> => {\n const [, setElement] = tapState(state.element);\n const value = tapResource(state.element);\n const subscribers = tapRef(new Set<() => void>()).current;\n const valueRef = tapRef(value);\n\n tapEffect(() => {\n if (value !== valueRef.current) {\n valueRef.current = value;\n subscribers.forEach((callback) => callback());\n }\n });\n\n const handle = tapMemo(\n () => ({\n getState: () => valueRef.current,\n subscribe: (callback: () => void) => {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n },\n render: (element: ResourceElement<R, P>) => {\n state.element = element;\n setElement(element);\n\n state.onRender();\n },\n unmount: state.onUnmount,\n }),\n [],\n );\n\n return handle;\n },\n);\n\nexport const createResource = <R, P>(\n element: ResourceElement<R, P>,\n { mount = true }: { mount?: boolean } = {},\n): createResource.Handle<R, P> => {\n let isMounted = mount;\n let render: RenderResult;\n const props = {\n element,\n onRender: () => {\n if (isMounted) return;\n isMounted = true;\n\n if (scheduler.isDirty) return;\n flushSync(() => {\n commitResourceFiber(fiber, render!);\n });\n },\n onUnmount: () => {\n if (!isMounted) return;\n isMounted = false;\n\n unmountResourceFiber(fiber);\n },\n };\n\n const scheduler = new UpdateScheduler(() => {\n render = renderResourceFiber(fiber, props);\n\n if (scheduler.isDirty || !isMounted) return;\n commitResourceFiber(fiber, render);\n });\n\n const fiber = createResourceFiber(HandleWrapperResource<R, P>, () =>\n scheduler.markDirty(),\n );\n\n flushSync(() => {\n scheduler.markDirty();\n });\n\n return render!.state;\n};\n"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,WAAW,uBAAuB;AAC3C,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAa5B,IAAM,wBAAwB;AAAA,EAC5B,CAAO,UAI4B;AACjC,UAAM,CAAC,EAAE,UAAU,IAAI,SAAS,MAAM,OAAO;AAC7C,UAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,UAAM,cAAc,OAAO,oBAAI,IAAgB,CAAC,EAAE;AAClD,UAAM,WAAW,OAAO,KAAK;AAE7B,cAAU,MAAM;AACd,UAAI,UAAU,SAAS,SAAS;AAC9B,iBAAS,UAAU;AACnB,oBAAY,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,UAAM,SAAS;AAAA,MACb,OAAO;AAAA,QACL,UAAU,MAAM,SAAS;AAAA,QACzB,WAAW,CAAC,aAAyB;AACnC,sBAAY,IAAI,QAAQ;AACxB,iBAAO,MAAM,YAAY,OAAO,QAAQ;AAAA,QAC1C;AAAA,QACA,QAAQ,CAAC,YAAmC;AAC1C,gBAAM,UAAU;AAChB,qBAAW,OAAO;AAElB,gBAAM,SAAS;AAAA,QACjB;AAAA,QACA,SAAS,MAAM;AAAA,MACjB;AAAA,MACA,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,iBAAiB,CAC5B,SACA,EAAE,QAAQ,KAAK,IAAyB,CAAC,MACT;AAChC,MAAI,YAAY;AAChB,MAAI;AACJ,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,UAAU,MAAM;AACd,UAAI,UAAW;AACf,kBAAY;AAEZ,UAAI,UAAU,QAAS;AACvB,gBAAU,MAAM;AACd,4BAAoB,OAAO,MAAO;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,IACA,WAAW,MAAM;AACf,UAAI,CAAC,UAAW;AAChB,kBAAY;AAEZ,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,YAAY,IAAI,gBAAgB,MAAM;AAC1C,aAAS,oBAAoB,OAAO,KAAK;AAEzC,QAAI,UAAU,WAAW,CAAC,UAAW;AACrC,wBAAoB,OAAO,MAAM;AAAA,EACnC,CAAC;AAED,QAAM,QAAQ;AAAA,IAAoB;AAAA,IAA6B,MAC7D,UAAU,UAAU;AAAA,EACtB;AAEA,YAAU,MAAM;AACd,cAAU,UAAU;AAAA,EACtB,CAAC;AAED,SAAO,OAAQ;AACjB;","names":[]}
1
+ {"version":3,"sources":["../../src/core/createResource.ts"],"sourcesContent":["import { RenderResult, ResourceElement } from \"./types\";\nimport {\n createResourceFiber,\n unmountResourceFiber,\n renderResourceFiber,\n commitResourceFiber,\n} from \"./ResourceFiber\";\nimport { flushSync, UpdateScheduler } from \"./scheduler\";\nimport { tapRef } from \"../hooks/tap-ref\";\nimport { tapState } from \"../hooks/tap-state\";\nimport { tapMemo } from \"../hooks/tap-memo\";\nimport { tapEffect } from \"../hooks/tap-effect\";\nimport { resource } from \"./resource\";\nimport { tapResource } from \"../hooks/tap-resource\";\n\nexport namespace createResource {\n export type Unsubscribe = () => void;\n\n export interface Handle<R, P> {\n getState(): R;\n subscribe(callback: () => void): Unsubscribe;\n render(element: ResourceElement<R, P>): void;\n unmount(): void;\n }\n}\n\nconst HandleWrapperResource = resource(\n <R, P>(state: {\n element: ResourceElement<R, P>;\n onRender: (changed: boolean) => boolean;\n onUnmount: () => void;\n }): createResource.Handle<R, P> => {\n const [, setElement] = tapState(state.element);\n const value = tapResource(state.element);\n const subscribers = tapRef(new Set<() => void>()).current;\n const valueRef = tapRef(value);\n\n tapEffect(() => {\n if (value !== valueRef.current) {\n valueRef.current = value;\n subscribers.forEach((callback) => callback());\n }\n });\n\n const handle = tapMemo(\n () => ({\n getState: () => valueRef.current,\n subscribe: (callback: () => void) => {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n },\n render: (element: ResourceElement<R, P>) => {\n const changed = state.element !== element;\n state.element = element;\n\n if (state.onRender(changed)) {\n setElement(element);\n }\n },\n unmount: state.onUnmount,\n }),\n [],\n );\n\n return handle;\n },\n);\n\nexport const createResource = <R, P>(\n element: ResourceElement<R, P>,\n { mount = true }: { mount?: boolean } = {},\n): createResource.Handle<R, P> => {\n let isMounted = mount;\n let render: RenderResult;\n const props = {\n element,\n onRender: (changed: boolean) => {\n if (isMounted) return changed;\n isMounted = true;\n\n flushSync(() => {\n if (changed) {\n render = renderResourceFiber(fiber, props);\n }\n\n if (scheduler.isDirty) return;\n commitResourceFiber(fiber, render!);\n });\n\n return false;\n },\n onUnmount: () => {\n if (!isMounted) throw new Error(\"Resource not mounted\");\n isMounted = false;\n\n unmountResourceFiber(fiber);\n },\n };\n\n const scheduler = new UpdateScheduler(() => {\n render = renderResourceFiber(fiber, props);\n\n if (scheduler.isDirty || !isMounted) return;\n commitResourceFiber(fiber, render);\n });\n\n const fiber = createResourceFiber(HandleWrapperResource<R, P>, () =>\n scheduler.markDirty(),\n );\n\n flushSync(() => {\n scheduler.markDirty();\n });\n\n return render!.state;\n};\n"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,WAAW,uBAAuB;AAC3C,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAa5B,IAAM,wBAAwB;AAAA,EAC5B,CAAO,UAI4B;AACjC,UAAM,CAAC,EAAE,UAAU,IAAI,SAAS,MAAM,OAAO;AAC7C,UAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,UAAM,cAAc,OAAO,oBAAI,IAAgB,CAAC,EAAE;AAClD,UAAM,WAAW,OAAO,KAAK;AAE7B,cAAU,MAAM;AACd,UAAI,UAAU,SAAS,SAAS;AAC9B,iBAAS,UAAU;AACnB,oBAAY,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,UAAM,SAAS;AAAA,MACb,OAAO;AAAA,QACL,UAAU,MAAM,SAAS;AAAA,QACzB,WAAW,CAAC,aAAyB;AACnC,sBAAY,IAAI,QAAQ;AACxB,iBAAO,MAAM,YAAY,OAAO,QAAQ;AAAA,QAC1C;AAAA,QACA,QAAQ,CAAC,YAAmC;AAC1C,gBAAM,UAAU,MAAM,YAAY;AAClC,gBAAM,UAAU;AAEhB,cAAI,MAAM,SAAS,OAAO,GAAG;AAC3B,uBAAW,OAAO;AAAA,UACpB;AAAA,QACF;AAAA,QACA,SAAS,MAAM;AAAA,MACjB;AAAA,MACA,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,iBAAiB,CAC5B,SACA,EAAE,QAAQ,KAAK,IAAyB,CAAC,MACT;AAChC,MAAI,YAAY;AAChB,MAAI;AACJ,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,UAAU,CAAC,YAAqB;AAC9B,UAAI,UAAW,QAAO;AACtB,kBAAY;AAEZ,gBAAU,MAAM;AACd,YAAI,SAAS;AACX,mBAAS,oBAAoB,OAAO,KAAK;AAAA,QAC3C;AAEA,YAAI,UAAU,QAAS;AACvB,4BAAoB,OAAO,MAAO;AAAA,MACpC,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,WAAW,MAAM;AACf,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,sBAAsB;AACtD,kBAAY;AAEZ,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,YAAY,IAAI,gBAAgB,MAAM;AAC1C,aAAS,oBAAoB,OAAO,KAAK;AAEzC,QAAI,UAAU,WAAW,CAAC,UAAW;AACrC,wBAAoB,OAAO,MAAM;AAAA,EACnC,CAAC;AAED,QAAM,QAAQ;AAAA,IAAoB;AAAA,IAA6B,MAC7D,UAAU,UAAU;AAAA,EACtB;AAEA,YAAU,MAAM;AACd,cAAU,UAAU;AAAA,EACtB,CAAC;AAED,SAAO,OAAQ;AACjB;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/tap",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "type": "module",
5
5
  "description": "Zero-dependency reactive state management inspired by React hooks",
6
6
  "main": "dist/index.js",