@leanbase-giangnd/js 0.0.7 → 0.1.1

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/src/types.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { FeatureFlagValue, JsonType, PostHogCoreOptions } from '@posthog/core'
2
2
  import { KnownUnsafeEditableEvent } from '@posthog/core'
3
+ import type { recordOptions } from './extensions/replay/types/rrweb'
3
4
  import { Leanbase } from './leanbase'
4
5
 
5
6
  export const COPY_AUTOCAPTURE_EVENT = '$copy_autocapture'
@@ -101,10 +102,14 @@ export interface LeanbaseConfig extends Partial<PostHogCoreOptions> {
101
102
  */
102
103
  host?: string
103
104
  /**
104
- * Backwards-compatible alias expected by replay code
105
+ * API host (alias) used by some modules; kept for compatibility with upstream
105
106
  */
106
- api_host: string
107
- ui_host?: string | null
107
+ api_host?: string
108
+
109
+ /**
110
+ * UI host override
111
+ */
112
+ ui_host?: string
108
113
 
109
114
  /**
110
115
  * The token for your Leanbase project.
@@ -127,6 +132,22 @@ export interface LeanbaseConfig extends Partial<PostHogCoreOptions> {
127
132
  */
128
133
  autocapture: boolean | AutocaptureConfig
129
134
 
135
+ /**
136
+ * Enables or disables session recording. When true, session recording is disabled on the client.
137
+ * @default false
138
+ */
139
+ disable_session_recording?: boolean
140
+
141
+ /**
142
+ * Session recording configuration
143
+ */
144
+ session_recording?: SessionRecordingOptions
145
+
146
+ /**
147
+ * Enable console.log recording for session replay (can be controlled remotely). Undefined defers to server.
148
+ */
149
+ enable_recording_console_log?: boolean
150
+
130
151
  /**
131
152
  * Determines whether Leanbase should capture pageview events automatically.
132
153
  * Can be:
@@ -138,6 +159,11 @@ export interface LeanbaseConfig extends Partial<PostHogCoreOptions> {
138
159
  */
139
160
  capture_pageview: boolean | 'history_change'
140
161
 
162
+ /**
163
+ * Enables performance capture. When true, network performance timing can be forwarded to replay when enabled.
164
+ */
165
+ capture_performance?: boolean | { network_timing?: boolean }
166
+
141
167
  /**
142
168
  * Determines the session idle timeout in seconds.
143
169
  * Any new event that's happened after this timeout will create a new session.
@@ -193,26 +219,6 @@ export interface LeanbaseConfig extends Partial<PostHogCoreOptions> {
193
219
  */
194
220
  persistence_name: string
195
221
 
196
- /**
197
- * Session recording options (browser parity)
198
- */
199
- session_recording: SessionRecordingOptions
200
-
201
- /**
202
- * Backwards-compatible flag to disable session recording
203
- */
204
- disable_session_recording?: boolean
205
-
206
- /**
207
- * Controls performance capture options used by replay/network tracing
208
- */
209
- capture_performance?: boolean | { network_timing?: boolean; web_vitals?: boolean }
210
-
211
- /**
212
- * Enable recording of console logs for session replay
213
- */
214
- enable_recording_console_log?: boolean
215
-
216
222
  /**
217
223
  * Prevent autocapture from capturing any attribute names on elements.
218
224
  *
@@ -355,15 +361,81 @@ export interface LeanbaseConfig extends Partial<PostHogCoreOptions> {
355
361
  * @param instance - The Leanbase instance that has been loaded.
356
362
  */
357
363
  loaded: (instance: Leanbase) => void
364
+ }
365
+
366
+ export type SessionRecordingCanvasOptions = {
367
+ recordCanvas?: boolean | null
368
+ canvasFps?: number | null
369
+ canvasQuality?: string | null
370
+ }
358
371
 
372
+ export interface SessionRecordingOptions {
373
+ blockClass?: string | RegExp
374
+ blockSelector?: string | null
375
+ ignoreClass?: string | RegExp
376
+ maskTextClass?: string | RegExp
377
+ maskTextSelector?: string | null
378
+ maskTextFn?: ((text: string, element?: HTMLElement) => string) | null
379
+ maskAllInputs?: boolean
380
+ maskInputOptions?: recordOptions['maskInputOptions']
381
+ maskInputFn?: ((text: string, element?: HTMLElement) => string) | null
382
+ slimDOMOptions?: recordOptions['slimDOMOptions']
383
+ collectFonts?: boolean
384
+ inlineStylesheet?: boolean
385
+ recordCrossOriginIframes?: boolean
386
+ recordHeaders?: boolean
387
+ recordBody?: boolean
388
+ captureCanvas?: SessionRecordingCanvasOptions
389
+ maskCapturedNetworkRequestFn?: ((data: CapturedNetworkRequest) => CapturedNetworkRequest | null | undefined) | null
390
+ maskNetworkRequestFn?: ((data: NetworkRequest) => NetworkRequest | null | undefined) | null
391
+ full_snapshot_interval_millis?: number
392
+ compress_events?: boolean
393
+ session_idle_threshold_ms?: number
394
+ __mutationThrottlerRefillRate?: number
395
+ __mutationThrottlerBucketSize?: number
359
396
  /**
360
- * Hook to allow preparing external dependency stylesheet before injection
397
+ * Force-enable session recording locally even if remote config disables it.
398
+ * Useful for dev/testing when the backend has sessionRecording set to false.
361
399
  */
362
- prepare_external_dependency_stylesheet?: (stylesheet: HTMLStyleElement) => HTMLStyleElement | null | undefined
400
+ forceClientRecording?: boolean
401
+ }
402
+
403
+ export type SessionRecordingPersistedConfig = Omit<
404
+ SessionRecordingRemoteConfig,
405
+ | 'recordCanvas'
406
+ | 'canvasFps'
407
+ | 'canvasQuality'
408
+ | 'networkPayloadCapture'
409
+ | 'sampleRate'
410
+ | 'minimumDurationMilliseconds'
411
+ > & {
412
+ enabled: boolean
413
+ networkPayloadCapture: SessionRecordingRemoteConfig['networkPayloadCapture'] & {
414
+ capturePerformance: RemoteConfig['capturePerformance']
415
+ }
416
+ canvasRecording: {
417
+ enabled: SessionRecordingRemoteConfig['recordCanvas']
418
+ fps: SessionRecordingRemoteConfig['canvasFps']
419
+ quality: SessionRecordingRemoteConfig['canvasQuality']
420
+ }
421
+ sampleRate: number | null
422
+ minimumDurationMilliseconds: number | null | undefined
363
423
  }
364
424
 
365
- // Backwards-compatible alias expected by replay code
366
- export type PostHogConfig = LeanbaseConfig
425
+ export type SessionRecordingRemoteConfig = SessionRecordingCanvasOptions & {
426
+ endpoint?: string
427
+ consoleLogRecordingEnabled?: boolean
428
+ sampleRate?: string | null
429
+ minimumDurationMilliseconds?: number
430
+ linkedFlag?: string | { flag: string; variant: string } | null
431
+ networkPayloadCapture?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders' | 'payloadHostDenyList'>
432
+ masking?: Pick<SessionRecordingOptions, 'maskAllInputs' | 'maskTextSelector' | 'blockSelector'>
433
+ urlTriggers?: SessionRecordingUrlTrigger[]
434
+ scriptConfig?: { script?: string | undefined }
435
+ urlBlocklist?: SessionRecordingUrlTrigger[]
436
+ eventTriggers?: string[]
437
+ triggerMatchType?: 'any' | 'all'
438
+ }
367
439
 
368
440
  export interface RageclickConfig {
369
441
  /**
@@ -499,6 +571,11 @@ export interface RemoteConfig {
499
571
  */
500
572
  autocaptureExceptions?: boolean | { endpoint?: string }
501
573
 
574
+ /**
575
+ * Session recording configuration options
576
+ */
577
+ sessionRecording?: SessionRecordingRemoteConfig | false
578
+
502
579
  /**
503
580
  * @deprecated, moved to toolbarParams
504
581
  */
@@ -509,11 +586,6 @@ export interface RemoteConfig {
509
586
  */
510
587
  isAuthenticated: boolean
511
588
 
512
- /**
513
- * Session recording remote config (when available)
514
- */
515
- sessionRecording?: SessionRecordingRemoteConfig
516
-
517
589
  /**
518
590
  * List of site apps with their IDs and URLs
519
591
  */
@@ -604,34 +676,16 @@ export interface RequestWithOptions {
604
676
  }
605
677
  }
606
678
 
607
- export type DeadClicksAutoCaptureConfig = {
608
- scroll_threshold_ms?: number
609
- selection_change_threshold_ms?: number
610
- mutation_threshold_ms?: number
611
- __onCapture?: ((click: any, properties: Properties) => void) | undefined
612
- } & Pick<AutocaptureConfig, 'element_attribute_ignorelist'>
613
-
614
- export type ExternalIntegrationKind = 'intercom' | 'crispChat'
615
-
616
- export type SiteAppLoader = {
617
- id: string
618
- init: (config: { posthog: any; callback: (success: boolean) => void }) => {
619
- processEvent?: (globals: any) => void
620
- }
621
- }
622
-
623
- // Network / replay types (copied from browser package) -------------------------------------------------
624
679
  export type InitiatorType =
625
680
  | 'audio'
626
681
  | 'beacon'
627
682
  | 'body'
628
683
  | 'css'
629
- | 'early-hint'
684
+ | 'early-hints'
630
685
  | 'embed'
631
686
  | 'fetch'
632
687
  | 'frame'
633
688
  | 'iframe'
634
- | 'icon'
635
689
  | 'image'
636
690
  | 'img'
637
691
  | 'input'
@@ -644,8 +698,24 @@ export type InitiatorType =
644
698
  | 'video'
645
699
  | 'xmlhttprequest'
646
700
 
647
- // we mirror PerformanceEntry since we read into this type from a PerformanceObserver,
648
- // but we don't want to inherit its readonly-iness
701
+ export type NetworkRecordOptions = {
702
+ initiatorTypes?: InitiatorType[]
703
+ maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined
704
+ recordHeaders?: boolean | { request: boolean; response: boolean }
705
+ recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }
706
+ recordInitialRequests?: boolean
707
+ recordPerformance?: boolean
708
+ performanceEntryTypeToObserve: string[]
709
+ payloadSizeLimitBytes: number
710
+ payloadHostDenyList?: string[]
711
+ }
712
+
713
+ export type NetworkRequest = {
714
+ url: string
715
+ }
716
+
717
+ export type Headers = Record<string, any>
718
+
649
719
  type Writable<T> = { -readonly [P in keyof T]: T[P] }
650
720
 
651
721
  export type CapturedNetworkRequest = Writable<Omit<PerformanceEntry, 'toJSON'>> & {
@@ -660,35 +730,14 @@ export type CapturedNetworkRequest = Writable<Omit<PerformanceEntry, 'toJSON'>>
660
730
  requestBody?: string | null
661
731
  responseHeaders?: Headers
662
732
  responseBody?: string | null
663
- // was this captured before fetch/xhr could have been wrapped
664
733
  isInitial?: boolean
665
734
  }
666
735
 
667
- export type Headers = Record<string, string>
668
-
669
- export type NetworkRecordOptions = {
670
- initiatorTypes?: InitiatorType[]
671
- maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined
672
- recordHeaders?: boolean | { request: boolean; response: boolean }
673
- recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }
674
- recordInitialRequests?: boolean
675
- recordPerformance?: boolean
676
- performanceEntryTypeToObserve: string[]
677
- payloadSizeLimitBytes: number
678
- payloadHostDenyList?: string[]
679
- }
680
-
681
- /** @deprecated - use CapturedNetworkRequest instead */
682
- export type NetworkRequest = {
736
+ export interface SessionRecordingUrlTrigger {
683
737
  url: string
738
+ matching: 'regex'
684
739
  }
685
740
 
686
- export type SessionIdChangedCallback = (
687
- sessionId: string,
688
- windowId: string | null | undefined,
689
- changeReason?: { noSessionId: boolean; activityTimeout: boolean; sessionPastMaximumLength: boolean }
690
- ) => void
691
-
692
741
  export type SessionStartReason =
693
742
  | 'sampling_overridden'
694
743
  | 'recording_initialized'
@@ -699,47 +748,11 @@ export type SessionStartReason =
699
748
  | 'url_trigger_matched'
700
749
  | 'event_trigger_matched'
701
750
 
702
- export type SessionRecordingCanvasOptions = {
703
- recordCanvas?: boolean | null
704
- canvasFps?: number | null
705
- canvasQuality?: string | null
706
- }
707
-
708
- export type SessionRecordingOptions = {
709
- __mutationThrottlerBucketSize?: number
710
- __mutationThrottlerRefillRate?: number
711
- blockClass?: string | RegExp
712
- blockSelector?: string | null
713
- captureCanvas?: SessionRecordingCanvasOptions
714
- collectFonts?: boolean
715
- compress_events?: boolean
716
- full_snapshot_interval_millis?: number
717
- ignoreClass?: string | RegExp
718
- inlineStylesheet?: boolean
719
- maskAllInputs?: boolean
720
- maskCapturedNetworkRequestFn?: ((data: CapturedNetworkRequest) => CapturedNetworkRequest | null | undefined) | null
721
- maskInputFn?: ((text: string, element?: HTMLElement) => string) | null
722
- maskInputOptions?: any
723
- maskNetworkRequestFn?: ((data: NetworkRequest) => NetworkRequest | null | undefined) | null
724
- maskTextClass?: string | RegExp
725
- maskTextFn?: ((text: string, element?: HTMLElement) => string) | null
726
- maskTextSelector?: string | null
727
- recordBody?: boolean
728
- recordCrossOriginIframes?: boolean
729
- recordHeaders?: boolean
730
- session_idle_threshold_ms?: number
731
- slimDOMOptions?: any
732
- }
733
-
734
- export type SessionRecordingPersistedConfig = any
735
- export type SessionRecordingRemoteConfig = any
736
-
737
- export type FlagVariant = { flag: string; variant: string }
738
-
739
- export interface SessionRecordingUrlTrigger {
740
- url: string
741
- matching: 'regex'
742
- }
751
+ export type SessionIdChangedCallback = (
752
+ sessionId: string,
753
+ windowId: string | null | undefined,
754
+ changeReason?: { noSessionId: boolean; activityTimeout: boolean; sessionPastMaximumLength: boolean }
755
+ ) => void
743
756
 
744
757
  export type LeanbasegCaptureOptions = {
745
758
  /** If provided overrides the auto-generated event ID */
@@ -1,64 +1,26 @@
1
- import Config from '../config'
2
- import { isUndefined } from '@posthog/core'
3
- import { assignableWindow, window } from './globals'
4
- import { logger as leanbaseLogger } from '../leanbase-logger'
5
- import type { Logger } from '@posthog/core'
1
+ import { logger as baseLogger } from '../leanbase-logger'
6
2
 
7
- type PosthogJsLogger = Omit<Logger, 'createLogger'> & {
8
- _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => void
3
+ export type PosthogJsLogger = {
4
+ info: (...args: any[]) => void
5
+ warn: (...args: any[]) => void
6
+ error: (...args: any[]) => void
7
+ critical: (...args: any[]) => void
9
8
  uninitializedWarning: (methodName: string) => void
10
9
  createLogger: (prefix: string) => PosthogJsLogger
11
10
  }
12
11
 
13
12
  const _createLogger = (prefix: string): PosthogJsLogger => {
14
- const logger: PosthogJsLogger = {
15
- _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => {
16
- if (
17
- window &&
18
- (Config.DEBUG || assignableWindow.POSTHOG_DEBUG) &&
19
- !isUndefined(window.console) &&
20
- window.console
21
- ) {
22
- const consoleLog =
23
- '__rrweb_original__' in window.console[level]
24
- ? (window.console[level] as any)['__rrweb_original__']
25
- : window.console[level]
26
-
27
- // eslint-disable-next-line no-console
28
- consoleLog(prefix, ...args)
29
- }
30
- },
31
-
32
- info: (...args: any[]) => {
33
- logger._log('log', ...args)
34
- },
35
-
36
- warn: (...args: any[]) => {
37
- logger._log('warn', ...args)
38
- },
39
-
40
- error: (...args: any[]) => {
41
- logger._log('error', ...args)
42
- },
43
-
44
- critical: (...args: any[]) => {
45
- // Critical errors are always logged to the console
46
- // eslint-disable-next-line no-console
47
- console.error(prefix, ...args)
48
- },
49
-
13
+ return {
14
+ info: (...args: any[]) => baseLogger.info(prefix, ...args),
15
+ warn: (...args: any[]) => baseLogger.warn(prefix, ...args),
16
+ error: (...args: any[]) => baseLogger.error(prefix, ...args),
17
+ critical: (...args: any[]) => baseLogger.critical(prefix, ...args),
50
18
  uninitializedWarning: (methodName: string) => {
51
- logger.error(`You must initialize Leanbase before calling ${methodName}`)
19
+ baseLogger.error(prefix, `You must initialize Leanbase before calling ${methodName}`)
52
20
  },
53
-
54
21
  createLogger: (additionalPrefix: string) => _createLogger(`${prefix} ${additionalPrefix}`),
55
22
  }
56
- return logger
57
23
  }
58
24
 
59
25
  export const logger = _createLogger('[Leanbase]')
60
-
61
- export const createLogger = logger.createLogger
62
-
63
- // Provide fallback leanbase logger methods for code that expects a simple logger
64
- export const fallbackLogger = leanbaseLogger
26
+ export const createLogger = _createLogger
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '0.0.7'
1
+ export const version = '0.1.1'
@@ -1,5 +0,0 @@
1
- files in here are intended for the lazy loaded portion of replay
2
-
3
- you aren't supposed to import them from outside the entrypoint file
4
-
5
- they could cause an increase in bundle size
@@ -1,27 +0,0 @@
1
- import { PostHog } from '../../posthog-core'
2
- import { createLogger } from '../../utils/logger'
3
- import { isUndefined, isNull } from '@posthog/core'
4
-
5
- const logger = createLogger('[Stylesheet Loader]')
6
-
7
- export const prepareStylesheet = (document: Document, innerText: string, posthog?: PostHog) => {
8
- // Forcing the existence of `document` requires this function to be called in a browser environment
9
- let stylesheet: HTMLStyleElement | null = document.createElement('style')
10
- stylesheet.innerText = innerText
11
-
12
- if (posthog?.config?.prepare_external_dependency_stylesheet) {
13
- const result = posthog.config.prepare_external_dependency_stylesheet(stylesheet)
14
- if (!isUndefined(result) && !isNull(result)) {
15
- stylesheet = result
16
- } else {
17
- stylesheet = null
18
- }
19
- }
20
-
21
- if (!stylesheet) {
22
- logger.error('prepare_external_dependency_stylesheet returned null')
23
- return null
24
- }
25
-
26
- return stylesheet
27
- }
@@ -1,12 +0,0 @@
1
- import type { Leanbase } from './leanbase'
2
-
3
- // PostHog shim: Leanbase runtime with a widened onFeatureFlags signature
4
- export type PostHog = Leanbase & {
5
- onFeatureFlags?: (cb: (...args: any[]) => void) => () => void
6
- consent?: {
7
- isOptedOut?: () => boolean
8
- }
9
- }
10
-
11
- export { default as Config } from './config'
12
- export { logger } from './utils/logger'