@w100n/documents 0.19.0 → 0.20.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/editor/live.ts","../src/room.ts"],"sourcesContent":["import { HocuspocusProvider } from '@hocuspocus/provider';\nimport type { JSONContent } from '@tiptap/core';\nimport { useEffect, useRef, useState } from 'react';\nimport type { Awareness } from 'y-protocols/awareness';\nimport * as Y from 'yjs';\nimport { filled, seed, type Kind } from '../collab';\nimport { Link } from '../room';\nimport type { DocumentsHost, Language, Person } from '../types';\n\ntype Peer = Person & { color: string; me: boolean; selection?: { sheet: string; range: string } };\n\ntype Wire = {\n awareness: Awareness | null;\n isSynced: boolean;\n unsyncedChanges: number;\n on(name: string, fn: (payload: never) => void): unknown;\n off(name: string, fn: (payload: never) => void): unknown;\n sendStateless(payload: string): void;\n destroy(): void;\n};\n\ntype State = { synced: boolean; ready: boolean; online: boolean; late: boolean; denied: boolean; readonly: boolean; people: Peer[]; pending: boolean; unsynced: boolean };\n\nconst colors = ['#1d4ed8', '#be185d', '#15803d', '#c2410c', '#6d28d9', '#0e7490', '#a16207', '#b91c1c'];\nconst colorOf = (id: string) => colors[[...id].reduce((h, c) => (Math.imul(h, 31) + c.charCodeAt(0)) >>> 0, 7) % colors.length];\n\nconst idle: State = { synced: false, ready: false, online: false, late: false, denied: false, readonly: false, people: [], pending: false, unsynced: false };\n\nexport function useLive(host: DocumentsHost | undefined, id: string, kind: Kind, bytes: ArrayBuffer, json: JSONContent | undefined, language: Language, edit: boolean, onSaved?: () => void) {\n const url = host?.collab?.url;\n const owner = useRef(host);\n const [wire, setWire] = useState<{ doc: Y.Doc; link: Wire; user: Record<string, string> } | null>(null);\n const [state, setState] = useState(idle);\n const waiting = useRef<((ok: boolean) => void) | null>(null);\n const saved = useRef(onSaved);\n\n useEffect(() => {\n owner.current = host;\n saved.current = onSaved;\n });\n\n useEffect(() => {\n const host = owner.current;\n if (!host?.collab || !url) return;\n const doc = new Y.Doc();\n const me = host.me;\n const user = { id: me.id, name: me.name, avatar: me.avatarUrl ?? '', color: colorOf(me.id) };\n const wire = new URL(url, location.href);\n wire.protocol = wire.protocol.replace('http', 'ws');\n wire.searchParams.set('lang', language);\n const link: Wire = url.startsWith('memory:')\n ? new Link(`${url}\\n${id}`, id, kind, doc, host, { id: me.id, name: me.name, language }, edit)\n : new HocuspocusProvider({ url: wire.href, name: id, document: doc, token: () => owner.current!.collab!.token() });\n const set = (next: Partial<State>) => setState(s => ({ ...s, ...next }));\n const editors = doc.getMap('editors');\n const meta = doc.getMap('meta');\n const people = () => {\n const seen = new Map<string, Peer>();\n link.awareness?.getStates().forEach((s, client) => {\n const u = s.user as { id?: string; name?: string; avatar?: string; color?: string } | undefined;\n if (u?.id && u.name && !seen.has(u.id)) seen.set(u.id, { id: u.id, name: u.name, avatarUrl: u.avatar || null, color: u.color ?? colorOf(u.id), me: client === doc.clientID, selection: s.selection });\n });\n set({ people: [...seen.values()] });\n };\n const on = <T,>(name: string, fn: (payload: T) => void) => link.on(name, fn as (payload: never) => void);\n on<{ state: boolean }>('synced', ({ state }) => { if (state) set({ synced: true, online: true }); });\n on<{ status: string }>('status', ({ status }) => set({ online: status === 'connected' && link.isSynced }));\n on<{ scope: string }>('authenticated', ({ scope }) => set({ readonly: scope === 'readonly' }));\n on('authenticationFailed', () => set({ denied: true }));\n on<{ number: number }>('unsyncedChanges', ({ number }) => set({ unsynced: number > 0 }));\n on<{ payload: string }>('stateless', ({ payload }) => {\n const reply = JSON.parse(payload) as { saved?: string | null; failed?: boolean };\n if (!('saved' in reply) && !reply.failed) return;\n waiting.current?.(!reply.failed);\n waiting.current = null;\n });\n link.awareness?.on('change', people);\n editors.observe(() => set({ pending: editors.size > 0 }));\n meta.observe(e => { if (e.keysChanged.has('version')) saved.current?.(); });\n const late = setTimeout(() => set({ late: true }), 4000);\n setWire({ doc, link, user });\n return () => {\n clearTimeout(late);\n waiting.current?.(false);\n link.destroy();\n doc.destroy();\n setWire(null);\n setState(idle);\n };\n }, [url, id, kind, edit, language]);\n\n useEffect(() => {\n if (!wire || !state.synced || state.ready) return;\n if (filled(wire.doc) || ((json || kind === 'xlsx' || kind === 'csv') && seed(wire.doc, kind, bytes, json))) setState(s => ({ ...s, ready: true }));\n }, [wire, state.synced, state.ready, json, bytes, kind]);\n\n const save = () => new Promise<boolean>(done => {\n if (!wire) return done(false);\n waiting.current?.(false);\n waiting.current = done;\n wire.link.sendStateless(JSON.stringify({ save: true }));\n setTimeout(() => { if (waiting.current === done) { waiting.current = null; done(false); } }, 30000);\n });\n\n return url ? { ...state, wire, save } : null;\n}\n","import { applyAwarenessUpdate, Awareness, encodeAwarenessUpdate, removeAwarenessStates } from 'y-protocols/awareness';\nimport * as Y from 'yjs';\nimport { follow, pending, save, type Author, type Kind } from './collab';\nimport type { DocumentsHost } from './types';\n\ntype Room = { doc: Y.Doc; links: Set<Link>; base: ArrayBuffer | null; busy: Promise<unknown> };\ntype Listener = (payload: never) => void;\n\nexport const rooms = new Map<string, Room>();\n\nexport class Link {\n awareness: Awareness;\n isSynced = false;\n unsyncedChanges = 0;\n authorizedScope: 'read-write' | 'readonly';\n private room: Room;\n private live = false;\n private stop: () => void;\n private events = new Map<string, Set<Listener>>();\n\n constructor(key: string, private id: string, private kind: Kind, readonly document: Y.Doc, private host: DocumentsHost, readonly author: Author, edit: boolean) {\n this.awareness = new Awareness(document);\n this.authorizedScope = edit ? 'read-write' : 'readonly';\n if (!rooms.has(key)) rooms.set(key, { doc: new Y.Doc(), links: new Set(), base: null, busy: Promise.resolve() });\n this.room = rooms.get(key)!;\n this.room.links.add(this);\n this.stop = follow(this.room.doc, origin => origin === this && edit ? this.author : null);\n document.on('update', this.local);\n this.awareness.on('update', this.presence);\n this.room.doc.on('update', this.remote);\n queueMicrotask(() => this.online(true));\n }\n\n on(name: string, fn: Listener) {\n if (!this.events.has(name)) this.events.set(name, new Set());\n this.events.get(name)!.add(fn);\n }\n\n off(name: string, fn: Listener) {\n this.events.get(name)?.delete(fn);\n }\n\n private emit(name: string, payload: unknown) {\n this.events.get(name)?.forEach(fn => (fn as (p: unknown) => void)(payload));\n }\n\n private peers = () => [...this.room.links].filter(l => l !== this && l.live);\n\n online(on: boolean) {\n if (on === this.live || !this.room.links.has(this)) return;\n this.live = on;\n if (on) {\n Y.applyUpdate(this.document, Y.encodeStateAsUpdate(this.room.doc, Y.encodeStateVector(this.document)), this.room);\n if (this.authorizedScope === 'read-write') Y.applyUpdate(this.room.doc, Y.encodeStateAsUpdate(this.document, Y.encodeStateVector(this.room.doc)), this);\n for (const peer of this.peers()) {\n applyAwarenessUpdate(this.awareness, encodeAwarenessUpdate(peer.awareness, [peer.awareness.clientID]), this.room);\n applyAwarenessUpdate(peer.awareness, encodeAwarenessUpdate(this.awareness, [this.awareness.clientID]), this.room);\n }\n this.isSynced = true;\n } else for (const peer of this.peers()) removeAwarenessStates(peer.awareness, [this.awareness.clientID], this.room);\n this.emit('status', { status: on ? 'connected' : 'disconnected' });\n if (on) this.emit('synced', { state: true });\n }\n\n private local = (update: Uint8Array, origin: unknown) => {\n if (this.live && origin !== this.room && this.authorizedScope === 'read-write') Y.applyUpdate(this.room.doc, update, this);\n };\n\n private remote = (update: Uint8Array, origin: unknown) => {\n if (this.live && origin !== this) Y.applyUpdate(this.document, update, this.room);\n };\n\n private presence = ({ added, updated, removed }: { added: number[]; updated: number[]; removed: number[] }, origin: unknown) => {\n if (!this.live || origin === this.room) return;\n const update = encodeAwarenessUpdate(this.awareness, [...added, ...updated, ...removed]);\n for (const peer of this.peers()) applyAwarenessUpdate(peer.awareness, update, this.room);\n };\n\n private store() {\n const room = this.room;\n const run = room.busy.then(async () => {\n const done = await save(room.doc, this.kind, room.base ?? await this.host.content(this.id), async (bytes, note) => (await this.host.save!(this.id, bytes, note)).versionId);\n if (done) room.base = done.bytes;\n return done;\n });\n room.busy = run.catch(() => null);\n return run;\n }\n\n sendStateless(payload: string) {\n if (!this.live || this.authorizedScope !== 'read-write' || !(JSON.parse(payload) as { save?: boolean }).save) return;\n this.store().then(\n done => this.emit('stateless', { payload: JSON.stringify({ saved: done?.version ?? null }) }),\n () => this.emit('stateless', { payload: JSON.stringify({ failed: true }) }),\n );\n }\n\n destroy() {\n this.online(false);\n this.room.links.delete(this);\n this.stop();\n this.document.off('update', this.local);\n this.awareness.off('update', this.presence);\n this.room.doc.off('update', this.remote);\n this.awareness.destroy();\n if (!this.room.links.size && pending(this.room.doc) && this.authorizedScope === 'read-write') this.store().catch(() => null);\n }\n}\n"],"mappings":"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","names":["Y","host","wire","state","save"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sheets/grid.ts","../src/sheets/calm.ts"],"sourcesContent":["import '@univerjs/preset-sheets-core/lib/index.css';\nimport '@univerjs/preset-sheets-sort/lib/index.css';\nimport '@univerjs/preset-sheets-filter/lib/index.css';\nimport '@univerjs/preset-sheets-find-replace/lib/index.css';\nimport '@univerjs/preset-sheets-data-validation/lib/index.css';\nimport '@univerjs/preset-sheets-note/lib/index.css';\nimport { createUniver, LocaleType, mergeLocales, purpleTheme } from '@univerjs/presets';\nimport { CalculationMode, IMarkSelectionService, SelectionControl, UniverSheetsCorePreset } from '@univerjs/preset-sheets-core';\nimport { UniverSheetsDataValidationPreset } from '@univerjs/preset-sheets-data-validation';\nimport { UniverSheetsFilterPreset } from '@univerjs/preset-sheets-filter';\nimport { UniverSheetsFindReplacePreset } from '@univerjs/preset-sheets-find-replace';\nimport { UniverSheetsNotePreset } from '@univerjs/preset-sheets-note';\nimport { UniverSheetsSortPreset } from '@univerjs/preset-sheets-sort';\nimport coreEn from '@univerjs/preset-sheets-core/locales/en-US';\nimport corePl from '@univerjs/preset-sheets-core/locales/pl-PL';\nimport checkEn from '@univerjs/preset-sheets-data-validation/locales/en-US';\nimport checkPl from '@univerjs/preset-sheets-data-validation/locales/pl-PL';\nimport filterEn from '@univerjs/preset-sheets-filter/locales/en-US';\nimport filterPl from '@univerjs/preset-sheets-filter/locales/pl-PL';\nimport findEn from '@univerjs/preset-sheets-find-replace/locales/en-US';\nimport findPl from '@univerjs/preset-sheets-find-replace/locales/pl-PL';\nimport noteEn from '@univerjs/preset-sheets-note/locales/en-US';\nimport notePl from '@univerjs/preset-sheets-note/locales/pl-PL';\nimport sortEn from '@univerjs/preset-sheets-sort/locales/en-US';\nimport sortPl from '@univerjs/preset-sheets-sort/locales/pl-PL';\nimport type { Language } from '../types';\nimport { bolder, calm } from './calm';\nimport { box } from './refs';\n\nexport type Mark = { sheet: string; range: string; color: string };\n\nconst draw = SelectionControl.prototype.updateRangeBySelectionWithCoord;\n// Univer draws eight resize handles on every formula reference and offers no option to turn them off.\nSelectionControl.prototype.updateRangeBySelectionWithCoord = function (selection, ...rest) { draw.call(this, calm(selection), ...rest); };\n\nexport function grid(container: HTMLElement, language: Language, edit: boolean) {\n return createUniver({\n locale: language === 'pl' ? LocaleType.PL_PL : LocaleType.EN_US,\n locales: {\n [LocaleType.EN_US]: mergeLocales(coreEn, checkEn, filterEn, findEn, noteEn, sortEn),\n [LocaleType.PL_PL]: mergeLocales(corePl, checkPl, filterPl, findPl, notePl, sortPl),\n },\n theme: { ...purpleTheme, 'loop-color': { 1: 'blue.500', 2: 'red.500', 3: 'green.600', 4: 'orange.500', 5: 'purple.500', 6: 'jiqing.600', 7: 'pink.500', 8: 'yellow.700', 9: 'indigo.600', 10: 'red.700', 11: 'green.800', 12: 'blue.800' } },\n darkMode: false,\n presets: [\n UniverSheetsCorePreset({\n container, toolbar: false, formulaBar: true, contextMenu: true, disableAutoFocus: true,\n footer: { sheetBar: true, statisticBar: true, menus: edit, zoomSlider: true, addSheetButtonConfig: { show: edit } },\n formula: { initialFormulaComputing: CalculationMode.WHEN_EMPTY },\n }),\n UniverSheetsSortPreset(),\n UniverSheetsFilterPreset(),\n UniverSheetsFindReplacePreset(),\n UniverSheetsDataValidationPreset(),\n UniverSheetsNotePreset(),\n ],\n });\n}\n\nexport { bolder };\n\nexport function marks({ univer, univerAPI: api }: ReturnType<typeof grid>) {\n const service = univer.__getInjector().get(IMarkSelectionService);\n let list: Mark[] = [];\n let ids: string[] = [];\n const draw = () => {\n ids.forEach(id => service.removeShape(id));\n const sid = api.getActiveWorkbook()?.getActiveSheet().getSheetId();\n ids = list.filter(m => m.sheet === sid).flatMap(m => {\n const b = box(m.range);\n const id = b && service.addShape({ range: b, primary: null, style: { stroke: m.color, fill: `${m.color}1f`, strokeWidth: 2, widgets: {} } }, [], 1000);\n return id ? [id] : [];\n });\n };\n const turn = api.addEvent(api.Event.ActiveSheetChanged, draw);\n return {\n show: (next: Mark[]) => { list = next; draw(); },\n dispose: () => { turn.dispose(); ids.forEach(id => service.removeShape(id)); },\n };\n}\n","import { ICommandService, ThemeService, type Injector } from '@univerjs/core';\n\ntype Style = { widgets?: object; strokeWidth?: number; stroke?: string; fill?: string };\ntype Run = { ts?: { cl?: { rgb?: string | null } | null; bl?: number } };\n\nconst pale = (color: string) => /^#[0-9a-f]{6}$/i.test(color) ? `${color}24` : color.replace(/^rgb\\(([^)]+)\\)$/i, 'rgba($1, 0.14)');\n\nexport const calm = <T extends { style?: Style | null | void }>(selection: T): T => {\n const style = selection.style;\n if (!style?.widgets || !Object.values(style.widgets).some(Boolean)) return selection;\n return { ...selection, style: { ...style, widgets: {}, strokeWidth: 3, fill: style.stroke ? pale(style.stroke) : style.fill } };\n};\n\nexport function bolder(injector: Injector) {\n const theme = injector.get(ThemeService);\n const tone = (color: string) => theme.isValidThemeColor(color) ? theme.getColorFromTheme(color) : color;\n const refs = new Set(Array.from({ length: 12 }, (_, i) => tone(theme.getColorFromTheme(`loop-color.${i + 1}`))));\n return injector.get(ICommandService).beforeCommandExecuted(({ id, params }) => {\n if (id !== 'doc.command.replace-text-runs') return;\n (params as { body?: { textRuns?: Run[] } } | undefined)?.body?.textRuns?.forEach(run => {\n if (run.ts?.cl?.rgb && refs.has(run.ts.cl.rgb)) run.ts.bl = 1;\n });\n });\n}\n"],"mappings":"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","names":["draw"]}