@01.software/sdk 0.56.1 → 0.65.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/CHANGELOG.md +192 -0
- package/README.md +174 -91
- package/dist/client.cjs +136 -7
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +6 -6
- package/dist/client.d.ts +6 -6
- package/dist/client.js +136 -7
- package/dist/client.js.map +1 -1
- package/dist/{collection-client-DxuBDso_.d.cts → collection-client-B7rsTtVj.d.cts} +6 -6
- package/dist/{collection-client-Bmr53saa.d.ts → collection-client-C2sMvfme.d.ts} +6 -6
- package/dist/{const-Cv1DCsp6.d.cts → const-CRxPTDGt.d.ts} +2 -2
- package/dist/{const-BKUqg96Q.d.ts → const-D6ZRQLxI.d.cts} +2 -2
- package/dist/{index-DFHLLqYu.d.ts → index-1auUEYrl.d.ts} +3 -3
- package/dist/{index-CGsT4AQ8.d.cts → index-Bbpf5t-l.d.cts} +3 -3
- package/dist/index.cjs +139 -205
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -9
- package/dist/index.d.ts +15 -9
- package/dist/index.js +139 -205
- package/dist/index.js.map +1 -1
- package/dist/{payload-types-Bk-duc5k.d.cts → payload-types-BnIET0xU.d.cts} +262 -328
- package/dist/{payload-types-Bk-duc5k.d.ts → payload-types-BnIET0xU.d.ts} +262 -328
- package/dist/query.cjs +48 -2
- package/dist/query.cjs.map +1 -1
- package/dist/query.d.cts +5 -5
- package/dist/query.d.ts +5 -5
- package/dist/query.js +48 -2
- package/dist/query.js.map +1 -1
- package/dist/realtime.d.cts +2 -2
- package/dist/realtime.d.ts +2 -2
- package/dist/server.cjs +459 -7
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +13 -8
- package/dist/server.d.ts +13 -8
- package/dist/server.js +459 -7
- package/dist/server.js.map +1 -1
- package/dist/{types-D4mjGFj4.d.ts → types-D1y4TgQm.d.ts} +2 -2
- package/dist/{types-CEK8uTvU.d.ts → types-DnRC3nLG.d.ts} +256 -9
- package/dist/{types-CNdpj2fI.d.cts → types-Dp1oYpD3.d.cts} +2 -2
- package/dist/{types-Dhk5NX7Z.d.cts → types-Dzn0LD2N.d.cts} +256 -9
- package/dist/ui/form.d.cts +1 -1
- package/dist/ui/form.d.ts +1 -1
- package/dist/ui/video.cjs +4 -2
- package/dist/ui/video.cjs.map +1 -1
- package/dist/ui/video.d.cts +4 -2
- package/dist/ui/video.d.ts +4 -2
- package/dist/ui/video.js +4 -2
- package/dist/ui/video.js.map +1 -1
- package/dist/webhook.d.cts +5 -5
- package/dist/webhook.d.ts +5 -5
- package/package.json +8 -28
- package/dist/analytics/react.cjs +0 -344
- package/dist/analytics/react.cjs.map +0 -1
- package/dist/analytics/react.d.cts +0 -24
- package/dist/analytics/react.d.ts +0 -24
- package/dist/analytics/react.js +0 -319
- package/dist/analytics/react.js.map +0 -1
- package/dist/analytics.cjs +0 -238
- package/dist/analytics.cjs.map +0 -1
- package/dist/analytics.d.cts +0 -39
- package/dist/analytics.d.ts +0 -39
- package/dist/analytics.js +0 -215
- package/dist/analytics.js.map +0 -1
package/dist/ui/video.js
CHANGED
|
@@ -55,6 +55,7 @@ function resolvePoster(props) {
|
|
|
55
55
|
if (url) return url;
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
+
if (props.streamUrl) return void 0;
|
|
58
59
|
const playbackId = resolvePlaybackId(props.video);
|
|
59
60
|
if (!playbackId) return void 0;
|
|
60
61
|
return getVideoThumbnail(playbackId, {
|
|
@@ -74,6 +75,7 @@ var VideoPlayer = forwardRef(
|
|
|
74
75
|
function VideoPlayer2(props, ref) {
|
|
75
76
|
const {
|
|
76
77
|
video,
|
|
78
|
+
streamUrl,
|
|
77
79
|
accentColor,
|
|
78
80
|
primaryColor,
|
|
79
81
|
secondaryColor,
|
|
@@ -104,7 +106,7 @@ var VideoPlayer = forwardRef(
|
|
|
104
106
|
const poster = resolvePoster(props);
|
|
105
107
|
const aspectRatio = resolveAspectRatio(video);
|
|
106
108
|
const status = resolveStatus(video);
|
|
107
|
-
if (!playbackId || typeof video !== "string" && status !== "ready") {
|
|
109
|
+
if (!streamUrl && !playbackId || typeof video !== "string" && status !== "ready") {
|
|
108
110
|
return /* @__PURE__ */ React.createElement(
|
|
109
111
|
"div",
|
|
110
112
|
{
|
|
@@ -128,7 +130,7 @@ var VideoPlayer = forwardRef(
|
|
|
128
130
|
MuxPlayer,
|
|
129
131
|
{
|
|
130
132
|
ref,
|
|
131
|
-
playbackId,
|
|
133
|
+
...streamUrl ? { src: streamUrl } : { playbackId },
|
|
132
134
|
streamType,
|
|
133
135
|
accentColor,
|
|
134
136
|
primaryColor,
|
package/dist/ui/video.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/Video/index.tsx","../../src/utils/video.ts"],"sourcesContent":["'use client'\n\nimport React, { forwardRef, type CSSProperties } from 'react'\nimport MuxPlayer from '@mux/mux-player-react'\nimport type {\n MuxPlayerRefAttributes,\n MuxPlayerProps,\n} from '@mux/mux-player-react'\nimport type { Video, Image } from '../../payload-types'\nimport { getVideoThumbnail } from '../../utils/video'\n\n// Re-export video utilities for convenience\nexport {\n getVideoThumbnail,\n getVideoGif,\n getVideoStreamUrl,\n getVideoMp4Url,\n getVideoStoryboard,\n type VideoThumbnailOptions,\n type VideoGifOptions,\n} from '../../utils/video'\n\n// ── CSS custom properties ──\n\nexport interface VideoPlayerCSSProperties extends CSSProperties {\n [key: `--${string}`]: string | undefined\n}\n\n// ── Props ──\n\nexport interface VideoPlayerProps {\n /** Video document or playbackId string */\n video: Video | string\n\n // ── Theming ──\n /** Theme accent color */\n accentColor?: string\n /** Theme primary color (controls) */\n primaryColor?: string\n /** Theme secondary color (time display, etc.) */\n secondaryColor?: string\n\n // ── Playback ──\n /** Title overlay (auto-resolved from Video.title if omitted) */\n title?: string\n /** Autoplay behavior */\n autoPlay?: boolean | 'muted' | 'any'\n /** Loop playback */\n loop?: boolean\n /** Muted by default */\n muted?: boolean\n /** Preload strategy (default: 'metadata') */\n preload?: 'auto' | 'metadata' | 'none'\n /** Start time in seconds */\n startTime?: number\n /** Stream type (default: 'on-demand') */\n streamType?: 'on-demand' | 'live' | 'll-live'\n /** Audio-only mode */\n audio?: boolean\n /** Disable keyboard shortcuts */\n noHotKeys?: boolean\n /** Max resolution cap */\n maxResolution?: '720p' | '1080p' | '1440p' | '2160p'\n\n // ── Poster ──\n /** Thumbnail time for auto-generated poster (default: 0) */\n thumbnailTime?: number\n /** Custom poster URL (overrides auto-generated thumbnail) */\n poster?: string\n\n // ── Placeholder (when video not ready) ──\n /** Placeholder text when video is not ready */\n placeholder?: string\n /** CSS class for the placeholder */\n placeholderClassName?: string\n /** Inline styles for the placeholder */\n placeholderStyle?: CSSProperties\n\n // ── Styling ──\n /** CSS class */\n className?: string\n /** Inline styles (supports --mux CSS custom properties) */\n style?: VideoPlayerCSSProperties\n\n // ── Events ──\n onPlay?: () => void\n onPause?: () => void\n onEnded?: () => void\n onTimeUpdate?: () => void\n onLoadedData?: () => void\n onError?: () => void\n\n // ── Escape hatch ──\n /** Extra props forwarded directly to MuxPlayer */\n playerProps?: Omit<\n MuxPlayerProps,\n | 'playbackId'\n | 'streamType'\n | 'accentColor'\n | 'primaryColor'\n | 'secondaryColor'\n | 'title'\n | 'autoPlay'\n | 'loop'\n | 'muted'\n | 'preload'\n | 'startTime'\n | 'poster'\n | 'audio'\n | 'nohotkeys'\n | 'maxResolution'\n | 'className'\n | 'style'\n >\n}\n\n// ── Helpers ──\n\nfunction resolvePlaybackId(video: Video | string): string | null {\n if (typeof video === 'string') return video\n return video.muxPlaybackId ?? null\n}\n\nfunction resolveTitle(props: VideoPlayerProps): string | undefined {\n if (props.title !== undefined) return props.title\n if (typeof props.video !== 'string') return props.video.title ?? undefined\n return undefined\n}\n\nfunction resolvePoster(props: VideoPlayerProps): string | undefined {\n // 1. Explicit poster URL (highest priority)\n if (props.poster) return props.poster\n\n // 2. Video.thumbnail uploaded image\n if (typeof props.video !== 'string' && props.video.thumbnail) {\n const thumb = props.video.thumbnail\n if (typeof thumb === 'object' && thumb !== null && 'url' in thumb) {\n const url = (thumb as Image).url\n if (url) return url\n }\n }\n\n // 3. Auto-generate from Mux image API\n const playbackId = resolvePlaybackId(props.video)\n if (!playbackId) return undefined\n return getVideoThumbnail(playbackId, {\n width: 1280,\n time: props.thumbnailTime ?? 0,\n })\n}\n\nfunction resolveAspectRatio(video: Video | string): string | undefined {\n if (typeof video === 'string') return undefined\n return video.aspectRatio ?? undefined\n}\n\nfunction resolveStatus(video: Video | string): string {\n if (typeof video === 'string') return 'ready'\n return video.muxStatus ?? 'waiting'\n}\n\n// ── Component ──\n\n/**\n * Mux video player component.\n * Requires `@mux/mux-player-react` (optional peer dependency).\n *\n * @example Basic usage\n * ```tsx\n * import { VideoPlayer } from '@01.software/sdk/ui/video'\n *\n * <VideoPlayer video={videoDoc} />\n * ```\n *\n * @example With playback ID string\n * ```tsx\n * <VideoPlayer video=\"abc123def\" autoPlay=\"muted\" loop />\n * ```\n *\n * @example Custom theming with CSS custom properties\n * ```tsx\n * <VideoPlayer\n * video={videoDoc}\n * accentColor=\"#f43f5e\"\n * primaryColor=\"#fff\"\n * className=\"rounded-lg overflow-hidden\"\n * style={{ '--controls-backdrop-color': 'rgba(0,0,0,0.6)' }}\n * />\n * ```\n *\n * @example Audio-only mode\n * ```tsx\n * <VideoPlayer video={videoDoc} audio />\n * ```\n */\nexport const VideoPlayer: React.ForwardRefExoticComponent<\n VideoPlayerProps & React.RefAttributes<MuxPlayerRefAttributes>\n> = forwardRef<MuxPlayerRefAttributes, VideoPlayerProps>(\n function VideoPlayer(props, ref) {\n const {\n video,\n accentColor,\n primaryColor,\n secondaryColor,\n autoPlay,\n loop,\n muted,\n preload = 'metadata',\n startTime,\n streamType = 'on-demand',\n audio,\n noHotKeys,\n maxResolution,\n placeholder,\n placeholderClassName,\n placeholderStyle,\n className,\n style,\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onLoadedData,\n onError,\n playerProps,\n } = props\n\n const playbackId = resolvePlaybackId(video)\n const title = resolveTitle(props)\n const poster = resolvePoster(props)\n const aspectRatio = resolveAspectRatio(video)\n const status = resolveStatus(video)\n\n // Show placeholder when no playbackId or video not ready\n if (!playbackId || (typeof video !== 'string' && status !== 'ready')) {\n return (\n <div\n className={placeholderClassName ?? className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n aspectRatio: aspectRatio ?? '16/9',\n backgroundColor: '#000',\n color: '#888',\n fontSize: 14,\n width: '100%',\n ...placeholderStyle,\n }}\n >\n {placeholder ??\n (status === 'preparing'\n ? 'Video is processing...'\n : status === 'errored'\n ? 'Video processing failed'\n : 'Video not available')}\n </div>\n )\n }\n\n return (\n <MuxPlayer\n ref={ref}\n playbackId={playbackId}\n streamType={streamType}\n accentColor={accentColor}\n primaryColor={primaryColor}\n secondaryColor={secondaryColor}\n title={title}\n autoPlay={autoPlay}\n loop={loop}\n muted={muted}\n preload={preload}\n startTime={startTime}\n poster={poster}\n audio={audio}\n nohotkeys={noHotKeys}\n maxResolution={maxResolution}\n className={className}\n style={{\n aspectRatio: aspectRatio ?? '16/9',\n width: '100%',\n ...style,\n }}\n onPlay={onPlay}\n onPause={onPause}\n onEnded={onEnded}\n onTimeUpdate={onTimeUpdate}\n onLoadedData={onLoadedData}\n onError={onError}\n {...playerProps}\n />\n )\n },\n)\n\n// ── Type Exports ──\n\nexport type { MuxPlayerRefAttributes as VideoPlayerRef } from '@mux/mux-player-react'\nexport type { Video as VideoData } from '../../payload-types'\n","const MUX_IMAGE_BASE = 'https://image.mux.com'\nconst MUX_STREAM_BASE = 'https://stream.mux.com'\n\n// ── Thumbnail ──\n\nexport interface VideoThumbnailOptions {\n /** Width in pixels (default: 640) */\n width?: number\n /** Height in pixels (auto if omitted) */\n height?: number\n /** Time offset in seconds (default: 0) */\n time?: number\n /** Fit mode (default: 'smartcrop') */\n fitMode?: 'preserve' | 'stretch' | 'crop' | 'smartcrop' | 'pad'\n /** Flip horizontally */\n flipH?: boolean\n /** Flip vertically */\n flipV?: boolean\n /** Rotation in degrees (90, 180, 270) */\n rotate?: 90 | 180 | 270\n}\n\n/**\n * Returns a Mux thumbnail URL for a video.\n *\n * @example\n * ```ts\n * getVideoThumbnail('abc123')\n * // => 'https://image.mux.com/abc123/thumbnail.jpg?width=640'\n *\n * getVideoThumbnail('abc123', { width: 320, time: 5 })\n * // => 'https://image.mux.com/abc123/thumbnail.jpg?width=320&time=5'\n * ```\n */\nexport function getVideoThumbnail(\n playbackId: string,\n options?: VideoThumbnailOptions,\n): string {\n const params = new URLSearchParams()\n params.set('width', String(options?.width ?? 640))\n if (options?.height) params.set('height', String(options.height))\n if (options?.time != null) params.set('time', String(options.time))\n if (options?.fitMode) params.set('fit_mode', options.fitMode)\n if (options?.flipH) params.set('flip_h', 'true')\n if (options?.flipV) params.set('flip_v', 'true')\n if (options?.rotate) params.set('rotate', String(options.rotate))\n return `${MUX_IMAGE_BASE}/${playbackId}/thumbnail.jpg?${params}`\n}\n\n// ── Animated GIF ──\n\nexport interface VideoGifOptions {\n /** Width in pixels (default: 320) */\n width?: number\n /** Start time in seconds (default: 0) */\n start?: number\n /** End time in seconds (default: start + 5) */\n end?: number\n /** Frames per second (default: 15) */\n fps?: number\n}\n\n/**\n * Returns a Mux animated GIF URL for a video.\n *\n * @example\n * ```ts\n * getVideoGif('abc123')\n * // => 'https://image.mux.com/abc123/animated.gif?width=320'\n *\n * getVideoGif('abc123', { width: 240, start: 2, end: 6 })\n * // => 'https://image.mux.com/abc123/animated.gif?width=240&start=2&end=6'\n * ```\n */\nexport function getVideoGif(\n playbackId: string,\n options?: VideoGifOptions,\n): string {\n const params = new URLSearchParams()\n params.set('width', String(options?.width ?? 320))\n if (options?.start != null) params.set('start', String(options.start))\n if (options?.end != null) params.set('end', String(options.end))\n if (options?.fps) params.set('fps', String(options.fps))\n return `${MUX_IMAGE_BASE}/${playbackId}/animated.gif?${params}`\n}\n\n// ── Storyboard ──\n\n/**\n * Returns a Mux storyboard VTT URL for timeline hover previews.\n *\n * @example\n * ```ts\n * getVideoStoryboard('abc123')\n * // => 'https://image.mux.com/abc123/storyboard.vtt'\n * ```\n */\nexport function getVideoStoryboard(playbackId: string): string {\n return `${MUX_IMAGE_BASE}/${playbackId}/storyboard.vtt`\n}\n\n// ── Stream / Playback URLs ──\n\n/**\n * Returns the HLS stream URL for a video.\n *\n * @example\n * ```ts\n * getVideoStreamUrl('abc123')\n * // => 'https://stream.mux.com/abc123.m3u8'\n * ```\n */\nexport function getVideoStreamUrl(playbackId: string): string {\n return `${MUX_STREAM_BASE}/${playbackId}.m3u8`\n}\n\n/**\n * Returns a Mux MP4 download URL for a video.\n * Only available if the asset was created with `mp4_support` enabled.\n *\n * @example\n * ```ts\n * getVideoMp4Url('abc123', 'high')\n * // => 'https://stream.mux.com/abc123/high.mp4'\n * ```\n */\nexport function getVideoMp4Url(\n playbackId: string,\n resolution: 'high' | 'medium' | 'low' = 'high',\n): string {\n return `${MUX_STREAM_BASE}/${playbackId}/${resolution}.mp4`\n}\n"],"mappings":"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","names":["VideoPlayer"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/Video/index.tsx","../../src/utils/video.ts"],"sourcesContent":["'use client'\n\nimport React, { forwardRef, type CSSProperties } from 'react'\nimport MuxPlayer from '@mux/mux-player-react'\nimport type {\n MuxPlayerRefAttributes,\n MuxPlayerProps,\n} from '@mux/mux-player-react'\nimport type { Video, Image } from '../../payload-types'\nimport { getVideoThumbnail } from '../../utils/video'\n\n// Re-export video utilities for convenience\nexport {\n getVideoThumbnail,\n getVideoGif,\n getVideoStreamUrl,\n getVideoMp4Url,\n getVideoStoryboard,\n type VideoThumbnailOptions,\n type VideoGifOptions,\n} from '../../utils/video'\n\n// ── CSS custom properties ──\n\nexport interface VideoPlayerCSSProperties extends CSSProperties {\n [key: `--${string}`]: string | undefined\n}\n\n// ── Props ──\n\nexport interface VideoPlayerProps {\n /** Video document or playbackId string */\n video: Video | string\n /** HLS URL from client.video.playback(video.id); required for gated Free VOD. */\n streamUrl?: string\n\n // ── Theming ──\n /** Theme accent color */\n accentColor?: string\n /** Theme primary color (controls) */\n primaryColor?: string\n /** Theme secondary color (time display, etc.) */\n secondaryColor?: string\n\n // ── Playback ──\n /** Title overlay (auto-resolved from Video.title if omitted) */\n title?: string\n /** Autoplay behavior */\n autoPlay?: boolean | 'muted' | 'any'\n /** Loop playback */\n loop?: boolean\n /** Muted by default */\n muted?: boolean\n /** Preload strategy (default: 'metadata') */\n preload?: 'auto' | 'metadata' | 'none'\n /** Start time in seconds */\n startTime?: number\n /** Stream type (default: 'on-demand') */\n streamType?: 'on-demand' | 'live' | 'll-live'\n /** Audio-only mode */\n audio?: boolean\n /** Disable keyboard shortcuts */\n noHotKeys?: boolean\n /** Max resolution cap */\n maxResolution?: '720p' | '1080p' | '1440p' | '2160p'\n\n // ── Poster ──\n /** Thumbnail time for auto-generated poster (default: 0) */\n thumbnailTime?: number\n /** Custom poster URL (overrides auto-generated thumbnail) */\n poster?: string\n\n // ── Placeholder (when video not ready) ──\n /** Placeholder text when video is not ready */\n placeholder?: string\n /** CSS class for the placeholder */\n placeholderClassName?: string\n /** Inline styles for the placeholder */\n placeholderStyle?: CSSProperties\n\n // ── Styling ──\n /** CSS class */\n className?: string\n /** Inline styles (supports --mux CSS custom properties) */\n style?: VideoPlayerCSSProperties\n\n // ── Events ──\n onPlay?: () => void\n onPause?: () => void\n onEnded?: () => void\n onTimeUpdate?: () => void\n onLoadedData?: () => void\n onError?: () => void\n\n // ── Escape hatch ──\n /** Extra props forwarded directly to MuxPlayer */\n playerProps?: Omit<\n MuxPlayerProps,\n | 'playbackId'\n | 'src'\n | 'streamType'\n | 'accentColor'\n | 'primaryColor'\n | 'secondaryColor'\n | 'title'\n | 'autoPlay'\n | 'loop'\n | 'muted'\n | 'preload'\n | 'startTime'\n | 'poster'\n | 'audio'\n | 'nohotkeys'\n | 'maxResolution'\n | 'className'\n | 'style'\n >\n}\n\n// ── Helpers ──\n\nfunction resolvePlaybackId(video: Video | string): string | null {\n if (typeof video === 'string') return video\n return video.muxPlaybackId ?? null\n}\n\nfunction resolveTitle(props: VideoPlayerProps): string | undefined {\n if (props.title !== undefined) return props.title\n if (typeof props.video !== 'string') return props.video.title ?? undefined\n return undefined\n}\n\nfunction resolvePoster(props: VideoPlayerProps): string | undefined {\n // 1. Explicit poster URL (highest priority)\n if (props.poster) return props.poster\n\n // 2. Video.thumbnail uploaded image\n if (typeof props.video !== 'string' && props.video.thumbnail) {\n const thumb = props.video.thumbnail\n if (typeof thumb === 'object' && thumb !== null && 'url' in thumb) {\n const url = (thumb as Image).url\n if (url) return url\n }\n }\n\n // 3. Auto-generate from Mux image API\n if (props.streamUrl) return undefined\n const playbackId = resolvePlaybackId(props.video)\n if (!playbackId) return undefined\n return getVideoThumbnail(playbackId, {\n width: 1280,\n time: props.thumbnailTime ?? 0,\n })\n}\n\nfunction resolveAspectRatio(video: Video | string): string | undefined {\n if (typeof video === 'string') return undefined\n return video.aspectRatio ?? undefined\n}\n\nfunction resolveStatus(video: Video | string): string {\n if (typeof video === 'string') return 'ready'\n return video.muxStatus ?? 'waiting'\n}\n\n// ── Component ──\n\n/**\n * Mux video player component.\n * Requires `@mux/mux-player-react` (optional peer dependency).\n *\n * @example Basic usage\n * ```tsx\n * import { VideoPlayer } from '@01.software/sdk/ui/video'\n *\n * <VideoPlayer video={videoDoc} />\n * ```\n *\n * @example With playback ID string\n * ```tsx\n * <VideoPlayer video=\"abc123def\" autoPlay=\"muted\" loop />\n * ```\n *\n * @example Custom theming with CSS custom properties\n * ```tsx\n * <VideoPlayer\n * video={videoDoc}\n * accentColor=\"#f43f5e\"\n * primaryColor=\"#fff\"\n * className=\"rounded-lg overflow-hidden\"\n * style={{ '--controls-backdrop-color': 'rgba(0,0,0,0.6)' }}\n * />\n * ```\n *\n * @example Audio-only mode\n * ```tsx\n * <VideoPlayer video={videoDoc} audio />\n * ```\n */\nexport const VideoPlayer: React.ForwardRefExoticComponent<\n VideoPlayerProps & React.RefAttributes<MuxPlayerRefAttributes>\n> = forwardRef<MuxPlayerRefAttributes, VideoPlayerProps>(\n function VideoPlayer(props, ref) {\n const {\n video,\n streamUrl,\n accentColor,\n primaryColor,\n secondaryColor,\n autoPlay,\n loop,\n muted,\n preload = 'metadata',\n startTime,\n streamType = 'on-demand',\n audio,\n noHotKeys,\n maxResolution,\n placeholder,\n placeholderClassName,\n placeholderStyle,\n className,\n style,\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onLoadedData,\n onError,\n playerProps,\n } = props\n\n const playbackId = resolvePlaybackId(video)\n const title = resolveTitle(props)\n const poster = resolvePoster(props)\n const aspectRatio = resolveAspectRatio(video)\n const status = resolveStatus(video)\n\n // Show placeholder when no playbackId or video not ready\n if (\n (!streamUrl && !playbackId) ||\n (typeof video !== 'string' && status !== 'ready')\n ) {\n return (\n <div\n className={placeholderClassName ?? className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n aspectRatio: aspectRatio ?? '16/9',\n backgroundColor: '#000',\n color: '#888',\n fontSize: 14,\n width: '100%',\n ...placeholderStyle,\n }}\n >\n {placeholder ??\n (status === 'preparing'\n ? 'Video is processing...'\n : status === 'errored'\n ? 'Video processing failed'\n : 'Video not available')}\n </div>\n )\n }\n\n return (\n <MuxPlayer\n ref={ref}\n {...(streamUrl ? { src: streamUrl } : { playbackId: playbackId! })}\n streamType={streamType}\n accentColor={accentColor}\n primaryColor={primaryColor}\n secondaryColor={secondaryColor}\n title={title}\n autoPlay={autoPlay}\n loop={loop}\n muted={muted}\n preload={preload}\n startTime={startTime}\n poster={poster}\n audio={audio}\n nohotkeys={noHotKeys}\n maxResolution={maxResolution}\n className={className}\n style={{\n aspectRatio: aspectRatio ?? '16/9',\n width: '100%',\n ...style,\n }}\n onPlay={onPlay}\n onPause={onPause}\n onEnded={onEnded}\n onTimeUpdate={onTimeUpdate}\n onLoadedData={onLoadedData}\n onError={onError}\n {...playerProps}\n />\n )\n },\n)\n\n// ── Type Exports ──\n\nexport type { MuxPlayerRefAttributes as VideoPlayerRef } from '@mux/mux-player-react'\nexport type { Video as VideoData } from '../../payload-types'\n","const MUX_IMAGE_BASE = 'https://image.mux.com'\nconst MUX_STREAM_BASE = 'https://stream.mux.com'\n\n// ── Thumbnail ──\n\nexport interface VideoThumbnailOptions {\n /** Width in pixels (default: 640) */\n width?: number\n /** Height in pixels (auto if omitted) */\n height?: number\n /** Time offset in seconds (default: 0) */\n time?: number\n /** Fit mode (default: 'smartcrop') */\n fitMode?: 'preserve' | 'stretch' | 'crop' | 'smartcrop' | 'pad'\n /** Flip horizontally */\n flipH?: boolean\n /** Flip vertically */\n flipV?: boolean\n /** Rotation in degrees (90, 180, 270) */\n rotate?: 90 | 180 | 270\n}\n\n/**\n * Returns a Mux thumbnail URL for a video.\n *\n * @example\n * ```ts\n * getVideoThumbnail('abc123')\n * // => 'https://image.mux.com/abc123/thumbnail.jpg?width=640'\n *\n * getVideoThumbnail('abc123', { width: 320, time: 5 })\n * // => 'https://image.mux.com/abc123/thumbnail.jpg?width=320&time=5'\n * ```\n */\nexport function getVideoThumbnail(\n playbackId: string,\n options?: VideoThumbnailOptions,\n): string {\n const params = new URLSearchParams()\n params.set('width', String(options?.width ?? 640))\n if (options?.height) params.set('height', String(options.height))\n if (options?.time != null) params.set('time', String(options.time))\n if (options?.fitMode) params.set('fit_mode', options.fitMode)\n if (options?.flipH) params.set('flip_h', 'true')\n if (options?.flipV) params.set('flip_v', 'true')\n if (options?.rotate) params.set('rotate', String(options.rotate))\n return `${MUX_IMAGE_BASE}/${playbackId}/thumbnail.jpg?${params}`\n}\n\n// ── Animated GIF ──\n\nexport interface VideoGifOptions {\n /** Width in pixels (default: 320) */\n width?: number\n /** Start time in seconds (default: 0) */\n start?: number\n /** End time in seconds (default: start + 5) */\n end?: number\n /** Frames per second (default: 15) */\n fps?: number\n}\n\n/**\n * Returns a Mux animated GIF URL for a video.\n *\n * @example\n * ```ts\n * getVideoGif('abc123')\n * // => 'https://image.mux.com/abc123/animated.gif?width=320'\n *\n * getVideoGif('abc123', { width: 240, start: 2, end: 6 })\n * // => 'https://image.mux.com/abc123/animated.gif?width=240&start=2&end=6'\n * ```\n */\nexport function getVideoGif(\n playbackId: string,\n options?: VideoGifOptions,\n): string {\n const params = new URLSearchParams()\n params.set('width', String(options?.width ?? 320))\n if (options?.start != null) params.set('start', String(options.start))\n if (options?.end != null) params.set('end', String(options.end))\n if (options?.fps) params.set('fps', String(options.fps))\n return `${MUX_IMAGE_BASE}/${playbackId}/animated.gif?${params}`\n}\n\n// ── Storyboard ──\n\n/**\n * Returns a Mux storyboard VTT URL for timeline hover previews.\n *\n * @example\n * ```ts\n * getVideoStoryboard('abc123')\n * // => 'https://image.mux.com/abc123/storyboard.vtt'\n * ```\n */\nexport function getVideoStoryboard(playbackId: string): string {\n return `${MUX_IMAGE_BASE}/${playbackId}/storyboard.vtt`\n}\n\n// ── Stream / Playback URLs ──\n\n/**\n * Returns the HLS stream URL for a video.\n *\n * @example\n * ```ts\n * getVideoStreamUrl('abc123')\n * // => 'https://stream.mux.com/abc123.m3u8'\n * ```\n */\nexport function getVideoStreamUrl(playbackId: string): string {\n return `${MUX_STREAM_BASE}/${playbackId}.m3u8`\n}\n\n/**\n * Returns a Mux MP4 download URL for a video.\n * Only available if the asset was created with `mp4_support` enabled.\n *\n * @example\n * ```ts\n * getVideoMp4Url('abc123', 'high')\n * // => 'https://stream.mux.com/abc123/high.mp4'\n * ```\n */\nexport function getVideoMp4Url(\n playbackId: string,\n resolution: 'high' | 'medium' | 'low' = 'high',\n): string {\n return `${MUX_STREAM_BASE}/${playbackId}/${resolution}.mp4`\n}\n"],"mappings":"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","names":["VideoPlayer"]}
|
package/dist/webhook.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { W as WebhookHandler } from './index-
|
|
2
|
-
export { C as COMMERCE_NOTIFICATION_EVENTS, a as COMMERCE_NOTIFICATION_EVENT_TYPE, b as COMMERCE_NOTIFICATION_OPERATION, c as CUSTOMER_PASSWORD_RESET_OPERATION, d as CollectionWebhookOperation, e as CommerceEmailChannel, f as CommerceEmailConfig, g as CommerceEmailEventConfig, h as CommerceEmailEventHandlers, i as CommerceEmailHandlerContext, j as CommerceNotification, k as CommerceNotificationData, l as CommerceNotificationEventHandlers, m as CommerceNotificationEventName, n as CommerceNotificationHandlerContext, o as CommerceNotificationSource, p as CommerceNotificationSourceCollection, q as CommerceNotificationWebhookEvent, r as CustomerAuthWebhookEvent, s as CustomerAuthWebhookHandlers, t as CustomerPasswordResetWebhookData, u as CustomerPasswordResetWebhookEvent, M as MembershipNotificationData, v as MembershipNotificationEventName, O as ORDER_CHANGED_EVENT_TYPE, w as OrderChangedWebhookEvent, P as PaymentIncidentMoney, x as PaymentIncidentNotificationData, y as PaymentIncidentNotificationEventName, z as PaymentIncidentNotificationReason, A as PaymentIncidentNotificationSourceCollection, B as PaymentIncidentNotificationStatus, D as PaymentIncidentProviderObject, E as WebhookChange, F as WebhookCommerceNotificationChange, G as WebhookEvent, H as WebhookKnownOperation, I as WebhookOperation, J as WebhookOptions, K as WebhookOrderChange, L as WebhookOrderMoved, N as WebhookOrderScope, Q as createCommerceEmailWebhookHandler, R as createCommerceNotificationWebhookHandler, S as createCustomerAuthWebhookHandler, T as createTypedWebhookHandler, U as defineCommerceEmailConfig, V as getCommerceNotificationIdempotencyKey, X as handleWebhook, Y as isCommerceNotificationWebhookEvent, Z as isCustomerPasswordResetWebhookEvent, _ as isOrderChangedWebhookEvent, $ as isValidWebhookEvent, a0 as isWebhookCollection, a1 as isWebhookOperation } from './index-
|
|
3
|
-
import { C as Collection } from './const-
|
|
4
|
-
import { C as CollectionType } from './types-
|
|
5
|
-
import { W as Webhook } from './payload-types-
|
|
1
|
+
import { W as WebhookHandler } from './index-Bbpf5t-l.cjs';
|
|
2
|
+
export { C as COMMERCE_NOTIFICATION_EVENTS, a as COMMERCE_NOTIFICATION_EVENT_TYPE, b as COMMERCE_NOTIFICATION_OPERATION, c as CUSTOMER_PASSWORD_RESET_OPERATION, d as CollectionWebhookOperation, e as CommerceEmailChannel, f as CommerceEmailConfig, g as CommerceEmailEventConfig, h as CommerceEmailEventHandlers, i as CommerceEmailHandlerContext, j as CommerceNotification, k as CommerceNotificationData, l as CommerceNotificationEventHandlers, m as CommerceNotificationEventName, n as CommerceNotificationHandlerContext, o as CommerceNotificationSource, p as CommerceNotificationSourceCollection, q as CommerceNotificationWebhookEvent, r as CustomerAuthWebhookEvent, s as CustomerAuthWebhookHandlers, t as CustomerPasswordResetWebhookData, u as CustomerPasswordResetWebhookEvent, M as MembershipNotificationData, v as MembershipNotificationEventName, O as ORDER_CHANGED_EVENT_TYPE, w as OrderChangedWebhookEvent, P as PaymentIncidentMoney, x as PaymentIncidentNotificationData, y as PaymentIncidentNotificationEventName, z as PaymentIncidentNotificationReason, A as PaymentIncidentNotificationSourceCollection, B as PaymentIncidentNotificationStatus, D as PaymentIncidentProviderObject, E as WebhookChange, F as WebhookCommerceNotificationChange, G as WebhookEvent, H as WebhookKnownOperation, I as WebhookOperation, J as WebhookOptions, K as WebhookOrderChange, L as WebhookOrderMoved, N as WebhookOrderScope, Q as createCommerceEmailWebhookHandler, R as createCommerceNotificationWebhookHandler, S as createCustomerAuthWebhookHandler, T as createTypedWebhookHandler, U as defineCommerceEmailConfig, V as getCommerceNotificationIdempotencyKey, X as handleWebhook, Y as isCommerceNotificationWebhookEvent, Z as isCustomerPasswordResetWebhookEvent, _ as isOrderChangedWebhookEvent, $ as isValidWebhookEvent, a0 as isWebhookCollection, a1 as isWebhookOperation } from './index-Bbpf5t-l.cjs';
|
|
3
|
+
import { C as Collection } from './const-D6ZRQLxI.cjs';
|
|
4
|
+
import { C as CollectionType } from './types-Dp1oYpD3.cjs';
|
|
5
|
+
import { W as Webhook } from './payload-types-BnIET0xU.cjs';
|
|
6
6
|
|
|
7
7
|
interface SignedWebhookOptions {
|
|
8
8
|
/** Nonblank HMAC-SHA256 signing secret for this receiver. */
|
package/dist/webhook.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { W as WebhookHandler } from './index-
|
|
2
|
-
export { C as COMMERCE_NOTIFICATION_EVENTS, a as COMMERCE_NOTIFICATION_EVENT_TYPE, b as COMMERCE_NOTIFICATION_OPERATION, c as CUSTOMER_PASSWORD_RESET_OPERATION, d as CollectionWebhookOperation, e as CommerceEmailChannel, f as CommerceEmailConfig, g as CommerceEmailEventConfig, h as CommerceEmailEventHandlers, i as CommerceEmailHandlerContext, j as CommerceNotification, k as CommerceNotificationData, l as CommerceNotificationEventHandlers, m as CommerceNotificationEventName, n as CommerceNotificationHandlerContext, o as CommerceNotificationSource, p as CommerceNotificationSourceCollection, q as CommerceNotificationWebhookEvent, r as CustomerAuthWebhookEvent, s as CustomerAuthWebhookHandlers, t as CustomerPasswordResetWebhookData, u as CustomerPasswordResetWebhookEvent, M as MembershipNotificationData, v as MembershipNotificationEventName, O as ORDER_CHANGED_EVENT_TYPE, w as OrderChangedWebhookEvent, P as PaymentIncidentMoney, x as PaymentIncidentNotificationData, y as PaymentIncidentNotificationEventName, z as PaymentIncidentNotificationReason, A as PaymentIncidentNotificationSourceCollection, B as PaymentIncidentNotificationStatus, D as PaymentIncidentProviderObject, E as WebhookChange, F as WebhookCommerceNotificationChange, G as WebhookEvent, H as WebhookKnownOperation, I as WebhookOperation, J as WebhookOptions, K as WebhookOrderChange, L as WebhookOrderMoved, N as WebhookOrderScope, Q as createCommerceEmailWebhookHandler, R as createCommerceNotificationWebhookHandler, S as createCustomerAuthWebhookHandler, T as createTypedWebhookHandler, U as defineCommerceEmailConfig, V as getCommerceNotificationIdempotencyKey, X as handleWebhook, Y as isCommerceNotificationWebhookEvent, Z as isCustomerPasswordResetWebhookEvent, _ as isOrderChangedWebhookEvent, $ as isValidWebhookEvent, a0 as isWebhookCollection, a1 as isWebhookOperation } from './index-
|
|
3
|
-
import { C as Collection } from './const-
|
|
4
|
-
import { C as CollectionType } from './types-
|
|
5
|
-
import { W as Webhook } from './payload-types-
|
|
1
|
+
import { W as WebhookHandler } from './index-1auUEYrl.js';
|
|
2
|
+
export { C as COMMERCE_NOTIFICATION_EVENTS, a as COMMERCE_NOTIFICATION_EVENT_TYPE, b as COMMERCE_NOTIFICATION_OPERATION, c as CUSTOMER_PASSWORD_RESET_OPERATION, d as CollectionWebhookOperation, e as CommerceEmailChannel, f as CommerceEmailConfig, g as CommerceEmailEventConfig, h as CommerceEmailEventHandlers, i as CommerceEmailHandlerContext, j as CommerceNotification, k as CommerceNotificationData, l as CommerceNotificationEventHandlers, m as CommerceNotificationEventName, n as CommerceNotificationHandlerContext, o as CommerceNotificationSource, p as CommerceNotificationSourceCollection, q as CommerceNotificationWebhookEvent, r as CustomerAuthWebhookEvent, s as CustomerAuthWebhookHandlers, t as CustomerPasswordResetWebhookData, u as CustomerPasswordResetWebhookEvent, M as MembershipNotificationData, v as MembershipNotificationEventName, O as ORDER_CHANGED_EVENT_TYPE, w as OrderChangedWebhookEvent, P as PaymentIncidentMoney, x as PaymentIncidentNotificationData, y as PaymentIncidentNotificationEventName, z as PaymentIncidentNotificationReason, A as PaymentIncidentNotificationSourceCollection, B as PaymentIncidentNotificationStatus, D as PaymentIncidentProviderObject, E as WebhookChange, F as WebhookCommerceNotificationChange, G as WebhookEvent, H as WebhookKnownOperation, I as WebhookOperation, J as WebhookOptions, K as WebhookOrderChange, L as WebhookOrderMoved, N as WebhookOrderScope, Q as createCommerceEmailWebhookHandler, R as createCommerceNotificationWebhookHandler, S as createCustomerAuthWebhookHandler, T as createTypedWebhookHandler, U as defineCommerceEmailConfig, V as getCommerceNotificationIdempotencyKey, X as handleWebhook, Y as isCommerceNotificationWebhookEvent, Z as isCustomerPasswordResetWebhookEvent, _ as isOrderChangedWebhookEvent, $ as isValidWebhookEvent, a0 as isWebhookCollection, a1 as isWebhookOperation } from './index-1auUEYrl.js';
|
|
3
|
+
import { C as Collection } from './const-CRxPTDGt.js';
|
|
4
|
+
import { C as CollectionType } from './types-D1y4TgQm.js';
|
|
5
|
+
import { W as Webhook } from './payload-types-BnIET0xU.js';
|
|
6
6
|
|
|
7
7
|
interface SignedWebhookOptions {
|
|
8
8
|
/** Nonblank HMAC-SHA256 signing secret for this receiver. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@01.software/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.65.1",
|
|
4
4
|
"description": "01.software SDK",
|
|
5
5
|
"author": "<office@01.works>",
|
|
6
6
|
"repository": {
|
|
@@ -54,26 +54,6 @@
|
|
|
54
54
|
"default": "./dist/errors.cjs"
|
|
55
55
|
}
|
|
56
56
|
},
|
|
57
|
-
"./analytics": {
|
|
58
|
-
"import": {
|
|
59
|
-
"types": "./dist/analytics.d.ts",
|
|
60
|
-
"default": "./dist/analytics.js"
|
|
61
|
-
},
|
|
62
|
-
"require": {
|
|
63
|
-
"types": "./dist/analytics.d.cts",
|
|
64
|
-
"default": "./dist/analytics.cjs"
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
"./analytics/react": {
|
|
68
|
-
"import": {
|
|
69
|
-
"types": "./dist/analytics/react.d.ts",
|
|
70
|
-
"default": "./dist/analytics/react.js"
|
|
71
|
-
},
|
|
72
|
-
"require": {
|
|
73
|
-
"types": "./dist/analytics/react.d.cts",
|
|
74
|
-
"default": "./dist/analytics/react.cjs"
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
57
|
"./query": {
|
|
78
58
|
"import": {
|
|
79
59
|
"types": "./dist/query.d.ts",
|
|
@@ -226,9 +206,12 @@
|
|
|
226
206
|
"CHANGELOG.md"
|
|
227
207
|
],
|
|
228
208
|
"devDependencies": {
|
|
209
|
+
"@01.software/http-contracts": "0.1.0",
|
|
229
210
|
"@arethetypeswrong/cli": "^0.18.5",
|
|
230
211
|
"@mux/mux-player-react": "^3.13.0",
|
|
231
|
-
"@payloadcms/richtext-lexical": "3.
|
|
212
|
+
"@payloadcms/richtext-lexical": "3.90.1",
|
|
213
|
+
"@repo/eslint-config": "0.0.0",
|
|
214
|
+
"@repo/typescript-config": "0.0.0",
|
|
232
215
|
"@tanstack/react-query": "5.100.9",
|
|
233
216
|
"@testing-library/jest-dom": "^6.9.1",
|
|
234
217
|
"@testing-library/react": "16.3.2",
|
|
@@ -241,8 +224,8 @@
|
|
|
241
224
|
"hast-util-to-jsx-runtime": "^2.3.6",
|
|
242
225
|
"jsdom": "26.1.0",
|
|
243
226
|
"monaco-editor": "0.55.1",
|
|
244
|
-
"next": "16.3.
|
|
245
|
-
"payload": "3.
|
|
227
|
+
"next": "16.3.8",
|
|
228
|
+
"payload": "3.90.1",
|
|
246
229
|
"postcss": "8.5.23",
|
|
247
230
|
"publint": "^0.3.20",
|
|
248
231
|
"quickjs-emscripten": "0.32.0",
|
|
@@ -253,10 +236,7 @@
|
|
|
253
236
|
"sucrase": "^3.35.1",
|
|
254
237
|
"tsup": "^8.5.1",
|
|
255
238
|
"typescript": "5.7.3",
|
|
256
|
-
"vitest": "^4.1.11"
|
|
257
|
-
"@01.software/http-contracts": "0.1.0",
|
|
258
|
-
"@repo/eslint-config": "0.0.0",
|
|
259
|
-
"@repo/typescript-config": "0.0.0"
|
|
239
|
+
"vitest": "^4.1.11"
|
|
260
240
|
},
|
|
261
241
|
"dependencies": {
|
|
262
242
|
"jose": "^6.2.3",
|
package/dist/analytics/react.cjs
DELETED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
"use client";
|
|
3
|
-
var __create = Object.create;
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __export = (target, all) => {
|
|
10
|
-
for (var name in all)
|
|
11
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
-
};
|
|
13
|
-
var __copyProps = (to, from, except, desc) => {
|
|
14
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
-
for (let key of __getOwnPropNames(from))
|
|
16
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
-
}
|
|
19
|
-
return to;
|
|
20
|
-
};
|
|
21
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
-
mod
|
|
28
|
-
));
|
|
29
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
-
|
|
31
|
-
// src/analytics/react.tsx
|
|
32
|
-
var react_exports = {};
|
|
33
|
-
__export(react_exports, {
|
|
34
|
-
Analytics: () => Analytics,
|
|
35
|
-
AnalyticsProvider: () => AnalyticsProvider,
|
|
36
|
-
createAnalyticsHooks: () => createAnalyticsHooks,
|
|
37
|
-
default: () => react_default,
|
|
38
|
-
useAnalytics: () => useAnalytics
|
|
39
|
-
});
|
|
40
|
-
module.exports = __toCommonJS(react_exports);
|
|
41
|
-
var import_react = __toESM(require("react"), 1);
|
|
42
|
-
|
|
43
|
-
// src/core/internal/utils/api-url.ts
|
|
44
|
-
function resolveApiUrl(apiUrl) {
|
|
45
|
-
if (apiUrl) {
|
|
46
|
-
return apiUrl.replace(/\/$/, "");
|
|
47
|
-
}
|
|
48
|
-
if (typeof process !== "undefined" && process.env) {
|
|
49
|
-
const envUrl = process.env.SOFTWARE_API_URL || process.env.NEXT_PUBLIC_SOFTWARE_API_URL;
|
|
50
|
-
if (envUrl) {
|
|
51
|
-
return envUrl.replace(/\/$/, "");
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return "https://api.01.software";
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// src/analytics.ts
|
|
58
|
-
function createAnalytics(config) {
|
|
59
|
-
if (typeof window === "undefined") {
|
|
60
|
-
return { pageview() {
|
|
61
|
-
}, track() {
|
|
62
|
-
}, destroy() {
|
|
63
|
-
} };
|
|
64
|
-
}
|
|
65
|
-
const endpoint = config.endpoint ?? `${resolveApiUrl()}/api/analytics/collect`;
|
|
66
|
-
const respectDnt = config.respectDnt !== false;
|
|
67
|
-
function isDntActive() {
|
|
68
|
-
if (!respectDnt) return false;
|
|
69
|
-
const nav = navigator;
|
|
70
|
-
return nav.doNotTrack === "1" || nav.globalPrivacyControl === true;
|
|
71
|
-
}
|
|
72
|
-
const isLocalHost = (() => {
|
|
73
|
-
try {
|
|
74
|
-
const h = location.hostname;
|
|
75
|
-
return h === "localhost" || h === "127.0.0.1" || h.endsWith(".local");
|
|
76
|
-
} catch {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
})();
|
|
80
|
-
const mode = config.mode ?? "auto";
|
|
81
|
-
const sendSuppressed = mode === "development" || mode === "auto" && isLocalHost;
|
|
82
|
-
let suppressNoticeShown = false;
|
|
83
|
-
function devSuppressNotice() {
|
|
84
|
-
if (suppressNoticeShown) return;
|
|
85
|
-
suppressNoticeShown = true;
|
|
86
|
-
try {
|
|
87
|
-
console.info(
|
|
88
|
-
`[01 analytics] events disabled on local host (mode: '${mode}'). Pass mode: 'production' to send while developing.`
|
|
89
|
-
);
|
|
90
|
-
} catch {
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
let lastPath = null;
|
|
94
|
-
let lastAt = 0;
|
|
95
|
-
const autoTrack = config.autoTrack !== false;
|
|
96
|
-
const originalPushState = history.pushState;
|
|
97
|
-
const originalReplaceState = history.replaceState;
|
|
98
|
-
let destroyed = false;
|
|
99
|
-
function newEventId() {
|
|
100
|
-
return typeof crypto !== "undefined" && typeof crypto.randomUUID === "function" ? crypto.randomUUID() : String(Date.now()) + String(Math.random());
|
|
101
|
-
}
|
|
102
|
-
function sendBeaconOrFetch(body) {
|
|
103
|
-
try {
|
|
104
|
-
if (typeof navigator.sendBeacon === "function") {
|
|
105
|
-
const blob = new Blob([body], { type: "text/plain" });
|
|
106
|
-
const sent = navigator.sendBeacon(endpoint, blob);
|
|
107
|
-
if (sent) return;
|
|
108
|
-
}
|
|
109
|
-
fetch(endpoint, {
|
|
110
|
-
method: "POST",
|
|
111
|
-
keepalive: true,
|
|
112
|
-
headers: { "Content-Type": "application/json" },
|
|
113
|
-
body
|
|
114
|
-
}).catch(() => {
|
|
115
|
-
});
|
|
116
|
-
} catch {
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
function sendPageview(pathname) {
|
|
120
|
-
if (isDntActive()) return;
|
|
121
|
-
const doc = document;
|
|
122
|
-
if (doc.prerendering === true || document.visibilityState === "prerender") return;
|
|
123
|
-
if (sendSuppressed) {
|
|
124
|
-
devSuppressNotice();
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
const now = Date.now();
|
|
128
|
-
if (pathname === lastPath && now - lastAt < 500) return;
|
|
129
|
-
lastPath = pathname;
|
|
130
|
-
lastAt = now;
|
|
131
|
-
const body = JSON.stringify({
|
|
132
|
-
publishableKey: config.publishableKey,
|
|
133
|
-
pathname,
|
|
134
|
-
referrer: document.referrer || "",
|
|
135
|
-
eventId: newEventId(),
|
|
136
|
-
eventTs: Date.now()
|
|
137
|
-
});
|
|
138
|
-
sendBeaconOrFetch(body);
|
|
139
|
-
}
|
|
140
|
-
function trackCurrentPath() {
|
|
141
|
-
if (destroyed) return;
|
|
142
|
-
sendPageview(location.pathname);
|
|
143
|
-
}
|
|
144
|
-
function patchedPushState(data, unused, url) {
|
|
145
|
-
originalPushState.apply(this, [data, unused, url]);
|
|
146
|
-
if (!destroyed) setTimeout(trackCurrentPath, 0);
|
|
147
|
-
}
|
|
148
|
-
function patchedReplaceState(data, unused, url) {
|
|
149
|
-
originalReplaceState.apply(this, [data, unused, url]);
|
|
150
|
-
if (!destroyed) setTimeout(trackCurrentPath, 0);
|
|
151
|
-
}
|
|
152
|
-
if (autoTrack) {
|
|
153
|
-
history.pushState = patchedPushState;
|
|
154
|
-
history.replaceState = patchedReplaceState;
|
|
155
|
-
window.addEventListener("popstate", trackCurrentPath);
|
|
156
|
-
if (document.readyState === "complete") {
|
|
157
|
-
trackCurrentPath();
|
|
158
|
-
} else {
|
|
159
|
-
window.addEventListener("load", trackCurrentPath, { once: true });
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
const isProduction = !isLocalHost;
|
|
163
|
-
const warnedReasons = /* @__PURE__ */ new Set();
|
|
164
|
-
function devWarn(name, reason) {
|
|
165
|
-
if (isProduction) return;
|
|
166
|
-
if (warnedReasons.has(reason)) return;
|
|
167
|
-
warnedReasons.add(reason);
|
|
168
|
-
console.warn(`[01 analytics] dropped event ${name}: ${reason}`);
|
|
169
|
-
}
|
|
170
|
-
const EVENT_NAME_RE = /^[a-zA-Z][a-zA-Z0-9_:-]{0,49}$/;
|
|
171
|
-
const RESERVED_PREFIXES = ["__", "_pv_"];
|
|
172
|
-
function validateEventName(name) {
|
|
173
|
-
if (!name || typeof name !== "string") return "name-empty";
|
|
174
|
-
for (const prefix of RESERVED_PREFIXES) {
|
|
175
|
-
if (name.startsWith(prefix)) return "name-reserved";
|
|
176
|
-
}
|
|
177
|
-
if (!EVENT_NAME_RE.test(name)) return "name-regex";
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
|
-
const PROP_KEY_RE = /^[a-zA-Z_][a-zA-Z0-9_]{0,31}$/;
|
|
181
|
-
function validateEventProps(props) {
|
|
182
|
-
if (props === void 0 || props === null) return null;
|
|
183
|
-
if (typeof props !== "object" || Array.isArray(props)) return "props-value-type";
|
|
184
|
-
const keys = Object.keys(props);
|
|
185
|
-
if (keys.length > 10) return "props-too-many-keys";
|
|
186
|
-
for (const k of keys) {
|
|
187
|
-
const v = props[k];
|
|
188
|
-
if (!PROP_KEY_RE.test(k)) return "props-key-regex";
|
|
189
|
-
if (typeof v === "string") {
|
|
190
|
-
if (v.length > 80) return "props-value-too-long";
|
|
191
|
-
} else if (typeof v === "number") {
|
|
192
|
-
if (!isFinite(v)) return "props-value-not-finite";
|
|
193
|
-
} else if (typeof v === "boolean") {
|
|
194
|
-
} else {
|
|
195
|
-
return "props-value-type";
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
return {
|
|
201
|
-
pageview(path) {
|
|
202
|
-
if (destroyed) return;
|
|
203
|
-
sendPageview(path ?? location.pathname);
|
|
204
|
-
},
|
|
205
|
-
track(name, props) {
|
|
206
|
-
if (destroyed) return;
|
|
207
|
-
if (isDntActive()) return;
|
|
208
|
-
const doc = document;
|
|
209
|
-
if (doc.prerendering === true || document.visibilityState === "prerender") return;
|
|
210
|
-
const nameErr = validateEventName(name);
|
|
211
|
-
if (nameErr) {
|
|
212
|
-
devWarn(name, nameErr);
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
if (props !== void 0) {
|
|
216
|
-
const propsErr = validateEventProps(props);
|
|
217
|
-
if (propsErr) {
|
|
218
|
-
devWarn(name, propsErr);
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
if (sendSuppressed) {
|
|
223
|
-
devSuppressNotice();
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
const body = JSON.stringify({
|
|
227
|
-
publishableKey: config.publishableKey,
|
|
228
|
-
pathname: location.pathname,
|
|
229
|
-
referrer: document.referrer || "",
|
|
230
|
-
eventId: newEventId(),
|
|
231
|
-
eventName: name,
|
|
232
|
-
eventProps: props,
|
|
233
|
-
eventTs: Date.now()
|
|
234
|
-
});
|
|
235
|
-
sendBeaconOrFetch(body);
|
|
236
|
-
},
|
|
237
|
-
destroy() {
|
|
238
|
-
if (destroyed) return;
|
|
239
|
-
destroyed = true;
|
|
240
|
-
if (autoTrack) {
|
|
241
|
-
history.pushState = originalPushState;
|
|
242
|
-
history.replaceState = originalReplaceState;
|
|
243
|
-
window.removeEventListener("popstate", trackCurrentPath);
|
|
244
|
-
}
|
|
245
|
-
lastPath = null;
|
|
246
|
-
lastAt = 0;
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// src/analytics/env.ts
|
|
252
|
-
var import_meta = {};
|
|
253
|
-
function readAnalyticsRuntimeEnv() {
|
|
254
|
-
const nextPublicKey = typeof process !== "undefined" ? process.env?.NEXT_PUBLIC_SOFTWARE_PUBLISHABLE_KEY : void 0;
|
|
255
|
-
const viteEnv = import_meta.env;
|
|
256
|
-
return {
|
|
257
|
-
nextPublicKey,
|
|
258
|
-
vitePublicKey: viteEnv?.VITE_SOFTWARE_PUBLISHABLE_KEY
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
function resolveAnalyticsPublishableKey(explicit, env = readAnalyticsRuntimeEnv()) {
|
|
262
|
-
if (explicit !== void 0) return explicit || void 0;
|
|
263
|
-
return env.nextPublicKey || env.vitePublicKey;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// src/analytics/react.tsx
|
|
267
|
-
function Analytics({
|
|
268
|
-
autoTrack,
|
|
269
|
-
endpoint,
|
|
270
|
-
mode,
|
|
271
|
-
publishableKey,
|
|
272
|
-
respectDnt
|
|
273
|
-
}) {
|
|
274
|
-
(0, import_react.useEffect)(() => {
|
|
275
|
-
const resolvedPublishableKey = resolveAnalyticsPublishableKey(publishableKey);
|
|
276
|
-
if (!resolvedPublishableKey) return;
|
|
277
|
-
const analytics = createAnalytics({
|
|
278
|
-
autoTrack,
|
|
279
|
-
endpoint,
|
|
280
|
-
mode,
|
|
281
|
-
publishableKey: resolvedPublishableKey,
|
|
282
|
-
respectDnt
|
|
283
|
-
});
|
|
284
|
-
return () => analytics.destroy();
|
|
285
|
-
}, [autoTrack, endpoint, mode, publishableKey, respectDnt]);
|
|
286
|
-
return null;
|
|
287
|
-
}
|
|
288
|
-
var react_default = Analytics;
|
|
289
|
-
var AnalyticsContext = (0, import_react.createContext)(null);
|
|
290
|
-
var NOOP_ANALYTICS = {
|
|
291
|
-
track() {
|
|
292
|
-
},
|
|
293
|
-
pageview() {
|
|
294
|
-
}
|
|
295
|
-
};
|
|
296
|
-
function AnalyticsProvider({
|
|
297
|
-
autoTrack,
|
|
298
|
-
endpoint,
|
|
299
|
-
mode,
|
|
300
|
-
publishableKey,
|
|
301
|
-
respectDnt,
|
|
302
|
-
children
|
|
303
|
-
}) {
|
|
304
|
-
const instanceRef = (0, import_react.useRef)(null);
|
|
305
|
-
const [value, setValue] = (0, import_react.useState)(NOOP_ANALYTICS);
|
|
306
|
-
(0, import_react.useEffect)(() => {
|
|
307
|
-
const resolvedPublishableKey = resolveAnalyticsPublishableKey(publishableKey);
|
|
308
|
-
if (!resolvedPublishableKey) return;
|
|
309
|
-
const analytics = createAnalytics({
|
|
310
|
-
autoTrack,
|
|
311
|
-
endpoint,
|
|
312
|
-
mode,
|
|
313
|
-
publishableKey: resolvedPublishableKey,
|
|
314
|
-
respectDnt
|
|
315
|
-
});
|
|
316
|
-
instanceRef.current = analytics;
|
|
317
|
-
setValue({
|
|
318
|
-
track: (...args) => instanceRef.current?.track(...args),
|
|
319
|
-
pageview: (path) => instanceRef.current?.pageview(path)
|
|
320
|
-
});
|
|
321
|
-
return () => {
|
|
322
|
-
analytics.destroy();
|
|
323
|
-
instanceRef.current = null;
|
|
324
|
-
setValue(NOOP_ANALYTICS);
|
|
325
|
-
};
|
|
326
|
-
}, [autoTrack, endpoint, mode, publishableKey, respectDnt]);
|
|
327
|
-
return /* @__PURE__ */ import_react.default.createElement(AnalyticsContext.Provider, { value }, children);
|
|
328
|
-
}
|
|
329
|
-
function useAnalytics() {
|
|
330
|
-
const ctx = (0, import_react.useContext)(AnalyticsContext);
|
|
331
|
-
if (ctx === null) {
|
|
332
|
-
throw new Error(
|
|
333
|
-
"useAnalytics must be used within an <AnalyticsProvider>."
|
|
334
|
-
);
|
|
335
|
-
}
|
|
336
|
-
return ctx;
|
|
337
|
-
}
|
|
338
|
-
function createAnalyticsHooks() {
|
|
339
|
-
return {
|
|
340
|
-
AnalyticsProvider,
|
|
341
|
-
useAnalytics
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
//# sourceMappingURL=react.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/analytics/react.tsx","../../src/core/internal/utils/api-url.ts","../../src/analytics.ts","../../src/analytics/env.ts"],"sourcesContent":["'use client'\n\nimport React, {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport {\n createAnalytics,\n // Aliased: the local `Analytics` component (value) would otherwise collide\n // with this type during .d.ts bundling, producing unparseable output.\n type Analytics as AnalyticsInstance,\n type AnalyticsConfig,\n type AnalyticsEventMap,\n} from '../analytics'\nimport { resolveAnalyticsPublishableKey } from './env'\n\nexport type AnalyticsProps = Omit<AnalyticsConfig, 'publishableKey'> & {\n publishableKey?: string\n}\n\nexport function Analytics({\n autoTrack,\n endpoint,\n mode,\n publishableKey,\n respectDnt,\n}: AnalyticsProps) {\n useEffect(() => {\n const resolvedPublishableKey =\n resolveAnalyticsPublishableKey(publishableKey)\n if (!resolvedPublishableKey) return\n\n const analytics = createAnalytics({\n autoTrack,\n endpoint,\n mode,\n publishableKey: resolvedPublishableKey,\n respectDnt,\n })\n\n return () => analytics.destroy()\n }, [autoTrack, endpoint, mode, publishableKey, respectDnt])\n\n return null\n}\n\nexport default Analytics\n\n// ============================================================================\n// AnalyticsProvider + useAnalytics\n// ============================================================================\n\ntype AnalyticsContextValue = Pick<AnalyticsInstance, 'track' | 'pageview'> | null\n\nconst AnalyticsContext = createContext<AnalyticsContextValue>(null)\n\nconst NOOP_ANALYTICS: Pick<AnalyticsInstance, 'track' | 'pageview'> = {\n track() {},\n pageview() {},\n} satisfies Pick<AnalyticsInstance, 'track' | 'pageview'>\n\nexport interface AnalyticsProviderProps extends AnalyticsProps {\n children: React.ReactNode\n}\n\nexport function AnalyticsProvider({\n autoTrack,\n endpoint,\n mode,\n publishableKey,\n respectDnt,\n children,\n}: AnalyticsProviderProps): React.ReactElement {\n // Hold one instance for the lifetime of the provider subtree.\n const instanceRef = useRef<AnalyticsInstance | null>(null)\n const [value, setValue] =\n useState<Pick<AnalyticsInstance, 'track' | 'pageview'>>(NOOP_ANALYTICS)\n\n useEffect(() => {\n const resolvedPublishableKey =\n resolveAnalyticsPublishableKey(publishableKey)\n if (!resolvedPublishableKey) return\n\n const analytics = createAnalytics({\n autoTrack,\n endpoint,\n mode,\n publishableKey: resolvedPublishableKey,\n respectDnt,\n })\n instanceRef.current = analytics\n setValue({\n track: (...args: Parameters<AnalyticsInstance['track']>) =>\n instanceRef.current?.track(...args),\n pageview: (path?: string) => instanceRef.current?.pageview(path),\n })\n\n return () => {\n analytics.destroy()\n instanceRef.current = null\n setValue(NOOP_ANALYTICS)\n }\n }, [autoTrack, endpoint, mode, publishableKey, respectDnt])\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n )\n}\n\nexport function useAnalytics<\n TEvents extends AnalyticsEventMap = AnalyticsEventMap,\n>(): Pick<AnalyticsInstance<TEvents>, 'track' | 'pageview'> {\n const ctx = useContext(AnalyticsContext)\n if (ctx === null) {\n throw new Error(\n 'useAnalytics must be used within an <AnalyticsProvider>.',\n )\n }\n return ctx as Pick<AnalyticsInstance<TEvents>, 'track' | 'pageview'>\n}\n\n/**\n * React counterpart of defineAnalyticsEvents: a typed Provider/hook pair so\n * call sites do not repeat the generic. Runtime values are the shared base\n * Provider/hook; the generic is compile-time only.\n */\nexport function createAnalyticsHooks<TEvents extends AnalyticsEventMap>(): {\n AnalyticsProvider: (props: AnalyticsProviderProps) => React.ReactElement\n useAnalytics: () => Pick<AnalyticsInstance<TEvents>, 'track' | 'pageview'>\n} {\n return {\n AnalyticsProvider,\n useAnalytics: useAnalytics as () => Pick<\n AnalyticsInstance<TEvents>,\n 'track' | 'pageview'\n >,\n }\n}\n","declare const __DEFAULT_API_URL__: string\n\nexport function resolveApiUrl(apiUrl?: string): string {\n if (apiUrl) {\n return apiUrl.replace(/\\/$/, '')\n }\n\n if (typeof process !== 'undefined' && process.env) {\n const envUrl =\n process.env.SOFTWARE_API_URL || process.env.NEXT_PUBLIC_SOFTWARE_API_URL\n if (envUrl) {\n return envUrl.replace(/\\/$/, '')\n }\n }\n return __DEFAULT_API_URL__\n}\n","/**\n * @01.software/sdk — Analytics Helper\n */\n\n/* ANALYTICS INVARIANTS START\n * @01.software/sdk — Analytics Helper\n *\n * ANALYTICS INVARIANTS\n * ====================\n * These invariants are the single source of truth for observable behavior.\n * They are mirrored verbatim in apps/console/src/app/api/analytics/script.js/route.ts.\n * Any change here MUST be reflected there, and vice versa.\n *\n * 1. DNT/GPC respect: when config.respectDnt !== false (default true) AND\n * (navigator.doNotTrack === '1' OR navigator.globalPrivacyControl === true),\n * all methods become no-ops. Zero network requests are made.\n *\n * 2. Prerender skip: when document.prerendering === true OR\n * document.visibilityState === 'prerender', pageview() sends zero requests.\n *\n * 3. 500ms same-path dedup: a pageview for the same pathname within 500ms of\n * the previous send is silently dropped. After 500ms the next call sends.\n *\n * 4. Transport: sendBeacon → fetch keepalive fallback.\n * Primary: navigator.sendBeacon(endpoint, new Blob([json], { type: 'text/plain' })).\n * Fallback (sendBeacon unavailable OR returns false):\n * fetch(endpoint, { method: 'POST', keepalive: true,\n * headers: { 'Content-Type': 'application/json' }, body: json }).catch(() => {})\n *\n * 5. Body-only publishableKey: publishableKey is always in the request body,\n * never in any HTTP header.\n *\n * 6. SSR no-op: when typeof window === 'undefined', createAnalytics() returns\n * a stub where all methods are no-ops. No side effects occur.\n *\n * 7. Error swallowing: all transport errors are caught and swallowed.\n * createAnalytics() and all returned methods never throw into the caller.\n *\n * 8. Client timestamp: every send carries eventTs (milliseconds since epoch)\n * captured with Date.now() immediately before transport. The collect\n * endpoint uses eventTs (a) to bucket the event into the client's\n * tenant-local day and (b) to enforce the late-arrival cutoff; events\n * submitted after the local-day-end grace window are dropped with\n * reason \"late\".\n *\n * 9. Dev / local-host send skip: in 'auto' mode (the default) all send paths\n * become no-ops when the page runs on a local host — location.hostname is\n * 'localhost', '127.0.0.1', or ends with '.local'. Validation and dev\n * warnings still run; only the network send is suppressed, and a one-time\n * console notice is emitted. SSR (6), DNT/GPC (1), and prerender (2) skips\n * are evaluated first. Overrides: both the SDK and the mirrored hosted\n * snippet accept mode 'production' (always send, even locally) and\n * 'development' (never send, on any host); 'auto' is the default. The\n * snippet reads mode from window.__01_analytics__.mode or the script's\n * data-mode attribute. For backward compatibility the snippet also accepts\n * captureOnLocalhost === true (via window.__01_analytics__.captureOnLocalhost\n * or data-capture-localhost), equivalent to mode 'production' when mode is\n * unset; an explicit mode wins.\n * ANALYTICS INVARIANTS END */\n\nimport { resolveApiUrl } from './core/internal/utils/api-url'\n\n// ============================================================================\n// Public Types\n// ============================================================================\n\nexport interface AnalyticsConfig {\n publishableKey: string\n /** Override the collect endpoint URL. Defaults to {SDK_BASE_URL}/api/analytics/collect */\n endpoint?: string\n /** Auto-patch history.pushState/replaceState and listen to popstate. Default: true */\n autoTrack?: boolean\n /** Respect navigator.doNotTrack and navigator.globalPrivacyControl. Default: true */\n respectDnt?: boolean\n /**\n * Send mode. 'auto' (default) skips all sends on local hosts\n * (localhost / 127.0.0.1 / *.local). 'production' always sends, even\n * locally. 'development' never sends, on any host. See INVARIANT 9.\n */\n mode?: 'auto' | 'production' | 'development'\n}\n\nexport type AnalyticsEventProps = Record<string, string | number | boolean>\n\nexport type AnalyticsEventMap = Record<string, AnalyticsEventProps | undefined>\n\n/**\n * Argument tuple for `track`. The default open map keeps `props` optional\n * (back-compat). A developer-declared closed map makes `props` required when\n * the event declares props, and omittable when the event value is `undefined`.\n */\nexport type TrackArgs<\n TEvents extends AnalyticsEventMap,\n K extends keyof TEvents & string,\n> = string extends keyof TEvents\n ? [props?: AnalyticsEventProps]\n : undefined extends TEvents[K]\n ? [props?: Exclude<TEvents[K], undefined>]\n : [props: TEvents[K]]\n\nexport interface Analytics<\n TEvents extends AnalyticsEventMap = AnalyticsEventMap,\n> {\n pageview(path?: string): void\n track<K extends keyof TEvents & string>(\n name: K,\n ...args: TrackArgs<TEvents, K>\n ): void\n destroy(): void\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nexport function createAnalytics<\n TEvents extends AnalyticsEventMap = AnalyticsEventMap,\n>(config: AnalyticsConfig): Analytics<TEvents> {\n // INVARIANT 6: SSR no-op\n if (typeof window === 'undefined') {\n return { pageview() {}, track() {}, destroy() {} } as Analytics<TEvents>\n }\n\n const endpoint =\n config.endpoint ?? `${resolveApiUrl()}/api/analytics/collect`\n\n // INVARIANT 1: DNT/GPC check (evaluated once at init; stays as closure)\n const respectDnt = config.respectDnt !== false\n function isDntActive(): boolean {\n if (!respectDnt) return false\n const nav = navigator as Navigator & { globalPrivacyControl?: boolean }\n return nav.doNotTrack === '1' || nav.globalPrivacyControl === true\n }\n\n // INVARIANT 9: local-host detection drives both dev warnings and the\n // auto send-skip. Hostname is the one signal shared with the hosted snippet.\n const isLocalHost: boolean = (() => {\n try {\n const h = location.hostname\n return h === 'localhost' || h === '127.0.0.1' || h.endsWith('.local')\n } catch {\n return false\n }\n })()\n\n const mode = config.mode ?? 'auto'\n const sendSuppressed =\n mode === 'development' || (mode === 'auto' && isLocalHost)\n\n let suppressNoticeShown = false\n function devSuppressNotice(): void {\n if (suppressNoticeShown) return\n suppressNoticeShown = true\n try {\n console.info(\n `[01 analytics] events disabled on local host (mode: '${mode}'). ` +\n `Pass mode: 'production' to send while developing.`,\n )\n } catch {\n // INVARIANT 7: swallow\n }\n }\n\n // INVARIANT 3: 500ms same-path dedup state\n let lastPath: string | null = null\n let lastAt = 0\n\n // autoTrack state — save originals for destroy()\n const autoTrack = config.autoTrack !== false\n const originalPushState = history.pushState\n const originalReplaceState = history.replaceState\n let destroyed = false\n\n // -------------------------------------------------------------------------\n // Core send logic\n // -------------------------------------------------------------------------\n\n // Generate a unique event ID (crypto.randomUUID when available, Date+Math.random fallback)\n function newEventId(): string {\n return typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : String(Date.now()) + String(Math.random())\n }\n\n // INVARIANT 4: sendBeacon → fetch keepalive fallback\n // INVARIANT 5: publishableKey in body only\n function sendBeaconOrFetch(body: string): void {\n try {\n if (typeof navigator.sendBeacon === 'function') {\n const blob = new Blob([body], { type: 'text/plain' })\n const sent = navigator.sendBeacon(endpoint, blob)\n if (sent) return\n // sent === false → fall through to fetch\n }\n // Fetch fallback\n fetch(endpoint, {\n method: 'POST',\n keepalive: true,\n headers: { 'Content-Type': 'application/json' },\n body,\n }).catch(() => {})\n } catch {\n // INVARIANT 7: swallow all errors\n }\n }\n\n function sendPageview(pathname: string): void {\n // INVARIANT 1: DNT/GPC\n if (isDntActive()) return\n\n // INVARIANT 2: prerender skip\n const doc = document as Document & { prerendering?: boolean }\n // visibilityState cast to string to accommodate non-standard 'prerender' value\n if (doc.prerendering === true || (document.visibilityState as string) === 'prerender') return\n\n // INVARIANT 9: skip sends on local hosts in auto mode\n if (sendSuppressed) {\n devSuppressNotice()\n return\n }\n\n // INVARIANT 3: 500ms same-path dedup\n const now = Date.now()\n if (pathname === lastPath && now - lastAt < 500) return\n lastPath = pathname\n lastAt = now\n\n const body = JSON.stringify({\n publishableKey: config.publishableKey,\n pathname,\n referrer: document.referrer || '',\n eventId: newEventId(),\n eventTs: Date.now(),\n })\n\n sendBeaconOrFetch(body)\n }\n\n // -------------------------------------------------------------------------\n // autoTrack: patch history methods + listen to popstate\n // -------------------------------------------------------------------------\n function trackCurrentPath(): void {\n if (destroyed) return\n sendPageview(location.pathname)\n }\n\n function patchedPushState(\n this: History,\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ): void {\n originalPushState.apply(this, [data, unused, url] as Parameters<typeof history.pushState>)\n if (!destroyed) setTimeout(trackCurrentPath, 0)\n }\n\n function patchedReplaceState(\n this: History,\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ): void {\n originalReplaceState.apply(this, [data, unused, url] as Parameters<typeof history.replaceState>)\n if (!destroyed) setTimeout(trackCurrentPath, 0)\n }\n\n if (autoTrack) {\n history.pushState = patchedPushState\n history.replaceState = patchedReplaceState\n window.addEventListener('popstate', trackCurrentPath)\n\n // Initial pageview\n if (document.readyState === 'complete') {\n trackCurrentPath()\n } else {\n window.addEventListener('load', trackCurrentPath, { once: true })\n }\n }\n\n // -------------------------------------------------------------------------\n // track() — client-side validation + send\n // -------------------------------------------------------------------------\n\n // Dev-mode detection for warnings: warn in dev, silent in production.\n // Reuses the same local-host signal as the send-skip (INVARIANT 9).\n const isProduction = !isLocalHost\n\n // One-shot warn dedup per reason per page load (keyed by reason only)\n const warnedReasons = new Set<string>()\n\n function devWarn(name: string, reason: string): void {\n if (isProduction) return\n if (warnedReasons.has(reason)) return\n warnedReasons.add(reason)\n console.warn(`[01 analytics] dropped event ${name}: ${reason}`)\n }\n\n const EVENT_NAME_RE = /^[a-zA-Z][a-zA-Z0-9_:-]{0,49}$/\n const RESERVED_PREFIXES = ['__', '_pv_']\n\n function validateEventName(name: string): string | null {\n if (!name || typeof name !== 'string') return 'name-empty'\n for (const prefix of RESERVED_PREFIXES) {\n if (name.startsWith(prefix)) return 'name-reserved'\n }\n if (!EVENT_NAME_RE.test(name)) return 'name-regex'\n return null\n }\n\n const PROP_KEY_RE = /^[a-zA-Z_][a-zA-Z0-9_]{0,31}$/\n\n function validateEventProps(\n props: Record<string, string | number | boolean> | undefined,\n ): string | null {\n if (props === undefined || props === null) return null\n if (typeof props !== 'object' || Array.isArray(props)) return 'props-value-type'\n const keys = Object.keys(props)\n if (keys.length > 10) return 'props-too-many-keys'\n for (const k of keys) {\n const v = props[k]\n if (!PROP_KEY_RE.test(k)) return 'props-key-regex'\n if (typeof v === 'string') {\n if (v.length > 80) return 'props-value-too-long'\n } else if (typeof v === 'number') {\n if (!isFinite(v)) return 'props-value-not-finite'\n } else if (typeof v === 'boolean') {\n // ok\n } else {\n return 'props-value-type'\n }\n }\n return null\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n return {\n pageview(path?: string): void {\n if (destroyed) return\n sendPageview(path ?? location.pathname)\n },\n\n track(name: string, props?: Record<string, string | number | boolean>): void {\n if (destroyed) return\n\n // INVARIANT 1: DNT/GPC (same as pageview)\n if (isDntActive()) return\n\n // INVARIANT 2: prerender skip\n const doc = document as Document & { prerendering?: boolean }\n if (doc.prerendering === true || (document.visibilityState as string) === 'prerender') return\n\n // Client-side validation\n const nameErr = validateEventName(name)\n if (nameErr) {\n devWarn(name, nameErr)\n return\n }\n\n if (props !== undefined) {\n const propsErr = validateEventProps(props)\n if (propsErr) {\n devWarn(name, propsErr)\n return\n }\n }\n\n // INVARIANT 9: skip sends on local hosts in auto mode (validation above\n // still runs so dev warnings fire)\n if (sendSuppressed) {\n devSuppressNotice()\n return\n }\n\n // Build body — no dedup for track() events\n const body = JSON.stringify({\n publishableKey: config.publishableKey,\n pathname: location.pathname,\n referrer: document.referrer || '',\n eventId: newEventId(),\n eventName: name,\n eventProps: props,\n eventTs: Date.now(),\n })\n\n sendBeaconOrFetch(body)\n },\n\n destroy(): void {\n if (destroyed) return\n destroyed = true\n\n if (autoTrack) {\n // Restore original history methods\n history.pushState = originalPushState\n history.replaceState = originalReplaceState\n window.removeEventListener('popstate', trackCurrentPath)\n }\n\n // Null out dedup state\n lastPath = null\n lastAt = 0\n },\n } as Analytics<TEvents>\n}\n\n/**\n * Bind a typed event map once, then create instances without repeating the\n * generic. Equivalent to `createAnalytics<TEvents>(config)`.\n */\nexport function defineAnalyticsEvents<\n TEvents extends AnalyticsEventMap,\n>(): (config: AnalyticsConfig) => Analytics<TEvents> {\n return (config) => createAnalytics<TEvents>(config)\n}\n","export type AnalyticsRuntimeEnv = {\n nextPublicKey?: string\n vitePublicKey?: string\n}\n\nexport function readAnalyticsRuntimeEnv(): AnalyticsRuntimeEnv {\n const nextPublicKey =\n typeof process !== 'undefined'\n ? process.env?.NEXT_PUBLIC_SOFTWARE_PUBLISHABLE_KEY\n : undefined\n\n const viteEnv = (\n import.meta as ImportMeta & {\n env?: Record<string, string | undefined>\n }\n ).env\n\n return {\n nextPublicKey,\n vitePublicKey: viteEnv?.VITE_SOFTWARE_PUBLISHABLE_KEY,\n }\n}\n\nexport function resolveAnalyticsPublishableKey(\n explicit?: string,\n env: AnalyticsRuntimeEnv = readAnalyticsRuntimeEnv(),\n): string | undefined {\n if (explicit !== undefined) return explicit || undefined\n\n return env.nextPublicKey || env.vitePublicKey\n}\n"],"mappings":"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","names":["React"]}
|