@servicetitan/web-components 37.0.2 → 38.1.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.
@@ -6,9 +6,7 @@ function _define_property(obj, key, value) {
6
6
  configurable: true,
7
7
  writable: true
8
8
  });
9
- } else {
10
- obj[key] = value;
11
- }
9
+ } else obj[key] = value;
12
10
  return obj;
13
11
  }
14
12
  export class MfeStyleRegistry {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/css-injector/mfe-style-registry.ts"],"sourcesContent":["declare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n var __mfeStyles__: Record<string, MfeStyleRegistry> | undefined;\n}\n\ntype StyleRoot = ShadowRoot | Document;\n\nexport class MfeStyleRegistry {\n readonly sheets = new Map<string, CSSStyleSheet>();\n readonly roots = new Set<StyleRoot>();\n\n // Per-component state stored on globalThis.__mfeStyles__ so it survives Vite HMR module reloads.\n static for(componentName: string): MfeStyleRegistry {\n globalThis.__mfeStyles__ ??= {};\n globalThis.__mfeStyles__[componentName] ??= new MfeStyleRegistry();\n return globalThis.__mfeStyles__[componentName];\n }\n\n injectSheet(sheetId: string, css: string) {\n let sheet = this.sheets.get(sheetId);\n if (sheet) {\n sheet.replaceSync(css);\n } else {\n sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n this.sheets.set(sheetId, sheet);\n for (const root of this.roots) {\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];\n }\n }\n }\n\n observeRoot(root: StyleRoot) {\n if (this.roots.has(root)) {\n return;\n }\n this.roots.add(root);\n root.adoptedStyleSheets ??= [];\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, ...this.sheets.values()];\n }\n\n unobserveRoot(root: StyleRoot) {\n this.roots.delete(root);\n const sheets = new Set(this.sheets.values());\n root.adoptedStyleSheets ??= [];\n root.adoptedStyleSheets = root.adoptedStyleSheets.filter(s => !sheets.has(s));\n }\n}\n"],"names":["MfeStyleRegistry","for","componentName","globalThis","__mfeStyles__","injectSheet","sheetId","css","sheet","sheets","get","replaceSync","CSSStyleSheet","set","root","roots","adoptedStyleSheets","observeRoot","has","add","values","unobserveRoot","delete","Set","filter","s","Map"],"mappings":";;;;;;;;;;;;;AAOA,OAAO,MAAMA;IAIT,iGAAiG;IACjG,OAAOC,IAAIC,aAAqB,EAAoB;YAChDC,aAAAA,gBACAA,2BAAyBD,gBAAzBC;SADAA,iBAAAA,CAAAA,cAAAA,YAAWC,aAAa,cAAxBD,4BAAAA,iBAAAA,YAAWC,aAAa,GAAK,CAAC;SAC9BD,IAAAA,CAAAA,4BAAAA,WAAWC,aAAa,CAAA,CAACF,iBAAAA,cAAc,cAAvCC,eAAAA,IAAAA,yBAAwB,CAACD,eAAc,GAAK,IAAIF;QAChD,OAAOG,WAAWC,aAAa,CAACF,cAAc;IAClD;IAEAG,YAAYC,OAAe,EAAEC,GAAW,EAAE;QACtC,IAAIC,QAAQ,IAAI,CAACC,MAAM,CAACC,GAAG,CAACJ;QAC5B,IAAIE,OAAO;YACPA,MAAMG,WAAW,CAACJ;QACtB,OAAO;YACHC,QAAQ,IAAII;YACZJ,MAAMG,WAAW,CAACJ;YAClB,IAAI,CAACE,MAAM,CAACI,GAAG,CAACP,SAASE;YACzB,KAAK,MAAMM,QAAQ,IAAI,CAACC,KAAK,CAAE;gBAC3BD,KAAKE,kBAAkB,GAAG;uBAAIF,KAAKE,kBAAkB;oBAAER;iBAAM;YACjE;QACJ;IACJ;IAEAS,YAAYH,IAAe,EAAE;YAKzBA,OAAAA;QAJA,IAAI,IAAI,CAACC,KAAK,CAACG,GAAG,CAACJ,OAAO;YACtB;QACJ;QACA,IAAI,CAACC,KAAK,CAACI,GAAG,CAACL;SACfA,sBAAAA,CAAAA,QAAAA,MAAKE,kBAAkB,cAAvBF,iCAAAA,sBAAAA,MAAKE,kBAAkB,GAAK,EAAE;QAC9BF,KAAKE,kBAAkB,GAAG;eAAIF,KAAKE,kBAAkB;eAAK,IAAI,CAACP,MAAM,CAACW,MAAM;SAAG;IACnF;IAEAC,cAAcP,IAAe,EAAE;YAG3BA,OAAAA;QAFA,IAAI,CAACC,KAAK,CAACO,MAAM,CAACR;QAClB,MAAML,SAAS,IAAIc,IAAI,IAAI,CAACd,MAAM,CAACW,MAAM;SACzCN,sBAAAA,CAAAA,QAAAA,MAAKE,kBAAkB,cAAvBF,iCAAAA,sBAAAA,MAAKE,kBAAkB,GAAK,EAAE;QAC9BF,KAAKE,kBAAkB,GAAGF,KAAKE,kBAAkB,CAACQ,MAAM,CAACC,CAAAA,IAAK,CAAChB,OAAOS,GAAG,CAACO;IAC9E;;QAtCA,uBAAShB,UAAS,IAAIiB;QACtB,uBAASX,SAAQ,IAAIQ;;AAsCzB"}
1
+ {"version":3,"sources":["../../src/css-injector/mfe-style-registry.ts"],"sourcesContent":["declare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n var __mfeStyles__: Record<string, MfeStyleRegistry> | undefined;\n}\n\ntype StyleRoot = ShadowRoot | Document;\n\nexport class MfeStyleRegistry {\n readonly sheets = new Map<string, CSSStyleSheet>();\n readonly roots = new Set<StyleRoot>();\n\n // Per-component state stored on globalThis.__mfeStyles__ so it survives Vite HMR module reloads.\n static for(componentName: string): MfeStyleRegistry {\n globalThis.__mfeStyles__ ??= {};\n globalThis.__mfeStyles__[componentName] ??= new MfeStyleRegistry();\n return globalThis.__mfeStyles__[componentName];\n }\n\n injectSheet(sheetId: string, css: string) {\n let sheet = this.sheets.get(sheetId);\n if (sheet) {\n sheet.replaceSync(css);\n } else {\n sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n this.sheets.set(sheetId, sheet);\n for (const root of this.roots) {\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];\n }\n }\n }\n\n observeRoot(root: StyleRoot) {\n if (this.roots.has(root)) {\n return;\n }\n this.roots.add(root);\n root.adoptedStyleSheets ??= [];\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, ...this.sheets.values()];\n }\n\n unobserveRoot(root: StyleRoot) {\n this.roots.delete(root);\n const sheets = new Set(this.sheets.values());\n root.adoptedStyleSheets ??= [];\n root.adoptedStyleSheets = root.adoptedStyleSheets.filter(s => !sheets.has(s));\n }\n}\n"],"names":["MfeStyleRegistry","for","componentName","globalThis","__mfeStyles__","injectSheet","sheetId","css","sheet","sheets","get","replaceSync","CSSStyleSheet","set","root","roots","adoptedStyleSheets","observeRoot","has","add","values","unobserveRoot","delete","Set","filter","s","Map"],"mappings":";;;;;;;;;;;AAOA,OAAO,MAAMA;IAIT,iGAAiG;IACjG,OAAOC,IAAIC,aAAqB,EAAoB;YAChDC,aAAAA,gBACAA,2BAAyBD,gBAAzBC;SADAA,iBAAAA,CAAAA,cAAAA,YAAWC,aAAa,cAAxBD,4BAAAA,iBAAAA,YAAWC,aAAa,GAAK,CAAC;SAC9BD,IAAAA,CAAAA,4BAAAA,WAAWC,aAAa,CAAA,CAACF,iBAAAA,cAAc,cAAvCC,eAAAA,IAAAA,yBAAwB,CAACD,eAAc,GAAK,IAAIF;QAChD,OAAOG,WAAWC,aAAa,CAACF,cAAc;IAClD;IAEAG,YAAYC,OAAe,EAAEC,GAAW,EAAE;QACtC,IAAIC,QAAQ,IAAI,CAACC,MAAM,CAACC,GAAG,CAACJ;QAC5B,IAAIE,OAAO;YACPA,MAAMG,WAAW,CAACJ;QACtB,OAAO;YACHC,QAAQ,IAAII;YACZJ,MAAMG,WAAW,CAACJ;YAClB,IAAI,CAACE,MAAM,CAACI,GAAG,CAACP,SAASE;YACzB,KAAK,MAAMM,QAAQ,IAAI,CAACC,KAAK,CAAE;gBAC3BD,KAAKE,kBAAkB,GAAG;uBAAIF,KAAKE,kBAAkB;oBAAER;iBAAM;YACjE;QACJ;IACJ;IAEAS,YAAYH,IAAe,EAAE;YAKzBA,OAAAA;QAJA,IAAI,IAAI,CAACC,KAAK,CAACG,GAAG,CAACJ,OAAO;YACtB;QACJ;QACA,IAAI,CAACC,KAAK,CAACI,GAAG,CAACL;SACfA,sBAAAA,CAAAA,QAAAA,MAAKE,kBAAkB,cAAvBF,iCAAAA,sBAAAA,MAAKE,kBAAkB,GAAK,EAAE;QAC9BF,KAAKE,kBAAkB,GAAG;eAAIF,KAAKE,kBAAkB;eAAK,IAAI,CAACP,MAAM,CAACW,MAAM;SAAG;IACnF;IAEAC,cAAcP,IAAe,EAAE;YAG3BA,OAAAA;QAFA,IAAI,CAACC,KAAK,CAACO,MAAM,CAACR;QAClB,MAAML,SAAS,IAAIc,IAAI,IAAI,CAACd,MAAM,CAACW,MAAM;SACzCN,sBAAAA,CAAAA,QAAAA,MAAKE,kBAAkB,cAAvBF,iCAAAA,sBAAAA,MAAKE,kBAAkB,GAAK,EAAE;QAC9BF,KAAKE,kBAAkB,GAAGF,KAAKE,kBAAkB,CAACQ,MAAM,CAACC,CAAAA,IAAK,CAAChB,OAAOS,GAAG,CAACO;IAC9E;;QAtCA,uBAAShB,UAAS,IAAIiB;QACtB,uBAASX,SAAQ,IAAIQ;;AAsCzB"}
package/dist/event-bus.js CHANGED
@@ -6,9 +6,7 @@ function _define_property(obj, key, value) {
6
6
  configurable: true,
7
7
  writable: true
8
8
  });
9
- } else {
10
- obj[key] = value;
11
- }
9
+ } else obj[key] = value;
12
10
  return obj;
13
11
  }
14
12
  import { symbolToken } from '@servicetitan/react-ioc';
@@ -109,18 +107,12 @@ const allowListedEvents = new Set([
109
107
  'blink',
110
108
  'CLOSE_COMPONENT',
111
109
  'CLOSE_JOB_EDIT_FLYOUT',
112
- 'close-troubleshooter',
113
110
  'company-profile-request-save',
114
111
  'company-profile-saved-error',
115
112
  'company-profile-saved',
116
113
  'dismiss-discrepancy-event',
117
114
  'dismiss-discrepancy-map-event',
118
115
  'dispatch-JobEditFlyout-fetchData',
119
- 'dispatch-pro-query-toggle-data',
120
- 'dispatch-pro-recieve-toggle-data',
121
- 'dispatch-pro-set-job-enabled',
122
- 'dispatchpro-fetchStatus',
123
- 'dispatchpro-open-issuereporter',
124
116
  'DRAWER_CREATED_CUSTOMER',
125
117
  'employees-emails-processed',
126
118
  'employees-request-save',
@@ -146,7 +138,6 @@ const allowListedEvents = new Set([
146
138
  'setLabel',
147
139
  'SHOW_POP_UP_MESSAGE',
148
140
  'TEAMS_SELECTED',
149
- 'tech-is-dispatch-pro-change',
150
141
  'technicians-emails-processed',
151
142
  'technicians-request-save',
152
143
  'technicians-saved-error',
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/event-bus.ts"],"sourcesContent":["import { symbolToken, SymbolToken } from '@servicetitan/react-ioc';\nimport mitt from 'mitt';\nimport { JSON, Serializable } from './types';\n\nexport const EVENT_BUS_TOKEN = symbolToken<EventBus>('EVENT_BUS_TOKEN');\n\nexport function typedEventBusToken<EventTypes extends Serializable<EventTypes>>() {\n return symbolToken<EventBus<EventTypes>>('EVENT_BUS_TOKEN');\n}\n\nexport type EventHandler<EventTypes, Event, T = never> = (\n data: [T] extends [never]\n ? Event extends SymbolToken<infer DataType>\n ? Serializable<DataType>\n : Event extends keyof EventTypes\n ? EventTypes[Event]\n : T\n : Serializable<T>\n) => void;\n\ntype JobPayload = JSON | void;\n\nexport type EventType = string | number | symbol;\nexport type SymbolTokenEventType<T, U extends EventType = EventType> =\n U extends SymbolToken<any> ? SymbolToken<T> : U;\n\nexport type JobEventHandler<Event> = (defer: {\n /**\n * Successfully complete a job.\n * @param result The value to return from the successfully completed job.\n */\n resolve(\n ...result: Event extends SymbolToken<infer ResultType>\n ? undefined extends ResultType\n ? [Serializable<ResultType>?]\n : [Serializable<ResultType>]\n : [JobPayload]\n ): void;\n /**\n * Fail a job.\n * @param reason The error to return from the failed job.\n */\n reject(reason?: string | Error): void;\n}) => void;\n\nexport class EventBus<EventTypes extends Serializable<EventTypes> = never> {\n job = {\n /**\n * Register a job event handler. Jobs event handlers return a result or an error.\n * @param event The job event to handle.\n * @param handler The handler to call when the event occurs. This handler is passed a `resolve` callback to return a successful result, and a `reject` callback to return an error.\n */\n on: <Event extends SymbolToken<any> | keyof EventTypes>(\n event: Event,\n handler: JobEventHandler<Event>\n ) => {\n this.validateEvent(event);\n this.emitter.on(event, handler);\n },\n\n /**\n * Deregister a job event handler.\n * @param event The previously registered event.\n * @param handler The previously registered handler.\n */\n off: <Event extends SymbolToken<any> | keyof EventTypes>(\n event: Event,\n handler: JobEventHandler<Event>\n ) => {\n this.emitter.off(event, handler);\n },\n\n /**\n * Send a job event.\n * @param event The event to send.\n * @returns a Promise that resolves or rejects depending on whether the job completes successfully.\n */\n emit: <Event extends SymbolToken<any> | keyof EventTypes>(event: Event) => {\n this.validateEvent(event);\n return new Promise<\n Event extends SymbolToken<infer ResultType> ? Serializable<ResultType> : JobPayload\n >((resolve, reject) => {\n this.emitter.emit(event, {\n resolve,\n reject: (reason?: string | Error) => {\n if (typeof reason === 'string' || reason instanceof Error) {\n reject(reason);\n } else {\n reject();\n }\n },\n });\n });\n },\n };\n\n private emitter = mitt<any>();\n\n /**\n * Register an event handler.\n * @param event The event to handle.\n * @param handler The handler to call when the event occurs.\n */\n on = <T extends Serializable<T> = never, Event extends SymbolToken<T> | keyof EventTypes = any>(\n event: SymbolTokenEventType<T, Event>,\n handler: EventHandler<EventTypes, Event, T>\n ) => {\n this.validateEvent(event);\n this.emitter.on(event, handler);\n };\n\n /**\n * Deregister an event handler.\n * @param event The previously registered event.\n * @param handler The previously registered handler.\n */\n off = <\n T extends Serializable<T> = never,\n Event extends SymbolToken<T> | keyof EventTypes = any,\n >(\n event: SymbolTokenEventType<T, Event>,\n handler: EventHandler<EventTypes, Event, T>\n ) => {\n this.emitter.off(event, handler);\n };\n\n /**\n * Send an event.\n * @param event The event to send.\n * @param data The data to pass to the event's handler.\n */\n emit = <T extends Serializable<T>, Event extends SymbolToken<T> | keyof EventTypes = any>(\n event: SymbolTokenEventType<T, Event>,\n ...data: Event extends SymbolToken<any>\n ? undefined extends T\n ? [T?]\n : [T]\n : [EventTypes] extends [never]\n ? [T?]\n : Event extends keyof EventTypes\n ? undefined extends EventTypes[Event]\n ? [EventTypes[Event]?]\n : [EventTypes[Event]] extends [never]\n ? []\n : [EventTypes[Event]]\n : never\n ) => {\n this.validateEvent(event);\n this.emitter.emit(event, data[0]);\n };\n\n private validateEvent(event: any) {\n if (process.env.NODE_ENV === 'production') {\n return;\n }\n\n const name = this.getName(event);\n if (name === undefined || /^[^:]+:.+/.test(name) || allowListedEvents.has(name)) {\n return;\n }\n\n throw new Error('event must have format {module}:{name}');\n }\n\n private getName(event: any) {\n if (typeof event === 'string') {\n return event;\n }\n if (typeof event === 'symbol') {\n return Symbol.keyFor(event) ?? '';\n }\n return undefined;\n }\n}\n\nconst allowListedEvents = new Set([\n ':widgets:message',\n '[EH] Module Link Clicked',\n '[EH] Module Loaded',\n '[internal] reset',\n 'blink',\n 'CLOSE_COMPONENT',\n 'CLOSE_JOB_EDIT_FLYOUT',\n 'close-troubleshooter',\n 'company-profile-request-save',\n 'company-profile-saved-error',\n 'company-profile-saved',\n 'dismiss-discrepancy-event',\n 'dismiss-discrepancy-map-event',\n 'dispatch-JobEditFlyout-fetchData',\n 'dispatch-pro-query-toggle-data',\n 'dispatch-pro-recieve-toggle-data',\n 'dispatch-pro-set-job-enabled',\n 'dispatchpro-fetchStatus',\n 'dispatchpro-open-issuereporter',\n 'DRAWER_CREATED_CUSTOMER',\n 'employees-emails-processed',\n 'employees-request-save',\n 'employees-saved-error',\n 'employees-saved',\n 'ium-ep-cancel-changes',\n 'ium-ep-form-can-be-submitted-change',\n 'ium-ep-save-changes',\n 'loaded',\n 'MESSAGE_TECHNICIAN',\n 'my-custom-event',\n 'NEW_EVENT',\n 'NonJobEventSelectedEvent',\n 'ON_WIDGET_INIT',\n 'OPEN_ASSIST_SCREEN',\n 'OPEN_CREATE_CUSTOMER_DRAWER',\n 'OPEN_DC_SIDE_PANEL_COMPONENT',\n 'OPEN_JOB_EDIT_FLYOUT',\n 'OPEN_RESCHEDULE_FLYOUT',\n 'open-troubleshooter',\n 'resolve-discrepancy-map-event',\n 'restore-discrepancy-event',\n 'setLabel',\n 'SHOW_POP_UP_MESSAGE',\n 'TEAMS_SELECTED',\n 'tech-is-dispatch-pro-change',\n 'technicians-emails-processed',\n 'technicians-request-save',\n 'technicians-saved-error',\n 'technicians-saved',\n 'timesheet-activity-saved',\n 'TOGGLE_DC_SIDE_PANEL_COMPONENT',\n 'updateUserEmail',\n 'VIEW_NON_JOB_EVENT',\n 'visibility',\n]);\n"],"names":["symbolToken","mitt","EVENT_BUS_TOKEN","typedEventBusToken","EventBus","validateEvent","event","process","env","NODE_ENV","name","getName","undefined","test","allowListedEvents","has","Error","Symbol","keyFor","job","on","handler","emitter","off","emit","Promise","resolve","reject","reason","data","Set"],"mappings":";;;;;;;;;;;;;AAAA,SAASA,WAAW,QAAqB,0BAA0B;AACnE,OAAOC,UAAU,OAAO;AAGxB,OAAO,MAAMC,kBAAkBF,YAAsB,mBAAmB;AAExE,OAAO,SAASG;IACZ,OAAOH,YAAkC;AAC7C;AAqCA,OAAO,MAAMI;IA0GDC,cAAcC,KAAU,EAAE;QAC9B,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,cAAc;YACvC;QACJ;QAEA,MAAMC,OAAO,IAAI,CAACC,OAAO,CAACL;QAC1B,IAAII,SAASE,aAAa,YAAYC,IAAI,CAACH,SAASI,kBAAkBC,GAAG,CAACL,OAAO;YAC7E;QACJ;QAEA,MAAM,IAAIM,MAAM;IACpB;IAEQL,QAAQL,KAAU,EAAE;QACxB,IAAI,OAAOA,UAAU,UAAU;YAC3B,OAAOA;QACX;QACA,IAAI,OAAOA,UAAU,UAAU;gBACpBW;YAAP,QAAOA,iBAAAA,OAAOC,MAAM,CAACZ,oBAAdW,4BAAAA,iBAAwB;QACnC;QACA,OAAOL;IACX;;QA9HAO,uBAAAA,OAAM;YACF;;;;SAIC,GACDC,IAAI,CACAd,OACAe;gBAEA,IAAI,CAAChB,aAAa,CAACC;gBACnB,IAAI,CAACgB,OAAO,CAACF,EAAE,CAACd,OAAOe;YAC3B;YAEA;;;;SAIC,GACDE,KAAK,CACDjB,OACAe;gBAEA,IAAI,CAACC,OAAO,CAACC,GAAG,CAACjB,OAAOe;YAC5B;YAEA;;;;SAIC,GACDG,MAAM,CAAoDlB;gBACtD,IAAI,CAACD,aAAa,CAACC;gBACnB,OAAO,IAAImB,QAET,CAACC,SAASC;oBACR,IAAI,CAACL,OAAO,CAACE,IAAI,CAAClB,OAAO;wBACrBoB;wBACAC,QAAQ,CAACC;4BACL,IAAI,OAAOA,WAAW,YAAYA,kBAAkBZ,OAAO;gCACvDW,OAAOC;4BACX,OAAO;gCACHD;4BACJ;wBACJ;oBACJ;gBACJ;YACJ;QACJ;QAEA,uBAAQL,WAAUrB;QAElB;;;;KAIC,GACDmB,uBAAAA,MAAK,CACDd,OACAe;YAEA,IAAI,CAAChB,aAAa,CAACC;YACnB,IAAI,CAACgB,OAAO,CAACF,EAAE,CAACd,OAAOe;QAC3B;QAEA;;;;KAIC,GACDE,uBAAAA,OAAM,CAIFjB,OACAe;YAEA,IAAI,CAACC,OAAO,CAACC,GAAG,CAACjB,OAAOe;QAC5B;QAEA;;;;KAIC,GACDG,uBAAAA,QAAO,CACHlB,OACA,GAAGuB;YAcH,IAAI,CAACxB,aAAa,CAACC;YACnB,IAAI,CAACgB,OAAO,CAACE,IAAI,CAAClB,OAAOuB,IAAI,CAAC,EAAE;QACpC;;AAwBJ;AAEA,MAAMf,oBAAoB,IAAIgB,IAAI;IAC9B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACH"}
1
+ {"version":3,"sources":["../src/event-bus.ts"],"sourcesContent":["import { symbolToken, SymbolToken } from '@servicetitan/react-ioc';\nimport mitt from 'mitt';\nimport { JSON, Serializable } from './types';\n\nexport const EVENT_BUS_TOKEN = symbolToken<EventBus>('EVENT_BUS_TOKEN');\n\nexport function typedEventBusToken<EventTypes extends Serializable<EventTypes>>() {\n return symbolToken<EventBus<EventTypes>>('EVENT_BUS_TOKEN');\n}\n\nexport type EventHandler<EventTypes, Event, T = never> = (\n data: [T] extends [never]\n ? Event extends SymbolToken<infer DataType>\n ? Serializable<DataType>\n : Event extends keyof EventTypes\n ? EventTypes[Event]\n : T\n : Serializable<T>\n) => void;\n\ntype JobPayload = JSON | void;\n\nexport type EventType = string | number | symbol;\nexport type SymbolTokenEventType<T, U extends EventType = EventType> =\n U extends SymbolToken<any> ? SymbolToken<T> : U;\n\nexport type JobEventHandler<Event> = (defer: {\n /**\n * Successfully complete a job.\n * @param result The value to return from the successfully completed job.\n */\n resolve(\n ...result: Event extends SymbolToken<infer ResultType>\n ? undefined extends ResultType\n ? [Serializable<ResultType>?]\n : [Serializable<ResultType>]\n : [JobPayload]\n ): void;\n /**\n * Fail a job.\n * @param reason The error to return from the failed job.\n */\n reject(reason?: string | Error): void;\n}) => void;\n\nexport class EventBus<EventTypes extends Serializable<EventTypes> = never> {\n job = {\n /**\n * Register a job event handler. Jobs event handlers return a result or an error.\n * @param event The job event to handle.\n * @param handler The handler to call when the event occurs. This handler is passed a `resolve` callback to return a successful result, and a `reject` callback to return an error.\n */\n on: <Event extends SymbolToken<any> | keyof EventTypes>(\n event: Event,\n handler: JobEventHandler<Event>\n ) => {\n this.validateEvent(event);\n this.emitter.on(event, handler);\n },\n\n /**\n * Deregister a job event handler.\n * @param event The previously registered event.\n * @param handler The previously registered handler.\n */\n off: <Event extends SymbolToken<any> | keyof EventTypes>(\n event: Event,\n handler: JobEventHandler<Event>\n ) => {\n this.emitter.off(event, handler);\n },\n\n /**\n * Send a job event.\n * @param event The event to send.\n * @returns a Promise that resolves or rejects depending on whether the job completes successfully.\n */\n emit: <Event extends SymbolToken<any> | keyof EventTypes>(event: Event) => {\n this.validateEvent(event);\n return new Promise<\n Event extends SymbolToken<infer ResultType> ? Serializable<ResultType> : JobPayload\n >((resolve, reject) => {\n this.emitter.emit(event, {\n resolve,\n reject: (reason?: string | Error) => {\n if (typeof reason === 'string' || reason instanceof Error) {\n reject(reason);\n } else {\n reject();\n }\n },\n });\n });\n },\n };\n\n private emitter = mitt<any>();\n\n /**\n * Register an event handler.\n * @param event The event to handle.\n * @param handler The handler to call when the event occurs.\n */\n on = <T extends Serializable<T> = never, Event extends SymbolToken<T> | keyof EventTypes = any>(\n event: SymbolTokenEventType<T, Event>,\n handler: EventHandler<EventTypes, Event, T>\n ) => {\n this.validateEvent(event);\n this.emitter.on(event, handler);\n };\n\n /**\n * Deregister an event handler.\n * @param event The previously registered event.\n * @param handler The previously registered handler.\n */\n off = <\n T extends Serializable<T> = never,\n Event extends SymbolToken<T> | keyof EventTypes = any,\n >(\n event: SymbolTokenEventType<T, Event>,\n handler: EventHandler<EventTypes, Event, T>\n ) => {\n this.emitter.off(event, handler);\n };\n\n /**\n * Send an event.\n * @param event The event to send.\n * @param data The data to pass to the event's handler.\n */\n emit = <T extends Serializable<T>, Event extends SymbolToken<T> | keyof EventTypes = any>(\n event: SymbolTokenEventType<T, Event>,\n ...data: Event extends SymbolToken<any>\n ? undefined extends T\n ? [T?]\n : [T]\n : [EventTypes] extends [never]\n ? [T?]\n : Event extends keyof EventTypes\n ? undefined extends EventTypes[Event]\n ? [EventTypes[Event]?]\n : [EventTypes[Event]] extends [never]\n ? []\n : [EventTypes[Event]]\n : never\n ) => {\n this.validateEvent(event);\n this.emitter.emit(event, data[0]);\n };\n\n private validateEvent(event: any) {\n if (process.env.NODE_ENV === 'production') {\n return;\n }\n\n const name = this.getName(event);\n if (name === undefined || /^[^:]+:.+/.test(name) || allowListedEvents.has(name)) {\n return;\n }\n\n throw new Error('event must have format {module}:{name}');\n }\n\n private getName(event: any) {\n if (typeof event === 'string') {\n return event;\n }\n if (typeof event === 'symbol') {\n return Symbol.keyFor(event) ?? '';\n }\n return undefined;\n }\n}\n\nconst allowListedEvents = new Set([\n ':widgets:message',\n '[EH] Module Link Clicked',\n '[EH] Module Loaded',\n '[internal] reset',\n 'blink',\n 'CLOSE_COMPONENT',\n 'CLOSE_JOB_EDIT_FLYOUT',\n 'company-profile-request-save',\n 'company-profile-saved-error',\n 'company-profile-saved',\n 'dismiss-discrepancy-event',\n 'dismiss-discrepancy-map-event',\n 'dispatch-JobEditFlyout-fetchData',\n 'DRAWER_CREATED_CUSTOMER',\n 'employees-emails-processed',\n 'employees-request-save',\n 'employees-saved-error',\n 'employees-saved',\n 'ium-ep-cancel-changes',\n 'ium-ep-form-can-be-submitted-change',\n 'ium-ep-save-changes',\n 'loaded',\n 'MESSAGE_TECHNICIAN',\n 'my-custom-event',\n 'NEW_EVENT',\n 'NonJobEventSelectedEvent',\n 'ON_WIDGET_INIT',\n 'OPEN_ASSIST_SCREEN',\n 'OPEN_CREATE_CUSTOMER_DRAWER',\n 'OPEN_DC_SIDE_PANEL_COMPONENT',\n 'OPEN_JOB_EDIT_FLYOUT',\n 'OPEN_RESCHEDULE_FLYOUT',\n 'open-troubleshooter',\n 'resolve-discrepancy-map-event',\n 'restore-discrepancy-event',\n 'setLabel',\n 'SHOW_POP_UP_MESSAGE',\n 'TEAMS_SELECTED',\n 'technicians-emails-processed',\n 'technicians-request-save',\n 'technicians-saved-error',\n 'technicians-saved',\n 'timesheet-activity-saved',\n 'TOGGLE_DC_SIDE_PANEL_COMPONENT',\n 'updateUserEmail',\n 'VIEW_NON_JOB_EVENT',\n 'visibility',\n]);\n"],"names":["symbolToken","mitt","EVENT_BUS_TOKEN","typedEventBusToken","EventBus","validateEvent","event","process","env","NODE_ENV","name","getName","undefined","test","allowListedEvents","has","Error","Symbol","keyFor","job","on","handler","emitter","off","emit","Promise","resolve","reject","reason","data","Set"],"mappings":";;;;;;;;;;;AAAA,SAASA,WAAW,QAAqB,0BAA0B;AACnE,OAAOC,UAAU,OAAO;AAGxB,OAAO,MAAMC,kBAAkBF,YAAsB,mBAAmB;AAExE,OAAO,SAASG;IACZ,OAAOH,YAAkC;AAC7C;AAqCA,OAAO,MAAMI;IA0GDC,cAAcC,KAAU,EAAE;QAC9B,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,cAAc;YACvC;QACJ;QAEA,MAAMC,OAAO,IAAI,CAACC,OAAO,CAACL;QAC1B,IAAII,SAASE,aAAa,YAAYC,IAAI,CAACH,SAASI,kBAAkBC,GAAG,CAACL,OAAO;YAC7E;QACJ;QAEA,MAAM,IAAIM,MAAM;IACpB;IAEQL,QAAQL,KAAU,EAAE;QACxB,IAAI,OAAOA,UAAU,UAAU;YAC3B,OAAOA;QACX;QACA,IAAI,OAAOA,UAAU,UAAU;gBACpBW;YAAP,QAAOA,iBAAAA,OAAOC,MAAM,CAACZ,oBAAdW,4BAAAA,iBAAwB;QACnC;QACA,OAAOL;IACX;;QA9HAO,uBAAAA,OAAM;YACF;;;;SAIC,GACDC,IAAI,CACAd,OACAe;gBAEA,IAAI,CAAChB,aAAa,CAACC;gBACnB,IAAI,CAACgB,OAAO,CAACF,EAAE,CAACd,OAAOe;YAC3B;YAEA;;;;SAIC,GACDE,KAAK,CACDjB,OACAe;gBAEA,IAAI,CAACC,OAAO,CAACC,GAAG,CAACjB,OAAOe;YAC5B;YAEA;;;;SAIC,GACDG,MAAM,CAAoDlB;gBACtD,IAAI,CAACD,aAAa,CAACC;gBACnB,OAAO,IAAImB,QAET,CAACC,SAASC;oBACR,IAAI,CAACL,OAAO,CAACE,IAAI,CAAClB,OAAO;wBACrBoB;wBACAC,QAAQ,CAACC;4BACL,IAAI,OAAOA,WAAW,YAAYA,kBAAkBZ,OAAO;gCACvDW,OAAOC;4BACX,OAAO;gCACHD;4BACJ;wBACJ;oBACJ;gBACJ;YACJ;QACJ;QAEA,uBAAQL,WAAUrB;QAElB;;;;KAIC,GACDmB,uBAAAA,MAAK,CACDd,OACAe;YAEA,IAAI,CAAChB,aAAa,CAACC;YACnB,IAAI,CAACgB,OAAO,CAACF,EAAE,CAACd,OAAOe;QAC3B;QAEA;;;;KAIC,GACDE,uBAAAA,OAAM,CAIFjB,OACAe;YAEA,IAAI,CAACC,OAAO,CAACC,GAAG,CAACjB,OAAOe;QAC5B;QAEA;;;;KAIC,GACDG,uBAAAA,QAAO,CACHlB,OACA,GAAGuB;YAcH,IAAI,CAACxB,aAAa,CAACC;YACnB,IAAI,CAACgB,OAAO,CAACE,IAAI,CAAClB,OAAOuB,IAAI,CAAC,EAAE;QACpC;;AAwBJ;AAEA,MAAMf,oBAAoB,IAAIgB,IAAI;IAC9B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACH"}
@@ -6,15 +6,20 @@ function _define_property(obj, key, value) {
6
6
  configurable: true,
7
7
  writable: true
8
8
  });
9
- } else {
10
- obj[key] = value;
11
- }
9
+ } else obj[key] = value;
12
10
  return obj;
13
11
  }
14
12
  function _ts_decorate(decorators, target, key, desc) {
15
13
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
14
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
15
+ r = Reflect.decorate(decorators, target, key, desc);
16
+ } else {
17
+ for(var i = decorators.length - 1; i >= 0; i--){
18
+ if (d = decorators[i]) {
19
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
20
+ }
21
+ }
22
+ }
18
23
  return c > 3 && r && Object.defineProperty(target, key, r), r;
19
24
  }
20
25
  import { injectable } from '@servicetitan/react-ioc';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/history-manager.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\nimport { History, Location, UnregisterCallback } from 'history';\n\n@injectable()\nexport class HistoryManager {\n // Initiator of action, used for filtering redirections\n occupied?: { history: History; location: Location };\n\n storage = new Map<History, UnregisterCallback>();\n\n register = (addable: History) => {\n this.storage.set(\n addable,\n addable.listen(location => {\n const path = addable.createHref(location);\n const state = location.state;\n\n if (!this.occupied) {\n this.occupied = { history: addable, location };\n } else if (this.occupied.history === addable) {\n this.occupied.location = location;\n }\n\n for (const history of this.storage.keys()) {\n if (history === addable) {\n continue;\n }\n\n if (\n history.createHref(history.location) === path &&\n history.location.state === state\n ) {\n continue;\n }\n\n // Allow redirects only to the deeper pages\n const unblock = history.block(location => {\n if (\n this.occupied &&\n !history\n .createHref(location)\n .startsWith(\n this.occupied.history.createHref(this.occupied.location)\n )\n ) {\n return false;\n }\n });\n\n history.replace(path, state);\n\n unblock();\n }\n\n // Wait for all updates, including redirections\n setTimeout(() => {\n if (\n this.occupied?.history === addable &&\n this.occupied?.location === location\n ) {\n this.occupied = undefined;\n }\n });\n })\n );\n };\n\n unregister = (removable: History) => {\n if (this.storage.has(removable)) {\n this.storage.get(removable)!();\n this.storage.delete(removable);\n }\n };\n}\n"],"names":["injectable","HistoryManager","occupied","storage","Map","register","addable","set","listen","location","path","createHref","state","history","keys","unblock","block","startsWith","replace","setTimeout","undefined","unregister","removable","has","get","delete"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AAIrD,OAAO,MAAMC;;QACT,uDAAuD;QACvDC,uBAAAA,YAAAA,KAAAA;QAEAC,uBAAAA,WAAU,IAAIC;QAEdC,uBAAAA,YAAW,CAACC;YACR,IAAI,CAACH,OAAO,CAACI,GAAG,CACZD,SACAA,QAAQE,MAAM,CAACC,CAAAA;gBACX,MAAMC,OAAOJ,QAAQK,UAAU,CAACF;gBAChC,MAAMG,QAAQH,SAASG,KAAK;gBAE5B,IAAI,CAAC,IAAI,CAACV,QAAQ,EAAE;oBAChB,IAAI,CAACA,QAAQ,GAAG;wBAAEW,SAASP;wBAASG;oBAAS;gBACjD,OAAO,IAAI,IAAI,CAACP,QAAQ,CAACW,OAAO,KAAKP,SAAS;oBAC1C,IAAI,CAACJ,QAAQ,CAACO,QAAQ,GAAGA;gBAC7B;gBAEA,KAAK,MAAMI,WAAW,IAAI,CAACV,OAAO,CAACW,IAAI,GAAI;oBACvC,IAAID,YAAYP,SAAS;wBACrB;oBACJ;oBAEA,IACIO,QAAQF,UAAU,CAACE,QAAQJ,QAAQ,MAAMC,QACzCG,QAAQJ,QAAQ,CAACG,KAAK,KAAKA,OAC7B;wBACE;oBACJ;oBAEA,2CAA2C;oBAC3C,MAAMG,UAAUF,QAAQG,KAAK,CAACP,CAAAA;wBAC1B,IACI,IAAI,CAACP,QAAQ,IACb,CAACW,QACIF,UAAU,CAACF,UACXQ,UAAU,CACP,IAAI,CAACf,QAAQ,CAACW,OAAO,CAACF,UAAU,CAAC,IAAI,CAACT,QAAQ,CAACO,QAAQ,IAEjE;4BACE,OAAO;wBACX;oBACJ;oBAEAI,QAAQK,OAAO,CAACR,MAAME;oBAEtBG;gBACJ;gBAEA,+CAA+C;gBAC/CI,WAAW;wBAEH,gBACA;oBAFJ,IACI,EAAA,iBAAA,IAAI,CAACjB,QAAQ,cAAb,qCAAA,eAAeW,OAAO,MAAKP,WAC3B,EAAA,kBAAA,IAAI,CAACJ,QAAQ,cAAb,sCAAA,gBAAeO,QAAQ,MAAKA,UAC9B;wBACE,IAAI,CAACP,QAAQ,GAAGkB;oBACpB;gBACJ;YACJ;QAER;QAEAC,uBAAAA,cAAa,CAACC;YACV,IAAI,IAAI,CAACnB,OAAO,CAACoB,GAAG,CAACD,YAAY;gBAC7B,IAAI,CAACnB,OAAO,CAACqB,GAAG,CAACF;gBACjB,IAAI,CAACnB,OAAO,CAACsB,MAAM,CAACH;YACxB;QACJ;;AACJ"}
1
+ {"version":3,"sources":["../src/history-manager.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\nimport { History, Location, UnregisterCallback } from 'history';\n\n@injectable()\nexport class HistoryManager {\n // Initiator of action, used for filtering redirections\n occupied?: { history: History; location: Location };\n\n storage = new Map<History, UnregisterCallback>();\n\n register = (addable: History) => {\n this.storage.set(\n addable,\n addable.listen(location => {\n const path = addable.createHref(location);\n const state = location.state;\n\n if (!this.occupied) {\n this.occupied = { history: addable, location };\n } else if (this.occupied.history === addable) {\n this.occupied.location = location;\n }\n\n for (const history of this.storage.keys()) {\n if (history === addable) {\n continue;\n }\n\n if (\n history.createHref(history.location) === path &&\n history.location.state === state\n ) {\n continue;\n }\n\n // Allow redirects only to the deeper pages\n const unblock = history.block(location => {\n if (\n this.occupied &&\n !history\n .createHref(location)\n .startsWith(\n this.occupied.history.createHref(this.occupied.location)\n )\n ) {\n return false;\n }\n });\n\n history.replace(path, state);\n\n unblock();\n }\n\n // Wait for all updates, including redirections\n setTimeout(() => {\n if (\n this.occupied?.history === addable &&\n this.occupied?.location === location\n ) {\n this.occupied = undefined;\n }\n });\n })\n );\n };\n\n unregister = (removable: History) => {\n if (this.storage.has(removable)) {\n this.storage.get(removable)!();\n this.storage.delete(removable);\n }\n };\n}\n"],"names":["injectable","HistoryManager","occupied","storage","Map","register","addable","set","listen","location","path","createHref","state","history","keys","unblock","block","startsWith","replace","setTimeout","undefined","unregister","removable","has","get","delete"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AAIrD,OAAO,MAAMC;;QACT,uDAAuD;QACvDC,uBAAAA,YAAAA,KAAAA;QAEAC,uBAAAA,WAAU,IAAIC;QAEdC,uBAAAA,YAAW,CAACC;YACR,IAAI,CAACH,OAAO,CAACI,GAAG,CACZD,SACAA,QAAQE,MAAM,CAACC,CAAAA;gBACX,MAAMC,OAAOJ,QAAQK,UAAU,CAACF;gBAChC,MAAMG,QAAQH,SAASG,KAAK;gBAE5B,IAAI,CAAC,IAAI,CAACV,QAAQ,EAAE;oBAChB,IAAI,CAACA,QAAQ,GAAG;wBAAEW,SAASP;wBAASG;oBAAS;gBACjD,OAAO,IAAI,IAAI,CAACP,QAAQ,CAACW,OAAO,KAAKP,SAAS;oBAC1C,IAAI,CAACJ,QAAQ,CAACO,QAAQ,GAAGA;gBAC7B;gBAEA,KAAK,MAAMI,WAAW,IAAI,CAACV,OAAO,CAACW,IAAI,GAAI;oBACvC,IAAID,YAAYP,SAAS;wBACrB;oBACJ;oBAEA,IACIO,QAAQF,UAAU,CAACE,QAAQJ,QAAQ,MAAMC,QACzCG,QAAQJ,QAAQ,CAACG,KAAK,KAAKA,OAC7B;wBACE;oBACJ;oBAEA,2CAA2C;oBAC3C,MAAMG,UAAUF,QAAQG,KAAK,CAACP,CAAAA;wBAC1B,IACI,IAAI,CAACP,QAAQ,IACb,CAACW,QACIF,UAAU,CAACF,UACXQ,UAAU,CACP,IAAI,CAACf,QAAQ,CAACW,OAAO,CAACF,UAAU,CAAC,IAAI,CAACT,QAAQ,CAACO,QAAQ,IAEjE;4BACE,OAAO;wBACX;oBACJ;oBAEAI,QAAQK,OAAO,CAACR,MAAME;oBAEtBG;gBACJ;gBAEA,+CAA+C;gBAC/CI,WAAW;wBAEH,gBACA;oBAFJ,IACI,EAAA,iBAAA,IAAI,CAACjB,QAAQ,cAAb,qCAAA,eAAeW,OAAO,MAAKP,WAC3B,EAAA,kBAAA,IAAI,CAACJ,QAAQ,cAAb,sCAAA,gBAAeO,QAAQ,MAAKA,UAC9B;wBACE,IAAI,CAACP,QAAQ,GAAGkB;oBACpB;gBACJ;YACJ;QAER;QAEAC,uBAAAA,cAAa,CAACC;YACV,IAAI,IAAI,CAACnB,OAAO,CAACoB,GAAG,CAACD,YAAY;gBAC7B,IAAI,CAACnB,OAAO,CAACqB,GAAG,CAACF;gBACjB,IAAI,CAACnB,OAAO,CAACsB,MAAM,CAACH;YACxB;QACJ;;AACJ"}
@@ -6,9 +6,7 @@ function _define_property(obj, key, value) {
6
6
  configurable: true,
7
7
  writable: true
8
8
  });
9
- } else {
10
- obj[key] = value;
11
- }
9
+ } else obj[key] = value;
12
10
  return obj;
13
11
  }
14
12
  import { WEB_COMPONENT_NAME } from './globals';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/register-headless.ts"],"sourcesContent":["import type { LDService } from '@servicetitan/launchdarkly-service';\nimport type { Log } from '@servicetitan/log-service';\nimport type { Entries, IWebComponent } from './common';\nimport type { EventBus } from './event-bus';\nimport { WEB_COMPONENT_NAME } from './globals';\nimport { Serializable } from './types';\n\ntype HeadlessCallbackArgs<TMfeData, TEventBus extends EventBus = EventBus> = Pick<\n Entries,\n 'ldService' | 'logService'\n> & {\n eventBus?: TEventBus;\n mfeData?: Serializable<TMfeData>;\n};\nexport type HeadlessCallback<TMfeData = any, TEventBus extends EventBus = EventBus> = (\n params: HeadlessCallbackArgs<TMfeData, TEventBus>\n) => void;\n\nexport function registerHeadless(\n connectedCallback?: HeadlessCallback,\n disconnectedCallback?: HeadlessCallback\n) {\n class Headless extends HTMLElement implements IWebComponent {\n private ldService?: LDService;\n private logService?: Log;\n private eventBus?: EventBus;\n private readonly readyPromise: Promise<void>;\n private resolveReadyPromise!: () => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise(resolve => {\n this.resolveReadyPromise = resolve;\n });\n }\n\n provide = (entries: Entries) => {\n this.ldService = entries.ldService;\n this.logService = entries.logService;\n this.eventBus = entries.eventBus;\n this.resolveReadyPromise();\n };\n\n async connectedCallback() {\n await this.readyPromise;\n connectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n async disconnectedCallback() {\n await this.readyPromise;\n disconnectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n connectedMoveCallback() {\n /*\n * Defining connectedMoveCallback prevents connectedCallback or disconnectedCallback\n * from running when the element is moved in the DOM\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks\n */\n }\n\n private get services() {\n return {\n ldService: this.ldService,\n logService: this.logService,\n eventBus: this.eventBus,\n };\n }\n\n private get mfeData() {\n return JSON.parse(this.dataset.mfeData ?? '{}');\n }\n }\n\n if (!WEB_COMPONENT_NAME) {\n // eslint-disable-next-line no-console\n console.error('\"WEB_COMPONENT_NAME\" is not defined!');\n return;\n }\n\n window.customElements.define(`headless-${WEB_COMPONENT_NAME}`, Headless);\n}\n"],"names":["WEB_COMPONENT_NAME","registerHeadless","connectedCallback","disconnectedCallback","Headless","HTMLElement","readyPromise","services","mfeData","connectedMoveCallback","ldService","logService","eventBus","JSON","parse","dataset","resolveReadyPromise","provide","entries","Promise","resolve","console","error","window","customElements","define"],"mappings":";;;;;;;;;;;;;AAIA,SAASA,kBAAkB,QAAQ,YAAY;AAc/C,OAAO,SAASC,iBACZC,iBAAoC,EACpCC,oBAAuC;IAEvC,MAAMC,iBAAiBC;QAqBnB,MAAMH,oBAAoB;YACtB,MAAM,IAAI,CAACI,YAAY;YACvBJ,8BAAAA,wCAAAA,kBAAoB;gBAChB,GAAG,IAAI,CAACK,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEA,MAAML,uBAAuB;YACzB,MAAM,IAAI,CAACG,YAAY;YACvBH,iCAAAA,2CAAAA,qBAAuB;gBACnB,GAAG,IAAI,CAACI,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEAC,wBAAwB;QACpB;;;;aAIC,GACL;QAEA,IAAYF,WAAW;YACnB,OAAO;gBACHG,WAAW,IAAI,CAACA,SAAS;gBACzBC,YAAY,IAAI,CAACA,UAAU;gBAC3BC,UAAU,IAAI,CAACA,QAAQ;YAC3B;QACJ;QAEA,IAAYJ,UAAU;gBACA;YAAlB,OAAOK,KAAKC,KAAK,EAAC,wBAAA,IAAI,CAACC,OAAO,CAACP,OAAO,cAApB,mCAAA,wBAAwB;QAC9C;QAhDA,aAAc;YACV,KAAK,IAPT,uBAAQE,aAAR,KAAA,IACA,uBAAQC,cAAR,KAAA,IACA,uBAAQC,YAAR,KAAA,IACA,uBAAiBN,gBAAjB,KAAA,IACA,uBAAQU,uBAAR,KAAA,IASAC,uBAAAA,WAAU,CAACC;gBACP,IAAI,CAACR,SAAS,GAAGQ,QAAQR,SAAS;gBAClC,IAAI,CAACC,UAAU,GAAGO,QAAQP,UAAU;gBACpC,IAAI,CAACC,QAAQ,GAAGM,QAAQN,QAAQ;gBAChC,IAAI,CAACI,mBAAmB;YAC5B;YAVI,IAAI,CAACV,YAAY,GAAG,IAAIa,QAAQC,CAAAA;gBAC5B,IAAI,CAACJ,mBAAmB,GAAGI;YAC/B;QACJ;IA4CJ;IAEA,IAAI,CAACpB,oBAAoB;QACrB,sCAAsC;QACtCqB,QAAQC,KAAK,CAAC;QACd;IACJ;IAEAC,OAAOC,cAAc,CAACC,MAAM,CAAC,CAAC,SAAS,EAAEzB,oBAAoB,EAAEI;AACnE"}
1
+ {"version":3,"sources":["../src/register-headless.ts"],"sourcesContent":["import type { LDService } from '@servicetitan/launchdarkly-service';\nimport type { Log } from '@servicetitan/log-service';\nimport type { Entries, IWebComponent } from './common';\nimport type { EventBus } from './event-bus';\nimport { WEB_COMPONENT_NAME } from './globals';\nimport { Serializable } from './types';\n\ntype HeadlessCallbackArgs<TMfeData, TEventBus extends EventBus = EventBus> = Pick<\n Entries,\n 'ldService' | 'logService'\n> & {\n eventBus?: TEventBus;\n mfeData?: Serializable<TMfeData>;\n};\nexport type HeadlessCallback<TMfeData = any, TEventBus extends EventBus = EventBus> = (\n params: HeadlessCallbackArgs<TMfeData, TEventBus>\n) => void;\n\nexport function registerHeadless(\n connectedCallback?: HeadlessCallback,\n disconnectedCallback?: HeadlessCallback\n) {\n class Headless extends HTMLElement implements IWebComponent {\n private ldService?: LDService;\n private logService?: Log;\n private eventBus?: EventBus;\n private readonly readyPromise: Promise<void>;\n private resolveReadyPromise!: () => void;\n\n constructor() {\n super();\n this.readyPromise = new Promise(resolve => {\n this.resolveReadyPromise = resolve;\n });\n }\n\n provide = (entries: Entries) => {\n this.ldService = entries.ldService;\n this.logService = entries.logService;\n this.eventBus = entries.eventBus;\n this.resolveReadyPromise();\n };\n\n async connectedCallback() {\n await this.readyPromise;\n connectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n async disconnectedCallback() {\n await this.readyPromise;\n disconnectedCallback?.({\n ...this.services,\n mfeData: this.mfeData,\n });\n }\n\n connectedMoveCallback() {\n /*\n * Defining connectedMoveCallback prevents connectedCallback or disconnectedCallback\n * from running when the element is moved in the DOM\n * https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#custom_element_lifecycle_callbacks\n */\n }\n\n private get services() {\n return {\n ldService: this.ldService,\n logService: this.logService,\n eventBus: this.eventBus,\n };\n }\n\n private get mfeData() {\n return JSON.parse(this.dataset.mfeData ?? '{}');\n }\n }\n\n if (!WEB_COMPONENT_NAME) {\n // eslint-disable-next-line no-console\n console.error('\"WEB_COMPONENT_NAME\" is not defined!');\n return;\n }\n\n window.customElements.define(`headless-${WEB_COMPONENT_NAME}`, Headless);\n}\n"],"names":["WEB_COMPONENT_NAME","registerHeadless","connectedCallback","disconnectedCallback","Headless","HTMLElement","readyPromise","services","mfeData","connectedMoveCallback","ldService","logService","eventBus","JSON","parse","dataset","resolveReadyPromise","provide","entries","Promise","resolve","console","error","window","customElements","define"],"mappings":";;;;;;;;;;;AAIA,SAASA,kBAAkB,QAAQ,YAAY;AAc/C,OAAO,SAASC,iBACZC,iBAAoC,EACpCC,oBAAuC;IAEvC,MAAMC,iBAAiBC;QAqBnB,MAAMH,oBAAoB;YACtB,MAAM,IAAI,CAACI,YAAY;YACvBJ,8BAAAA,wCAAAA,kBAAoB;gBAChB,GAAG,IAAI,CAACK,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEA,MAAML,uBAAuB;YACzB,MAAM,IAAI,CAACG,YAAY;YACvBH,iCAAAA,2CAAAA,qBAAuB;gBACnB,GAAG,IAAI,CAACI,QAAQ;gBAChBC,SAAS,IAAI,CAACA,OAAO;YACzB;QACJ;QAEAC,wBAAwB;QACpB;;;;aAIC,GACL;QAEA,IAAYF,WAAW;YACnB,OAAO;gBACHG,WAAW,IAAI,CAACA,SAAS;gBACzBC,YAAY,IAAI,CAACA,UAAU;gBAC3BC,UAAU,IAAI,CAACA,QAAQ;YAC3B;QACJ;QAEA,IAAYJ,UAAU;gBACA;YAAlB,OAAOK,KAAKC,KAAK,EAAC,wBAAA,IAAI,CAACC,OAAO,CAACP,OAAO,cAApB,mCAAA,wBAAwB;QAC9C;QAhDA,aAAc;YACV,KAAK,IAPT,uBAAQE,aAAR,KAAA,IACA,uBAAQC,cAAR,KAAA,IACA,uBAAQC,YAAR,KAAA,IACA,uBAAiBN,gBAAjB,KAAA,IACA,uBAAQU,uBAAR,KAAA,IASAC,uBAAAA,WAAU,CAACC;gBACP,IAAI,CAACR,SAAS,GAAGQ,QAAQR,SAAS;gBAClC,IAAI,CAACC,UAAU,GAAGO,QAAQP,UAAU;gBACpC,IAAI,CAACC,QAAQ,GAAGM,QAAQN,QAAQ;gBAChC,IAAI,CAACI,mBAAmB;YAC5B;YAVI,IAAI,CAACV,YAAY,GAAG,IAAIa,QAAQC,CAAAA;gBAC5B,IAAI,CAACJ,mBAAmB,GAAGI;YAC/B;QACJ;IA4CJ;IAEA,IAAI,CAACpB,oBAAoB;QACrB,sCAAsC;QACtCqB,QAAQC,KAAK,CAAC;QACd;IACJ;IAEAC,OAAOC,cAAc,CAACC,MAAM,CAAC,CAAC,SAAS,EAAEzB,oBAAoB,EAAEI;AACnE"}
package/dist/register.js CHANGED
@@ -6,9 +6,7 @@ function _define_property(obj, key, value) {
6
6
  configurable: true,
7
7
  writable: true
8
8
  });
9
- } else {
10
- obj[key] = value;
11
- }
9
+ } else obj[key] = value;
12
10
  return obj;
13
11
  }
14
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/register.tsx"],"sourcesContent":["import { type LDService } from '@servicetitan/launchdarkly-service';\nimport { Log } from '@servicetitan/log-service';\nimport { Provider } from '@servicetitan/react-ioc';\nimport { ExposedDependencies } from '@servicetitan/startup-utils';\nimport { ComponentType, FC, ReactElement, useEffect } from 'react';\nimport { Anvil1Providers } from './anvil1-providers';\nimport { Anvil2Providers } from './anvil2-providers';\nimport {\n BASENAME_TOKEN,\n Entries,\n EXPOSED_DEPENDENCIES_TOKEN,\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n ExposedInstanceDependencies,\n IS_WEB_COMPONENT_TOKEN,\n IWebComponent,\n RENDER_ROOT_TOKEN,\n} from './common';\nimport { MFEDataContext } from './contexts/mfe-data-context';\nimport { MFEMetadataContext } from './contexts/mfe-metadata-context';\nimport { withCssInjector } from './css-injector';\nimport { EVENT_BUS_TOKEN, EventBus } from './event-bus';\nimport { getStyleUrls } from './get-style-urls';\nimport { WEB_COMPONENT_NAME } from './globals';\nimport { HistoryManager } from './history-manager';\nimport { render } from './render';\nimport { getElementName, getLDServiceToken } from './utils';\n\nfunction createLink(url: string, onLoad: () => void) {\n const element = document.createElement('link');\n\n element.href = url;\n element.rel = 'stylesheet';\n element.crossOrigin = 'anonymous';\n element.onload = onLoad;\n element.onerror = onLoad;\n\n return element;\n}\n\nconst Placeholder: FC = () => <div style={{ display: 'none' }} />;\n\nexport interface RegisterOptions {\n legacyRoot?: boolean;\n sharedDependenciesNames?: string[];\n}\n\nexport function register(Component: ComponentType, light: boolean, options?: RegisterOptions) {\n const WrappedComponent = withCssInjector(Component);\n\n class WebComponent extends HTMLElement implements IWebComponent {\n private root?: ShadowRoot;\n private portal?: ShadowRoot;\n private portalAnvilContainer?: HTMLDivElement;\n\n private styles: {\n total: number;\n loaded: number;\n elements: HTMLElement[];\n } = { total: 0, loaded: 0, elements: [] };\n\n private ldService?: LDService;\n private logService?: Log;\n private historyManager?: HistoryManager;\n private exposedDependencies?: ExposedDependencies;\n private exposedInstanceDependencies?: ExposedInstanceDependencies;\n private eventBus?: EventBus;\n private basename?: string;\n private onReady?: () => void;\n private onDispose?: () => void;\n private view?: ReturnType<typeof render>;\n\n connectedCallback() {\n /*\n * connectedCallback can be called when DOM element has moved\n * check that root is still connected to the DOM\n * if that's the case we don't need to reconnect MFE\n */\n if (this.root?.isConnected) {\n return;\n }\n const sharedDependenciesNames = options?.sharedDependenciesNames ?? [];\n const styleUrls = getStyleUrls(light, sharedDependenciesNames, this);\n\n this.styles = {\n total: styleUrls.length * 2,\n loaded: 0,\n elements: [],\n };\n\n this.root = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n /*\n * Portal shadow dom is created at the bottom of the body in order to be used as\n * the element for the design system components to attach modals and popups to.\n * This element is passed down the tree through context, and used within\n * the design system components.\n */\n const portalElement = document.createElement('div');\n portalElement.setAttribute(\n 'data-mfe-portal-name',\n getElementName({ WebComponent: WEB_COMPONENT_NAME! })\n );\n this.portal = document.body.appendChild(portalElement).attachShadow({ mode: 'open' });\n /*\n * Add element inside of portal so that Anvil 2 can attach modals and popups to it\n * since floating-ui does not support attaching straight to shadow dom\n */\n this.portalAnvilContainer = document.createElement('div');\n this.portal.appendChild(this.portalAnvilContainer);\n\n this.view = render(<Placeholder />, this.root, options);\n\n this.styles.elements.push(\n ...this.attachStyles(this.root, styleUrls),\n ...this.attachStyles(this.portal, styleUrls)\n );\n }\n\n disconnectedCallback() {\n if (!this.root || this.root.isConnected) {\n return;\n }\n for (const element of this.styles.elements) {\n element.remove();\n }\n\n this.view?.unmount();\n document.body?.removeChild(this.portal!.host);\n this.root = undefined;\n this.portal = undefined;\n this.portalAnvilContainer = undefined;\n\n this.onDispose?.();\n }\n\n // Observe changes to the data-mfe-data attribute so that we can re-render when it changes\n static get observedAttributes() {\n return ['data-mfe-data'];\n }\n\n attributeChangedCallback() {\n this.render();\n }\n\n provide = (entries: Entries) => {\n for (const [key, value] of Object.entries(entries)) {\n this[key as keyof IWebComponent] = value;\n }\n\n if (this.styles.loaded === this.styles.total) {\n this.render();\n }\n };\n\n private handleLoad = () => {\n this.styles.loaded++;\n\n if (this.styles.loaded === this.styles.total) {\n this.render();\n }\n };\n\n private attachStyles = (node: ShadowRoot, urls: string[]) => {\n const elements: HTMLElement[] = [];\n\n for (const url of urls) {\n const element = createLink(url, this.handleLoad);\n node.appendChild(element);\n elements.push(element);\n }\n\n return elements;\n };\n\n private withProviders(children: ReactElement) {\n return (\n <Anvil2Providers portalAnvilContainer={this.portalAnvilContainer!}>\n <Anvil1Providers root={this.root!} portal={this.portal!}>\n {children}\n </Anvil1Providers>\n </Anvil2Providers>\n );\n }\n\n private render = () => {\n /*\n * Check for this.root first, otherwise we get error when\n * attributeChangedCallback happens on load\n */\n if (this.root) {\n const mfeData = this.dataset.mfeData\n ? /*\n * Data was stringified in order to come through the data-mfe-data attribute\n * So we must JSON.parse it here to get an object back\n */\n JSON.parse(this.dataset.mfeData)\n : /*\n * If mfeData isn't there, then the Host may not be up to date with web-components\n * and is instead passing data through separate data-attributes, so we want to\n * spread all of those instead\n */\n { ...this.dataset };\n\n const metadata = {\n shadowRoot: this.root,\n portalShadowRoot: this.portal!,\n };\n\n this.view?.rerender(\n <Provider\n singletons={[\n { provide: IS_WEB_COMPONENT_TOKEN, useValue: true },\n { provide: RENDER_ROOT_TOKEN, useValue: this.root },\n ]}\n >\n <Provider\n singletons={[\n { provide: Log, useValue: this.logService },\n {\n provide: HistoryManager,\n useValue: this.historyManager,\n },\n {\n provide: EXPOSED_DEPENDENCIES_TOKEN,\n useValue: this.exposedDependencies,\n },\n {\n provide: EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n useValue: this.exposedInstanceDependencies,\n },\n { provide: BASENAME_TOKEN, useValue: this.basename },\n { provide: EVENT_BUS_TOKEN, useValue: this.eventBus },\n { provide: getLDServiceToken(), useValue: this.ldService },\n ].filter(\n ({ provide, useValue }) =>\n useValue !== undefined && provide !== undefined\n )}\n >\n <MFEDataContext.Provider value={{ ...mfeData }}>\n <MFEMetadataContext.Provider value={metadata}>\n {this.withProviders(<WrappedComponent {...mfeData} />)}\n {this.onReady && <RenderCallback callback={this.onReady} />}\n </MFEMetadataContext.Provider>\n </MFEDataContext.Provider>\n </Provider>\n </Provider>\n );\n }\n };\n }\n\n if (!WEB_COMPONENT_NAME) {\n // eslint-disable-next-line no-console\n console.error('\"WEB_COMPONENT_NAME\" is not defined!');\n return;\n }\n\n window.customElements.define(WEB_COMPONENT_NAME, WebComponent);\n}\n\nfunction RenderCallback({ callback }: { callback: () => void }) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => callback(), []);\n return null;\n}\n"],"names":["Log","Provider","useEffect","Anvil1Providers","Anvil2Providers","BASENAME_TOKEN","EXPOSED_DEPENDENCIES_TOKEN","EXPOSED_INSTANCE_DEPENDENCIES_TOKEN","IS_WEB_COMPONENT_TOKEN","RENDER_ROOT_TOKEN","MFEDataContext","MFEMetadataContext","withCssInjector","EVENT_BUS_TOKEN","getStyleUrls","WEB_COMPONENT_NAME","HistoryManager","render","getElementName","getLDServiceToken","createLink","url","onLoad","element","document","createElement","href","rel","crossOrigin","onload","onerror","Placeholder","div","style","display","register","Component","light","options","WrappedComponent","WebComponent","HTMLElement","connectedCallback","root","isConnected","sharedDependenciesNames","styleUrls","styles","total","length","loaded","elements","shadowRoot","attachShadow","mode","portalElement","setAttribute","portal","body","appendChild","portalAnvilContainer","view","push","attachStyles","disconnectedCallback","remove","unmount","removeChild","host","undefined","onDispose","observedAttributes","attributeChangedCallback","withProviders","children","ldService","logService","historyManager","exposedDependencies","exposedInstanceDependencies","eventBus","basename","onReady","provide","entries","key","value","Object","handleLoad","node","urls","mfeData","dataset","JSON","parse","metadata","portalShadowRoot","rerender","singletons","useValue","filter","RenderCallback","callback","console","error","window","customElements","define"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/register.tsx"],"sourcesContent":["import { type LDService } from '@servicetitan/launchdarkly-service';\nimport { Log } from '@servicetitan/log-service';\nimport { Provider } from '@servicetitan/react-ioc';\nimport { ExposedDependencies } from '@servicetitan/startup-utils';\nimport { ComponentType, FC, ReactElement, useEffect } from 'react';\nimport { Anvil1Providers } from './anvil1-providers';\nimport { Anvil2Providers } from './anvil2-providers';\nimport {\n BASENAME_TOKEN,\n Entries,\n EXPOSED_DEPENDENCIES_TOKEN,\n EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n ExposedInstanceDependencies,\n IS_WEB_COMPONENT_TOKEN,\n IWebComponent,\n RENDER_ROOT_TOKEN,\n} from './common';\nimport { MFEDataContext } from './contexts/mfe-data-context';\nimport { MFEMetadataContext } from './contexts/mfe-metadata-context';\nimport { withCssInjector } from './css-injector';\nimport { EVENT_BUS_TOKEN, EventBus } from './event-bus';\nimport { getStyleUrls } from './get-style-urls';\nimport { WEB_COMPONENT_NAME } from './globals';\nimport { HistoryManager } from './history-manager';\nimport { render } from './render';\nimport { getElementName, getLDServiceToken } from './utils';\n\nfunction createLink(url: string, onLoad: () => void) {\n const element = document.createElement('link');\n\n element.href = url;\n element.rel = 'stylesheet';\n element.crossOrigin = 'anonymous';\n element.onload = onLoad;\n element.onerror = onLoad;\n\n return element;\n}\n\nconst Placeholder: FC = () => <div style={{ display: 'none' }} />;\n\nexport interface RegisterOptions {\n legacyRoot?: boolean;\n sharedDependenciesNames?: string[];\n}\n\nexport function register(Component: ComponentType, light: boolean, options?: RegisterOptions) {\n const WrappedComponent = withCssInjector(Component);\n\n class WebComponent extends HTMLElement implements IWebComponent {\n private root?: ShadowRoot;\n private portal?: ShadowRoot;\n private portalAnvilContainer?: HTMLDivElement;\n\n private styles: {\n total: number;\n loaded: number;\n elements: HTMLElement[];\n } = { total: 0, loaded: 0, elements: [] };\n\n private ldService?: LDService;\n private logService?: Log;\n private historyManager?: HistoryManager;\n private exposedDependencies?: ExposedDependencies;\n private exposedInstanceDependencies?: ExposedInstanceDependencies;\n private eventBus?: EventBus;\n private basename?: string;\n private onReady?: () => void;\n private onDispose?: () => void;\n private view?: ReturnType<typeof render>;\n\n connectedCallback() {\n /*\n * connectedCallback can be called when DOM element has moved\n * check that root is still connected to the DOM\n * if that's the case we don't need to reconnect MFE\n */\n if (this.root?.isConnected) {\n return;\n }\n const sharedDependenciesNames = options?.sharedDependenciesNames ?? [];\n const styleUrls = getStyleUrls(light, sharedDependenciesNames, this);\n\n this.styles = {\n total: styleUrls.length * 2,\n loaded: 0,\n elements: [],\n };\n\n this.root = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n /*\n * Portal shadow dom is created at the bottom of the body in order to be used as\n * the element for the design system components to attach modals and popups to.\n * This element is passed down the tree through context, and used within\n * the design system components.\n */\n const portalElement = document.createElement('div');\n portalElement.setAttribute(\n 'data-mfe-portal-name',\n getElementName({ WebComponent: WEB_COMPONENT_NAME! })\n );\n this.portal = document.body.appendChild(portalElement).attachShadow({ mode: 'open' });\n /*\n * Add element inside of portal so that Anvil 2 can attach modals and popups to it\n * since floating-ui does not support attaching straight to shadow dom\n */\n this.portalAnvilContainer = document.createElement('div');\n this.portal.appendChild(this.portalAnvilContainer);\n\n this.view = render(<Placeholder />, this.root, options);\n\n this.styles.elements.push(\n ...this.attachStyles(this.root, styleUrls),\n ...this.attachStyles(this.portal, styleUrls)\n );\n }\n\n disconnectedCallback() {\n if (!this.root || this.root.isConnected) {\n return;\n }\n for (const element of this.styles.elements) {\n element.remove();\n }\n\n this.view?.unmount();\n document.body?.removeChild(this.portal!.host);\n this.root = undefined;\n this.portal = undefined;\n this.portalAnvilContainer = undefined;\n\n this.onDispose?.();\n }\n\n // Observe changes to the data-mfe-data attribute so that we can re-render when it changes\n static get observedAttributes() {\n return ['data-mfe-data'];\n }\n\n attributeChangedCallback() {\n this.render();\n }\n\n provide = (entries: Entries) => {\n for (const [key, value] of Object.entries(entries)) {\n this[key as keyof IWebComponent] = value;\n }\n\n if (this.styles.loaded === this.styles.total) {\n this.render();\n }\n };\n\n private handleLoad = () => {\n this.styles.loaded++;\n\n if (this.styles.loaded === this.styles.total) {\n this.render();\n }\n };\n\n private attachStyles = (node: ShadowRoot, urls: string[]) => {\n const elements: HTMLElement[] = [];\n\n for (const url of urls) {\n const element = createLink(url, this.handleLoad);\n node.appendChild(element);\n elements.push(element);\n }\n\n return elements;\n };\n\n private withProviders(children: ReactElement) {\n return (\n <Anvil2Providers portalAnvilContainer={this.portalAnvilContainer!}>\n <Anvil1Providers root={this.root!} portal={this.portal!}>\n {children}\n </Anvil1Providers>\n </Anvil2Providers>\n );\n }\n\n private render = () => {\n /*\n * Check for this.root first, otherwise we get error when\n * attributeChangedCallback happens on load\n */\n if (this.root) {\n const mfeData = this.dataset.mfeData\n ? /*\n * Data was stringified in order to come through the data-mfe-data attribute\n * So we must JSON.parse it here to get an object back\n */\n JSON.parse(this.dataset.mfeData)\n : /*\n * If mfeData isn't there, then the Host may not be up to date with web-components\n * and is instead passing data through separate data-attributes, so we want to\n * spread all of those instead\n */\n { ...this.dataset };\n\n const metadata = {\n shadowRoot: this.root,\n portalShadowRoot: this.portal!,\n };\n\n this.view?.rerender(\n <Provider\n singletons={[\n { provide: IS_WEB_COMPONENT_TOKEN, useValue: true },\n { provide: RENDER_ROOT_TOKEN, useValue: this.root },\n ]}\n >\n <Provider\n singletons={[\n { provide: Log, useValue: this.logService },\n {\n provide: HistoryManager,\n useValue: this.historyManager,\n },\n {\n provide: EXPOSED_DEPENDENCIES_TOKEN,\n useValue: this.exposedDependencies,\n },\n {\n provide: EXPOSED_INSTANCE_DEPENDENCIES_TOKEN,\n useValue: this.exposedInstanceDependencies,\n },\n { provide: BASENAME_TOKEN, useValue: this.basename },\n { provide: EVENT_BUS_TOKEN, useValue: this.eventBus },\n { provide: getLDServiceToken(), useValue: this.ldService },\n ].filter(\n ({ provide, useValue }) =>\n useValue !== undefined && provide !== undefined\n )}\n >\n <MFEDataContext.Provider value={{ ...mfeData }}>\n <MFEMetadataContext.Provider value={metadata}>\n {this.withProviders(<WrappedComponent {...mfeData} />)}\n {this.onReady && <RenderCallback callback={this.onReady} />}\n </MFEMetadataContext.Provider>\n </MFEDataContext.Provider>\n </Provider>\n </Provider>\n );\n }\n };\n }\n\n if (!WEB_COMPONENT_NAME) {\n // eslint-disable-next-line no-console\n console.error('\"WEB_COMPONENT_NAME\" is not defined!');\n return;\n }\n\n window.customElements.define(WEB_COMPONENT_NAME, WebComponent);\n}\n\nfunction RenderCallback({ callback }: { callback: () => void }) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => callback(), []);\n return null;\n}\n"],"names":["Log","Provider","useEffect","Anvil1Providers","Anvil2Providers","BASENAME_TOKEN","EXPOSED_DEPENDENCIES_TOKEN","EXPOSED_INSTANCE_DEPENDENCIES_TOKEN","IS_WEB_COMPONENT_TOKEN","RENDER_ROOT_TOKEN","MFEDataContext","MFEMetadataContext","withCssInjector","EVENT_BUS_TOKEN","getStyleUrls","WEB_COMPONENT_NAME","HistoryManager","render","getElementName","getLDServiceToken","createLink","url","onLoad","element","document","createElement","href","rel","crossOrigin","onload","onerror","Placeholder","div","style","display","register","Component","light","options","WrappedComponent","WebComponent","HTMLElement","connectedCallback","root","isConnected","sharedDependenciesNames","styleUrls","styles","total","length","loaded","elements","shadowRoot","attachShadow","mode","portalElement","setAttribute","portal","body","appendChild","portalAnvilContainer","view","push","attachStyles","disconnectedCallback","remove","unmount","removeChild","host","undefined","onDispose","observedAttributes","attributeChangedCallback","withProviders","children","ldService","logService","historyManager","exposedDependencies","exposedInstanceDependencies","eventBus","basename","onReady","provide","entries","key","value","Object","handleLoad","node","urls","mfeData","dataset","JSON","parse","metadata","portalShadowRoot","rerender","singletons","useValue","filter","RenderCallback","callback","console","error","window","customElements","define"],"mappings":"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"}
@@ -6,9 +6,7 @@ function _define_property(obj, key, value) {
6
6
  configurable: true,
7
7
  writable: true
8
8
  });
9
- } else {
10
- obj[key] = value;
11
- }
9
+ } else obj[key] = value;
12
10
  return obj;
13
11
  }
14
12
  const MINUTE = 1000 * 60;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/ttl-cache.ts"],"sourcesContent":["const MINUTE = 1000 * 60;\nconst DEFAULT_TTL = 5 * MINUTE;\n\nexport interface TtlCacheOptions {\n ttlMs?: number;\n}\n\nexport class TtlCache<T = any> {\n private readonly data: Map<string, T>;\n private readonly timers: Map<string, ReturnType<typeof setTimeout>>;\n private readonly ttl: number;\n\n constructor({ ttlMs = DEFAULT_TTL }: TtlCacheOptions = {}) {\n if (ttlMs < 0) {\n throw new Error('default TTL must be zero or greater');\n }\n\n this.data = new Map();\n this.timers = new Map();\n this.ttl = ttlMs;\n }\n\n set(key: string, value: T, ttl?: number) {\n this.setTimeout(key, ttl ?? this.ttl);\n this.data.set(key, value);\n }\n\n get(key: string) {\n return this.data.get(key);\n }\n\n has(key: string) {\n return this.data.has(key);\n }\n\n delete(key: string) {\n this.cancelTimeout(key);\n this.data.delete(key);\n }\n\n clear() {\n this.data.clear();\n this.timers.forEach(value => clearTimeout(value));\n this.timers.clear();\n }\n\n private cancelTimeout(key: string) {\n const id = this.timers.get(key);\n if (id) {\n clearTimeout(id);\n this.timers.delete(key);\n }\n }\n\n private setTimeout(key: string, ttl: number) {\n this.cancelTimeout(key);\n if (ttl < 0) {\n return;\n }\n\n const id = setTimeout(() => this.delete(key), ttl);\n this.timers.set(key, id);\n }\n}\n"],"names":["MINUTE","DEFAULT_TTL","TtlCache","set","key","value","ttl","setTimeout","data","get","has","delete","cancelTimeout","clear","timers","forEach","clearTimeout","id","ttlMs","Error","Map"],"mappings":";;;;;;;;;;;;;AAAA,MAAMA,SAAS,OAAO;AACtB,MAAMC,cAAc,IAAID;AAMxB,OAAO,MAAME;IAeTC,IAAIC,GAAW,EAAEC,KAAQ,EAAEC,GAAY,EAAE;QACrC,IAAI,CAACC,UAAU,CAACH,KAAKE,gBAAAA,iBAAAA,MAAO,IAAI,CAACA,GAAG;QACpC,IAAI,CAACE,IAAI,CAACL,GAAG,CAACC,KAAKC;IACvB;IAEAI,IAAIL,GAAW,EAAE;QACb,OAAO,IAAI,CAACI,IAAI,CAACC,GAAG,CAACL;IACzB;IAEAM,IAAIN,GAAW,EAAE;QACb,OAAO,IAAI,CAACI,IAAI,CAACE,GAAG,CAACN;IACzB;IAEAO,OAAOP,GAAW,EAAE;QAChB,IAAI,CAACQ,aAAa,CAACR;QACnB,IAAI,CAACI,IAAI,CAACG,MAAM,CAACP;IACrB;IAEAS,QAAQ;QACJ,IAAI,CAACL,IAAI,CAACK,KAAK;QACf,IAAI,CAACC,MAAM,CAACC,OAAO,CAACV,CAAAA,QAASW,aAAaX;QAC1C,IAAI,CAACS,MAAM,CAACD,KAAK;IACrB;IAEQD,cAAcR,GAAW,EAAE;QAC/B,MAAMa,KAAK,IAAI,CAACH,MAAM,CAACL,GAAG,CAACL;QAC3B,IAAIa,IAAI;YACJD,aAAaC;YACb,IAAI,CAACH,MAAM,CAACH,MAAM,CAACP;QACvB;IACJ;IAEQG,WAAWH,GAAW,EAAEE,GAAW,EAAE;QACzC,IAAI,CAACM,aAAa,CAACR;QACnB,IAAIE,MAAM,GAAG;YACT;QACJ;QAEA,MAAMW,KAAKV,WAAW,IAAM,IAAI,CAACI,MAAM,CAACP,MAAME;QAC9C,IAAI,CAACQ,MAAM,CAACX,GAAG,CAACC,KAAKa;IACzB;IAlDA,YAAY,EAAEC,QAAQjB,WAAW,EAAmB,GAAG,CAAC,CAAC,CAAE;QAJ3D,uBAAiBO,QAAjB,KAAA;QACA,uBAAiBM,UAAjB,KAAA;QACA,uBAAiBR,OAAjB,KAAA;QAGI,IAAIY,QAAQ,GAAG;YACX,MAAM,IAAIC,MAAM;QACpB;QAEA,IAAI,CAACX,IAAI,GAAG,IAAIY;QAChB,IAAI,CAACN,MAAM,GAAG,IAAIM;QAClB,IAAI,CAACd,GAAG,GAAGY;IACf;AA2CJ"}
1
+ {"version":3,"sources":["../../src/utils/ttl-cache.ts"],"sourcesContent":["const MINUTE = 1000 * 60;\nconst DEFAULT_TTL = 5 * MINUTE;\n\nexport interface TtlCacheOptions {\n ttlMs?: number;\n}\n\nexport class TtlCache<T = any> {\n private readonly data: Map<string, T>;\n private readonly timers: Map<string, ReturnType<typeof setTimeout>>;\n private readonly ttl: number;\n\n constructor({ ttlMs = DEFAULT_TTL }: TtlCacheOptions = {}) {\n if (ttlMs < 0) {\n throw new Error('default TTL must be zero or greater');\n }\n\n this.data = new Map();\n this.timers = new Map();\n this.ttl = ttlMs;\n }\n\n set(key: string, value: T, ttl?: number) {\n this.setTimeout(key, ttl ?? this.ttl);\n this.data.set(key, value);\n }\n\n get(key: string) {\n return this.data.get(key);\n }\n\n has(key: string) {\n return this.data.has(key);\n }\n\n delete(key: string) {\n this.cancelTimeout(key);\n this.data.delete(key);\n }\n\n clear() {\n this.data.clear();\n this.timers.forEach(value => clearTimeout(value));\n this.timers.clear();\n }\n\n private cancelTimeout(key: string) {\n const id = this.timers.get(key);\n if (id) {\n clearTimeout(id);\n this.timers.delete(key);\n }\n }\n\n private setTimeout(key: string, ttl: number) {\n this.cancelTimeout(key);\n if (ttl < 0) {\n return;\n }\n\n const id = setTimeout(() => this.delete(key), ttl);\n this.timers.set(key, id);\n }\n}\n"],"names":["MINUTE","DEFAULT_TTL","TtlCache","set","key","value","ttl","setTimeout","data","get","has","delete","cancelTimeout","clear","timers","forEach","clearTimeout","id","ttlMs","Error","Map"],"mappings":";;;;;;;;;;;AAAA,MAAMA,SAAS,OAAO;AACtB,MAAMC,cAAc,IAAID;AAMxB,OAAO,MAAME;IAeTC,IAAIC,GAAW,EAAEC,KAAQ,EAAEC,GAAY,EAAE;QACrC,IAAI,CAACC,UAAU,CAACH,KAAKE,gBAAAA,iBAAAA,MAAO,IAAI,CAACA,GAAG;QACpC,IAAI,CAACE,IAAI,CAACL,GAAG,CAACC,KAAKC;IACvB;IAEAI,IAAIL,GAAW,EAAE;QACb,OAAO,IAAI,CAACI,IAAI,CAACC,GAAG,CAACL;IACzB;IAEAM,IAAIN,GAAW,EAAE;QACb,OAAO,IAAI,CAACI,IAAI,CAACE,GAAG,CAACN;IACzB;IAEAO,OAAOP,GAAW,EAAE;QAChB,IAAI,CAACQ,aAAa,CAACR;QACnB,IAAI,CAACI,IAAI,CAACG,MAAM,CAACP;IACrB;IAEAS,QAAQ;QACJ,IAAI,CAACL,IAAI,CAACK,KAAK;QACf,IAAI,CAACC,MAAM,CAACC,OAAO,CAACV,CAAAA,QAASW,aAAaX;QAC1C,IAAI,CAACS,MAAM,CAACD,KAAK;IACrB;IAEQD,cAAcR,GAAW,EAAE;QAC/B,MAAMa,KAAK,IAAI,CAACH,MAAM,CAACL,GAAG,CAACL;QAC3B,IAAIa,IAAI;YACJD,aAAaC;YACb,IAAI,CAACH,MAAM,CAACH,MAAM,CAACP;QACvB;IACJ;IAEQG,WAAWH,GAAW,EAAEE,GAAW,EAAE;QACzC,IAAI,CAACM,aAAa,CAACR;QACnB,IAAIE,MAAM,GAAG;YACT;QACJ;QAEA,MAAMW,KAAKV,WAAW,IAAM,IAAI,CAACI,MAAM,CAACP,MAAME;QAC9C,IAAI,CAACQ,MAAM,CAACX,GAAG,CAACC,KAAKa;IACzB;IAlDA,YAAY,EAAEC,QAAQjB,WAAW,EAAmB,GAAG,CAAC,CAAC,CAAE;QAJ3D,uBAAiBO,QAAjB,KAAA;QACA,uBAAiBM,UAAjB,KAAA;QACA,uBAAiBR,OAAjB,KAAA;QAGI,IAAIY,QAAQ,GAAG;YACX,MAAM,IAAIC,MAAM;QACpB;QAEA,IAAI,CAACX,IAAI,GAAG,IAAIY;QAChB,IAAI,CAACN,MAAM,GAAG,IAAIM;QAClB,IAAI,CAACd,GAAG,GAAGY;IACf;AA2CJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/web-components",
3
- "version": "37.0.2",
3
+ "version": "38.1.0",
4
4
  "description": "Framework to build, register, and load Microfrontends into host applications",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/uikit/web-components",
6
6
  "repository": {
@@ -27,18 +27,18 @@
27
27
  "src"
28
28
  ],
29
29
  "dependencies": {
30
- "@servicetitan/error-boundary": "37.0.2",
31
- "@servicetitan/startup-utils": "37.0.2",
30
+ "@servicetitan/error-boundary": "38.1.0",
31
+ "@servicetitan/startup-utils": "38.1.0",
32
32
  "lodash.get": "~4.4.2",
33
33
  "mitt": "~3.0.1",
34
34
  "semver": "~7.8.5"
35
35
  },
36
36
  "devDependencies": {
37
- "@servicetitan/anvil2": "^3.4.1",
37
+ "@servicetitan/anvil2": "^3.8.0",
38
38
  "@servicetitan/design-system": "~14.5.3",
39
- "@servicetitan/launchdarkly-service": "37.0.2",
40
- "@servicetitan/log-service": "37.0.2",
41
- "@servicetitan/react-ioc": "37.0.2",
39
+ "@servicetitan/launchdarkly-service": "38.1.0",
40
+ "@servicetitan/log-service": "38.1.0",
41
+ "@servicetitan/react-ioc": "38.1.0",
42
42
  "@testing-library/dom": "^10.4.1",
43
43
  "@testing-library/jest-dom": "^6.9.1",
44
44
  "@testing-library/react": "^16.3.2",
@@ -56,9 +56,9 @@
56
56
  "peerDependencies": {
57
57
  "@servicetitan/anvil2": ">=1.5.0",
58
58
  "@servicetitan/design-system": ">=14.5.3",
59
- "@servicetitan/launchdarkly-service": "37.0.2",
60
- "@servicetitan/log-service": "37.0.2",
61
- "@servicetitan/react-ioc": "37.0.2",
59
+ "@servicetitan/launchdarkly-service": "38.1.0",
60
+ "@servicetitan/log-service": "38.1.0",
61
+ "@servicetitan/react-ioc": "38.1.0",
62
62
  "history": "~4.10.1",
63
63
  "react": ">=17.0.2",
64
64
  "react-dom": ">=17.0.2"
@@ -91,5 +91,5 @@
91
91
  }
92
92
  }
93
93
  },
94
- "gitHead": "d30a9eb850b4bdb98b6af7cc06fade1359fcc943"
94
+ "gitHead": "e8c601a26ad49ca0d6b0b84a9f530f3242d53c7f"
95
95
  }
@@ -11,18 +11,12 @@ const allowListedEvents = [
11
11
  'blink',
12
12
  'CLOSE_COMPONENT',
13
13
  'CLOSE_JOB_EDIT_FLYOUT',
14
- 'close-troubleshooter',
15
14
  'company-profile-request-save',
16
15
  'company-profile-saved-error',
17
16
  'company-profile-saved',
18
17
  'dismiss-discrepancy-event',
19
18
  'dismiss-discrepancy-map-event',
20
19
  'dispatch-JobEditFlyout-fetchData',
21
- 'dispatch-pro-query-toggle-data',
22
- 'dispatch-pro-recieve-toggle-data',
23
- 'dispatch-pro-set-job-enabled',
24
- 'dispatchpro-fetchStatus',
25
- 'dispatchpro-open-issuereporter',
26
20
  'DRAWER_CREATED_CUSTOMER',
27
21
  'employees-emails-processed',
28
22
  'employees-request-save',
@@ -48,7 +42,6 @@ const allowListedEvents = [
48
42
  'setLabel',
49
43
  'SHOW_POP_UP_MESSAGE',
50
44
  'TEAMS_SELECTED',
51
- 'tech-is-dispatch-pro-change',
52
45
  'technicians-emails-processed',
53
46
  'technicians-request-save',
54
47
  'technicians-saved-error',
package/src/event-bus.ts CHANGED
@@ -181,18 +181,12 @@ const allowListedEvents = new Set([
181
181
  'blink',
182
182
  'CLOSE_COMPONENT',
183
183
  'CLOSE_JOB_EDIT_FLYOUT',
184
- 'close-troubleshooter',
185
184
  'company-profile-request-save',
186
185
  'company-profile-saved-error',
187
186
  'company-profile-saved',
188
187
  'dismiss-discrepancy-event',
189
188
  'dismiss-discrepancy-map-event',
190
189
  'dispatch-JobEditFlyout-fetchData',
191
- 'dispatch-pro-query-toggle-data',
192
- 'dispatch-pro-recieve-toggle-data',
193
- 'dispatch-pro-set-job-enabled',
194
- 'dispatchpro-fetchStatus',
195
- 'dispatchpro-open-issuereporter',
196
190
  'DRAWER_CREATED_CUSTOMER',
197
191
  'employees-emails-processed',
198
192
  'employees-request-save',
@@ -218,7 +212,6 @@ const allowListedEvents = new Set([
218
212
  'setLabel',
219
213
  'SHOW_POP_UP_MESSAGE',
220
214
  'TEAMS_SELECTED',
221
- 'tech-is-dispatch-pro-change',
222
215
  'technicians-emails-processed',
223
216
  'technicians-request-save',
224
217
  'technicians-saved-error',