@inkandswitch/patchwork-pkg-base 0.0.66 → 0.0.68

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.
Files changed (49) hide show
  1. package/module-settings-url +1 -1
  2. package/package.json +1 -1
  3. package/packages/codemirror-markdown/example.js +1 -2
  4. package/packages/sideboard/dist/account-bar-JHI3FZZT.js +2 -0
  5. package/packages/sideboard/dist/{chunk-V62KH27A.js → chunk-25X3B3RC.js} +2 -2
  6. package/packages/sideboard/dist/{chunk-LJ5XCENG.js → chunk-FEMULUBJ.js} +2 -2
  7. package/packages/sideboard/dist/chunk-FEMULUBJ.js.map +7 -0
  8. package/packages/sideboard/dist/{chunk-6POQCUBB.js → chunk-VGVBBUBE.js} +2 -2
  9. package/packages/sideboard/dist/{chunk-6POQCUBB.js.map → chunk-VGVBBUBE.js.map} +1 -1
  10. package/packages/sideboard/dist/document-list-panel-HWSCX2ZQ.js +2 -0
  11. package/packages/sideboard/dist/index.js +1 -1
  12. package/packages/sideboard/dist/sideboard/sideboard.js +1 -1
  13. package/packages/sideboard/package.json +1 -1
  14. package/packages/tldraw4/dist/{chunk-IKZWERSR.js → chunk-G3PMV62Z.js} +1 -3
  15. package/packages/tldraw4/dist/{chunk-7CJQMVDI.js → chunk-PMHAL5YM.js} +4 -4
  16. package/packages/tldraw4/dist/datatype.js +2 -2
  17. package/packages/tldraw4/dist/main.js +1 -1
  18. package/packages/tldraw4/dist/{sanitizeSvg-OOYBXUQ2.js → sanitizeSvg-NCGPTJ3E.js} +2 -2
  19. package/packages/tldraw4/dist/tool.js +450 -5675
  20. package/packages/tldraw4/dist/tool.js.map +4 -4
  21. package/packages/tldraw4/package.json +0 -1
  22. package/packages/tldraw5/dist/{chunk-GKLJTYCF.js → chunk-DO47QRII.js} +1 -3
  23. package/packages/tldraw5/dist/{chunk-4JN3PIR7.js → chunk-FTKY6DDS.js} +3 -3
  24. package/packages/tldraw5/dist/{chunk-JDHJ334K.js → chunk-SZI4VCOI.js} +4 -4
  25. package/packages/tldraw5/dist/datatype.js +3 -3
  26. package/packages/tldraw5/dist/main.js +1 -1
  27. package/packages/tldraw5/dist/{sanitizeSvg-3EKLLIYO.js → sanitizeSvg-J7F3MQGT.js} +2 -2
  28. package/packages/tldraw5/dist/{script-VW3AAU5T.js → script-4RKE5JKT.js} +3 -3
  29. package/packages/tldraw5/dist/script-4RKE5JKT.js.map +7 -0
  30. package/packages/tldraw5/dist/{tldr-archive-WERHN3T4.js → tldr-archive-5X7EMHWZ.js} +3 -3
  31. package/packages/tldraw5/dist/tool.js +293 -1543
  32. package/packages/tldraw5/dist/tool.js.map +4 -4
  33. package/packages/tldraw5/package.json +0 -1
  34. package/plugin-registry-url +1 -1
  35. package/packages/sideboard/dist/account-bar-KGTVEYOE.js +0 -2
  36. package/packages/sideboard/dist/chunk-LJ5XCENG.js.map +0 -7
  37. package/packages/sideboard/dist/document-list-panel-GHYN6JR5.js +0 -2
  38. package/packages/tldraw5/dist/script-VW3AAU5T.js.map +0 -7
  39. /package/packages/sideboard/dist/{account-bar-KGTVEYOE.js.map → account-bar-JHI3FZZT.js.map} +0 -0
  40. /package/packages/sideboard/dist/{chunk-V62KH27A.js.map → chunk-25X3B3RC.js.map} +0 -0
  41. /package/packages/sideboard/dist/{document-list-panel-GHYN6JR5.js.map → document-list-panel-HWSCX2ZQ.js.map} +0 -0
  42. /package/packages/tldraw4/dist/{chunk-IKZWERSR.js.map → chunk-G3PMV62Z.js.map} +0 -0
  43. /package/packages/tldraw4/dist/{chunk-7CJQMVDI.js.map → chunk-PMHAL5YM.js.map} +0 -0
  44. /package/packages/tldraw4/dist/{sanitizeSvg-OOYBXUQ2.js.map → sanitizeSvg-NCGPTJ3E.js.map} +0 -0
  45. /package/packages/tldraw5/dist/{chunk-GKLJTYCF.js.map → chunk-DO47QRII.js.map} +0 -0
  46. /package/packages/tldraw5/dist/{chunk-4JN3PIR7.js.map → chunk-FTKY6DDS.js.map} +0 -0
  47. /package/packages/tldraw5/dist/{chunk-JDHJ334K.js.map → chunk-SZI4VCOI.js.map} +0 -0
  48. /package/packages/tldraw5/dist/{sanitizeSvg-3EKLLIYO.js.map → sanitizeSvg-J7F3MQGT.js.map} +0 -0
  49. /package/packages/tldraw5/dist/{tldr-archive-WERHN3T4.js.map → tldr-archive-5X7EMHWZ.js.map} +0 -0
@@ -30,7 +30,6 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@automerge/automerge-repo-react-hooks": "2.6.0-subduction.46",
33
- "@automerge/react": "^2.6.0-subduction.9",
34
33
  "@inkandswitch/patchwork-bootloader": "^0.7.2",
35
34
  "@inkandswitch/patchwork-filesystem": "^0.2.9",
36
35
  "@inkandswitch/patchwork-plugins": "^1.2.5",
@@ -1 +1 @@
1
- automerge:2yAyTrgdNEVhJXGGvq8w7BJ5UjFi
1
+ automerge:2yGpAJ6beUWmae6SedD3aVZL3oFT
@@ -1,2 +0,0 @@
1
- import{a,b}from"./chunk-V62KH27A.js";import"./chunk-LJ5XCENG.js";import"./chunk-TCL6SLDB.js";import"./chunk-FW4363Y4.js";export{a as AccountBar,b as renderAccountBar};
2
- //# sourceMappingURL=account-bar-KGTVEYOE.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/makeDocumentProjection.ts", "../node_modules/.pnpm/cabbages@0.2.10/node_modules/cabbages/output/cabbages.js", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/autoproduce.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/createDocumentProjection.ts", "../node_modules/.pnpm/@solid-primitives+utils@6.4.1_solid-js@1.9.11/node_modules/@solid-primitives/utils/dist/index.js", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/useDocHandle.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/context.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/useDocument.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/makeDocSignal.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/createDocSignal.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/useRepo.ts", "../src/sideboard/events.ts"],
4
- "sourcesContent": ["import {onCleanup} from \"solid-js\"\nimport type {\n\tDoc,\n\tDocHandle,\n\tDocHandleChangePayload,\n} from \"@automerge/automerge-repo/slim\"\nimport autoproduce from \"./autoproduce.ts\"\nimport {createStore, produce, reconcile, type Store} from \"solid-js/store\"\n\nconst cache = new WeakMap<\n\tDocHandle<unknown>,\n\t{\n\t\trefs: number\n\t\tstore: Store<Doc<unknown>>\n\t\tcleanup(): void\n\t}\n>()\n\n/**\n * make a fine-grained live view of a document from its handle.\n * @param handle an Automerge\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n */\nexport default function makeDocumentProjection<T extends object>(\n\thandle: DocHandle<T>\n): Doc<T> {\n\tonCleanup(() => {\n\t\tconst item = cache.get(handle)!\n\t\tif (!item) return\n\t\tif (!item.refs--) {\n\t\t\titem.cleanup()\n\t\t}\n\t})\n\n\tif (cache.has(handle)) {\n\t\tconst item = cache.get(handle)!\n\t\titem.refs++\n\t\treturn item.store as Doc<T>\n\t}\n\n\tconst [doc, set] = createStore<Doc<T>>(handle.doc()!)\n\n\tcache.set(handle, {\n\t\trefs: 0,\n\t\tstore: doc,\n\t\tcleanup() {\n\t\t\thandle.off(\"change\", patch)\n\t\t\thandle.off(\"delete\", ondelete)\n\t\t\tcache.delete(handle)\n\t\t},\n\t})\n\n\tfunction patch(payload: DocHandleChangePayload<T>) {\n\t\t// `scopeReplaced` means the change landed at or above this (sub-)handle's\n\t\t// scope boundary, so it can't be expressed as in-scope patches. The\n\t\t// payload still carries `doc` \u2014 the new value at the handle's path (the\n\t\t// part of the store this scope points at) \u2014 so we reconcile against that\n\t\t// instead of applying patches. `reconcile` structurally diffs it against\n\t\t// the current store, so unchanged subtrees keep their identity and only\n\t\t// the parts that actually changed notify. `doc` is undefined when the\n\t\t// scope was removed entirely.\n\t\tif (payload.scopeReplaced) {\n\t\t\tset(reconcile((payload.doc ?? {}) as Doc<T>))\n\t\t\treturn\n\t\t}\n\t\tset(produce(autoproduce(payload)))\n\t}\n\n\tfunction ondelete() {\n\t\tset(reconcile({} as Doc<T>))\n\t}\n\n\thandle.on(\"change\", patch)\n\thandle.on(\"delete\", ondelete)\n\n\thandle.whenReady().then(() => {\n\t\tset(handle.doc()!)\n\t})\n\n\treturn doc\n}\n", "// cabbages.ts\nimport debug from \"debug\";\nvar log = debug(\"cabbages\");\nfunction pojo(target) {\n return typeof target == \"object\" && typeof target != null && Object.getPrototypeOf(target) == Object.prototype;\n}\nvar BLOCK_MARKER = \"\\uFFFC\";\nfunction apply(target, ...rest) {\n if (rest.length == 0) {\n log(\"empty patch\");\n return;\n }\n const [path, range, val] = rest;\n let p = [...path];\n while (true) {\n let key = p.shift();\n if (!p.length) {\n const RANGE_ARRAY = Array.isArray(range);\n if (pojo(target) && RANGE_ARRAY && typeof key == \"undefined\" && typeof range[0] == \"string\") {\n delete target[range[0]];\n return;\n }\n if (RANGE_ARRAY || typeof range == \"number\") {\n if (typeof key == \"undefined\") {\n throw new Error(\"cant treat top level as a seq\");\n }\n key = key;\n let [start, end] = Array.isArray(range) ? range : [range, range + 1];\n const ZERO_LENGTH = Array.isArray(range) && range.length == 0;\n if (!ZERO_LENGTH && (start == null || end == null)) {\n throw new RangeError(\"it's all or nothing, no half measures\");\n }\n const DELETE = typeof val == \"undefined\";\n const INSERT = start === end && !DELETE;\n const APPEND = ZERO_LENGTH && !DELETE;\n const REPLACE = !INSERT && !DELETE && !APPEND;\n if (typeof target[key] == \"undefined\") {\n if (typeof target == \"string\") {\n return;\n } else if (typeof val == \"string\") {\n target[key] = \"\";\n } else {\n target[key] = [];\n }\n }\n let seq = target[key];\n if (Array.isArray(seq)) {\n if (APPEND) {\n Array.isArray(val) ? seq.push(...val) : seq.push(val);\n return;\n }\n if (INSERT || REPLACE) {\n Array.isArray(val) ? seq.splice(start, end - start, ...val) : seq.splice(start, end - start, val);\n return;\n }\n if (DELETE) {\n seq.splice(start, end - start);\n return;\n }\n throw new Error(\"i don't know what happened\");\n }\n if (typeof seq == \"string\") {\n if (APPEND) {\n target[key] = seq + val;\n return;\n }\n if (REPLACE || INSERT) {\n target[key] = seq.slice(0, start) + (typeof val == \"string\" ? val : val.map(\n (n) => typeof n == \"string\" ? n : BLOCK_MARKER\n ).join(\"\")) + seq.slice(end);\n return;\n }\n if (DELETE) {\n target[key] = seq.slice(0, start) + seq.slice(end);\n return;\n }\n throw new Error(\"i don't know what happened\");\n }\n if (pojo(seq) && RANGE_ARRAY && typeof range[0] == \"string\") {\n delete seq[range[0]];\n return;\n }\n throw new Error(\"not implemented\");\n }\n if (typeof key == \"undefined\") {\n if (typeof range != \"string\") {\n throw new Error(`can't index top-level map with ${range}`);\n }\n if (typeof val == \"undefined\") {\n delete target[range];\n } else {\n target[range] = val;\n }\n return;\n }\n if (typeof target[key] == \"undefined\") {\n target[key] = {};\n }\n if (RANGE_ARRAY) {\n let [a, b] = range;\n if (a != null && b != null) {\n if (typeof val == \"undefined\" && a != null && b != null) {\n delete target[key][a || b];\n } else {\n target[key][a || b] = val;\n }\n }\n } else {\n if (typeof val == \"undefined\") {\n delete target[key][range];\n } else if (typeof target[key] == \"string\") {\n return;\n } else {\n target[key][range] = val;\n }\n }\n return;\n }\n if (typeof key == \"undefined\") {\n throw new Error(\"cant treat top level as a seq\");\n }\n key = key;\n let nextkey = p[0];\n if (typeof target[key] == \"undefined\") {\n if (typeof nextkey == \"string\") {\n target[key] = {};\n } else if (typeof nextkey == \"number\") {\n target[key] = [];\n } else {\n throw new Error(`can't go down this road ${target}.${key}.${nextkey}`);\n }\n }\n target = target[key];\n }\n}\nvar patch = apply;\nfunction get(obj, key) {\n for (let p = 0; p < key.length; p++) {\n obj = obj ? obj[key[p]] : void 0;\n }\n return obj;\n}\nfunction fromAutomerge(autopatch, payload) {\n const path = autopatch.path.slice(0, -1);\n const key = autopatch.path[autopatch.path.length - 1];\n switch (autopatch.action) {\n case \"mark\":\n case \"unmark\":\n log(\n `skipping ${autopatch.action} because it doesn't affect material reality`\n );\n return [];\n case \"inc\":\n if (payload) {\n return [path, key, get(payload.patchInfo.after, autopatch.path)];\n } else {\n throw new Error(\n `can't apply ${autopatch.action} without payload argument`\n );\n }\n case \"conflict\":\n if (payload) {\n return [path, key, get(payload.patchInfo.after, autopatch.path)];\n } else {\n throw new Error(\n `can't apply ${autopatch.action} without payload argument`\n );\n }\n case \"del\": {\n return typeof key == \"string\" ? [path, key] : [path, [key, key + (autopatch.length || 1)]];\n }\n case \"insert\": {\n return [\n path,\n [key, key],\n structuredClone(autopatch.values)\n ];\n }\n case \"splice\": {\n return [path, [key, key], [autopatch.value]];\n }\n case \"put\": {\n return [path, key, structuredClone(autopatch.value)];\n }\n }\n}\nexport {\n apply,\n fromAutomerge,\n patch,\n pojo\n};\n", "import type {DocHandleChangePayload} from \"@automerge/automerge-repo/slim\"\nimport {apply, fromAutomerge} from \"cabbages\"\n\n/**\n * convert automerge patches to solid producer operations\n * @param payload the\n * [DocHandleChangePayload](https://automerge.org/automerge-repo/interfaces/_automerge_automerge_repo.DocHandleChangePayload.html)\n * from the handle.on(\"change\n * @returns a callback for an immer-like function. e.g.\n * [produce](https://docs.solidjs.com/reference/store-utilities/produce) for\n * [Solid\n * Stores](https://docs.solidjs.com/reference/store-utilities/create-store)\n */\nexport default function autoproduce<T>(\n\tpayload: DocHandleChangePayload<T>\n): (doc: T) => void {\n\treturn (doc: T) => {\n\t\tfor (let patch of payload.patches) {\n\t\t\tapply(doc, ...fromAutomerge(patch, payload))\n\t\t}\n\t}\n}\n", "import {createMemo, type Accessor} from \"solid-js\"\nimport {type DocHandle, type Doc} from \"@automerge/automerge-repo/slim\"\nimport makeDocumentProjection from \"./makeDocumentProjection.ts\"\nimport {access} from \"@solid-primitives/utils\"\n\n/**\n * get a fine-grained live view of a document from a handle. works with\n * {@link useDocHandle}.\n * @param handle an accessor (signal/resource) of a\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n */\nexport default function createDocumentProjection<T extends object>(\n\thandle: Accessor<DocHandle<T> | undefined>\n): Accessor<Doc<T> | undefined> {\n\tconst projection = createMemo<Doc<T> | undefined>(\n\t\t() => access(handle) && makeDocumentProjection<T>(access(handle)!)\n\t)\n\treturn projection\n}\n", "import { getOwner, onCleanup, createSignal, untrack, sharedConfig, onMount, DEV, equalFn, } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nexport * from \"./types.js\";\n//\n// GENERAL HELPERS:\n//\nexport { isServer };\nexport const isClient = !isServer;\nexport const isDev = isClient && !!DEV;\nexport const isProd = !isDev;\n/** no operation */\nexport const noop = (() => void 0);\nexport const trueFn = () => true;\nexport const falseFn = () => false;\n/** @deprecated use {@link equalFn} from \"solid-js\" */\nexport const defaultEquals = equalFn;\nexport const EQUALS_FALSE_OPTIONS = { equals: false };\nexport const INTERNAL_OPTIONS = { internal: true };\n/**\n * Check if the value is an instance of ___\n */\nexport const ofClass = (v, c) => v instanceof c || (v && v.constructor === c);\n/** Check if value is typeof \"object\" or \"function\" */\nexport function isObject(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\nexport const isNonNullable = (i) => i != null;\nexport const filterNonNullable = (arr) => arr.filter(isNonNullable);\nexport const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);\n/**\n * Check shallow array equality\n */\nexport const arrayEquals = (a, b) => a === b || (a.length === b.length && a.every((e, i) => e === b[i]));\n/**\n * Returns a function that will call all functions in the order they were chained with the same arguments.\n */\nexport function chain(callbacks) {\n return (...args) => {\n for (const callback of callbacks)\n callback && callback(...args);\n };\n}\n/**\n * Returns a function that will call all functions in the reversed order with the same arguments.\n */\nexport function reverseChain(callbacks) {\n return (...args) => {\n for (let i = callbacks.length - 1; i >= 0; i--) {\n const callback = callbacks[i];\n callback && callback(...args);\n }\n };\n}\nexport const clamp = (n, min, max) => Math.min(Math.max(n, min), max);\n/**\n * Accesses the value of a MaybeAccessor\n * @example\n * ```ts\n * access(\"foo\") // => \"foo\"\n * access(() => \"foo\") // => \"foo\"\n * ```\n */\nexport const access = (v) => typeof v === \"function\" && !v.length ? v() : v;\nexport const asArray = (value) => Array.isArray(value) ? value : value ? [value] : [];\n/**\n * Access an array of MaybeAccessors\n * @example\n * const list = [1, 2, () => 3)] // T: MaybeAccessor<number>[]\n * const newList = accessArray(list) // T: number[]\n */\nexport const accessArray = (list) => list.map(v => access(v));\n/**\n * Run the function if the accessed value is not `undefined` nor `null`\n * @param value\n * @param fn\n */\nexport const withAccess = (value, fn) => {\n const _value = access(value);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n typeof _value != null && fn(_value);\n};\nexport const asAccessor = (v) => (typeof v === \"function\" ? v : () => v);\n/** If value is a function \u2013 call it with a given arguments \u2013 otherwise get the value as is */\nexport function accessWith(valueOrFn, ...args) {\n return typeof valueOrFn === \"function\" ? valueOrFn(...args) : valueOrFn;\n}\nexport function defer(deps, fn, initialValue) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let shouldDefer = true;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++)\n input[i] = deps[i]();\n }\n else\n input = deps();\n if (shouldDefer) {\n shouldDefer = false;\n prevInput = input;\n return initialValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\n/**\n * Get entries of an object\n */\nexport const entries = Object.entries;\n/**\n * Get keys of an object\n */\nexport const keys = Object.keys;\n/**\n * Solid's `onCleanup` that doesn't warn in development if used outside of a component.\n */\nexport const tryOnCleanup = isDev\n ? fn => (getOwner() ? onCleanup(fn) : fn)\n : onCleanup;\nexport const createCallbackStack = () => {\n let stack = [];\n const clear = () => (stack = []);\n return {\n push: (...callbacks) => stack.push(...callbacks),\n execute(arg0, arg1, arg2, arg3) {\n stack.forEach(cb => cb(arg0, arg1, arg2, arg3));\n clear();\n },\n clear,\n };\n};\n/**\n * Group synchronous function calls.\n * @param fn\n * @returns `fn`\n */\nexport function createMicrotask(fn) {\n let calls = 0;\n let args;\n onCleanup(() => (calls = 0));\n return (...a) => {\n (args = a), calls++;\n queueMicrotask(() => --calls === 0 && fn(...args));\n };\n}\n/**\n * A hydratable version of the {@link createSignal}. It will use the serverValue on the server and the update function on the client. If initialized during hydration it will use serverValue as the initial value and update it once hydration is complete.\n *\n * @param serverValue initial value of the state on the server\n * @param update called once on the client or on hydration to initialize the value\n * @param options {@link SignalOptions}\n * @returns\n * ```ts\n * [state: Accessor<T>, setState: Setter<T>]\n * ```\n * @see {@link createSignal}\n */\nexport function createHydratableSignal(serverValue, update, options) {\n if (isServer) {\n return createSignal(serverValue, options);\n }\n if (sharedConfig.context) {\n const [state, setState] = createSignal(serverValue, options);\n onMount(() => setState(() => update()));\n return [state, setState];\n }\n return createSignal(update(), options);\n}\n/** @deprecated use {@link createHydratableSignal} instead */\nexport const createHydrateSignal = createHydratableSignal;\n/**\n * Handle items removed and added to the array by diffing it by refference.\n *\n * @param current new array instance\n * @param prev previous array copy\n * @param handleAdded called once for every added item to array\n * @param handleRemoved called once for every removed from array\n */\nexport function handleDiffArray(current, prev, handleAdded, handleRemoved) {\n const currLength = current.length;\n const prevLength = prev.length;\n let i = 0;\n if (!prevLength) {\n for (; i < currLength; i++)\n handleAdded(current[i]);\n return;\n }\n if (!currLength) {\n for (; i < prevLength; i++)\n handleRemoved(prev[i]);\n return;\n }\n for (; i < prevLength; i++) {\n if (prev[i] !== current[i])\n break;\n }\n let prevEl;\n let currEl;\n prev = prev.slice(i);\n current = current.slice(i);\n for (prevEl of prev) {\n if (!current.includes(prevEl))\n handleRemoved(prevEl);\n }\n for (currEl of current) {\n if (!prev.includes(currEl))\n handleAdded(currEl);\n }\n}\n// \u2500\u2500\u2500 String transforms \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/**\n * Parse a string as a single JSON value.\n *\n * ```ts\n * const { data } = createSSE<{ status: string }>(url, { transform: json });\n * ```\n */\nexport const json = (raw) => JSON.parse(raw);\n/**\n * Parse a string as newline-delimited JSON (NDJSON / JSON Lines).\n *\n * Each non-empty line is parsed as a separate JSON value and returned as an array.\n *\n * ```ts\n * const { data } = createSSE<TickEvent[]>(url, { transform: ndjson });\n * // data() === [{ id: 1, type: \"tick\" }, { id: 2, type: \"tick\" }]\n * ```\n */\nexport const ndjson = (raw) => raw\n .split(\"\\n\")\n .filter(line => line !== \"\")\n .map(line => JSON.parse(line));\n/**\n * Split a string into individual lines, returning a `string[]`. Empty lines are filtered out.\n *\n * ```ts\n * const { data } = createSSE<string[]>(url, { transform: lines });\n * // data() === [\"line one\", \"line two\"]\n * ```\n */\nexport const lines = (raw) => raw.split(\"\\n\").filter(line => line !== \"\");\n/**\n * Parse a string as a number using `Number()` semantics.\n *\n * Note: `\"\"` \u2192 `0`, non-numeric strings \u2192 `NaN`.\n *\n * ```ts\n * const { data } = createSSE<number>(url, { transform: number });\n * // data() === 42\n * ```\n */\nexport const number = (raw) => Number(raw);\nexport function safe(transform, fallback) {\n return (raw) => {\n try {\n return transform(raw);\n }\n catch {\n return fallback;\n }\n };\n}\n/**\n * Compose two transforms into one: the output of `a` is passed as the input of `b`.\n *\n * ```ts\n * const { data } = createSSE<RawEvent[]>(url, {\n * transform: pipe(ndjson<RawEvent>, rows => rows.filter(r => r.type === \"tick\")),\n * });\n * ```\n */\nexport function pipe(a, b) {\n return (raw) => b(a(raw));\n}\n", "import type {AutomergeUrl, DocHandle} from \"@automerge/automerge-repo/slim\"\nimport {createEffect, createResource, useContext, type Resource} from \"solid-js\"\nimport {access, type MaybeAccessor} from \"@solid-primitives/utils\"\nimport {RepoContext} from \"./context.ts\"\nimport type {UseDocHandleOptions} from \"./types.ts\"\n\n/**\n * get a\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n * from an\n * [AutomergeUrl](https://automerge.org/automerge-repo/types/_automerge_automerge_repo.AutomergeUrl.html)\n * as a\n * [Resource](https://docs.solidjs.com/reference/basic-reactivity/create-resource).\n * Waits for the handle to be ready.\n */\nexport default function useDocHandle<T>(\n\turl: MaybeAccessor<AutomergeUrl | undefined>,\n\toptions?: UseDocHandleOptions\n): Resource<DocHandle<T> | undefined> {\n\tconst contextRepo = useContext(RepoContext)\n\n\tif (!options?.repo && !contextRepo) {\n\t\tthrow new Error(\"use outside <RepoContext> requires options.repo\")\n\t}\n\n\tconst repo = (options?.repo || contextRepo)!\n\n\tfunction getExistingHandle() {\n\t\tif (options?.[\"~skipInitialValue\"]) return undefined\n\t\tconst unwrappedURL = access(url)\n\t\tif (!unwrappedURL) return undefined\n\t\tconst state = repo.findWithProgress<T>(unwrappedURL).peek()\n\t\treturn state.state === \"ready\" ? state.handle : undefined\n\t}\n\n\tconst [handle, {mutate}] = createResource(\n\t\turl,\n\t\turl => repo.findWithProgress<T>(url).whenReady(),\n\t\t{\n\t\t\tinitialValue: getExistingHandle(),\n\t\t}\n\t)\n\n\tcreateEffect(() => {\n\t\tif (!access(url)) {\n\t\t\tmutate()\n\t\t}\n\t})\n\n\treturn handle\n}\n", "import type {Repo} from \"@automerge/automerge-repo/slim\"\nimport {createContext, type Context} from \"solid-js\"\n\n/**\n * a [context](https://docs.solidjs.com/concepts/context) that provides access\n * to an Automerge Repo. you don't need this, you can pass the repo in the\n * second arg to the functions that need it.\n */\nexport const RepoContext: Context<Repo | null> = createContext<Repo | null>(\n\tnull\n)\n", "import type {AutomergeUrl, Doc, DocHandle} from \"@automerge/automerge-repo/slim\"\nimport createDocumentProjection from \"./createDocumentProjection.ts\"\nimport type {MaybeAccessor} from \"@solid-primitives/utils\"\nimport useDocHandle from \"./useDocHandle.ts\"\nimport type {UseDocHandleOptions} from \"./types.ts\"\nimport type {Accessor, Resource} from \"solid-js\"\n\n/**\n * get a fine-grained live view of a document, and its handle, from a URL.\n * @param url a function that returns a url\n */\nexport default function useDocument<T extends object>(\n\turl: MaybeAccessor<AutomergeUrl | undefined>,\n\toptions?: UseDocHandleOptions\n): [Accessor<Doc<T> | undefined>, Resource<DocHandle<T> | undefined>] {\n\tconst handle = useDocHandle<T>(url, options)\n\treturn [createDocumentProjection<T>(handle), handle] as const\n}\n", "import {onCleanup, type Accessor} from \"solid-js\"\nimport {createSignal} from \"solid-js\"\nimport type {Doc, DocHandle} from \"@automerge/automerge-repo/slim\"\n\n/**\n * a light coarse-grained primitive when you care only _that_ a doc has changed,\n * and not _how_.\n * @param handle an Automerge\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n */\nexport default function makeDocSignal<T extends object>(\n\thandle: DocHandle<T>\n): Accessor<Doc<T> | undefined> {\n\tconst [signal, setSignal] = createSignal<Doc<T> | undefined>(handle.doc())\n\n\tfunction update() {\n\t\tsetSignal(() => handle.doc() as Doc<T> | undefined)\n\t}\n\n\thandle.on(\"change\", update)\n\tonCleanup(() => handle.off(\"change\", update))\n\n\treturn signal\n}\n", "import {createEffect, onCleanup, type Accessor} from \"solid-js\"\nimport {createSignal} from \"solid-js\"\nimport type {Doc, DocHandle} from \"@automerge/automerge-repo/slim\"\n\n/**\n * a light coarse-grained primitive when you care only _that_ a doc has changed,\n * and not _how_. works with {@link useDocHandle}.\n * @param handle an accessor (signal/resource) of a\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n */\nexport default function createDocSignal<T extends object>(\n\thandle: Accessor<DocHandle<T> | undefined>\n): Accessor<Doc<T> | undefined> {\n\tconst [signal, setSignal] = createSignal<Doc<T> | undefined>(handle()?.doc())\n\n\tcreateEffect(() => {\n\t\tconst h = handle()\n\n\t\tfunction update() {\n\t\t\tsetSignal(() => h?.doc() as Doc<T> | undefined)\n\t\t}\n\n\t\t// sync the signal with the current handle's doc\n\t\tupdate()\n\n\t\tif (h) {\n\t\t\th.on(\"change\", update)\n\t\t\tonCleanup(() => h.off(\"change\", update))\n\t\t}\n\t})\n\n\treturn signal\n}\n", "import type {Repo} from \"@automerge/automerge-repo/slim\"\nimport {RepoContext} from \"./context.ts\"\nimport {useContext} from \"solid-js\"\n\n/** grab the repo from the {@link RepoContext} */\nexport default function useRepo(): Repo {\n\tconst repo = useContext(RepoContext)\n\tif (!repo) throw new Error(\"Please wrap me in a <RepoContext value={repo}>\")\n\treturn repo\n}\n", "import type { OpenDocumentEventDetail } from \"@inkandswitch/patchwork-elements\";\n\nexport function createOpenEvent(detail: OpenDocumentEventDetail) {\n const openEvent = new CustomEvent(\"patchwork:open-document\", {\n detail,\n bubbles: true,\n composed: true,\n });\n return openEvent;\n}\n"],
5
- "mappings": "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",
6
- "names": ["onCleanup", "import_debug", "log", "debug", "pojo", "target", "BLOCK_MARKER", "apply", "rest", "path", "range", "val", "p", "key", "RANGE_ARRAY", "start", "end", "ZERO_LENGTH", "DELETE", "INSERT", "APPEND", "REPLACE", "seq", "n", "a", "b", "nextkey", "get", "obj", "key", "p", "fromAutomerge", "autopatch", "payload", "path", "log", "autoproduce", "payload", "doc", "patch", "apply", "fromAutomerge", "createStore", "produce", "reconcile", "cache", "makeDocumentProjection", "handle", "onCleanup", "item", "doc", "set", "patch", "ondelete", "payload", "autoproduce", "createMemo", "getOwner", "onCleanup", "createSignal", "untrack", "sharedConfig", "onMount", "DEV", "equalFn", "isServer", "access", "v", "createDocumentProjection", "handle", "createMemo", "access", "makeDocumentProjection", "createEffect", "createResource", "useContext", "createContext", "RepoContext", "useDocHandle", "url", "options", "contextRepo", "useContext", "RepoContext", "repo", "getExistingHandle", "unwrappedURL", "access", "state", "handle", "mutate", "createResource", "createEffect", "useDocument", "url", "options", "handle", "useDocHandle", "createDocumentProjection", "onCleanup", "createSignal", "createEffect", "onCleanup", "createSignal", "useContext", "createOpenEvent", "detail"]
7
- }
@@ -1,2 +0,0 @@
1
- import{b as a,c as b}from"./chunk-6POQCUBB.js";import"./chunk-DS3QVJZT.js";import"./chunk-NO6SJFVH.js";import"./chunk-ZQBDNEEV.js";import"./chunk-LJ5XCENG.js";import"./chunk-TCL6SLDB.js";import"./chunk-FW4363Y4.js";export{a as DocumentListPanel,b as renderDocumentListPanel};
2
- //# sourceMappingURL=document-list-panel-GHYN6JR5.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/script.ts", "../src/script-helpers.ts"],
4
- "sourcesContent": ["// Document scripts. A `.tldraw` archive can carry a `script/**` tree whose\n// `main.js` default-exports a function that runs against the live editor once\n// the canvas mounts (and whose siblings it may import). On import each file\n// becomes its own Patchwork `file` document, so the script is editable in\n// Patchwork like any other file.\n//\n// Running one means turning those documents back into modules. There is no\n// importmap on this page for `tldraw`, and relative specifiers point at\n// documents rather than paths, so each file is rewritten and handed to the\n// browser as a blob module.\n\nimport type { DocHandle, Repo } from \"@automerge/react\";\nimport type {\n DocLink,\n FolderDoc,\n UnixFileEntry,\n} from \"@inkandswitch/patchwork-filesystem\";\nimport type { Editor } from \"@tldraw/tldraw\";\nimport * as tldrawSdk from \"@tldraw/tldraw\";\nimport * as reactSdk from \"react\";\nimport * as reactJsxRuntime from \"react/jsx-runtime\";\nimport * as reactDomSdk from \"react-dom\";\nimport * as reactDomClient from \"react-dom/client\";\n\nimport type { ZipEntries } from \"./zip.ts\";\nimport { makeScriptHelpers, type ScriptHelpers } from \"./script-helpers.ts\";\n\n// What a `main.js` default export receives, mirroring the desktop app's\n// `MainScriptContext`. `app` is deliberately absent \u2014 it is host-provided and\n// feature-detected (`ctx.app?.window`), and there is no desktop window here.\nexport type MainScriptContext = {\n editor: Editor;\n helpers: ScriptHelpers;\n signal: AbortSignal;\n};\n\nconst SCRIPT_PREFIX = \"script/\";\nconst ENTRY = \"main.js\";\nconst CONFIG = \"config.js\";\n\nconst TEXT_EXTENSIONS = new Set([\"js\", \"mjs\", \"json\", \"css\", \"ts\", \"txt\", \"md\"]);\n\nfunction extensionOf(path: string) {\n const base = path.slice(path.lastIndexOf(\"/\") + 1);\n const dot = base.lastIndexOf(\".\");\n return dot === -1 ? \"\" : base.slice(dot + 1).toLowerCase();\n}\n\nfunction mimeTypeOf(path: string) {\n switch (extensionOf(path)) {\n case \"js\":\n case \"mjs\":\n return \"text/javascript\";\n case \"json\":\n return \"application/json\";\n case \"css\":\n return \"text/css\";\n case \"wasm\":\n return \"application/wasm\";\n default:\n return \"application/octet-stream\";\n }\n}\n\n/** The `script/**` entries of an archive, keyed by path relative to `script/`. */\nexport function extractScriptFiles(files: ZipEntries): Map<string, Uint8Array> {\n const script = new Map<string, Uint8Array>();\n for (const [name, bytes] of files) {\n if (!name.startsWith(SCRIPT_PREFIX) || name.endsWith(\"/\")) continue;\n script.set(name.slice(SCRIPT_PREFIX.length), bytes);\n }\n return script;\n}\n\nasync function createFileDoc(repo: Repo, path: string, bytes: Uint8Array) {\n const extension = extensionOf(path);\n const handle = await repo.create2<UnixFileEntry>({\n \"@patchwork\": { type: \"file\" },\n content: TEXT_EXTENSIONS.has(extension)\n ? new TextDecoder().decode(bytes)\n : bytes,\n extension,\n mimeType: mimeTypeOf(path),\n name: path.slice(path.lastIndexOf(\"/\") + 1),\n } as UnixFileEntry);\n return handle.url;\n}\n\n/**\n * Stores a `script/**` tree as `DocLink[]` \u2014 a file document per file, a nested\n * folder document per directory. The result goes straight onto the canvas\n * document's `docs`, which is why a canvas is FolderDoc-compatible.\n */\nexport async function storeScriptFiles(\n repo: Repo,\n files: Map<string, Uint8Array>\n): Promise<DocLink[]> {\n const here: Array<[string, Uint8Array]> = [];\n const directories = new Map<string, Map<string, Uint8Array>>();\n\n for (const [path, bytes] of files) {\n const slash = path.indexOf(\"/\");\n if (slash === -1) {\n here.push([path, bytes]);\n continue;\n }\n const directory = path.slice(0, slash);\n const rest = path.slice(slash + 1);\n const nested = directories.get(directory) ?? new Map();\n nested.set(rest, bytes);\n directories.set(directory, nested);\n }\n\n const links: DocLink[] = [];\n for (const [name, bytes] of here) {\n links.push({\n name,\n type: \"file\",\n url: (await createFileDoc(repo, name, bytes)) as DocLink[\"url\"],\n });\n }\n for (const [name, nested] of directories) {\n const handle = await repo.create2<FolderDoc>({\n \"@patchwork\": { type: \"folder\" },\n title: name,\n docs: await storeScriptFiles(repo, nested),\n } as FolderDoc);\n links.push({ name, type: \"folder\", url: handle.url });\n }\n\n return links;\n}\n\n/** Flattens the `DocLink[]` tree back into archive-relative path \u2192 doc url. */\nexport async function resolveScriptFiles(\n repo: Repo,\n docs: DocLink[] | undefined,\n prefix = \"\"\n): Promise<Record<string, string>> {\n const files: Record<string, string> = {};\n for (const link of docs ?? []) {\n const path = prefix ? `${prefix}/${link.name}` : link.name;\n if (link.type === \"folder\") {\n const handle = await repo.find<FolderDoc>(link.url);\n Object.assign(\n files,\n await resolveScriptFiles(repo, handle.doc()?.docs, path)\n );\n } else {\n files[path] = link.url;\n }\n }\n return files;\n}\n\n/**\n * The script tree as the runner needs it: where each file lives, a version that\n * moves whenever a file is edited, and every document involved so the tree can\n * be watched.\n */\nexport type ScriptTree = {\n /** archive-relative path \u2192 file document url */\n files: Record<string, string>;\n /** archive-relative path \u2192 version, changing on every edit to that file */\n versions: Record<string, string>;\n /** every document in the tree, the folders included */\n handles: DocHandle<unknown>[];\n};\n\nexport async function readScriptTree(\n repo: Repo,\n docs: DocLink[] | undefined,\n prefix = \"\"\n): Promise<ScriptTree> {\n const tree: ScriptTree = { files: {}, versions: {}, handles: [] };\n for (const link of docs ?? []) {\n const path = prefix ? `${prefix}/${link.name}` : link.name;\n const handle = await repo.find<FolderDoc>(link.url);\n tree.handles.push(handle as unknown as DocHandle<unknown>);\n if (link.type === \"folder\") {\n const nested = await readScriptTree(repo, handle.doc()?.docs, path);\n Object.assign(tree.files, nested.files);\n Object.assign(tree.versions, nested.versions);\n tree.handles.push(...nested.handles);\n } else {\n tree.files[path] = link.url;\n tree.versions[path] = handle.heads().join(\",\");\n }\n }\n return tree;\n}\n\n/**\n * Reads the tree and reads it again whenever any of its documents changes, so\n * editing a script file in Patchwork takes effect on the canvas immediately.\n * Reads are serialised: a burst of edits can't leave two readers racing to\n * attach listeners to the same handles.\n */\nexport function watchScriptTree(\n repo: Repo,\n docs: DocLink[] | undefined,\n onTree: (tree: ScriptTree) => void\n): () => void {\n const watched = new Map<string, DocHandle<unknown>>();\n let stopped = false;\n let reading: Promise<void> = Promise.resolve();\n\n const reread = () => {\n reading = reading.then(async () => {\n if (stopped) return;\n const tree = await readScriptTree(repo, docs);\n if (stopped) return;\n const next = new Map<string, DocHandle<unknown>>(\n tree.handles.map((handle) => [handle.url, handle])\n );\n for (const [url, handle] of watched) {\n if (next.has(url)) continue;\n handle.off(\"change\", reread);\n watched.delete(url);\n }\n for (const [url, handle] of next) {\n if (watched.has(url)) continue;\n handle.on(\"change\", reread);\n watched.set(url, handle);\n }\n onTree(tree);\n });\n };\n\n reread();\n\n return () => {\n stopped = true;\n for (const handle of watched.values()) handle.off(\"change\", reread);\n watched.clear();\n };\n}\n\n/** The part of a tree's state a script actually depends on. */\nexport function signatureOf(deps: string[], versions: Record<string, string>) {\n return deps.map((path) => `${path}@${versions[path] ?? \"\"}`).join(\"|\");\n}\n\n/** Reads the linked documents back out as archive bytes, keyed by path. */\nexport async function readScriptFiles(\n repo: Repo,\n docs: DocLink[] | undefined\n): Promise<Map<string, Uint8Array>> {\n const encoder = new TextEncoder();\n const files = new Map<string, Uint8Array>();\n for (const [path, url] of Object.entries(\n await resolveScriptFiles(repo, docs)\n )) {\n const handle = await repo.find<UnixFileEntry>(url as never);\n const content = handle.doc()?.content;\n if (content == null) continue;\n files.set(\n path,\n typeof content === \"string\"\n ? encoder.encode(content)\n : new Uint8Array(content as Uint8Array)\n );\n }\n return files;\n}\n\nexport function hasScript(files: Record<string, string>) {\n return ENTRY in files;\n}\n\nfunction resolvePath(from: string, specifier: string) {\n const base = from.slice(0, from.lastIndexOf(\"/\") + 1);\n const parts = (base + specifier).split(\"/\");\n const out: string[] = [];\n for (const part of parts) {\n if (part === \".\" || part === \"\") continue;\n if (part === \"..\") out.pop();\n else out.push(part);\n }\n return out.join(\"/\");\n}\n\n// Bare specifiers a script may import. There is no importmap on this page, so\n// each is served as a generated module re-exporting the copy this tool already\n// bundles \u2014 the script gets the same instances the canvas is running on rather\n// than a second copy of React or the SDK.\nconst BUNDLED: Record<string, Record<string, unknown>> = {\n tldraw: tldrawSdk,\n \"@tldraw/tldraw\": tldrawSdk,\n react: reactSdk,\n \"react/jsx-runtime\": reactJsxRuntime,\n \"react-dom\": reactDomSdk,\n \"react-dom/client\": reactDomClient,\n};\n\n// A namespace built from CommonJS carries a `default` key, and `export const\n// default = \u2026` is a syntax error.\nconst NOT_EXPORTABLE = new Set([\"default\", \"class\", \"function\", \"import\", \"new\"]);\n\nfunction shimUrl(\n specifier: string,\n shims: Map<string, string>,\n revoke: string[]\n) {\n const cached = shims.get(specifier);\n if (cached) return cached;\n\n const namespace = BUNDLED[specifier];\n const key = `__tldraw5_shim_${specifier.replace(/\\W/g, \"_\")}`;\n (globalThis as Record<string, unknown>)[key] = namespace;\n\n const names = Object.keys(namespace).filter(\n (name) => /^[A-Za-z_$][\\w$]*$/.test(name) && !NOT_EXPORTABLE.has(name)\n );\n const source = [\n `const m = globalThis[${JSON.stringify(key)}];`,\n `export default m.default ?? m;`,\n ...names.map((name) => `export const ${name} = m[${JSON.stringify(name)}];`),\n ].join(\"\\n\");\n\n const url = URL.createObjectURL(\n new Blob([source], { type: \"text/javascript\" })\n );\n revoke.push(url);\n shims.set(specifier, url);\n return url;\n}\n\n// `from '\u2026'` / `import('\u2026')` specifiers only \u2014 a bare word match would rewrite\n// unrelated strings inside a bundled vendor file.\nconst SPECIFIER =\n /(\\bfrom\\s*|\\bimport\\s*\\(\\s*|\\bimport\\s+)([\"'])([^\"']+)\\2/g;\n\n/**\n * Builds a blob module for `path`, recursively building whatever it imports.\n * Cycles are not supported \u2014 a script that imports itself in a loop will throw.\n */\nasync function buildModule(\n repo: Repo,\n files: Record<string, string>,\n path: string,\n built: Map<string, string>,\n shims: Map<string, string>,\n revoke: string[]\n): Promise<string> {\n const existing = built.get(path);\n if (existing) return existing;\n\n const url = files[path];\n if (!url) throw new Error(`script file not found: ${path}`);\n\n const handle = await repo.find<UnixFileEntry>(url as never);\n const content = handle.doc()?.content;\n const source =\n typeof content === \"string\"\n ? content\n : new TextDecoder().decode(content as Uint8Array);\n\n const specifiers = new Map<string, string>();\n for (const [, , , specifier] of source.matchAll(SPECIFIER)) {\n if (specifiers.has(specifier)) continue;\n if (specifier in BUNDLED) {\n specifiers.set(specifier, shimUrl(specifier, shims, revoke));\n } else if (specifier.startsWith(\".\")) {\n const target = resolvePath(path, specifier);\n const targetUrl = files[target];\n if (!targetUrl) continue;\n const cached = built.get(target);\n if (cached) {\n specifiers.set(specifier, cached);\n continue;\n }\n // Non-JS siblings (wasm, json) are fetched by the script rather than\n // imported, so they become plain blob urls.\n const isModule =\n TEXT_EXTENSIONS.has(extensionOf(target)) &&\n extensionOf(target) !== \"json\";\n const targetBlob = isModule\n ? await buildModule(repo, files, target, built, shims, revoke)\n : await blobUrlFor(repo, targetUrl, target, revoke);\n built.set(target, targetBlob);\n specifiers.set(specifier, targetBlob);\n }\n }\n\n const rewritten = source.replace(\n SPECIFIER,\n (match, keyword: string, quote: string, specifier: string) => {\n const replacement = specifiers.get(specifier);\n return replacement ? `${keyword}${quote}${replacement}${quote}` : match;\n }\n );\n\n const blobUrl = URL.createObjectURL(\n new Blob([rewritten], { type: \"text/javascript\" })\n );\n revoke.push(blobUrl);\n built.set(path, blobUrl);\n return blobUrl;\n}\n\nasync function blobUrlFor(\n repo: Repo,\n url: string,\n path: string,\n revoke: string[]\n) {\n const handle = await repo.find<UnixFileEntry>(url as never);\n const content = handle.doc()?.content;\n const bytes =\n typeof content === \"string\" ? new TextEncoder().encode(content) : content;\n const blobUrl = URL.createObjectURL(\n new Blob([bytes as BlobPart], { type: mimeTypeOf(path) })\n );\n revoke.push(blobUrl);\n return blobUrl;\n}\n\n// The shape of the object a `config.js` receives and returns. Mirrors the\n// desktop app's `TldrawConfig`: arrays of constructors the script pushes onto,\n// a components map it overwrites slots in, and the editor options.\nexport type TldrawConfig = {\n shapeUtils: unknown[];\n bindingUtils: unknown[];\n assetUtils: unknown[];\n overlayUtils: unknown[];\n tools: unknown[];\n components: Record<string, unknown>;\n options: Record<string, unknown>;\n getShapeVisibility?: unknown;\n assetUrls?: unknown;\n initialState?: string;\n};\n\n/**\n * Runs `config.js` before the editor mounts, giving it the config the canvas is\n * about to be built from. Built as its own module graph \u2014 `config.js` and\n * `main.js` don't share instances of the files they both import, matching the\n * desktop app.\n */\nexport async function runConfigScript(\n repo: Repo,\n files: Record<string, string>,\n config: TldrawConfig\n): Promise<{ config: TldrawConfig; dispose: () => void; deps: string[] }> {\n const dispose = (urls: string[]) => () => {\n for (const url of urls) URL.revokeObjectURL(url);\n };\n\n if (!(CONFIG in files)) return { config, dispose: dispose([]), deps: [] };\n\n const revoke: string[] = [];\n const shims = new Map<string, string>();\n const built = new Map<string, string>();\n\n try {\n const url = await buildModule(repo, files, CONFIG, built, shims, revoke);\n const module = (await import(/* @vite-ignore */ url)) as {\n default?: (ctx: { config: TldrawConfig }) => TldrawConfig | Promise<TldrawConfig>;\n };\n const result = (await module.default?.({ config })) ?? config;\n return { config: result, dispose: dispose(revoke), deps: [...built.keys()] };\n } catch (error) {\n dispose(revoke)();\n throw error;\n }\n}\n\n/**\n * Runs a document's script against the editor. Returns the files it was built\n * from \u2014 so a caller can re-run it when one of them is edited \u2014 and a cleanup\n * that aborts the script's signal and revokes the blob urls.\n */\nexport async function runScript(\n repo: Repo,\n files: Record<string, string>,\n editor: Editor\n): Promise<{ dispose: () => void; deps: string[] }> {\n const revoke: string[] = [];\n const shims = new Map<string, string>();\n const built = new Map<string, string>();\n const aborter = new AbortController();\n\n try {\n const entryUrl = await buildModule(\n repo,\n files,\n ENTRY,\n built,\n shims,\n revoke\n );\n const module = (await import(/* @vite-ignore */ entryUrl)) as {\n default?: (ctx: MainScriptContext) => unknown;\n };\n // `signal` is the script's teardown hook \u2014 it aborts when the canvas\n // unmounts, the same point at which the desktop app aborts it.\n await module.default?.({\n editor,\n helpers: makeScriptHelpers(editor),\n signal: aborter.signal,\n });\n } catch (error) {\n aborter.abort();\n for (const url of revoke) URL.revokeObjectURL(url);\n throw error;\n }\n\n return {\n deps: [...built.keys()],\n dispose: () => {\n aborter.abort();\n for (const url of revoke) URL.revokeObjectURL(url);\n },\n };\n}\n", "// `ctx.helpers` \u2014 the editor-bound convenience bag a document script receives,\n// mirroring the desktop app's `ScriptHelpers`. Pure tldraw primitives are not\n// in here; scripts import those from 'tldraw' directly.\n\nimport {\n Box,\n createShapeId,\n renderPlaintextFromRichText,\n type Editor,\n type TLShape,\n type TLShapeId,\n type TLShapePartial,\n} from \"@tldraw/tldraw\";\n\ntype ShapeRef = string | { id?: string; shapeId?: string };\n\nfunction refToId(ref: ShapeRef): TLShapeId {\n if (typeof ref === \"string\") return ref as TLShapeId;\n return (ref.id ?? ref.shapeId) as TLShapeId;\n}\n\nexport function makeScriptHelpers(editor: Editor) {\n const createShapeIfMissing = (shape: TLShapePartial & { id: TLShapeId }) => {\n if (editor.getShape(shape.id)) return false;\n editor.createShape(shape);\n return true;\n };\n\n return {\n richTextToPlainText(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (!value) return \"\";\n try {\n return renderPlaintextFromRichText(editor, value as never);\n } catch {\n return \"\";\n }\n },\n\n createShapeIfMissing,\n\n createShapesIfMissing(shapes: Array<TLShapePartial & { id: TLShapeId }>) {\n const created: TLShapeId[] = [];\n for (const shape of shapes) {\n if (createShapeIfMissing(shape)) created.push(shape.id);\n }\n return created;\n },\n\n translateShapes(refs: ShapeRef[], dx: number, dy: number) {\n const moved: TLShapeId[] = [];\n const partials: TLShapePartial[] = [];\n for (const ref of refs) {\n const id = refToId(ref);\n const shape = editor.getShape(id);\n if (!shape) continue;\n partials.push({\n id,\n type: shape.type,\n x: shape.x + dx,\n y: shape.y + dy,\n } as TLShapePartial);\n moved.push(id);\n }\n if (partials.length) {\n editor.run(() => editor.updateShapes(partials), { history: \"ignore\" });\n }\n return moved;\n },\n\n // Fires only when the anchor alone moved: a resize or rotation also shifts\n // x/y, and a multi-shape drag would move script-owned internals twice.\n onShapeTranslate(\n shapeRef: string | TLShapeId,\n handler: (info: {\n dx: number;\n dy: number;\n prev: TLShape;\n next: TLShape;\n }) => void,\n options?: { signal?: AbortSignal }\n ) {\n const id = shapeRef as TLShapeId;\n const unlisten = editor.store.listen(\n ({ changes }) => {\n const updated = Object.values(changes.updated);\n if (updated.length !== 1) return;\n const [prev, next] = updated[0] as [TLShape, TLShape];\n if (prev.id !== id || next.typeName !== \"shape\") return;\n const dx = next.x - prev.x;\n const dy = next.y - prev.y;\n if (dx === 0 && dy === 0) return;\n if (\n prev.rotation !== next.rotation ||\n JSON.stringify(prev.props) !== JSON.stringify(next.props)\n ) {\n return;\n }\n handler({ dx, dy, prev, next });\n },\n { source: \"user\", scope: \"document\" }\n );\n options?.signal?.addEventListener(\"abort\", unlisten, { once: true });\n return unlisten;\n },\n\n createArrowBetweenShapes(\n fromShapeId: string,\n toShapeId: string,\n options: {\n bend?: number;\n arrowheadStart?: string;\n arrowheadEnd?: string;\n richText?: unknown;\n } = {}\n ) {\n const id = createShapeId();\n editor.createShape({\n id,\n type: \"arrow\",\n props: {\n bend: options.bend ?? 0,\n arrowheadStart: options.arrowheadStart ?? \"none\",\n arrowheadEnd: options.arrowheadEnd ?? \"arrow\",\n ...(options.richText ? { richText: options.richText } : {}),\n },\n } as TLShapePartial);\n editor.createBindings([\n {\n type: \"arrow\",\n fromId: id,\n toId: fromShapeId as TLShapeId,\n props: { terminal: \"start\" },\n },\n {\n type: \"arrow\",\n fromId: id,\n toId: toShapeId as TLShapeId,\n props: { terminal: \"end\" },\n },\n ] as never);\n return id;\n },\n\n boxShapes(\n refs: ShapeRef[],\n options: {\n shapeId?: string;\n color?: string;\n fill?: string;\n text?: string;\n } = {}\n ) {\n const boxes = refs\n .map((ref) => editor.getShapePageBounds(refToId(ref)))\n .filter(Boolean) as Box[];\n if (!boxes.length) return editor;\n\n const bounds = Box.Common(boxes);\n const padding = 16;\n editor.createShape({\n id: (options.shapeId as TLShapeId) ?? createShapeId(),\n type: \"geo\",\n x: bounds.x - padding,\n y: bounds.y - padding,\n props: {\n geo: \"rectangle\",\n w: bounds.w + padding * 2,\n h: bounds.h + padding * 2,\n color: options.color ?? \"black\",\n fill: options.fill ?? \"none\",\n },\n } as TLShapePartial);\n return editor;\n },\n\n // The desktop app's lints are heuristics over its own layout rules; rather\n // than invent different ones, this reports nothing.\n getLints() {\n return { lints: [] as Array<{ type: string; shapeIds: string[]; message: string }> };\n },\n\n // Patchwork persists through Automerge continuously \u2014 there is no file to\n // save, and the desktop contract forbids scripts calling this anyway.\n async saveDoc() {\n throw new Error(\"saveDoc() is not available outside the tldraw desktop app\");\n },\n };\n}\n\nexport type ScriptHelpers = ReturnType<typeof makeScriptHelpers>;\n"],
5
- "mappings": "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",
6
- "names": []
7
- }