@noodleseed/assistant 1.2.0 → 1.3.0

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/react.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
- import { A as AssistantThemeMode } from './appearance-KDbtkt2G.cjs';
2
+ import { A as AssistantThemeMode } from './appearance-BLO7kFYB.cjs';
3
3
  import { NoodleAssistantElement } from './index.cjs';
4
- import { A as AssistantErrorDetail } from './client-CwvdK4O6.cjs';
4
+ import { A as AssistantErrorDetail } from './client-Bm990MFE.cjs';
5
5
 
6
6
  interface NoodleAssistantProps {
7
7
  readonly sessionEndpoint: string;
package/dist/react.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
- import { A as AssistantThemeMode } from './appearance-KDbtkt2G.js';
2
+ import { A as AssistantThemeMode } from './appearance-BLO7kFYB.js';
3
3
  import { NoodleAssistantElement } from './index.js';
4
- import { A as AssistantErrorDetail } from './client-DkAfqcSb.js';
4
+ import { A as AssistantErrorDetail } from './client-Dd7_LZLY.js';
5
5
 
6
6
  interface NoodleAssistantProps {
7
7
  readonly sessionEndpoint: string;
package/dist/react.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  registerNoodleAssistant
3
- } from "./chunk-J2YDKISA.js";
4
- import "./chunk-WUDHE5BD.js";
3
+ } from "./chunk-QMDSNLTA.js";
4
+ import "./chunk-N6TFOYOX.js";
5
5
 
6
6
  // src/react.ts
7
7
  import {
@@ -14,18 +14,24 @@ import {
14
14
  var NoodleAssistant = forwardRef(
15
15
  function NoodleAssistant2(props, forwardedRef) {
16
16
  const ref = useRef(null);
17
+ const readyNotified = useRef(false);
17
18
  useImperativeHandle(forwardedRef, () => ref.current, []);
18
19
  useEffect(() => {
19
- registerNoodleAssistant();
20
20
  const element = ref.current;
21
21
  if (!element) return;
22
- element.sessionEndpoint = props.sessionEndpoint;
23
- const ready = () => props.onReady?.();
22
+ const ready = () => {
23
+ if (readyNotified.current) return;
24
+ readyNotified.current = true;
25
+ props.onReady?.();
26
+ };
24
27
  const error = (event) => props.onError?.(event.detail);
25
28
  const expired = () => props.onSessionExpired?.();
26
29
  element.addEventListener("assistant-ready", ready);
27
30
  element.addEventListener("assistant-error", error);
28
31
  element.addEventListener("assistant-session-expired", expired);
32
+ registerNoodleAssistant();
33
+ element.sessionEndpoint = props.sessionEndpoint;
34
+ if (element.shadowRoot) ready();
29
35
  return () => {
30
36
  element.removeEventListener("assistant-ready", ready);
31
37
  element.removeEventListener("assistant-error", error);
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.ts"],"sourcesContent":["import {\n createElement,\n forwardRef,\n type ReactElement,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport type { AssistantThemeMode } from './appearance.js';\nimport { type NoodleAssistantElement, registerNoodleAssistant } from './element.js';\nimport type { AssistantErrorDetail } from './transport.js';\n\nexport interface NoodleAssistantProps {\n readonly sessionEndpoint: string;\n readonly theme?: AssistantThemeMode;\n readonly open?: boolean;\n readonly className?: string;\n readonly onReady?: () => void;\n readonly onError?: (error: AssistantErrorDetail) => void;\n readonly onSessionExpired?: () => void;\n}\n\nexport const NoodleAssistant = forwardRef<NoodleAssistantElement, NoodleAssistantProps>(\n function NoodleAssistant(props, forwardedRef): ReactElement {\n const ref = useRef<NoodleAssistantElement>(null);\n useImperativeHandle(forwardedRef, () => ref.current as NoodleAssistantElement, []);\n useEffect(() => {\n registerNoodleAssistant();\n const element = ref.current;\n if (!element) return;\n element.sessionEndpoint = props.sessionEndpoint;\n const ready = () => props.onReady?.();\n const error = (event: Event) =>\n props.onError?.((event as CustomEvent<AssistantErrorDetail>).detail);\n const expired = () => props.onSessionExpired?.();\n element.addEventListener('assistant-ready', ready);\n element.addEventListener('assistant-error', error);\n element.addEventListener('assistant-session-expired', expired);\n return () => {\n element.removeEventListener('assistant-ready', ready);\n element.removeEventListener('assistant-error', error);\n element.removeEventListener('assistant-session-expired', expired);\n };\n }, [props.onError, props.onReady, props.onSessionExpired, props.sessionEndpoint]);\n return createElement('noodle-assistant', {\n ref,\n class: props.className,\n 'session-endpoint': props.sessionEndpoint,\n ...(props.theme ? { theme: props.theme } : {}),\n ...(props.open ? { open: '' } : {}),\n });\n },\n);\n"],"mappings":";;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeA,IAAM,kBAAkB;AAAA,EAC7B,SAASA,iBAAgB,OAAO,cAA4B;AAC1D,UAAM,MAAM,OAA+B,IAAI;AAC/C,wBAAoB,cAAc,MAAM,IAAI,SAAmC,CAAC,CAAC;AACjF,cAAU,MAAM;AACd,8BAAwB;AACxB,YAAM,UAAU,IAAI;AACpB,UAAI,CAAC,QAAS;AACd,cAAQ,kBAAkB,MAAM;AAChC,YAAM,QAAQ,MAAM,MAAM,UAAU;AACpC,YAAM,QAAQ,CAAC,UACb,MAAM,UAAW,MAA4C,MAAM;AACrE,YAAM,UAAU,MAAM,MAAM,mBAAmB;AAC/C,cAAQ,iBAAiB,mBAAmB,KAAK;AACjD,cAAQ,iBAAiB,mBAAmB,KAAK;AACjD,cAAQ,iBAAiB,6BAA6B,OAAO;AAC7D,aAAO,MAAM;AACX,gBAAQ,oBAAoB,mBAAmB,KAAK;AACpD,gBAAQ,oBAAoB,mBAAmB,KAAK;AACpD,gBAAQ,oBAAoB,6BAA6B,OAAO;AAAA,MAClE;AAAA,IACF,GAAG,CAAC,MAAM,SAAS,MAAM,SAAS,MAAM,kBAAkB,MAAM,eAAe,CAAC;AAChF,WAAO,cAAc,oBAAoB;AAAA,MACvC;AAAA,MACA,OAAO,MAAM;AAAA,MACb,oBAAoB,MAAM;AAAA,MAC1B,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,MAC5C,GAAI,MAAM,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AACF;","names":["NoodleAssistant"]}
1
+ {"version":3,"sources":["../src/react.ts"],"sourcesContent":["import {\n createElement,\n forwardRef,\n type ReactElement,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport type { AssistantThemeMode } from './appearance.js';\nimport { type NoodleAssistantElement, registerNoodleAssistant } from './element.js';\nimport type { AssistantErrorDetail } from './transport.js';\n\nexport interface NoodleAssistantProps {\n readonly sessionEndpoint: string;\n readonly theme?: AssistantThemeMode;\n readonly open?: boolean;\n readonly className?: string;\n readonly onReady?: () => void;\n readonly onError?: (error: AssistantErrorDetail) => void;\n readonly onSessionExpired?: () => void;\n}\n\nexport const NoodleAssistant = forwardRef<NoodleAssistantElement, NoodleAssistantProps>(\n function NoodleAssistant(props, forwardedRef): ReactElement {\n const ref = useRef<NoodleAssistantElement>(null);\n const readyNotified = useRef(false);\n useImperativeHandle(forwardedRef, () => ref.current as NoodleAssistantElement, []);\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n const ready = () => {\n if (readyNotified.current) return;\n readyNotified.current = true;\n props.onReady?.();\n };\n const error = (event: Event) =>\n props.onError?.((event as CustomEvent<AssistantErrorDetail>).detail);\n const expired = () => props.onSessionExpired?.();\n element.addEventListener('assistant-ready', ready);\n element.addEventListener('assistant-error', error);\n element.addEventListener('assistant-session-expired', expired);\n registerNoodleAssistant();\n element.sessionEndpoint = props.sessionEndpoint;\n // The canonical entry may have registered and upgraded the element before this effect ran.\n // Readiness is sticky once the shadow root exists, so late React listeners still fire once.\n if (element.shadowRoot) ready();\n return () => {\n element.removeEventListener('assistant-ready', ready);\n element.removeEventListener('assistant-error', error);\n element.removeEventListener('assistant-session-expired', expired);\n };\n }, [props.onError, props.onReady, props.onSessionExpired, props.sessionEndpoint]);\n return createElement('noodle-assistant', {\n ref,\n class: props.className,\n 'session-endpoint': props.sessionEndpoint,\n ...(props.theme ? { theme: props.theme } : {}),\n ...(props.open ? { open: '' } : {}),\n });\n },\n);\n"],"mappings":";;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeA,IAAM,kBAAkB;AAAA,EAC7B,SAASA,iBAAgB,OAAO,cAA4B;AAC1D,UAAM,MAAM,OAA+B,IAAI;AAC/C,UAAM,gBAAgB,OAAO,KAAK;AAClC,wBAAoB,cAAc,MAAM,IAAI,SAAmC,CAAC,CAAC;AACjF,cAAU,MAAM;AACd,YAAM,UAAU,IAAI;AACpB,UAAI,CAAC,QAAS;AACd,YAAM,QAAQ,MAAM;AAClB,YAAI,cAAc,QAAS;AAC3B,sBAAc,UAAU;AACxB,cAAM,UAAU;AAAA,MAClB;AACA,YAAM,QAAQ,CAAC,UACb,MAAM,UAAW,MAA4C,MAAM;AACrE,YAAM,UAAU,MAAM,MAAM,mBAAmB;AAC/C,cAAQ,iBAAiB,mBAAmB,KAAK;AACjD,cAAQ,iBAAiB,mBAAmB,KAAK;AACjD,cAAQ,iBAAiB,6BAA6B,OAAO;AAC7D,8BAAwB;AACxB,cAAQ,kBAAkB,MAAM;AAGhC,UAAI,QAAQ,WAAY,OAAM;AAC9B,aAAO,MAAM;AACX,gBAAQ,oBAAoB,mBAAmB,KAAK;AACpD,gBAAQ,oBAAoB,mBAAmB,KAAK;AACpD,gBAAQ,oBAAoB,6BAA6B,OAAO;AAAA,MAClE;AAAA,IACF,GAAG,CAAC,MAAM,SAAS,MAAM,SAAS,MAAM,kBAAkB,MAAM,eAAe,CAAC;AAChF,WAAO,cAAc,oBAAoB;AAAA,MACvC;AAAA,MACA,OAAO,MAAM;AAAA,MACb,oBAAoB,MAAM;AAAA,MAC1B,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,MAC5C,GAAI,MAAM,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AACF;","names":["NoodleAssistant"]}
package/dist/server.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as AssistantConfiguration } from './appearance-KDbtkt2G.cjs';
1
+ import { a as AssistantConfiguration } from './appearance-BLO7kFYB.cjs';
2
2
 
3
3
  interface CreateAssistantSessionInput {
4
4
  readonly serviceUrl: string;
package/dist/server.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as AssistantConfiguration } from './appearance-KDbtkt2G.js';
1
+ import { a as AssistantConfiguration } from './appearance-BLO7kFYB.js';
2
2
 
3
3
  interface CreateAssistantSessionInput {
4
4
  readonly serviceUrl: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodleseed/assistant",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Embed the Noodle Seed customer-branded assistant in your web app: Web Component, React wrapper, and backend session helper. Authoring and deploying the server is @noodleseed/one.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -81,5 +81,9 @@
81
81
  "./dist/server.d.ts"
82
82
  ]
83
83
  }
84
+ },
85
+ "dependencies": {
86
+ "dompurify": "^3.4.11",
87
+ "marked": "^16.4.2"
84
88
  }
85
89
  }