@prestack/thread-ui 0.0.1 → 0.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.
- package/CHANGELOG.md +177 -0
- package/dist/ui/animations/anm_appear.ts +13 -0
- package/dist/ui/animations/anm_blur_in.ts +19 -0
- package/dist/ui/animations/anm_blur_out.ts +18 -0
- package/dist/ui/animations/anm_dismiss.ts +18 -0
- package/dist/ui/animations/anm_drop.ts +19 -0
- package/dist/ui/animations/anm_fall.ts +18 -0
- package/dist/ui/animations/anm_flash.ts +18 -0
- package/dist/ui/animations/anm_glow.ts +16 -0
- package/dist/ui/animations/anm_lift.ts +16 -0
- package/dist/ui/animations/anm_nudge.ts +16 -0
- package/dist/ui/animations/anm_pop_in.ts +23 -0
- package/dist/ui/animations/anm_pop_out.ts +22 -0
- package/dist/ui/animations/anm_press.ts +12 -0
- package/dist/ui/animations/anm_pulse.ts +13 -0
- package/dist/ui/animations/anm_rise.ts +19 -0
- package/dist/ui/animations/anm_shake.ts +13 -0
- package/dist/ui/animations/anm_slide_in_left.ts +19 -0
- package/dist/ui/animations/anm_slide_in_right.ts +19 -0
- package/dist/ui/animations/anm_slide_out_left.ts +18 -0
- package/dist/ui/animations/anm_slide_out_right.ts +18 -0
- package/dist/ui/animations/anm_spin.ts +12 -0
- package/dist/ui/animations/anm_swell.ts +16 -0
- package/dist/ui/animations/anm_wobble.ts +24 -0
- package/dist/ui/animations/anm_zoom_in.ts +19 -0
- package/dist/ui/animations/anm_zoom_out.ts +18 -0
- package/dist/ui/animations.js +2 -3
- package/dist/ui/animations.ts +316 -0
- package/dist/ui/attach.js +13 -10
- package/dist/ui/attach.ts +607 -0
- package/dist/ui/charts.tsx +74 -0
- package/dist/ui/checked.d.ts +2 -2
- package/dist/ui/checked.ts +32 -0
- package/dist/ui/collector.ts +140 -0
- package/dist/ui/compositions.d.ts +11 -2
- package/dist/ui/compositions.js +283 -59
- package/dist/ui/compositions.ts +633 -0
- package/dist/ui/consent.ts +55 -0
- package/dist/ui/content.tsx +39 -0
- package/dist/ui/contrast.ts +27 -0
- package/dist/ui/controls.tsx +30 -0
- package/dist/ui/disclosure.tsx +22 -0
- package/dist/ui/dismiss-layer.ts +87 -0
- package/dist/ui/door.ts +140 -0
- package/dist/ui/drag.ts +316 -0
- package/dist/ui/elements/accordion.js +2 -2
- package/dist/ui/elements/accordion.tsx +47 -0
- package/dist/ui/elements/accordion.works.ts +66 -0
- package/dist/ui/elements/aspect-ratio.js +1 -1
- package/dist/ui/elements/aspect-ratio.tsx +30 -0
- package/dist/ui/elements/aspect-ratio.works.ts +5 -0
- package/dist/ui/elements/avatar.js +1 -1
- package/dist/ui/elements/avatar.tsx +33 -0
- package/dist/ui/elements/avatar.works.ts +16 -0
- package/dist/ui/elements/badge.js +1 -1
- package/dist/ui/elements/badge.tsx +32 -0
- package/dist/ui/elements/badge.works.ts +9 -0
- package/dist/ui/elements/bars.js +2 -2
- package/dist/ui/elements/bars.tsx +49 -0
- package/dist/ui/elements/bars.works.ts +29 -0
- package/dist/ui/elements/box.js +3 -2
- package/dist/ui/elements/box.tsx +35 -0
- package/dist/ui/elements/breadcrumb.js +2 -2
- package/dist/ui/elements/breadcrumb.tsx +37 -0
- package/dist/ui/elements/breadcrumb.works.ts +24 -0
- package/dist/ui/elements/button.js +1 -1
- package/dist/ui/elements/button.tsx +45 -0
- package/dist/ui/elements/button.works.tsx +52 -0
- package/dist/ui/elements/column.js +1 -1
- package/dist/ui/elements/column.tsx +28 -0
- package/dist/ui/elements/consent.js +2 -2
- package/dist/ui/elements/consent.tsx +70 -0
- package/dist/ui/elements/consent.works.tsx +132 -0
- package/dist/ui/elements/donut.js +2 -2
- package/dist/ui/elements/donut.tsx +44 -0
- package/dist/ui/elements/donut.works.ts +42 -0
- package/dist/ui/elements/each.js +1 -1
- package/dist/ui/elements/each.tsx +33 -0
- package/dist/ui/elements/each.works.tsx +82 -0
- package/dist/ui/elements/empty.js +1 -1
- package/dist/ui/elements/empty.tsx +32 -0
- package/dist/ui/elements/field.js +1 -1
- package/dist/ui/elements/field.tsx +44 -0
- package/dist/ui/elements/field.works.ts +65 -0
- package/dist/ui/elements/funnel.js +2 -2
- package/dist/ui/elements/funnel.tsx +49 -0
- package/dist/ui/elements/funnel.works.ts +37 -0
- package/dist/ui/elements/gauge.js +1 -1
- package/dist/ui/elements/gauge.tsx +39 -0
- package/dist/ui/elements/gauge.works.ts +42 -0
- package/dist/ui/elements/glyph.js +1 -1
- package/dist/ui/elements/glyph.tsx +29 -0
- package/dist/ui/elements/glyph.works.tsx +42 -0
- package/dist/ui/elements/grid.js +1 -1
- package/dist/ui/elements/grid.tsx +28 -0
- package/dist/ui/elements/heatmap.js +2 -2
- package/dist/ui/elements/heatmap.tsx +47 -0
- package/dist/ui/elements/heatmap.works.ts +24 -0
- package/dist/ui/elements/hit-box.js +1 -1
- package/dist/ui/elements/hit-box.tsx +46 -0
- package/dist/ui/elements/hit-box.works.tsx +576 -0
- package/dist/ui/elements/image.js +1 -1
- package/dist/ui/elements/image.tsx +28 -0
- package/dist/ui/elements/line-chart.js +2 -2
- package/dist/ui/elements/line-chart.tsx +44 -0
- package/dist/ui/elements/line-chart.works.ts +41 -0
- package/dist/ui/elements/link.js +1 -1
- package/dist/ui/elements/link.tsx +37 -0
- package/dist/ui/elements/link.works.ts +25 -0
- package/dist/ui/elements/media.js +1 -1
- package/dist/ui/elements/media.tsx +56 -0
- package/dist/ui/elements/menu.js +2 -2
- package/dist/ui/elements/menu.tsx +50 -0
- package/dist/ui/elements/menu.works.tsx +153 -0
- package/dist/ui/elements/money.js +1 -1
- package/dist/ui/elements/money.tsx +28 -0
- package/dist/ui/elements/money.works.ts +9 -0
- package/dist/ui/elements/pagination.js +2 -2
- package/dist/ui/elements/pagination.tsx +38 -0
- package/dist/ui/elements/pagination.works.ts +20 -0
- package/dist/ui/elements/progress.js +1 -1
- package/dist/ui/elements/progress.tsx +33 -0
- package/dist/ui/elements/progress.works.ts +8 -0
- package/dist/ui/elements/radio-group.js +2 -2
- package/dist/ui/elements/radio-group.tsx +49 -0
- package/dist/ui/elements/radio-group.works.ts +33 -0
- package/dist/ui/elements/row.js +1 -1
- package/dist/ui/elements/row.tsx +28 -0
- package/dist/ui/elements/scatter.js +1 -1
- package/dist/ui/elements/scatter.tsx +41 -0
- package/dist/ui/elements/scatter.works.ts +38 -0
- package/dist/ui/elements/select.js +2 -2
- package/dist/ui/elements/select.tsx +42 -0
- package/dist/ui/elements/select.works.ts +5 -0
- package/dist/ui/elements/separator.js +1 -1
- package/dist/ui/elements/separator.tsx +30 -0
- package/dist/ui/elements/skeleton.js +1 -1
- package/dist/ui/elements/skeleton.tsx +30 -0
- package/dist/ui/elements/slider.js +1 -1
- package/dist/ui/elements/slider.tsx +33 -0
- package/dist/ui/elements/slider.works.ts +5 -0
- package/dist/ui/elements/sparkline.js +1 -1
- package/dist/ui/elements/sparkline.tsx +36 -0
- package/dist/ui/elements/sparkline.works.ts +32 -0
- package/dist/ui/elements/spinner.js +1 -1
- package/dist/ui/elements/spinner.tsx +32 -0
- package/dist/ui/elements/stack.js +1 -1
- package/dist/ui/elements/stack.tsx +28 -0
- package/dist/ui/elements/stat.js +1 -1
- package/dist/ui/elements/stat.tsx +35 -0
- package/dist/ui/elements/stat.works.ts +14 -0
- package/dist/ui/elements/surface.js +1 -1
- package/dist/ui/elements/surface.tsx +35 -0
- package/dist/ui/elements/surface.works.ts +9 -0
- package/dist/ui/elements/table.js +2 -2
- package/dist/ui/elements/table.tsx +61 -0
- package/dist/ui/elements/table.works.ts +30 -0
- package/dist/ui/elements/tabs.js +2 -2
- package/dist/ui/elements/tabs.tsx +47 -0
- package/dist/ui/elements/tabs.works.ts +84 -0
- package/dist/ui/elements/text.js +1 -1
- package/dist/ui/elements/text.tsx +32 -0
- package/dist/ui/elements/textarea.js +1 -1
- package/dist/ui/elements/textarea.tsx +37 -0
- package/dist/ui/elements/textarea.works.ts +5 -0
- package/dist/ui/elements/time.js +1 -1
- package/dist/ui/elements/time.tsx +34 -0
- package/dist/ui/elements/time.works.ts +25 -0
- package/dist/ui/elements/toggle.js +1 -1
- package/dist/ui/elements/toggle.tsx +33 -0
- package/dist/ui/elements/toggle.works.ts +5 -0
- package/dist/ui/elements/tooltip.js +1 -1
- package/dist/ui/elements/tooltip.tsx +39 -0
- package/dist/ui/elements/tooltip.works.ts +77 -0
- package/dist/ui/elements/value.js +1 -1
- package/dist/ui/elements/value.tsx +30 -0
- package/dist/ui/elements/value.works.ts +9 -0
- package/dist/ui/elements.ts +127 -0
- package/dist/ui/focus-scope.ts +121 -0
- package/dist/ui/fonts.ts +355 -0
- package/dist/ui/generators/dev.js +2 -1
- package/dist/ui/generators/dev.ts +80 -0
- package/dist/ui/generators/elements.d.ts +1 -11
- package/dist/ui/generators/elements.js +44 -14
- package/dist/ui/generators/elements.ts +794 -0
- package/dist/ui/generators/i18n.js +2 -3
- package/dist/ui/generators/i18n.ts +300 -0
- package/dist/ui/generators/icons.js +3 -12
- package/dist/ui/generators/icons.ts +214 -0
- package/dist/ui/generators/react.js +13 -5
- package/dist/ui/generators/react.ts +269 -0
- package/dist/ui/generators/routes.d.ts +1 -0
- package/dist/ui/generators/routes.js +99 -83
- package/dist/ui/generators/routes.ts +743 -0
- package/dist/ui/generators/show.js +4 -12
- package/dist/ui/generators/show.ts +260 -0
- package/dist/ui/generators/styles.js +3 -4
- package/dist/ui/generators/styles.ts +669 -0
- package/dist/ui/generators/variants.js +2 -3
- package/dist/ui/generators/variants.ts +204 -0
- package/dist/ui/i18n/catalogs/en.ts +191 -0
- package/dist/ui/i18n/format.ts +221 -0
- package/dist/ui/i18n/locales.ts +33 -0
- package/dist/ui/i18n/parse.ts +315 -0
- package/dist/ui/i18n/translator.ts +31 -0
- package/dist/ui/i18n/types.ts +96 -0
- package/dist/ui/icons.ts +331 -0
- package/dist/ui/islands/map.ts +58 -0
- package/dist/ui/localizations.ts +75 -0
- package/dist/ui/material.ts +236 -0
- package/dist/ui/materials/mat_bordered.ts +13 -0
- package/dist/ui/materials/mat_ceramic.ts +13 -0
- package/dist/ui/materials/mat_clay.ts +13 -0
- package/dist/ui/materials/mat_elevated.ts +24 -0
- package/dist/ui/materials/mat_flat.ts +34 -0
- package/dist/ui/materials/mat_glass.ts +20 -0
- package/dist/ui/materials/mat_lit.ts +13 -0
- package/dist/ui/materials/mat_moulded.ts +11 -0
- package/dist/ui/materials.js +2 -3
- package/dist/ui/materials.ts +205 -0
- package/dist/ui/modes.ts +44 -0
- package/dist/ui/navigation.tsx +32 -0
- package/dist/ui/positioning.ts +90 -0
- package/dist/ui/presented.tsx +119 -0
- package/dist/ui/provider.d.ts +2 -0
- package/dist/ui/provider.js +7 -1
- package/dist/ui/provider.tsx +182 -0
- package/dist/ui/render-loop.ts +133 -0
- package/dist/ui/roving-focus.ts +161 -0
- package/dist/ui/screens.js +22 -22
- package/dist/ui/screens.ts +141 -0
- package/dist/ui/scroll-lock.ts +28 -0
- package/dist/ui/series.ts +97 -0
- package/dist/ui/signals.ts +386 -0
- package/dist/ui/styleguide.ts +231 -0
- package/dist/ui/styleguides.ts +374 -0
- package/dist/ui/themes.ts +22 -0
- package/dist/ui/token.js +1 -1
- package/dist/ui/token.ts +78 -0
- package/dist/ui/tokens/shadow.ts +25 -0
- package/dist/ui/tokens.js +1 -2
- package/dist/ui/tokens.ts +234 -0
- package/dist/ui/validators.ts +232 -0
- package/dist/ui/variant.d.ts +1 -0
- package/dist/ui/variant.js +3 -0
- package/dist/ui/variant.ts +352 -0
- package/dist/ui/variants/var_avatar-round.ts +14 -0
- package/dist/ui/variants/var_bubble-me.ts +14 -0
- package/dist/ui/variants/var_bubble-them.ts +13 -0
- package/dist/ui/variants/var_button-border.ts +76 -0
- package/dist/ui/variants/var_button-cta.ts +76 -0
- package/dist/ui/variants/var_button-destructive-ghost.ts +72 -0
- package/dist/ui/variants/var_button-destructive.ts +76 -0
- package/dist/ui/variants/var_button-fill.ts +76 -0
- package/dist/ui/variants/var_button-ghost.ts +72 -0
- package/dist/ui/variants/var_button-glass.ts +55 -0
- package/dist/ui/variants/var_button-normal.ts +76 -0
- package/dist/ui/variants/var_button-quiet.ts +74 -0
- package/dist/ui/variants/var_card.ts +17 -0
- package/dist/ui/variants/var_chip.ts +13 -0
- package/dist/ui/variants/var_choice.ts +15 -0
- package/dist/ui/variants/var_framed.ts +10 -0
- package/dist/ui/variants/var_glyph-plain.ts +11 -0
- package/dist/ui/variants/var_input.ts +43 -0
- package/dist/ui/variants/var_link-inline.ts +29 -0
- package/dist/ui/variants/var_list-row.ts +34 -0
- package/dist/ui/variants/var_rule.ts +10 -0
- package/dist/ui/variants/var_skeleton-block.ts +12 -0
- package/dist/ui/variants/var_spinner-turning.ts +12 -0
- package/dist/ui/variants/var_stat-tile.ts +13 -0
- package/dist/ui/variants/var_tab-bar.ts +15 -0
- package/dist/ui/variants/var_tap-target.ts +25 -0
- package/dist/ui/variants.ts +64 -0
- package/dist/ui/wrappers.d.ts +4 -1
- package/dist/ui/wrappers.js +60 -20
- package/dist/ui/wrappers.tsx +426 -0
- package/package.json +8 -2
- package/dist/ui/makers/message.d.ts +0 -1
- package/dist/ui/makers/message.js +0 -230
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { formatValue } from './validators.ts'
|
|
4
|
+
import { seriesColour, seriesRamp } from './series.ts'
|
|
5
|
+
import { classOfElement } from './variant.ts'
|
|
6
|
+
|
|
7
|
+
import { element, useSurface, useUi } from './wrappers.tsx'
|
|
8
|
+
import type { MessageKey } from './content.tsx'
|
|
9
|
+
|
|
10
|
+
export type Row = Readonly<Record<string, unknown>>
|
|
11
|
+
|
|
12
|
+
export type WhenTight = 'scroll' | 'bucket' | 'wrap' | 'shrink'
|
|
13
|
+
|
|
14
|
+
export interface ChartBase {
|
|
15
|
+
readonly rows: readonly Row[]
|
|
16
|
+
readonly titleKey?: MessageKey
|
|
17
|
+
|
|
18
|
+
readonly whenTight?: WhenTight
|
|
19
|
+
|
|
20
|
+
readonly format?: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const num = (row: Row, key: string): number => {
|
|
24
|
+
const v = row[key]
|
|
25
|
+
return typeof v === 'number' ? v : Number(v ?? 0)
|
|
26
|
+
}
|
|
27
|
+
export const str = (row: Row, key: string): string => String(row[key] ?? '')
|
|
28
|
+
|
|
29
|
+
export function useRamp(count: number): readonly string[] {
|
|
30
|
+
const { palette } = useUi()
|
|
31
|
+
return seriesRamp(palette.accent, palette.surface, Math.max(1, count))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function placed(element: string, place: string): string {
|
|
35
|
+
return `${classOfElement(element)}-${place}`
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function measured(held: Readonly<Record<string, string | number>>): Record<string, string | number> {
|
|
39
|
+
const out: Record<string, string | number> = {}
|
|
40
|
+
for (const [name, value] of Object.entries(held)) out[`--${name}`] = value
|
|
41
|
+
return out
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function EmptyFrame({ className }: { className?: string }): React.ReactElement {
|
|
45
|
+
return <div className={className} data-empty="true" />
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface SeriesProps extends ChartBase {
|
|
49
|
+
readonly value: string
|
|
50
|
+
readonly at: string
|
|
51
|
+
|
|
52
|
+
readonly by?: string
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function polyline(values: readonly number[], width: number, height: number): string {
|
|
56
|
+
if (values.length === 0) return ''
|
|
57
|
+
const max = Math.max(...values)
|
|
58
|
+
const min = Math.min(...values, 0)
|
|
59
|
+
const span = max - min || 1
|
|
60
|
+
const step = values.length === 1 ? 0 : width / (values.length - 1)
|
|
61
|
+
return values.map((v, i) => `${(i * step).toFixed(2)},${(height - ((v - min) / span) * height).toFixed(2)}`).join(' ')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface CategoryProps extends ChartBase {
|
|
65
|
+
readonly value: string
|
|
66
|
+
readonly by: string
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface TwoAxisProps extends ChartBase {
|
|
70
|
+
readonly x: string
|
|
71
|
+
readonly y: string
|
|
72
|
+
readonly value?: string
|
|
73
|
+
}
|
|
74
|
+
|
package/dist/ui/checked.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ELEMENTS } from './elements.ts';
|
|
2
|
-
import { VARIANTS } from './variants.ts';
|
|
1
|
+
import type { ELEMENTS } from './elements.ts';
|
|
2
|
+
import type { VARIANTS } from './variants.ts';
|
|
3
3
|
type Shipped = (typeof VARIANTS)['declares'][number];
|
|
4
4
|
export interface Wearing {
|
|
5
5
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ELEMENTS } from './elements.ts'
|
|
2
|
+
import type { VARIANTS } from './variants.ts'
|
|
3
|
+
|
|
4
|
+
type Shipped = (typeof VARIANTS)['declares'][number]
|
|
5
|
+
|
|
6
|
+
export interface Wearing {}
|
|
7
|
+
|
|
8
|
+
export interface Dispatching {}
|
|
9
|
+
|
|
10
|
+
export type VariantsFor<E extends string> = Shipped extends infer One
|
|
11
|
+
? One extends { readonly id: string; readonly wears: readonly string[] }
|
|
12
|
+
? E extends One['wears'][number]
|
|
13
|
+
? Camel<One['id']>
|
|
14
|
+
: never
|
|
15
|
+
: never
|
|
16
|
+
: never
|
|
17
|
+
|
|
18
|
+
type Pascal<S extends string> = S extends `${infer Head}-${infer Rest}`
|
|
19
|
+
? `${Capitalize<Head>}${Pascal<Rest>}`
|
|
20
|
+
: Capitalize<S>
|
|
21
|
+
|
|
22
|
+
type Camel<S extends string> = S extends `${infer Head}-${infer Rest}` ? `${Head}${Pascal<Rest>}` : S
|
|
23
|
+
|
|
24
|
+
export type ArrangementElement = (typeof ELEMENTS)['declares'][number] extends infer One
|
|
25
|
+
? One extends { readonly arranges: true; readonly id: infer Id extends string }
|
|
26
|
+
? Pascal<Id>
|
|
27
|
+
: never
|
|
28
|
+
: never
|
|
29
|
+
|
|
30
|
+
export function idOf(name: string): string {
|
|
31
|
+
return name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()
|
|
32
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
export interface ClientEvent {
|
|
4
|
+
|
|
5
|
+
readonly property: 'interaction' | 'visit' | 'consent'
|
|
6
|
+
|
|
7
|
+
readonly screen?: string
|
|
8
|
+
|
|
9
|
+
readonly element?: string
|
|
10
|
+
|
|
11
|
+
readonly name?: string
|
|
12
|
+
|
|
13
|
+
readonly action?: string
|
|
14
|
+
|
|
15
|
+
readonly refusedBy?: string
|
|
16
|
+
|
|
17
|
+
readonly attempt?: number
|
|
18
|
+
|
|
19
|
+
readonly at: number
|
|
20
|
+
|
|
21
|
+
readonly seq: number
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface CollectorOptions {
|
|
25
|
+
|
|
26
|
+
readonly endpoint: string
|
|
27
|
+
|
|
28
|
+
readonly allowed: () => boolean
|
|
29
|
+
|
|
30
|
+
readonly sample?: number
|
|
31
|
+
|
|
32
|
+
readonly maxBatch?: number
|
|
33
|
+
|
|
34
|
+
readonly intervalMs?: number
|
|
35
|
+
|
|
36
|
+
readonly now?: () => number
|
|
37
|
+
readonly random?: () => number
|
|
38
|
+
readonly fetch?: typeof globalThis.fetch
|
|
39
|
+
|
|
40
|
+
readonly beacon?: (url: string, body: string) => boolean
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type RecordedEvent = Omit<ClientEvent, 'at' | 'seq'>
|
|
44
|
+
|
|
45
|
+
export interface Collector {
|
|
46
|
+
record: (event: RecordedEvent) => void
|
|
47
|
+
flush: () => Promise<void>
|
|
48
|
+
|
|
49
|
+
stop: () => void
|
|
50
|
+
|
|
51
|
+
dropped: () => number
|
|
52
|
+
|
|
53
|
+
pending: () => number
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const INERT_COLLECTOR: Collector = {
|
|
57
|
+
record: () => undefined,
|
|
58
|
+
flush: async () => undefined,
|
|
59
|
+
stop: () => undefined,
|
|
60
|
+
dropped: () => 0,
|
|
61
|
+
pending: () => 0,
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function createCollector(options: CollectorOptions): Collector {
|
|
65
|
+
const now = options.now ?? (() => Date.now())
|
|
66
|
+
const random = options.random ?? Math.random
|
|
67
|
+
const maxBatch = options.maxBatch ?? 25
|
|
68
|
+
const intervalMs = options.intervalMs ?? 10_000
|
|
69
|
+
|
|
70
|
+
const sampled = (options.sample ?? 1) >= 1 || random() < (options.sample ?? 1)
|
|
71
|
+
if (!sampled) return INERT_COLLECTOR
|
|
72
|
+
|
|
73
|
+
let buffer: ClientEvent[] = []
|
|
74
|
+
let dropped = 0
|
|
75
|
+
let stopped = false
|
|
76
|
+
|
|
77
|
+
let seq = 0
|
|
78
|
+
|
|
79
|
+
const send = async (batch: readonly ClientEvent[]): Promise<void> => {
|
|
80
|
+
if (batch.length === 0) return
|
|
81
|
+
const body = JSON.stringify({ events: batch })
|
|
82
|
+
|
|
83
|
+
if (options.beacon !== undefined && options.beacon(options.endpoint, body)) return
|
|
84
|
+
|
|
85
|
+
const doFetch = options.fetch ?? globalThis.fetch
|
|
86
|
+
if (doFetch === undefined) {
|
|
87
|
+
dropped += batch.length
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
const response = await doFetch(options.endpoint, {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
headers: { 'content-type': 'application/json' },
|
|
95
|
+
|
|
96
|
+
keepalive: true,
|
|
97
|
+
body,
|
|
98
|
+
})
|
|
99
|
+
if (!response.ok) dropped += batch.length
|
|
100
|
+
} catch {
|
|
101
|
+
|
|
102
|
+
dropped += batch.length
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const flush = async (): Promise<void> => {
|
|
107
|
+
const batch = buffer
|
|
108
|
+
buffer = []
|
|
109
|
+
await send(batch)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const record = (event: RecordedEvent): void => {
|
|
113
|
+
|
|
114
|
+
if (stopped || !options.allowed()) return
|
|
115
|
+
|
|
116
|
+
buffer.push({ ...event, at: now(), seq: ++seq })
|
|
117
|
+
if (buffer.length >= maxBatch) void flush()
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const timer = setInterval(() => void flush(), intervalMs)
|
|
121
|
+
|
|
122
|
+
;(timer as unknown as { unref?: () => void }).unref?.()
|
|
123
|
+
|
|
124
|
+
const onHide = (): void => {
|
|
125
|
+
if (globalThis.document?.visibilityState === 'hidden') void flush()
|
|
126
|
+
}
|
|
127
|
+
globalThis.document?.addEventListener('visibilitychange', onHide)
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
record,
|
|
131
|
+
flush,
|
|
132
|
+
stop: () => {
|
|
133
|
+
stopped = true
|
|
134
|
+
clearInterval(timer)
|
|
135
|
+
globalThis.document?.removeEventListener('visibilitychange', onHide)
|
|
136
|
+
},
|
|
137
|
+
dropped: () => dropped,
|
|
138
|
+
pending: () => buffer.length,
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -7,14 +7,23 @@ export declare const COMPOSITIONS: Threaded & {
|
|
|
7
7
|
readonly files: string;
|
|
8
8
|
};
|
|
9
9
|
export declare function nameOf(at: string): string;
|
|
10
|
-
export declare
|
|
10
|
+
export declare const catalogue: () => Promise<readonly string[]>;
|
|
11
|
+
export declare const screening: () => Promise<readonly string[]>;
|
|
11
12
|
export declare function composed(body: string, rows: readonly {
|
|
12
13
|
readonly id: string;
|
|
13
14
|
readonly at?: string;
|
|
14
15
|
}[], from: 'screens' | 'compositions', except?: string): readonly string[];
|
|
16
|
+
export declare const HOME: string;
|
|
15
17
|
export declare const DOORS: ReadonlySet<string>;
|
|
16
18
|
export declare function reaching(at: string, text: string, elements: ReadonlySet<string>, declared: ReadonlySet<string>): readonly string[];
|
|
17
|
-
export declare
|
|
19
|
+
export declare const COMPILED = "app/_generated/compiled";
|
|
20
|
+
export declare function compiledAt(at: string): string;
|
|
21
|
+
export declare function settled(root: string, rows: readonly Threaded[], checking: boolean, by: string, kept: Set<string>): readonly string[];
|
|
22
|
+
export declare const RUNTIME: readonly string[];
|
|
23
|
+
export declare function emitting(root: string, entries: readonly string[], checking: boolean, kept: Set<string>): readonly string[];
|
|
24
|
+
export declare function stale(root: string, kept: ReadonlySet<string>, checking: boolean): readonly string[];
|
|
25
|
+
export declare function handing(at: string, text: string): readonly string[];
|
|
26
|
+
export declare function undeclared(tree: Tree, rows: readonly Threaded[]): readonly string[];
|
|
18
27
|
export declare function seeds(rows: readonly Threaded[], held: (at: string) => boolean): readonly {
|
|
19
28
|
readonly path: string;
|
|
20
29
|
readonly content: string;
|