@kubohiroya/turbowarp-extension-data-editor 0.2.0 → 0.2.2

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 (68) hide show
  1. package/README.md +9 -6
  2. package/dist/build-info.json +3 -3
  3. package/dist/fixed-input-branches.d.ts +12 -0
  4. package/dist/fixed-input-branches.js +180 -0
  5. package/dist/fixed-input-editor.d.ts +39 -0
  6. package/dist/fixed-input-editor.js +538 -0
  7. package/dist/fixed-input-schema.d.ts +15 -0
  8. package/dist/fixed-input-schema.js +21 -0
  9. package/dist/fixed-input-snapshot.d.ts +7 -0
  10. package/dist/fixed-input-snapshot.js +180 -0
  11. package/dist/fixed-input-types.d.ts +138 -0
  12. package/dist/fixed-input-types.js +23 -0
  13. package/dist/fixed-input-view.d.ts +14 -0
  14. package/dist/fixed-input-view.js +168 -0
  15. package/dist/index.d.ts +6 -0
  16. package/dist/index.js +4 -0
  17. package/dist/react.css +168 -0
  18. package/dist/react.d.ts +8 -0
  19. package/dist/react.js +19 -2
  20. package/dist/registry.d.ts +4 -0
  21. package/dist/registry.js +45 -7
  22. package/dist/rjsf-templates.d.ts +11 -0
  23. package/dist/rjsf-templates.js +129 -0
  24. package/dist/rjsf.d.ts +24 -1
  25. package/dist/rjsf.js +35 -3
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.js +1 -0
  28. package/dist/session.d.ts +3 -1
  29. package/dist/session.js +205 -7
  30. package/dist/turbowarp/bridge.d.ts +2 -1
  31. package/dist/turbowarp/bridge.js +37 -5
  32. package/dist/turbowarp/fixed-fields.d.ts +82 -0
  33. package/dist/turbowarp/fixed-fields.js +311 -0
  34. package/dist/turbowarp/fixed-transaction.d.ts +18 -0
  35. package/dist/turbowarp/fixed-transaction.js +460 -0
  36. package/dist/turbowarp/host.d.ts +3 -8
  37. package/dist/turbowarp/host.js +68 -1
  38. package/dist/turbowarp.d.ts +4 -0
  39. package/dist/turbowarp.js +1 -1
  40. package/dist/types.d.ts +5 -0
  41. package/dist/view.js +4 -0
  42. package/dist/webpack4/index.js +22 -5
  43. package/dist/webpack4/metafile.json +592 -299
  44. package/dist/webpack4/react.js +20 -6
  45. package/dist/webpack4/react.js.map +2 -2
  46. package/dist/webpack4/rjsf.js +450 -60
  47. package/dist/webpack4/rjsf.js.map +4 -4
  48. package/dist/webpack4/schema.js +6 -3
  49. package/dist/webpack4/{shared-KQOUMWJ4.js → shared-75QIWLZY.js} +1129 -1244
  50. package/dist/webpack4/{shared-KQOUMWJ4.js.map → shared-75QIWLZY.js.map} +4 -4
  51. package/dist/webpack4/shared-FYUILHED.js +1 -0
  52. package/dist/webpack4/shared-GQLPPRT2.js +210 -0
  53. package/dist/webpack4/shared-GQLPPRT2.js.map +7 -0
  54. package/dist/webpack4/shared-P2JBRZFP.js +2206 -0
  55. package/dist/webpack4/shared-P2JBRZFP.js.map +7 -0
  56. package/dist/webpack4/turbowarp.js +913 -9
  57. package/dist/webpack4/turbowarp.js.map +4 -4
  58. package/docs/api.md +7 -0
  59. package/docs/fixed-input-contracts.md +77 -0
  60. package/docs/package-distribution.md +5 -0
  61. package/docs/stage-2-publication.ja.md +6 -0
  62. package/package.json +2 -1
  63. package/dist/webpack4/shared-CQB3NG2A.js +0 -1
  64. package/dist/webpack4/shared-MRPGBJIH.js +0 -75
  65. package/dist/webpack4/shared-MRPGBJIH.js.map +0 -7
  66. package/dist/webpack4/shared-N6YQE2X6.js +0 -1029
  67. package/dist/webpack4/shared-N6YQE2X6.js.map +0 -7
  68. /package/dist/webpack4/{shared-CQB3NG2A.js.map → shared-FYUILHED.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../turbowarp/subtree.js", "../turbowarp/host.js", "../turbowarp/icon.js", "../turbowarp/appearance.js", "../turbowarp/error-session.js", "../turbowarp/bridge.js", "../turbowarp.js"],
4
- "sourcesContent": ["import { BlockEditorStructureError, DEFAULT_DESCENDANT_LIMITS } from '../index.js';\n// Traverse statement inputs and their internal next chains; never the root's outer next or reporters.\nconst collectBlockEditorSubtree = ({ ScratchBlocks, reference, inspect, generation }) => {\n const nodes = [];\n const records = new Map();\n const pending = {};\n const invalid = message => {\n throw new BlockEditorStructureError(message, 'invalid-structure');\n };\n const visit = (id, depth) => {\n if (records.has(id)) {\n throw new BlockEditorStructureError('A statement block is connected more than once.', 'cycle');\n }\n if (depth > DEFAULT_DESCENDANT_LIMITS.maxDepth || nodes.length >= DEFAULT_DESCENDANT_LIMITS.maxNodes) {\n throw new BlockEditorStructureError('The block hierarchy exceeds the editing limit.', 'limit');\n }\n const record = inspect({ targetId: reference.targetId, blockId: id }, true);\n if (!record)\n throw pending;\n if (record.block.outputConnection)\n invalid('A reporter cannot be a statement descendant.');\n records.set(id, record);\n const branches = [];\n nodes.push({ block: record.snapshot, branches });\n for (const input of record.block.inputList) {\n if (input.type !== ScratchBlocks.NEXT_STATEMENT)\n continue;\n const branch = { input: input.name, blockIds: [] };\n branches.push(branch);\n let child = input.connection && input.connection.targetBlock();\n const vmInput = record.vmBlock.inputs[input.name];\n if ((child ? child.id : null) !== (vmInput && vmInput.block ? vmInput.block : null))\n throw pending;\n let previous = input.connection;\n while (child) {\n if (!child.previousConnection || child.previousConnection.targetConnection !== previous) {\n invalid('Invalid statement connection.');\n }\n branch.blockIds.push(child.id);\n visit(child.id, depth + 1);\n const next = child.getNextBlock();\n if ((next ? next.id : null) !== (records.get(child.id).vmBlock.next || null))\n throw pending;\n previous = child.nextConnection;\n child = next;\n }\n }\n };\n try {\n visit(reference.blockId, 0);\n }\n catch (error) {\n if (error === pending)\n return null;\n throw error;\n }\n return { snapshot: { ...reference, generation: String(generation), nodes }, records };\n};\nexport default collectBlockEditorSubtree;\n", "import { BlockEditorConflictError, DESCENDANT_EDITING_CAPABILITY } from '../index.js';\nimport collectBlockEditorSubtree from './subtree.js';\nconst owns = (object, key) => Object.prototype.hasOwnProperty.call(object, key);\n// Adapt only standard, unvalidated text shadows; never evaluate connected reporters.\nconst createBlockEditorHost = ({ ScratchBlocks, workspace, vm, registry, enableDescendants = false, onError = console.error }) => {\n let disposed = false;\n let committing = false;\n let revision = 0;\n let identity = 0;\n let generation = 1;\n let lastTarget = vm.editingTarget;\n const versions = new Map();\n const invalidations = new Set();\n let notifyInvalidations = () => { };\n const identities = new WeakMap();\n const identify = object => {\n if (!identities.has(object))\n identities.set(object, ++identity);\n return identities.get(object);\n };\n const invalidate = event => {\n if (event && event.isUiEvent)\n return;\n revision++;\n if (enableDescendants && event) {\n const ids = new Set([event.blockId, ...(event.ids || [])]);\n for (const id of ids)\n if (id)\n versions.set(id, (versions.get(id) || 0) + 1);\n }\n if (!committing)\n notifyInvalidations();\n };\n const renew = () => {\n generation++;\n versions.clear();\n invalidate();\n };\n const targetsChanged = () => {\n if (lastTarget === vm.editingTarget)\n invalidate();\n else {\n lastTarget = vm.editingTarget;\n renew();\n }\n };\n workspace.addChangeListener(invalidate);\n vm.on('workspaceUpdate', renew);\n vm.on('targetsUpdate', targetsChanged);\n const inspect = (reference, structural = false) => {\n const target = vm.editingTarget;\n if (disposed || !target || target.id !== reference.targetId || workspace.isFlyout ||\n workspace.options.readOnly || (workspace.isDragging && workspace.isDragging()))\n return null;\n const block = workspace.getBlockById(reference.blockId);\n if (!block || block.isInFlyout || block.isShadow())\n return null;\n const descriptor = registry.resolve(block.type);\n const vmBlock = target.blocks.getBlock(block.id);\n if ((!structural && !descriptor) || (!block.isEditable() && (!structural || descriptor)) ||\n !vmBlock || vmBlock.opcode !== block.type)\n return null;\n const slots = {};\n const fields = new Map();\n const signature = [structural ? versions.get(block.id) || 0 : revision,\n identify(block), identify(vmBlock), identify(target)];\n if (structural) {\n if ((block.getParent() ? block.getParent().id : null) !== (vmBlock.parent || null))\n return null;\n signature.push(block.isEditable(), vmBlock.fields, vmBlock.inputs, vmBlock.mutation || null);\n for (const input of block.inputList) {\n if (input.type !== ScratchBlocks.INPUT_VALUE)\n continue;\n const connected = input.connection && input.connection.targetBlock();\n const vmInput = vmBlock.inputs[input.name];\n if ((connected ? connected.id : null) !==\n (vmInput && vmInput.block ? vmInput.block : null))\n return null;\n if (!connected)\n continue;\n signature.push(input.name, connected.id, identify(connected), connected.type);\n if (!connected.isShadow())\n continue;\n const vmShadow = target.blocks.getBlock(connected.id);\n if (!vmShadow)\n return null;\n for (const row of connected.inputList) {\n for (const field of row.fieldRow) {\n if (!field.name)\n continue;\n const stored = vmShadow.fields[field.name];\n if (!stored || String(field.getValue()) !== String(stored.id || stored.value))\n return null;\n }\n }\n signature.push(versions.get(connected.id) || 0, identify(vmShadow), vmShadow.fields);\n }\n }\n for (const name of descriptor ? descriptor.editableArguments : []) {\n const input = block.getInput(name);\n const shadow = input && input.connection && input.connection.targetBlock();\n const field = shadow && shadow.getField('TEXT');\n const vmShadow = shadow && target.blocks.getBlock(shadow.id);\n const vmInput = vmBlock.inputs && vmBlock.inputs[name];\n // Plain text is the only field family whose validation/side effects we support here.\n if (!shadow || !shadow.isShadow() || shadow.type !== 'text' || !field ||\n field.constructor !== ScratchBlocks.FieldTextInput || field.getValidator() ||\n !vmShadow || vmShadow.opcode !== 'text' || !vmShadow.fields.TEXT ||\n !vmInput || vmInput.block !== shadow.id || typeof field.getValue() !== 'string') {\n Object.defineProperty(slots, name, { value: { kind: 'reporter' }, enumerable: true });\n continue;\n }\n // Do not open or save against events which have not reached the VM yet.\n if (vmShadow.fields.TEXT.value !== field.getValue())\n return null;\n Object.defineProperty(slots, name, {\n value: { kind: 'literal', value: field.getValue() }, enumerable: true\n });\n fields.set(name, { shadow, field, value: field.getValue() });\n signature.push(name, identify(shadow), identify(field), identify(vmShadow), shadow.id);\n }\n return {\n snapshot: {\n targetId: target.id,\n blockId: block.id,\n opcode: block.type,\n revision: JSON.stringify(signature),\n arguments: slots\n },\n fields,\n block,\n vmBlock\n };\n };\n const collect = reference => collectBlockEditorSubtree({ ScratchBlocks, reference, inspect, generation });\n notifyInvalidations = () => {\n if (committing)\n return;\n for (const item of [...invalidations]) {\n let matches = false;\n try {\n const current = collect(item.reference);\n matches = current && JSON.stringify(current.snapshot) === JSON.stringify(item.snapshot);\n }\n catch (error) {\n // A malformed replacement graph invalidates an already open session too.\n }\n if (!matches)\n item.listener(new BlockEditorConflictError('The block hierarchy changed.'));\n }\n };\n const apply = (prepared, signal) => {\n const Events = ScratchBlocks.Events;\n if (!Events.isEnabled() || !Events.recordUndo || Events.getGroup() ||\n !Array.isArray(workspace.undoStack_) || !Array.isArray(workspace.redoStack_)) {\n throw new Error('The workspace is busy or its undo API is unsupported.');\n }\n if (!prepared.length)\n return;\n const target = vm.editingTarget;\n const oldRevision = revision;\n const oldVersions = new Map(versions);\n const undo = workspace.undoStack_.slice();\n const redo = workspace.redoStack_.slice();\n const emitProjectChanged = vm.runtime.emitProjectChanged;\n let succeeded = false;\n // Hold dirty notifications until all synchronous field/VM updates have succeeded.\n vm.runtime.emitProjectChanged = () => { };\n Events.setGroup(true);\n Events.disable();\n committing = true;\n try {\n if (signal && signal.aborted)\n throw new BlockEditorConflictError();\n for (const item of prepared) {\n item.field.setValue(item.next);\n if (item.field.getValue() !== item.next)\n throw new Error('The field rejected its value.');\n }\n // Deliver normal Change events synchronously: VM and undo state agree before resolving.\n for (const item of prepared) {\n workspace.fireChangeListener(new Events.Change(item.shadow, 'field', 'TEXT', item.value, item.next));\n if ((signal && signal.aborted) || vm.editingTarget !== target)\n throw new BlockEditorConflictError();\n }\n succeeded = true;\n }\n catch (error) {\n // No queued setter events exist because events were disabled throughout this section.\n for (const item of prepared) {\n ScratchBlocks.FieldTextInput.prototype.setValue.call(item.field, item.value);\n target.blocks.blocklyListen(new Events.Change(item.shadow, 'field', 'TEXT', item.next, item.value));\n }\n workspace.undoStack_.splice(0, workspace.undoStack_.length, ...undo);\n workspace.redoStack_.splice(0, workspace.redoStack_.length, ...redo);\n revision = oldRevision;\n versions.clear();\n for (const [id, value] of oldVersions)\n versions.set(id, value);\n throw error;\n }\n finally {\n committing = false;\n Events.enable();\n Events.setGroup(false);\n vm.runtime.emitProjectChanged = emitProjectChanged;\n }\n if (succeeded) {\n // Observer exceptions must not misreport an already committed transaction as rejected.\n try {\n emitProjectChanged.call(vm.runtime);\n }\n catch (error) {\n onError(error);\n }\n }\n };\n const prepare = (changes, records) => {\n if (!Array.isArray(changes))\n throw new TypeError('Expected an argument patch array.');\n const seen = new Set();\n const fields = new Set();\n return changes.map(change => {\n const record = change && records.get(change.blockId);\n const key = change && JSON.stringify([change.blockId, change.argument]);\n if (!record || typeof change.value !== 'string' || seen.has(key) ||\n !owns(record.snapshot.arguments, change.argument) || !record.fields.has(change.argument)) {\n throw new TypeError('Only distinct standard text shadow changes are supported.');\n }\n seen.add(key);\n const item = record.fields.get(change.argument);\n if (fields.has(item.field))\n throw new TypeError('Duplicate shadow write.');\n fields.add(item.field);\n return { ...item, next: change.value };\n }).filter(item => item.next !== item.value);\n };\n const host = {\n isCommitting: () => committing,\n readBlock: reference => {\n const result = inspect(reference);\n return result ? result.snapshot : null;\n },\n commit: ({ expected, changes }) => {\n const current = inspect(expected);\n if (!current || JSON.stringify(current.snapshot) !== JSON.stringify(expected)) {\n throw new BlockEditorConflictError();\n }\n apply(prepare(changes.map(change => ({ ...change, blockId: expected.blockId })), new Map([[expected.blockId, current]])));\n },\n invalidate: renew,\n dispose: () => {\n disposed = true;\n notifyInvalidations();\n invalidations.clear();\n workspace.removeChangeListener(invalidate);\n vm.removeListener('workspaceUpdate', renew);\n vm.removeListener('targetsUpdate', targetsChanged);\n }\n };\n if (enableDescendants) {\n host.descendants = {\n capability: DESCENDANT_EDITING_CAPABILITY,\n readSubtree: reference => {\n const result = collect(reference);\n return result ? result.snapshot : null;\n },\n commitSubtree: ({ expected, changes, signal }) => {\n const current = collect(expected);\n if ((signal && signal.aborted) || !current ||\n JSON.stringify(current.snapshot) !== JSON.stringify(expected))\n throw new BlockEditorConflictError();\n apply(prepare(changes, current.records), signal);\n },\n subscribeInvalidation: (reference, listener) => {\n const result = collect(reference);\n if (!result) {\n listener(new BlockEditorConflictError());\n return () => { };\n }\n const item = { reference, listener, snapshot: result.snapshot };\n invalidations.add(item);\n return () => invalidations.delete(item);\n }\n };\n }\n return host;\n};\nexport default createBlockEditorHost;\n", "// Decorate one known FieldImage; never search or intercept unrelated workspace DOM.\nconst bindBlockEditorIcon = ({ element, label, canOpen, onOpen }) => {\n const attributes = ['role', 'tabindex', 'aria-label', 'data-block-editor-icon'];\n const previous = attributes.map(name => element.getAttribute(name));\n const oldCursor = element.style.cursor;\n let press = null;\n const stop = event => {\n if (!canOpen())\n return;\n event.stopPropagation();\n event.preventDefault();\n };\n const down = event => {\n if (!canOpen() || event.button !== 0 || event.isPrimary === false)\n return;\n stop(event);\n press = { id: event.pointerId, x: event.clientX, y: event.clientY, moved: false };\n element.focus();\n if (element.setPointerCapture)\n element.setPointerCapture(event.pointerId);\n };\n const move = event => {\n if (!press || press.id !== event.pointerId)\n return;\n stop(event);\n if (Math.hypot(event.clientX - press.x, event.clientY - press.y) > 4)\n press.moved = true;\n };\n const up = event => {\n if (!press || press.id !== event.pointerId)\n return;\n move(event);\n const open = !press.moved && canOpen();\n press = null;\n if (element.releasePointerCapture && element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n if (open)\n onOpen();\n };\n const cancel = () => {\n press = null;\n };\n const key = event => {\n if ((event.key === 'Enter' || event.key === ' ') && canOpen()) {\n stop(event);\n if (!event.repeat)\n onOpen();\n }\n };\n const listeners = [\n ['pointerdown', down], ['pointermove', move], ['pointerup', up], ['pointercancel', cancel],\n ['mousedown', stop], ['mouseup', stop], ['click', stop], ['dblclick', stop],\n ['touchstart', stop], ['touchend', stop], ['touchmove', stop], ['keydown', key]\n ];\n element.setAttribute('role', 'button');\n element.setAttribute('tabindex', '0');\n element.setAttribute('aria-label', label);\n element.setAttribute('data-block-editor-icon', '');\n element.style.cursor = 'pointer';\n for (const [type, listener] of listeners)\n element.addEventListener(type, listener, { passive: false });\n return () => {\n for (const [type, listener] of listeners)\n element.removeEventListener(type, listener);\n attributes.forEach((name, index) => {\n if (previous[index] === null)\n element.removeAttribute(name);\n else\n element.setAttribute(name, previous[index]);\n });\n element.style.cursor = oldCursor;\n press = null;\n };\n};\nexport default bindBlockEditorIcon;\n", "// Presentation metadata stays outside snapshots, drafts and saved project data.\nconst readBlockEditorAppearance = (block, ScratchBlocks) => {\n const appearance = {};\n if (!block)\n return appearance;\n try {\n // Use the block's own labels, without reading JSON or other values from connected inputs.\n const name = block.inputList.filter(input => input.type !== ScratchBlocks.NEXT_STATEMENT)\n .map(input => input.fieldRow.filter(field => !(field instanceof ScratchBlocks.FieldImage))\n .map(field => field.getText())\n .join(' '))\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n if (name)\n appearance.name = name;\n }\n catch (error) {\n // The opcode remains available as a name fallback.\n }\n try {\n const colour = block.getColour();\n if (typeof colour === 'string' && /^#[0-9a-f]{6}$/i.test(colour)) {\n appearance.colour = colour;\n const channels = [1, 3, 5].map(offset => parseInt(colour.slice(offset, offset + 2), 16));\n appearance.tint = `rgba(${channels.join(', ')}, 0.08)`;\n }\n }\n catch (error) {\n // Missing presentation data must not prevent opening an otherwise editable tree.\n }\n try {\n const input = block.inputList[0];\n const field = input && input.fieldRow[0];\n if (field instanceof ScratchBlocks.FieldImage) {\n const uri = field.getValue();\n if (typeof uri === 'string' && uri.trim())\n appearance.iconURI = uri;\n }\n }\n catch (error) {\n // Keep the colour even when the leading image is unavailable.\n }\n return appearance;\n};\nexport default readBlockEditorAppearance;\n", "// A failed opening has no draft or save path; retain a closeable diagnostic modal.\nconst createBlockEditorErrorSession = (reference, error) => {\n let status = 'editing';\n const listeners = new Set();\n const finish = next => {\n if (status !== 'editing')\n return false;\n status = next;\n for (const listener of [...listeners])\n listener();\n listeners.clear();\n return true;\n };\n return Object.freeze({\n reference,\n getState: () => ({ status, canSave: false, issues: [], error }),\n subscribe: listener => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n mount: () => () => { },\n save: () => Promise.resolve({ status: 'failed', error }),\n cancel: () => finish('cancelled'),\n dispose: () => {\n finish('disposed');\n return true;\n }\n });\n};\nexport default createBlockEditorErrorSession;\n", "import createBlockEditorHost from './host.js';\nimport bindBlockEditorIcon from './icon.js';\nimport readBlockEditorAppearance from './appearance.js';\nimport { supportsDescendantEditing } from '../index.js';\nimport createBlockEditorErrorSession from './error-session.js';\nconst openBlockEditorSession = ({ registry, reference, host, descendants }) => (descendants && supportsDescendantEditing(host) ?\n registry.openDescendants(reference, host) : registry.open(reference, host));\nconst createBlockEditorBridge = ({ ScratchBlocks, workspace, vm, service, label, canOpen, onOpen, onError, descendants = false }) => {\n const host = createBlockEditorHost({ ScratchBlocks,\n workspace,\n vm,\n registry: service.registry,\n enableDescendants: descendants,\n onError });\n const decorations = new Map();\n let disposed = false;\n let timer = null;\n let activeSession = null;\n let openingSnapshot = null;\n let stopWaiting = null;\n const endSession = () => {\n const session = activeSession;\n if (!session)\n return;\n if (typeof session.invalidate === 'function') {\n session.invalidate();\n return;\n }\n // Normal close is refused while saving. Host invalidation also blocks commit,\n // then releases the old view as soon as its pending validation settles.\n if (session.dispose())\n return;\n if (!stopWaiting) {\n stopWaiting = session.subscribe(() => {\n if (session.getState().status === 'saving')\n return;\n stopWaiting();\n stopWaiting = null;\n session.dispose();\n });\n }\n };\n const checkSession = () => {\n // The host owns rollback. Its synchronous transaction must retain the draft on failure.\n if (host.isCommitting())\n return;\n if (!activeSession || !openingSnapshot ||\n !['editing', 'saving'].includes(activeSession.getState().status))\n return;\n const current = typeof activeSession.getNodes === 'function' ?\n host.descendants.readSubtree(activeSession.reference) : host.readBlock(activeSession.reference);\n if (!current || JSON.stringify(current) !== JSON.stringify(openingSnapshot))\n endSession();\n };\n const available = block => {\n if (disposed || !vm.editingTarget || !canOpen() || !service.registry.resolve(block.type))\n return false;\n const snapshot = host.readBlock({ targetId: vm.editingTarget.id, blockId: block.id });\n return snapshot && Object.values(snapshot.arguments).every(slot => slot.kind === 'literal');\n };\n const open = block => {\n if (activeSession && ['editing', 'saving'].includes(activeSession.getState().status))\n return;\n const reference = { targetId: vm.editingTarget.id, blockId: block.id };\n try {\n const session = openBlockEditorSession({ registry: service.registry, reference, host, descendants });\n if (!session && descendants)\n throw new Error('The complete block hierarchy is not editable.');\n if (session) {\n ScratchBlocks.hideChaff();\n activeSession = session;\n openingSnapshot = typeof session.getNodes === 'function' ?\n host.descendants.readSubtree(session.reference) : host.readBlock(session.reference);\n const labels = {};\n const appearances = Object.create(null);\n if (typeof session.getNodes === 'function') {\n for (const node of session.getNodes()) {\n const source = workspace.getBlockById(node.reference.blockId);\n const appearance = readBlockEditorAppearance(source, ScratchBlocks);\n appearances[node.reference.blockId] = appearance;\n labels[node.reference.blockId] = appearance.name || node.opcode;\n }\n }\n onOpen(session, labels, appearances);\n }\n }\n catch (error) {\n onError(error);\n activeSession = createBlockEditorErrorSession(reference, error);\n openingSnapshot = null;\n onOpen(activeSession);\n }\n };\n const refresh = () => {\n if (disposed)\n return;\n const seen = new Set();\n for (const block of workspace.getAllBlocks(false)) {\n const input = block.inputList[0];\n const field = input && input.fieldRow[0];\n if (workspace.options.readOnly || !service.registry.resolve(block.type) || !field ||\n !(field instanceof ScratchBlocks.FieldImage) || !field.fieldGroup_ ||\n block.isInFlyout || block.isShadow() || !block.isEditable())\n continue;\n seen.add(block.id);\n const old = decorations.get(block.id);\n if (old && old.field === field)\n continue;\n if (old)\n old.cleanup();\n const tooltip = field.imageElement_.tooltip;\n field.setTooltip(label);\n const unbind = bindBlockEditorIcon({\n element: field.fieldGroup_,\n label,\n canOpen: () => available(block),\n onOpen: () => open(block)\n });\n decorations.set(block.id, { field,\n cleanup: () => {\n unbind();\n if (field.imageElement_)\n field.imageElement_.tooltip = tooltip;\n } });\n }\n for (const [id, decoration] of decorations) {\n if (!seen.has(id)) {\n decoration.cleanup();\n decorations.delete(id);\n }\n }\n };\n const schedule = () => {\n checkSession();\n clearTimeout(timer);\n timer = setTimeout(refresh, 0);\n };\n const unregister = service.subscribe(() => {\n // Aggregate sessions observe relevant registry changes themselves.\n if (!activeSession || typeof activeSession.getNodes !== 'function') {\n host.invalidate();\n endSession();\n }\n schedule();\n });\n workspace.addChangeListener(schedule);\n vm.on('workspaceUpdate', schedule);\n vm.on('targetsUpdate', schedule);\n refresh();\n return {\n refresh,\n dispose: () => {\n disposed = true;\n clearTimeout(timer);\n unregister();\n workspace.removeChangeListener(schedule);\n vm.removeListener('workspaceUpdate', schedule);\n vm.removeListener('targetsUpdate', schedule);\n host.dispose();\n endSession();\n for (const decoration of decorations.values())\n decoration.cleanup();\n decorations.clear();\n }\n };\n};\nexport default createBlockEditorBridge;\nexport { openBlockEditorSession };\n", "import createBridge, { openBlockEditorSession as openSession } from './turbowarp/bridge.js';\nimport createHost from './turbowarp/host.js';\nimport bindIcon from './turbowarp/icon.js';\nimport readAppearance from './turbowarp/appearance.js';\nimport createErrorSession from './turbowarp/error-session.js';\n/** Attach to one workspace. No global VM, feature flag, React or GUI module is consulted. */\nexport function attachTurboWarpBlockEditors(options) {\n var _a;\n if (options.enabled !== true)\n return Object.freeze({ refresh() { }, dispose() { } });\n const bridge = createBridge({ ...options, descendants: options.descendants === true,\n onError: (_a = options.onError) !== null && _a !== void 0 ? _a : console.error });\n let disposed = false;\n return Object.freeze({\n refresh() { if (!disposed)\n bridge.refresh(); },\n dispose() {\n if (disposed)\n return;\n disposed = true;\n bridge.dispose();\n }\n });\n}\n/** Lower-level host port for custom integrations; standard GUI integrations use attachTurboWarpBlockEditors. */\nexport function createTurboWarpBlockEditorHost(options) {\n return createHost(options);\n}\nexport function bindBlockEditorIcon(options) {\n return bindIcon(options);\n}\nexport function readBlockEditorAppearance(block, ScratchBlocks) {\n return readAppearance(block, ScratchBlocks);\n}\nexport function createBlockEditorErrorSession(reference, error) {\n return createErrorSession(reference, error);\n}\nexport function openBlockEditorSession(options) {\n return openSession(options);\n}\n"],
5
- "mappings": "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",
6
- "names": ["bindBlockEditorIcon", "readBlockEditorAppearance", "createBlockEditorErrorSession", "openBlockEditorSession"]
3
+ "sources": ["../turbowarp/subtree.js", "../turbowarp/fixed-fields.js", "../turbowarp/fixed-transaction.js", "../turbowarp/host.js", "../turbowarp/icon.js", "../turbowarp/appearance.js", "../turbowarp/error-session.js", "../turbowarp/bridge.js", "../turbowarp.js"],
4
+ "sourcesContent": ["import { BlockEditorStructureError, DEFAULT_DESCENDANT_LIMITS } from '../index.js';\n// Traverse statement inputs and their internal next chains; never the root's outer next or reporters.\nconst collectBlockEditorSubtree = ({ ScratchBlocks, reference, inspect, generation }) => {\n const nodes = [];\n const records = new Map();\n const pending = {};\n const invalid = message => {\n throw new BlockEditorStructureError(message, 'invalid-structure');\n };\n const visit = (id, depth) => {\n if (records.has(id)) {\n throw new BlockEditorStructureError('A statement block is connected more than once.', 'cycle');\n }\n if (depth > DEFAULT_DESCENDANT_LIMITS.maxDepth || nodes.length >= DEFAULT_DESCENDANT_LIMITS.maxNodes) {\n throw new BlockEditorStructureError('The block hierarchy exceeds the editing limit.', 'limit');\n }\n const record = inspect({ targetId: reference.targetId, blockId: id }, true);\n if (!record)\n throw pending;\n if (record.block.outputConnection)\n invalid('A reporter cannot be a statement descendant.');\n records.set(id, record);\n const branches = [];\n nodes.push({ block: record.snapshot, branches });\n for (const input of record.block.inputList) {\n if (input.type !== ScratchBlocks.NEXT_STATEMENT)\n continue;\n const branch = { input: input.name, blockIds: [] };\n branches.push(branch);\n let child = input.connection && input.connection.targetBlock();\n const vmInput = record.vmBlock.inputs[input.name];\n if ((child ? child.id : null) !== (vmInput && vmInput.block ? vmInput.block : null))\n throw pending;\n let previous = input.connection;\n while (child) {\n if (!child.previousConnection || child.previousConnection.targetConnection !== previous) {\n invalid('Invalid statement connection.');\n }\n branch.blockIds.push(child.id);\n visit(child.id, depth + 1);\n const next = child.getNextBlock();\n if ((next ? next.id : null) !== (records.get(child.id).vmBlock.next || null))\n throw pending;\n previous = child.nextConnection;\n child = next;\n }\n }\n };\n try {\n visit(reference.blockId, 0);\n }\n catch (error) {\n if (error === pending)\n return null;\n throw error;\n }\n return { snapshot: { ...reference, generation: String(generation), nodes }, records };\n};\nexport default collectBlockEditorSubtree;\n", "const owns = (object, key) => Object.prototype.hasOwnProperty.call(object, key);\nconst own = (object, key) => {\n const descriptor = object && Object.getOwnPropertyDescriptor(object, key);\n return descriptor && 'value' in descriptor ? descriptor.value : undefined;\n};\nconst primitive = value => typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\nconst token = /^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$/u;\n// Inspect data properties without invoking custom field accessors or menu providers.\nconst inherited = (object, name) => {\n for (let current = object; current; current = Object.getPrototypeOf(current)) {\n const descriptor = Object.getOwnPropertyDescriptor(current, name);\n if (descriptor)\n return 'value' in descriptor ? descriptor.value : undefined;\n }\n return undefined;\n};\nconst storage = ['text_', 'value_', 'colour_', 'validator_', 'sourceBlock_', 'hue_', 'saturation_', 'brightness_'];\nconst methods = ['getValue', 'getText', 'setValue', 'setText', 'getValidator', 'classValidator', 'callValidator',\n 'getOptions', 'forceRerender', 'updateSliderHandles_', 'updateDom_'];\nconst trustedClasses = new WeakMap();\n/** Freeze native method identities once when the host attaches, before opening editors. */\nexport function initializeFixedFields(ScratchBlocks) {\n for (const key of ['FieldTextInput', 'FieldNumber', 'FieldDropdown', 'FieldColourSlider']) {\n const Class = ScratchBlocks[key];\n if (typeof Class !== 'function' || trustedClasses.has(Class))\n continue;\n const chain = [];\n for (let prototype = Class.prototype; prototype && prototype !== Object.prototype; prototype = Object.getPrototypeOf(prototype)) {\n chain.push({ prototype, own: methods.map(name => [name, Object.getOwnPropertyDescriptor(prototype, name)]) });\n }\n trustedClasses.set(Class, { prototype: Class.prototype, chain,\n methods: methods.map(name => [name, inherited(Class.prototype, name)]) });\n }\n}\nconst safeField = (field, Class) => {\n const trusted = Class && trustedClasses.get(Class);\n if (!trusted || Class.prototype !== trusted.prototype || Object.getPrototypeOf(field) !== trusted.prototype)\n return false;\n let currentPrototype = trusted.prototype;\n for (const entry of trusted.chain) {\n if (currentPrototype !== entry.prototype)\n return false;\n for (const [name, expected] of entry.own) {\n const actual = Object.getOwnPropertyDescriptor(currentPrototype, name);\n if (Boolean(actual) !== Boolean(expected) ||\n (actual && (!('value' in actual) || !expected || !('value' in expected) || actual.value !== expected.value)))\n return false;\n }\n currentPrototype = Object.getPrototypeOf(currentPrototype);\n }\n if (currentPrototype !== Object.prototype && currentPrototype !== null)\n return false;\n for (const name of storage) {\n for (let current = field; current; current = Object.getPrototypeOf(current)) {\n const descriptor = Object.getOwnPropertyDescriptor(current, name);\n if (!descriptor)\n continue;\n if (!('value' in descriptor))\n return false;\n break;\n }\n }\n for (const [name, expected] of trusted.methods) {\n if (owns(field, name) || inherited(field, name) !== expected)\n return false;\n }\n for (let current = field; current; current = Object.getPrototypeOf(current)) {\n const descriptor = Object.getOwnPropertyDescriptor(current, 'validator_');\n if (descriptor)\n return 'value' in descriptor && descriptor.value == null;\n }\n return false;\n};\nconst arrayData = value => {\n if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype)\n return null;\n const result = [];\n for (let index = 0; index < value.length; index++) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor || !('value' in descriptor))\n return null;\n result.push(descriptor.value);\n }\n return result;\n};\nconst staticValues = field => {\n const items = arrayData(own(field, 'menuGenerator_'));\n if (!items || items.length === 0)\n return null;\n const values = [];\n for (const item of items) {\n const tuple = arrayData(item);\n if (!tuple || tuple.length !== 2 || typeof tuple[0] !== 'string' || typeof tuple[1] !== 'string')\n return null;\n values.push(tuple[1]);\n }\n return Object.freeze(values);\n};\nconst rawKeys = ['text_', 'value_', 'colour_', 'hue_', 'saturation_', 'brightness_'];\nconst ownState = (object, keys) => keys.map(name => [name, Object.getOwnPropertyDescriptor(object, name)]);\nconst restoreOwnState = (object, state) => {\n for (const [name, descriptor] of state) {\n if (descriptor)\n Object.defineProperty(object, name, descriptor);\n else\n delete object[name];\n }\n};\nconst vmFieldsIdentity = (fields, identify) => Object.keys(fields || {}).sort().map(name => {\n const descriptor = Object.getOwnPropertyDescriptor(fields, name);\n if (!descriptor || !('value' in descriptor))\n return [name, 'accessor'];\n const stored = descriptor.value;\n if (!stored || typeof stored !== 'object')\n return [name, typeof stored, String(stored)];\n return [name, identify(stored), ...Object.keys(stored).sort().map(key => {\n const item = Object.getOwnPropertyDescriptor(stored, key);\n if (!item || !('value' in item))\n return [key, 'accessor'];\n const value = item.value;\n return [key, typeof value, primitive(value) ? (Object.is(value, -0) ? '-0' : String(value)) :\n value && (typeof value === 'object' || typeof value === 'function') ? identify(value) : String(value)];\n })];\n});\nconst colorState = (block, field) => {\n const colors = ['getColour', 'getColourSecondary', 'getColourTertiary', 'getColourQuaternary'];\n return {\n colors: colors.map(name => typeof block[name] === 'function' ? block[name]() : undefined),\n hsv: ['hue_', 'saturation_', 'brightness_'].map(name => [name, own(field, name)]),\n blockProperties: ownState(block, ['colour_', 'colourSecondary_', 'colourTertiary_', 'colourQuaternary_'])\n };\n};\n/** Native objects stay local; only primitive metadata is returned in snapshots. */\nexport function inspectFixedArgument({ ScratchBlocks, block, vmBlock, target, argument, role, identify, extensionId }) {\n initializeFixedFields(ScratchBlocks);\n const sourceIdentity = [argument, identify(block), identify(vmBlock)];\n let observedFields = [];\n const unavailable = (source, reason, raw) => ({\n slot: primitive(raw) ? { kind: 'literal', value: raw } : { kind: 'reporter' },\n metadata: { role, source, identity: JSON.stringify([...sourceIdentity, source]), reason },\n signatureParts: [...sourceIdentity, observedFields]\n });\n const direct = block.getField(argument);\n const input = block.getInput(argument);\n const connected = input && input.connection && input.connection.targetBlock();\n const vmInput = vmBlock.inputs && vmBlock.inputs[argument];\n if ((connected ? connected.id : null) !== (vmInput && vmInput.block ? vmInput.block : null))\n return null;\n if (direct && connected)\n return null;\n if (connected && !connected.isShadow()) {\n const vmReporter = target.blocks.getBlock(connected.id);\n if (!vmReporter || vmReporter.opcode !== connected.type || vmReporter.parent !== block.id)\n return null;\n sourceIdentity.push(identify(connected), identify(vmReporter), connected.id, connected.type);\n return { slot: { kind: 'reporter' }, metadata: { role, source: 'reporter', identity: JSON.stringify(sourceIdentity) },\n signatureParts: sourceIdentity };\n }\n let owner = direct ? block : connected;\n if (!owner) {\n if (vmBlock.fields && owns(vmBlock.fields, argument))\n return null;\n return unavailable('missing', 'The declared field or input is missing.');\n }\n const vmOwner = direct ? vmBlock : target.blocks.getBlock(owner.id);\n if (!vmOwner || vmOwner.opcode !== owner.type)\n return null;\n sourceIdentity.push(identify(owner), identify(vmOwner), owner.id, owner.type);\n observedFields = vmFieldsIdentity(vmOwner.fields, identify);\n if (!direct && (!vmInput || vmInput.shadow !== owner.id || vmOwner.parent !== block.id))\n return null;\n let kind;\n let name;\n let Class;\n if (direct) {\n kind = 'menu';\n name = argument;\n Class = ScratchBlocks.FieldDropdown;\n }\n else if (owner.type === 'text') {\n kind = 'text';\n name = 'TEXT';\n Class = ScratchBlocks.FieldTextInput;\n }\n else if (owner.type === 'math_number') {\n kind = 'number';\n name = 'NUM';\n Class = ScratchBlocks.FieldNumber;\n }\n else if (owner.type === 'colour_picker') {\n kind = 'color';\n name = 'COLOUR';\n Class = ScratchBlocks.FieldColourSlider;\n }\n else if (typeof extensionId === 'string' && owner.type.startsWith(`${extensionId}_menu_`)) {\n kind = 'menu';\n Class = ScratchBlocks.FieldDropdown;\n const names = [];\n for (const row of owner.inputList)\n for (const candidate of row.fieldRow) {\n const candidateName = own(candidate, 'name');\n if (typeof candidateName === 'string' && candidateName)\n names.push(candidateName);\n }\n if (names.length !== 1)\n return unavailable('unsupported', 'The menu shadow does not have one standard field.');\n [name] = names;\n }\n else\n return unavailable('unsupported', 'The shadow field family is unsupported.');\n const field = direct || owner.getField(name);\n const stored = vmOwner.fields && vmOwner.fields[name];\n if (!field || !stored)\n return null;\n sourceIdentity.push(identify(field), name);\n const raw = own(stored, 'value');\n if (!safeField(field, Class))\n return unavailable('unsupported', 'The field class, methods or validator is unsupported.', raw);\n const value = inherited(Class.prototype, 'getValue').call(field);\n if (!Object.is(value, raw))\n return null;\n if (typeof value !== 'string')\n return unavailable('unsupported', 'The native field value is not a string.', raw);\n const allowedValues = kind === 'menu' ? staticValues(field) : undefined;\n if (kind === 'menu' && !allowedValues)\n return unavailable('unsupported', 'Dynamic or nonstandard menus are unsupported.', raw);\n sourceIdentity.push(kind, ...(allowedValues || []));\n const binding = { block: owner, field, fieldName: name, value, vmBlock: vmOwner, kind,\n Class, prototype: Class.prototype, allowedValues,\n restoreValue: inherited(Class.prototype, 'setValue'), rawState: ownState(field, rawKeys),\n restoreHandles: inherited(Class.prototype, 'updateSliderHandles_'),\n restoreDom: inherited(Class.prototype, 'updateDom_'),\n ...(kind === 'color' ? { restoreState: colorState(owner, field) } : {}) };\n return { slot: { kind: 'literal', value }, metadata: { role, source: direct ? 'field' : 'shadow',\n identity: JSON.stringify(sourceIdentity), field: { blockId: owner.id, name, type: { text: 'FieldTextInput', number: 'FieldNumber', menu: 'FieldDropdown', color: 'FieldColourSlider' }[kind] } },\n ...(role === 'editable' ? { binding } : {}), signatureParts: [...sourceIdentity, observedFields] };\n}\n/** Validate the exact saved primitive; native setters must not silently normalize it. */\nexport function prepareFixedChange(binding, value) {\n if (!binding || !safeField(binding.field, binding.Class) || typeof value !== 'string') {\n throw new TypeError('Only standard native string field writes are supported.');\n }\n if (binding.kind === 'menu') {\n const currentValues = staticValues(binding.field);\n if (!currentValues || currentValues.length !== binding.allowedValues.length ||\n currentValues.some((item, index) => item !== binding.allowedValues[index])) {\n throw new TypeError('The static menu changed before preparing the write.');\n }\n }\n if (value !== binding.value) {\n if (binding.kind === 'number' && (!token.test(value.trim()) || !Number.isFinite(Number(value)))) {\n throw new TypeError('Expected a finite numeric field token.');\n }\n if (binding.kind === 'color' && !/^#(?:[a-f0-9]{3}|[a-f0-9]{6})$/iu.test(value)) {\n throw new TypeError('Expected a hexadecimal color field token.');\n }\n if (binding.kind === 'menu' && !binding.allowedValues.includes(value)) {\n throw new TypeError('Expected a declared static menu value.');\n }\n }\n return { ...binding, next: value };\n}\n/** Capture a later external value without invoking replacement field methods. */\nexport function captureFixedFieldState(binding) {\n if (!binding || !safeField(binding.field, binding.Class)) {\n throw new TypeError('Cannot capture an unsupported native field.');\n }\n const value = inherited(binding.prototype, 'getValue').call(binding.field);\n if (typeof value !== 'string')\n throw new TypeError('Expected a native string field.');\n return { ...binding, value, rawState: ownState(binding.field, rawKeys),\n ...(binding.kind === 'color' ? { restoreState: colorState(binding.block, binding.field) } : {}) };\n}\n/** Restore raw text and the standard color field's additional block/UI state. */\nexport function restoreFixedField(binding) {\n let failure;\n try {\n binding.restoreValue.call(binding.field, binding.value);\n }\n catch (error) {\n failure = error;\n }\n // The standard setters can update raw data before renderer code throws.\n // Restore primitive descriptors independently so renderer failure cannot retain new data.\n restoreOwnState(binding.field, binding.rawState);\n if (binding.restoreState) {\n const colors = binding.restoreState.colors;\n try {\n if (colors.every(value => typeof value === 'string'))\n binding.block.setColour(...colors);\n }\n catch (error) {\n failure = failure || error;\n }\n restoreOwnState(binding.block, binding.restoreState.blockProperties);\n try {\n binding.restoreHandles.call(binding.field);\n }\n catch (error) {\n failure = failure || error;\n }\n try {\n binding.restoreDom.call(binding.field);\n }\n catch (error) {\n failure = failure || error;\n }\n }\n if (failure)\n throw failure;\n}\n", "import { BlockEditorConflictError, FIXED_INPUTS_CAPABILITY } from '../index.js';\nimport { captureFixedInputDeclaration, captureFixedSnapshot, sameFixedSnapshot } from '../fixed-input-snapshot.js';\nimport { initializeFixedFields, inspectFixedArgument, prepareFixedChange, restoreFixedField, captureFixedFieldState } from './fixed-fields.js';\nimport { snapshotJson } from '../schema-json.js';\nimport { validateFixedBranchChanges } from '../fixed-input-branches.js';\nconst own = (object, name) => {\n const descriptor = object && Object.getOwnPropertyDescriptor(object, name);\n if (!descriptor || !Object.prototype.hasOwnProperty.call(descriptor, 'value')) {\n throw new TypeError('Expected an own data property.');\n }\n return descriptor.value;\n};\nconst inheritedData = (object, key) => {\n for (let item = object; item; item = Object.getPrototypeOf(item)) {\n const descriptor = Object.getOwnPropertyDescriptor(item, key);\n if (descriptor) {\n if (!('value' in descriptor))\n throw new TypeError('Unsupported undo configuration.');\n return descriptor.value;\n }\n }\n return undefined;\n};\nconst ensureNativeHistory = stack => {\n if (!Array.isArray(stack) || !Object.isExtensible(stack) ||\n Object.getOwnPropertySymbols(stack).length || !Object.getOwnPropertyDescriptor(stack, 'length').writable) {\n throw new TypeError('Unsupported undo history.');\n }\n if (Object.getOwnPropertyNames(stack).length !== stack.length + 1)\n throw new TypeError('Unsupported undo history.');\n for (let index = 0; index < stack.length; index++) {\n const descriptor = Object.getOwnPropertyDescriptor(stack, String(index));\n if (!descriptor || !('value' in descriptor) || !descriptor.writable || !descriptor.configurable) {\n throw new TypeError('Unsupported undo history.');\n }\n }\n};\nconst copyHistory = stack => {\n const copy = [];\n for (let index = 0; index < stack.length; index++)\n copy.push(own(stack, String(index)));\n return copy;\n};\nconst replaceHistory = (stack, values) => {\n stack.length = 0;\n for (const value of values)\n Array.prototype.push.call(stack, value);\n};\nconst conflict = () => { throw new BlockEditorConflictError(); };\nconst aborted = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'aborted').get;\nconst isAborted = signal => aborted.call(signal);\nconst optionalOwn = (object, name) => {\n const descriptor = object && Object.getOwnPropertyDescriptor(object, name);\n if (descriptor && !Object.prototype.hasOwnProperty.call(descriptor, 'value')) {\n throw new TypeError('VM state must contain data properties.');\n }\n return descriptor && descriptor.value;\n};\nconst stateToken = (value, identify, seen = new Set()) => {\n if (typeof value === 'number')\n return ['number', Object.is(value, -0) ? '-0' : String(value)];\n if (value === undefined)\n return ['undefined'];\n if (value === null || typeof value === 'string' || typeof value === 'boolean')\n return value;\n if (typeof value !== 'object' || seen.has(value) || seen.size > 64)\n throw new TypeError('Unsupported VM state.');\n seen.add(value);\n const result = Object.getOwnPropertyNames(value).sort().map(key => [key, stateToken(own(value, key), identify, seen)]);\n seen.delete(value);\n return ['object', identify(value), result];\n};\nconst untouchedState = (block, vmBlock, target, bindings, identify) => {\n const omitted = new Map();\n for (const binding of bindings.values()) {\n if (!omitted.has(binding.vmBlock))\n omitted.set(binding.vmBlock, new Set());\n omitted.get(binding.vmBlock).add(binding.fieldName);\n }\n const seen = new Set();\n const records = [];\n const capture = item => {\n if (!item || seen.has(item))\n return;\n seen.add(item);\n const fields = item.fields || {};\n records.push([identify(item), ['id', 'opcode', 'parent', 'next', 'inputs', 'mutation', 'shadow', 'topLevel']\n .map(key => [key, stateToken(optionalOwn(item, key), identify)]), identify(fields), Object.keys(fields).sort()\n .map(key => {\n var _a;\n const field = own(fields, key);\n if (!((_a = omitted.get(item)) === null || _a === void 0 ? void 0 : _a.has(key)))\n return [key, stateToken(field, identify)];\n return [key, identify(field), Object.getOwnPropertyNames(field).sort()\n .filter(property => property !== 'value').map(property => [property, stateToken(own(field, property), identify)])];\n })]);\n };\n capture(vmBlock);\n const connections = [];\n for (const input of block.inputList) {\n const connected = input.connection && input.connection.targetBlock();\n connections.push([input.name || '', identify(input), input.connection ? identify(input.connection) : null, connected ? [connected.id, connected.type, identify(connected)] : null]);\n if (connected)\n capture(target.blocks.getBlock(connected.id));\n }\n const statementConnections = ['nextConnection', 'previousConnection', 'outputConnection'].map(name => {\n const connection = block[name];\n const connected = connection && connection.targetBlock();\n return [name, connection ? identify(connection) : null,\n connection && connection.targetConnection ? identify(connection.targetConnection) : null,\n connected ? [connected.id, connected.type, identify(connected)] : null];\n });\n return JSON.stringify([records, connections, statementConnections]);\n};\nconst sameDeclaration = (left, right) => JSON.stringify(captureFixedInputDeclaration(left)) ===\n JSON.stringify(captureFixedInputDeclaration(right));\n// Fixed inputs deliberately use a separate transaction from the legacy TEXT adapter.\nexport default function createFixedInputPort({ ScratchBlocks, workspace, vm, registry, identify, getState, begin, markEvent, finish, onError, subscribeScope }) {\n initializeFixedFields(ScratchBlocks);\n const inspect = (reference, suppliedDeclaration) => {\n const state = getState();\n const target = vm.editingTarget;\n if (state.disposed || !target || target.id !== reference.targetId || workspace.isFlyout ||\n workspace.options.readOnly || (workspace.isDragging && workspace.isDragging()))\n return null;\n const block = workspace.getBlockById(reference.blockId);\n if (!block || block.isInFlyout || block.isShadow() || !block.isEditable())\n return null;\n const descriptor = registry.resolve(block.type);\n const declaration = registry.resolveFixed(block.type);\n if (!descriptor || !declaration || !sameDeclaration(declaration, suppliedDeclaration))\n return null;\n const vmBlock = target.blocks.getBlock(block.id);\n const nextBlock = block.nextConnection && block.nextConnection.targetBlock();\n if (!vmBlock || (nextBlock ? nextBlock.id : null) !== (vmBlock.next || null) || vmBlock.opcode !== block.type ||\n (block.getParent() ? block.getParent().id : null) !== (vmBlock.parent || null))\n return null;\n const arguments_ = Object.create(null);\n const inputs = Object.create(null);\n const bindings = new Map();\n const signature = [state.revision, identify(target), identify(block), identify(vmBlock), identify(declaration)];\n for (const [role, names] of [['editable', declaration.editableArguments], ['readonly', declaration.readOnlyArguments]]) {\n for (const argument of names) {\n const item = inspectFixedArgument({ ScratchBlocks, block, vmBlock, target, argument, role,\n identify, extensionId: descriptor.extensionId });\n if (!item)\n return null;\n arguments_[argument] = item.slot;\n inputs[argument] = item.metadata;\n if (role === 'editable' && item.binding)\n bindings.set(argument, item.binding);\n signature.push(argument, item.signatureParts);\n }\n }\n const untouched = untouchedState(block, vmBlock, target, bindings, identify);\n signature.push(untouched);\n const snapshot = captureFixedSnapshot({ targetId: target.id, blockId: block.id, opcode: block.type,\n revision: JSON.stringify(signature), arguments: arguments_, fixedContext: {\n contractId: declaration.contractId, contractRevision: declaration.contractRevision,\n generation: String(state.generation), readOnlyArguments: declaration.readOnlyArguments,\n dependencies: declaration.dependencies, inputs\n } }, reference, declaration);\n return { snapshot, bindings, declaration, target, block, vmBlock, state, untouched, runtime: vm.runtime };\n };\n const commit = request => {\n var _a;\n const expectedInput = own(request, 'expected');\n const changesInput = own(request, 'changes');\n const signal = own(request, 'signal');\n try {\n const contextInput = own(request, 'context');\n const context = snapshotJson({ consumerId: own(contextInput, 'consumerId'),\n nowMs: own(contextInput, 'nowMs'), settings: own(contextInput, 'settings') });\n if (typeof context.consumerId !== 'string' || !context.consumerId ||\n typeof context.nowMs !== 'number' || !Number.isFinite(context.nowMs)) {\n throw new TypeError('Invalid fixed validation context.');\n }\n }\n catch (_b) {\n throw new TypeError('Invalid fixed validation context.');\n }\n if (isAborted(signal))\n conflict();\n const expected = captureFixedSnapshot(expectedInput);\n const current = inspect(expected, registry.resolveFixed(expected.opcode));\n if (!current || !sameFixedSnapshot(expected, current.snapshot))\n conflict();\n const declaration = current.declaration;\n captureFixedSnapshot(expected, expected, declaration);\n if (!Array.isArray(changesInput))\n throw new TypeError('Expected a fixed argument patch array.');\n const prepared = [];\n const seenNames = new Set();\n const seenFields = new Set();\n for (let i = 0; i < changesInput.length; i++) {\n const change = own(changesInput, String(i));\n const name = own(change, 'argument');\n const value = own(change, 'value');\n if (typeof name !== 'string' || seenNames.has(name) ||\n !declaration.editableArguments.includes(name) || !current.bindings.has(name)) {\n throw new TypeError('Only distinct editable standard fields may be changed.');\n }\n seenNames.add(name);\n const binding = current.bindings.get(name);\n if (seenFields.has(binding.field))\n throw new TypeError('Duplicate field write.');\n seenFields.add(binding.field);\n if (Object.is(value, binding.value))\n continue;\n prepared.push({ ...prepareFixedChange(binding, value), argument: name });\n }\n if (validateFixedBranchChanges(declaration, expected, prepared.map(item => ({ argument: item.argument, value: item.next }))).length) {\n throw new TypeError('Fixed branch changes require a valid canonical branch policy.');\n }\n const guard = () => {\n const state = getState();\n if (isAborted(signal) || state.disposed || state.generation !== current.state.generation ||\n state.externalRevision !== current.state.externalRevision || vm.editingTarget !== current.target ||\n vm.runtime !== current.runtime ||\n registry.resolveFixed(expected.opcode) !== declaration)\n conflict();\n };\n guard();\n const beforeWrite = inspect(expected, declaration);\n if (!beforeWrite || !sameFixedSnapshot(expected, beforeWrite.snapshot))\n conflict();\n guard();\n if (!prepared.length)\n return;\n const Events = ScratchBlocks.Events;\n if (!Events.isEnabled() || !Events.recordUndo || Events.getGroup() ||\n !Array.isArray(workspace.undoStack_) || !Array.isArray(workspace.redoStack_)) {\n throw new Error('The workspace is busy or its undo API is unsupported.');\n }\n const undoStack = workspace.undoStack_;\n const redoStack = workspace.redoStack_;\n ensureNativeHistory(undoStack);\n ensureNativeHistory(redoStack);\n const configuredMaxUndo = inheritedData(workspace, 'MAX_UNDO');\n const maxUndo = configuredMaxUndo === undefined ? Infinity : configuredMaxUndo;\n if (maxUndo !== Infinity && (!Number.isSafeInteger(maxUndo) || maxUndo < 0)) {\n throw new TypeError('Unsupported undo configuration.');\n }\n const undo = copyHistory(undoStack);\n const redo = copyHistory(redoStack);\n const oldGroup = Events.getGroup();\n const runtime = current.runtime;\n const dirty = runtime.emitProjectChanged;\n const dirtyDescriptor = Object.getOwnPropertyDescriptor(runtime, 'emitProjectChanged');\n const savedVmFields = prepared.map(item => ({ binding: item, block: item.vmBlock, name: item.fieldName,\n fields: item.vmBlock.fields, field: item.vmBlock.fields[item.fieldName],\n descriptors: Object.getOwnPropertyDescriptors(item.vmBlock.fields[item.fieldName]) }));\n let succeeded = false;\n let failure;\n let activeEvent = null;\n const pendingHistory = [];\n const externalWrites = new Map();\n const byField = new Map(prepared.map(item => [JSON.stringify([item.block.id, item.fieldName]), item]));\n let externalDirty = false;\n const ownedEvents = new WeakSet();\n const originalDelivery = workspace.fireChangeListener;\n const deliveryDescriptor = Object.getOwnPropertyDescriptor(workspace, 'fireChangeListener');\n const stableScope = () => {\n const state = getState();\n return state.generation === current.state.generation && vm.editingTarget === current.target && vm.runtime === runtime;\n };\n let begun = false;\n try {\n runtime.emitProjectChanged = () => {\n if (!activeEvent || !ownedEvents.has(activeEvent) || !stableScope())\n externalDirty = true;\n };\n workspace.fireChangeListener = function (event) {\n const previous = activeEvent;\n const external = event && !event.isUiEvent && !ownedEvents.has(event);\n const edited = external && event.type === 'change' && event.element === 'field' &&\n byField.get(JSON.stringify([event.blockId, event.name]));\n if (edited && !externalWrites.has(edited.field)) {\n // An external undo must not revive this editor's uncommitted candidate.\n if (Object.is(event.oldValue, edited.next))\n event.oldValue = edited.value;\n externalWrites.set(edited.field, null);\n }\n activeEvent = event;\n try {\n return originalDelivery.call(this, event);\n }\n finally {\n if (edited) {\n const fields = edited.vmBlock.fields;\n const field = fields && fields[edited.fieldName];\n externalWrites.set(edited.field, { binding: captureFixedFieldState(edited),\n fields, field, descriptors: field && Object.getOwnPropertyDescriptors(field) });\n }\n activeEvent = previous;\n }\n };\n Events.setGroup(true);\n Events.disable();\n begin();\n begun = true;\n guard();\n for (const item of prepared) {\n guard();\n item.field.setValue(item.next);\n if (!Object.is(item.field.getValue(), item.next))\n throw new Error('The field rejected its value.');\n guard();\n }\n for (const item of prepared) {\n guard();\n const event = new Events.Change(item.block, 'field', item.fieldName, item.value, item.next);\n ownedEvents.add(event);\n markEvent(event);\n // Stage only editor-owned undo records; external events retain normal semantics.\n const recordUndo = event.recordUndo;\n event.recordUndo = false;\n try {\n workspace.fireChangeListener(event);\n }\n finally {\n event.recordUndo = recordUndo;\n }\n if (recordUndo)\n pendingHistory.push(event);\n guard();\n }\n const after = inspect(expected, declaration);\n if (!after || after.untouched !== current.untouched)\n conflict();\n const wantedArguments = { ...expected.arguments };\n for (const item of prepared)\n wantedArguments[item.argument] = { kind: 'literal', value: item.next };\n if (!sameFixedSnapshot({ ...expected, revision: after.snapshot.revision, arguments: wantedArguments }, after.snapshot))\n conflict();\n guard();\n if (workspace.undoStack_ !== undoStack || workspace.redoStack_ !== redoStack ||\n undoStack.length !== undo.length || redoStack.length !== redo.length ||\n undo.some((entry, index) => undoStack[index] !== entry) ||\n redo.some((entry, index) => redoStack[index] !== entry))\n conflict();\n ensureNativeHistory(undoStack);\n ensureNativeHistory(redoStack);\n // This section contains no vendor callbacks; both native arrays are writable dense data.\n try {\n for (const event of pendingHistory)\n Array.prototype.push.call(undoStack, event);\n if (undoStack.length > maxUndo) {\n Array.prototype.copyWithin.call(undoStack, 0, undoStack.length - maxUndo);\n undoStack.length = maxUndo;\n }\n redoStack.length = 0;\n }\n catch (error) {\n replaceHistory(undoStack, undo);\n replaceHistory(redoStack, redo);\n throw error;\n }\n succeeded = true;\n }\n catch (error) {\n failure = error;\n for (const item of begun ? prepared : []) {\n try {\n restoreFixedField(((_a = externalWrites.get(item.field)) === null || _a === void 0 ? void 0 : _a.binding) || item);\n }\n catch (restoreError) {\n // Continue restoring every independent field before reporting a failure.\n try {\n onError(restoreError);\n }\n catch ( /* Observer failures do not interrupt rollback. */_c) { /* Observer failures do not interrupt rollback. */ }\n }\n }\n for (const saved of begun ? savedVmFields : []) {\n const outside = externalWrites.get(saved.binding.field);\n const fields = saved.block.fields;\n if (!fields)\n continue;\n const field = outside ? outside.field : saved.field;\n const descriptors = outside ? outside.descriptors : saved.descriptors;\n if (!field) {\n delete fields[saved.name];\n continue;\n }\n fields[saved.name] = field;\n for (const key of Object.keys(field))\n if (!Object.hasOwn(descriptors, key))\n delete field[key];\n Object.defineProperties(field, descriptors);\n }\n if (begun && typeof current.target.blocks.resetCache === 'function')\n current.target.blocks.resetCache();\n // Pending editor events never entered either history. External histories are authoritative.\n }\n finally {\n try {\n if (begun)\n finish(succeeded);\n }\n finally {\n try {\n if (!Events.isEnabled())\n Events.enable();\n }\n finally {\n try {\n Events.setGroup(oldGroup);\n }\n finally {\n if (deliveryDescriptor)\n Object.defineProperty(workspace, 'fireChangeListener', deliveryDescriptor);\n else\n delete workspace.fireChangeListener;\n if (dirtyDescriptor)\n Object.defineProperty(runtime, 'emitProjectChanged', dirtyDescriptor);\n else\n delete runtime.emitProjectChanged;\n }\n }\n }\n }\n if (succeeded || externalDirty) {\n try {\n dirty.call(runtime);\n }\n catch (error) {\n try {\n onError(error);\n }\n catch ( /* Dirty observers do not change the transaction result. */_d) { /* Dirty observers do not change the transaction result. */ }\n }\n }\n if (!succeeded)\n throw failure;\n };\n return Object.freeze({ capability: FIXED_INPUTS_CAPABILITY,\n readBlock: (reference, declaration) => { var _a; return ((_a = inspect(reference, declaration)) === null || _a === void 0 ? void 0 : _a.snapshot) || null; }, commit,\n subscribeInvalidation: (reference, declaration, listener) => {\n const captured = inspect(reference, declaration);\n if (!captured || typeof subscribeScope !== 'function') {\n listener(new BlockEditorConflictError());\n return () => { };\n }\n let active = true;\n const check = () => {\n const state = getState();\n if (!active || (!state.disposed && state.generation === captured.state.generation &&\n vm.editingTarget === captured.target && vm.runtime === captured.runtime &&\n workspace.getBlockById(reference.blockId) === captured.block &&\n captured.target.blocks.getBlock(reference.blockId) === captured.vmBlock &&\n registry.resolveFixed(captured.snapshot.opcode) === captured.declaration))\n return;\n active = false;\n listener(new BlockEditorConflictError());\n };\n const unsubscribe = subscribeScope(check);\n return () => { active = false; unsubscribe(); };\n } });\n}\n", "import { BlockEditorConflictError, DESCENDANT_EDITING_CAPABILITY } from '../index.js';\nimport collectBlockEditorSubtree from './subtree.js';\nimport createFixedInputPort from './fixed-transaction.js';\nconst owns = (object, key) => Object.prototype.hasOwnProperty.call(object, key);\n// Adapt only standard, unvalidated text shadows; never evaluate connected reporters.\nconst createBlockEditorHost = ({ ScratchBlocks, workspace, vm, registry, enableDescendants = false, enableFixedInputs = false, onError = console.error }) => {\n let disposed = false;\n let committing = false;\n let revision = 0;\n let identity = 0;\n let generation = 1;\n let externalRevision = 0;\n let fixedTransaction = null;\n let lastTarget = vm.editingTarget;\n const versions = new Map();\n const invalidations = new Set();\n const fixedScopeListeners = new Set();\n const notifyFixedScopes = () => {\n for (const listener of [...fixedScopeListeners]) {\n try {\n listener();\n }\n catch (error) {\n try {\n onError(error);\n }\n catch ( /* Scope observers cannot interrupt native events. */_a) { /* Scope observers cannot interrupt native events. */ }\n }\n }\n };\n let notifyInvalidations = () => { };\n const identities = new WeakMap();\n const identify = object => {\n if (!identities.has(object))\n identities.set(object, ++identity);\n return identities.get(object);\n };\n const invalidate = event => {\n if (event && event.isUiEvent)\n return;\n revision++;\n if (fixedTransaction && event && fixedTransaction.events.has(event)) {\n fixedTransaction.revisions++;\n if (enableDescendants) {\n for (const id of new Set([event.blockId, ...(event.ids || [])])) {\n if (id)\n fixedTransaction.versions.set(id, (fixedTransaction.versions.get(id) || 0) + 1);\n }\n }\n }\n else\n externalRevision++;\n if (enableDescendants && event) {\n const ids = new Set([event.blockId, ...(event.ids || [])]);\n for (const id of ids)\n if (id)\n versions.set(id, (versions.get(id) || 0) + 1);\n }\n if (!committing)\n notifyInvalidations();\n notifyFixedScopes();\n };\n const renew = () => {\n generation++;\n versions.clear();\n invalidate();\n };\n const targetsChanged = () => {\n if (lastTarget === vm.editingTarget)\n invalidate();\n else {\n lastTarget = vm.editingTarget;\n renew();\n }\n };\n workspace.addChangeListener(invalidate);\n vm.on('workspaceUpdate', renew);\n vm.on('targetsUpdate', targetsChanged);\n const inspect = (reference, structural = false) => {\n const target = vm.editingTarget;\n if (disposed || !target || target.id !== reference.targetId || workspace.isFlyout ||\n workspace.options.readOnly || (workspace.isDragging && workspace.isDragging()))\n return null;\n const block = workspace.getBlockById(reference.blockId);\n if (!block || block.isInFlyout || block.isShadow())\n return null;\n const descriptor = registry.resolve(block.type);\n if (typeof registry.resolveFixed === 'function' && registry.resolveFixed(block.type))\n return null;\n const vmBlock = target.blocks.getBlock(block.id);\n if ((!structural && !descriptor) || (!block.isEditable() && (!structural || descriptor)) ||\n !vmBlock || vmBlock.opcode !== block.type)\n return null;\n const slots = {};\n const fields = new Map();\n const signature = [structural ? versions.get(block.id) || 0 : revision,\n identify(block), identify(vmBlock), identify(target)];\n if (structural) {\n if ((block.getParent() ? block.getParent().id : null) !== (vmBlock.parent || null))\n return null;\n signature.push(block.isEditable(), vmBlock.fields, vmBlock.inputs, vmBlock.mutation || null);\n for (const input of block.inputList) {\n if (input.type !== ScratchBlocks.INPUT_VALUE)\n continue;\n const connected = input.connection && input.connection.targetBlock();\n const vmInput = vmBlock.inputs[input.name];\n if ((connected ? connected.id : null) !==\n (vmInput && vmInput.block ? vmInput.block : null))\n return null;\n if (!connected)\n continue;\n signature.push(input.name, connected.id, identify(connected), connected.type);\n if (!connected.isShadow())\n continue;\n const vmShadow = target.blocks.getBlock(connected.id);\n if (!vmShadow)\n return null;\n for (const row of connected.inputList) {\n for (const field of row.fieldRow) {\n if (!field.name)\n continue;\n const stored = vmShadow.fields[field.name];\n if (!stored || String(field.getValue()) !== String(stored.id || stored.value))\n return null;\n }\n }\n signature.push(versions.get(connected.id) || 0, identify(vmShadow), vmShadow.fields);\n }\n }\n for (const name of descriptor ? descriptor.editableArguments : []) {\n const input = block.getInput(name);\n const shadow = input && input.connection && input.connection.targetBlock();\n const field = shadow && shadow.getField('TEXT');\n const vmShadow = shadow && target.blocks.getBlock(shadow.id);\n const vmInput = vmBlock.inputs && vmBlock.inputs[name];\n // Plain text is the only field family whose validation/side effects we support here.\n if (!shadow || !shadow.isShadow() || shadow.type !== 'text' || !field ||\n field.constructor !== ScratchBlocks.FieldTextInput || field.getValidator() ||\n !vmShadow || vmShadow.opcode !== 'text' || !vmShadow.fields.TEXT ||\n !vmInput || vmInput.block !== shadow.id || typeof field.getValue() !== 'string') {\n Object.defineProperty(slots, name, { value: { kind: 'reporter' }, enumerable: true });\n continue;\n }\n // Do not open or save against events which have not reached the VM yet.\n if (vmShadow.fields.TEXT.value !== field.getValue())\n return null;\n Object.defineProperty(slots, name, {\n value: { kind: 'literal', value: field.getValue() }, enumerable: true\n });\n fields.set(name, { shadow, field, value: field.getValue() });\n signature.push(name, identify(shadow), identify(field), identify(vmShadow), shadow.id);\n }\n return {\n snapshot: {\n targetId: target.id,\n blockId: block.id,\n opcode: block.type,\n revision: JSON.stringify(signature),\n arguments: slots\n },\n fields,\n block,\n vmBlock\n };\n };\n const collect = reference => collectBlockEditorSubtree({ ScratchBlocks, reference, inspect, generation });\n notifyInvalidations = () => {\n if (committing)\n return;\n for (const item of [...invalidations]) {\n let matches = false;\n try {\n const current = collect(item.reference);\n matches = current && JSON.stringify(current.snapshot) === JSON.stringify(item.snapshot);\n }\n catch (error) {\n // A malformed replacement graph invalidates an already open session too.\n }\n if (!matches)\n item.listener(new BlockEditorConflictError('The block hierarchy changed.'));\n }\n };\n const apply = (prepared, signal) => {\n const Events = ScratchBlocks.Events;\n if (!Events.isEnabled() || !Events.recordUndo || Events.getGroup() ||\n !Array.isArray(workspace.undoStack_) || !Array.isArray(workspace.redoStack_)) {\n throw new Error('The workspace is busy or its undo API is unsupported.');\n }\n if (!prepared.length)\n return;\n const target = vm.editingTarget;\n const oldRevision = revision;\n const oldVersions = new Map(versions);\n const undo = workspace.undoStack_.slice();\n const redo = workspace.redoStack_.slice();\n const emitProjectChanged = vm.runtime.emitProjectChanged;\n let succeeded = false;\n // Hold dirty notifications until all synchronous field/VM updates have succeeded.\n vm.runtime.emitProjectChanged = () => { };\n Events.setGroup(true);\n Events.disable();\n committing = true;\n try {\n if (signal && signal.aborted)\n throw new BlockEditorConflictError();\n for (const item of prepared) {\n item.field.setValue(item.next);\n if (item.field.getValue() !== item.next)\n throw new Error('The field rejected its value.');\n }\n // Deliver normal Change events synchronously: VM and undo state agree before resolving.\n for (const item of prepared) {\n workspace.fireChangeListener(new Events.Change(item.shadow, 'field', 'TEXT', item.value, item.next));\n if ((signal && signal.aborted) || vm.editingTarget !== target)\n throw new BlockEditorConflictError();\n }\n succeeded = true;\n }\n catch (error) {\n // No queued setter events exist because events were disabled throughout this section.\n for (const item of prepared) {\n ScratchBlocks.FieldTextInput.prototype.setValue.call(item.field, item.value);\n target.blocks.blocklyListen(new Events.Change(item.shadow, 'field', 'TEXT', item.next, item.value));\n }\n workspace.undoStack_.splice(0, workspace.undoStack_.length, ...undo);\n workspace.redoStack_.splice(0, workspace.redoStack_.length, ...redo);\n revision = oldRevision;\n versions.clear();\n for (const [id, value] of oldVersions)\n versions.set(id, value);\n throw error;\n }\n finally {\n committing = false;\n Events.enable();\n Events.setGroup(false);\n vm.runtime.emitProjectChanged = emitProjectChanged;\n }\n if (succeeded) {\n // Observer exceptions must not misreport an already committed transaction as rejected.\n try {\n emitProjectChanged.call(vm.runtime);\n }\n catch (error) {\n onError(error);\n }\n }\n };\n const prepare = (changes, records) => {\n if (!Array.isArray(changes))\n throw new TypeError('Expected an argument patch array.');\n const seen = new Set();\n const fields = new Set();\n return changes.map(change => {\n const record = change && records.get(change.blockId);\n const key = change && JSON.stringify([change.blockId, change.argument]);\n if (!record || typeof change.value !== 'string' || seen.has(key) ||\n !owns(record.snapshot.arguments, change.argument) || !record.fields.has(change.argument)) {\n throw new TypeError('Only distinct standard text shadow changes are supported.');\n }\n seen.add(key);\n const item = record.fields.get(change.argument);\n if (fields.has(item.field))\n throw new TypeError('Duplicate shadow write.');\n fields.add(item.field);\n return { ...item, next: change.value };\n }).filter(item => item.next !== item.value);\n };\n const host = {\n isCommitting: () => committing,\n readBlock: reference => {\n const block = workspace.getBlockById(reference.blockId);\n const declaration = block && typeof registry.resolveFixed === 'function' && registry.resolveFixed(block.type);\n if (declaration)\n return host.fixedInputs ? host.fixedInputs.readBlock(reference, declaration) : null;\n const result = inspect(reference);\n return result ? result.snapshot : null;\n },\n commit: ({ expected, changes }) => {\n if (typeof registry.resolveFixed === 'function' && registry.resolveFixed(expected.opcode)) {\n throw new TypeError('Fixed input editors require the fixed transaction port.');\n }\n const current = inspect(expected);\n if (!current || JSON.stringify(current.snapshot) !== JSON.stringify(expected)) {\n throw new BlockEditorConflictError();\n }\n apply(prepare(changes.map(change => ({ ...change, blockId: expected.blockId })), new Map([[expected.blockId, current]])));\n },\n invalidate: renew,\n dispose: () => {\n disposed = true;\n notifyFixedScopes();\n fixedScopeListeners.clear();\n notifyInvalidations();\n invalidations.clear();\n workspace.removeChangeListener(invalidate);\n vm.removeListener('workspaceUpdate', renew);\n vm.removeListener('targetsUpdate', targetsChanged);\n }\n };\n if (enableDescendants) {\n host.descendants = {\n capability: DESCENDANT_EDITING_CAPABILITY,\n readSubtree: reference => {\n const result = collect(reference);\n return result ? result.snapshot : null;\n },\n commitSubtree: ({ expected, changes, signal }) => {\n const current = collect(expected);\n if ((signal && signal.aborted) || !current ||\n JSON.stringify(current.snapshot) !== JSON.stringify(expected))\n throw new BlockEditorConflictError();\n apply(prepare(changes, current.records), signal);\n },\n subscribeInvalidation: (reference, listener) => {\n const result = collect(reference);\n if (!result) {\n listener(new BlockEditorConflictError());\n return () => { };\n }\n const item = { reference, listener, snapshot: result.snapshot };\n invalidations.add(item);\n return () => invalidations.delete(item);\n }\n };\n }\n if (enableFixedInputs === true) {\n host.fixedInputs = createFixedInputPort({ ScratchBlocks, workspace, vm, registry, identify, onError,\n subscribeScope: listener => {\n fixedScopeListeners.add(listener);\n return () => { fixedScopeListeners.delete(listener); };\n },\n getState: () => ({ disposed, revision, generation, externalRevision }),\n begin: () => {\n committing = true;\n fixedTransaction = { events: new WeakSet(), revisions: 0, versions: new Map() };\n },\n markEvent: event => fixedTransaction.events.add(event),\n finish: succeeded => {\n if (!succeeded) {\n revision -= fixedTransaction.revisions;\n for (const [id, delta] of fixedTransaction.versions) {\n const remaining = (versions.get(id) || 0) - delta;\n if (remaining > 0)\n versions.set(id, remaining);\n else\n versions.delete(id);\n }\n }\n fixedTransaction = null;\n committing = false;\n } });\n }\n return host;\n};\nexport default createBlockEditorHost;\n", "// Decorate one known FieldImage; never search or intercept unrelated workspace DOM.\nconst bindBlockEditorIcon = ({ element, label, canOpen, onOpen }) => {\n const attributes = ['role', 'tabindex', 'aria-label', 'data-block-editor-icon'];\n const previous = attributes.map(name => element.getAttribute(name));\n const oldCursor = element.style.cursor;\n let press = null;\n const stop = event => {\n if (!canOpen())\n return;\n event.stopPropagation();\n event.preventDefault();\n };\n const down = event => {\n if (!canOpen() || event.button !== 0 || event.isPrimary === false)\n return;\n stop(event);\n press = { id: event.pointerId, x: event.clientX, y: event.clientY, moved: false };\n element.focus();\n if (element.setPointerCapture)\n element.setPointerCapture(event.pointerId);\n };\n const move = event => {\n if (!press || press.id !== event.pointerId)\n return;\n stop(event);\n if (Math.hypot(event.clientX - press.x, event.clientY - press.y) > 4)\n press.moved = true;\n };\n const up = event => {\n if (!press || press.id !== event.pointerId)\n return;\n move(event);\n const open = !press.moved && canOpen();\n press = null;\n if (element.releasePointerCapture && element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n if (open)\n onOpen();\n };\n const cancel = () => {\n press = null;\n };\n const key = event => {\n if ((event.key === 'Enter' || event.key === ' ') && canOpen()) {\n stop(event);\n if (!event.repeat)\n onOpen();\n }\n };\n const listeners = [\n ['pointerdown', down], ['pointermove', move], ['pointerup', up], ['pointercancel', cancel],\n ['mousedown', stop], ['mouseup', stop], ['click', stop], ['dblclick', stop],\n ['touchstart', stop], ['touchend', stop], ['touchmove', stop], ['keydown', key]\n ];\n element.setAttribute('role', 'button');\n element.setAttribute('tabindex', '0');\n element.setAttribute('aria-label', label);\n element.setAttribute('data-block-editor-icon', '');\n element.style.cursor = 'pointer';\n for (const [type, listener] of listeners)\n element.addEventListener(type, listener, { passive: false });\n return () => {\n for (const [type, listener] of listeners)\n element.removeEventListener(type, listener);\n attributes.forEach((name, index) => {\n if (previous[index] === null)\n element.removeAttribute(name);\n else\n element.setAttribute(name, previous[index]);\n });\n element.style.cursor = oldCursor;\n press = null;\n };\n};\nexport default bindBlockEditorIcon;\n", "// Presentation metadata stays outside snapshots, drafts and saved project data.\nconst readBlockEditorAppearance = (block, ScratchBlocks) => {\n const appearance = {};\n if (!block)\n return appearance;\n try {\n // Use the block's own labels, without reading JSON or other values from connected inputs.\n const name = block.inputList.filter(input => input.type !== ScratchBlocks.NEXT_STATEMENT)\n .map(input => input.fieldRow.filter(field => !(field instanceof ScratchBlocks.FieldImage))\n .map(field => field.getText())\n .join(' '))\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n if (name)\n appearance.name = name;\n }\n catch (error) {\n // The opcode remains available as a name fallback.\n }\n try {\n const colour = block.getColour();\n if (typeof colour === 'string' && /^#[0-9a-f]{6}$/i.test(colour)) {\n appearance.colour = colour;\n const channels = [1, 3, 5].map(offset => parseInt(colour.slice(offset, offset + 2), 16));\n appearance.tint = `rgba(${channels.join(', ')}, 0.08)`;\n }\n }\n catch (error) {\n // Missing presentation data must not prevent opening an otherwise editable tree.\n }\n try {\n const input = block.inputList[0];\n const field = input && input.fieldRow[0];\n if (field instanceof ScratchBlocks.FieldImage) {\n const uri = field.getValue();\n if (typeof uri === 'string' && uri.trim())\n appearance.iconURI = uri;\n }\n }\n catch (error) {\n // Keep the colour even when the leading image is unavailable.\n }\n return appearance;\n};\nexport default readBlockEditorAppearance;\n", "// A failed opening has no draft or save path; retain a closeable diagnostic modal.\nconst createBlockEditorErrorSession = (reference, error) => {\n let status = 'editing';\n const listeners = new Set();\n const finish = next => {\n if (status !== 'editing')\n return false;\n status = next;\n for (const listener of [...listeners])\n listener();\n listeners.clear();\n return true;\n };\n return Object.freeze({\n reference,\n getState: () => ({ status, canSave: false, issues: [], error }),\n subscribe: listener => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n mount: () => () => { },\n save: () => Promise.resolve({ status: 'failed', error }),\n cancel: () => finish('cancelled'),\n dispose: () => {\n finish('disposed');\n return true;\n }\n });\n};\nexport default createBlockEditorErrorSession;\n", "import createBlockEditorHost from './host.js';\nimport bindBlockEditorIcon from './icon.js';\nimport readBlockEditorAppearance from './appearance.js';\nimport { supportsDescendantEditing, supportsFixedInputEditing } from '../index.js';\nimport createBlockEditorErrorSession from './error-session.js';\nconst fixedDeclaration = (registry, snapshot) => snapshot && typeof registry.resolveFixed === 'function' &&\n registry.resolveFixed(snapshot.opcode);\nconst openBlockEditorSession = ({ registry, reference, host, descendants }) => {\n const snapshot = host.readBlock ? host.readBlock(reference) : null;\n // A fixed registration owns only this block; legacy aggregate traversal stays fail-closed.\n if (fixedDeclaration(registry, snapshot))\n return supportsFixedInputEditing(host) ? registry.open(reference, host) : undefined;\n return descendants && supportsDescendantEditing(host) ?\n registry.openDescendants(reference, host) : registry.open(reference, host);\n};\nconst createBlockEditorBridge = ({ ScratchBlocks, workspace, vm, service, label, canOpen, onOpen, onError, descendants = false, fixedInputs = false }) => {\n const host = createBlockEditorHost({ ScratchBlocks,\n workspace,\n vm,\n registry: service.registry,\n enableDescendants: descendants,\n enableFixedInputs: fixedInputs,\n onError });\n const decorations = new Map();\n let disposed = false;\n let timer = null;\n let activeSession = null;\n let openingSnapshot = null;\n let openingFixedDeclaration = null;\n let stopWaiting = null;\n const endSession = () => {\n const session = activeSession;\n if (!session)\n return;\n if (typeof session.invalidate === 'function') {\n session.invalidate();\n return;\n }\n // Normal close is refused while saving. Host invalidation also blocks commit,\n // then releases the old view as soon as its pending validation settles.\n if (session.dispose())\n return;\n if (!stopWaiting) {\n stopWaiting = session.subscribe(() => {\n if (session.getState().status === 'saving')\n return;\n stopWaiting();\n stopWaiting = null;\n session.dispose();\n });\n }\n };\n const checkSession = () => {\n var _a;\n // The host owns rollback. Its synchronous transaction must retain the draft on failure.\n if (host.isCommitting())\n return;\n if (!activeSession || !openingSnapshot ||\n !['editing', 'saving'].includes(activeSession.getState().status))\n return;\n const current = typeof activeSession.getNodes === 'function' ?\n host.descendants.readSubtree(activeSession.reference) : host.readBlock(activeSession.reference);\n if (openingFixedDeclaration) {\n // Same-target external edits conflict at save while the session retains its draft.\n // Project/target/registration replacement ends the session and drops that draft.\n if (!current || ((_a = current.fixedContext) === null || _a === void 0 ? void 0 : _a.generation) !== openingSnapshot.fixedContext.generation ||\n fixedDeclaration(service.registry, current) !== openingFixedDeclaration)\n endSession();\n return;\n }\n if (!current || JSON.stringify(current) !== JSON.stringify(openingSnapshot))\n endSession();\n };\n const available = block => {\n if (disposed || !vm.editingTarget || !canOpen() || !service.registry.resolve(block.type))\n return false;\n const snapshot = host.readBlock({ targetId: vm.editingTarget.id, blockId: block.id });\n if (fixedDeclaration(service.registry, snapshot))\n return supportsFixedInputEditing(host);\n return snapshot && Object.values(snapshot.arguments).every(slot => slot.kind === 'literal');\n };\n const open = block => {\n if (activeSession && ['editing', 'saving'].includes(activeSession.getState().status))\n return;\n const reference = { targetId: vm.editingTarget.id, blockId: block.id };\n try {\n const session = openBlockEditorSession({ registry: service.registry, reference, host, descendants });\n if (!session && descendants)\n throw new Error('The complete block hierarchy is not editable.');\n if (session) {\n ScratchBlocks.hideChaff();\n activeSession = session;\n openingSnapshot = typeof session.getNodes === 'function' ?\n host.descendants.readSubtree(session.reference) : host.readBlock(session.reference);\n openingFixedDeclaration = fixedDeclaration(service.registry, openingSnapshot) || null;\n const labels = {};\n const appearances = Object.create(null);\n const rootAppearance = readBlockEditorAppearance(block, ScratchBlocks);\n appearances[reference.blockId] = rootAppearance;\n labels[reference.blockId] = rootAppearance.name || block.type;\n if (typeof session.getNodes === 'function') {\n for (const node of session.getNodes()) {\n const source = workspace.getBlockById(node.reference.blockId);\n const appearance = readBlockEditorAppearance(source, ScratchBlocks);\n appearances[node.reference.blockId] = appearance;\n labels[node.reference.blockId] = appearance.name || node.opcode;\n }\n }\n onOpen(session, labels, appearances);\n }\n }\n catch (error) {\n onError(error);\n activeSession = createBlockEditorErrorSession(reference, error);\n openingSnapshot = null;\n openingFixedDeclaration = null;\n onOpen(activeSession);\n }\n };\n const refresh = () => {\n if (disposed)\n return;\n const seen = new Set();\n for (const block of workspace.getAllBlocks(false)) {\n const input = block.inputList[0];\n const field = input && input.fieldRow[0];\n if (workspace.options.readOnly || !service.registry.resolve(block.type) || !field ||\n !(field instanceof ScratchBlocks.FieldImage) || !field.fieldGroup_ ||\n block.isInFlyout || block.isShadow() || !block.isEditable())\n continue;\n seen.add(block.id);\n const old = decorations.get(block.id);\n if (old && old.field === field)\n continue;\n if (old)\n old.cleanup();\n const tooltip = field.imageElement_.tooltip;\n field.setTooltip(label);\n const unbind = bindBlockEditorIcon({\n element: field.fieldGroup_,\n label,\n canOpen: () => available(block),\n onOpen: () => open(block)\n });\n decorations.set(block.id, { field,\n cleanup: () => {\n unbind();\n if (field.imageElement_)\n field.imageElement_.tooltip = tooltip;\n } });\n }\n for (const [id, decoration] of decorations) {\n if (!seen.has(id)) {\n decoration.cleanup();\n decorations.delete(id);\n }\n }\n };\n const schedule = () => {\n checkSession();\n clearTimeout(timer);\n timer = setTimeout(refresh, 0);\n };\n const unregister = service.subscribe(() => {\n // Aggregate sessions observe relevant registry changes themselves.\n if (openingFixedDeclaration && activeSession) {\n if (service.registry.resolveFixed(openingSnapshot.opcode) !== openingFixedDeclaration) {\n host.invalidate();\n endSession();\n }\n }\n else if (!activeSession || typeof activeSession.getNodes !== 'function') {\n host.invalidate();\n endSession();\n }\n schedule();\n });\n workspace.addChangeListener(schedule);\n vm.on('workspaceUpdate', schedule);\n vm.on('targetsUpdate', schedule);\n refresh();\n return {\n refresh,\n dispose: () => {\n disposed = true;\n clearTimeout(timer);\n unregister();\n workspace.removeChangeListener(schedule);\n vm.removeListener('workspaceUpdate', schedule);\n vm.removeListener('targetsUpdate', schedule);\n host.dispose();\n endSession();\n for (const decoration of decorations.values())\n decoration.cleanup();\n decorations.clear();\n }\n };\n};\nexport default createBlockEditorBridge;\nexport { openBlockEditorSession };\n", "import createBridge, { openBlockEditorSession as openSession } from './turbowarp/bridge.js';\nimport createHost from './turbowarp/host.js';\nimport bindIcon from './turbowarp/icon.js';\nimport readAppearance from './turbowarp/appearance.js';\nimport createErrorSession from './turbowarp/error-session.js';\n/** Attach to one workspace. No global VM, feature flag, React or GUI module is consulted. */\nexport function attachTurboWarpBlockEditors(options) {\n var _a;\n if (options.enabled !== true)\n return Object.freeze({ refresh() { }, dispose() { } });\n const bridge = createBridge({ ...options, descendants: options.descendants === true, fixedInputs: options.fixedInputs === true,\n onError: (_a = options.onError) !== null && _a !== void 0 ? _a : console.error });\n let disposed = false;\n return Object.freeze({\n refresh() { if (!disposed)\n bridge.refresh(); },\n dispose() {\n if (disposed)\n return;\n disposed = true;\n bridge.dispose();\n }\n });\n}\n/** Lower-level host port for custom integrations; standard GUI integrations use attachTurboWarpBlockEditors. */\nexport function createTurboWarpBlockEditorHost(options) {\n return createHost(options);\n}\nexport function bindBlockEditorIcon(options) {\n return bindIcon(options);\n}\nexport function readBlockEditorAppearance(block, ScratchBlocks) {\n return readAppearance(block, ScratchBlocks);\n}\nexport function createBlockEditorErrorSession(reference, error) {\n return createErrorSession(reference, error);\n}\nexport function openBlockEditorSession(options) {\n return openSession(options);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["raw", "own", "owns", "bindBlockEditorIcon", "readBlockEditorAppearance", "createBlockEditorErrorSession", "openBlockEditorSession"]
7
7
  }
package/docs/api.md CHANGED
@@ -100,12 +100,19 @@ draft-07 を基本とし、未解決の外部参照や不正な schema は登録
100
100
  - `session`: 単一または階層セッション。本文mount契約は従来どおりです。
101
101
  - `ModalComponent`: `id`, `className`, `contentLabel`, `onRequestClose`, `children` を受けるホストのModal。
102
102
  portal・フォーカストラップ/復帰・Escape/背景/閉じるボタンを所有し、終了操作を `onRequestClose` へ渡します。
103
+ 根ブロックのアイコンがある場合は `headerImage` も渡します。
104
+ `headerClassName` を見出しのコンテナへ設定すると、アイコン寸法と長い見出しの折り返しを制御します。
103
105
  - `messages`: title / saving / cancel / save / saveAll / structureError / conflict / failed / structuralNode の翻訳済み文字列。
104
106
  - `styles`: `/react/styles.css` をCSS Modulesで読み込んだcamelCaseのクラス名対応表。
105
107
  - 任意の `className`: ホストテーマを設定するクラス。任意の `nodeLabels` / `nodeAppearances` は表示専用のメタデータ。
106
108
  - `onClose`: ホスト側のModal状態を閉じる処理。任意の `onError` はビュー例外の報告先。
107
109
 
108
110
  CSSはJS入口から自動importしません。ホストが `/react/styles.css` を読み込み、CSS ModulesのcamelCaseを有効にして渡します。
111
+ 見出しは根ブロックの `nodeAppearances.name` または `nodeLabels` を使用します。
112
+ `messages.title` に `{name}` があれば置換し、従来の「ブロックを編集」/「Edit block」も名前を含む見出しへ置換します。
113
+ 表示用メタデータがない場合は従来の見出しを維持します。
114
+ 標準フォームの追加項目は番号と薄い枠を持ち、key-valueは「キー」「値」のラベルと入力欄を横並びにした2行で表示します。
115
+ 項目の削除は「…」メニューの「🗑️この項目を削除」から行い、追加は「➕項目を追加」ボタンで行います。
109
116
  テーマは `--block-editor-background`, `--block-editor-text`, `--block-editor-input`,
110
117
  `--block-editor-button`, `--block-editor-border`, `--block-editor-radius` をModalのクラスへ設定します。
111
118
  省略時は明るい背景の既定値を使用します。GUIの翻訳/Redux/テーマモジュールを共通側からimportしません。
@@ -0,0 +1,77 @@
1
+ # 固定入力・native host・フォーム(S3-1〜S3-3)
2
+
3
+ この実装は固定入力の型・Schema検査・同期prepared境界と、明示的に有効化する標準field transactionを追加する。固定フォームとGUIの既定OFFフラグへ接続する。各拡張は正本Schema・codec・登録を所有し、共通基盤に特定用途のSchemaを内蔵しない。既存SOURCE編集、`apiVersion: 1`、既存8 exportsとCSS buildは維持する。
4
+
5
+ ## 有効化と互換性
6
+
7
+ `createBlockEditorService()`は既存SOURCE APIを返し、`registerFixedInputEditor`を公開しない。固定入力の契約を使うサービスは`createBlockEditorService({fixedInputs: true})`と明示する。旧host向けの`BlockEditorRegistrationAPI`上では新メソッドはoptionalのままである。GUIでは起動時固定・既定OFFの`blockEditorFixedInputs`を`blockEditorDialogs`とのANDで使う。
8
+
9
+ 登録には`registerFixedInputEditor<C = null>(options)`、DOM不要の定義構築にはrootの`createFixedInputEditor<C = null>(options)`を使う。registryへ直接登録する場合は`registerFixed()`を使い、legacy `register()`やSOURCE専用`registerPrepared()`に渡さない。旧hostには`fixedInputs`を要求せず、新契約の定義だけを開けない状態にする。
10
+
11
+ `BlockEditorHost.fixedInputs`はoptionalで、対応ポートは`capability: 'fixed-inputs-v1'`、`readBlock(reference, declaration)`、`commit(request)`を持つ。サービスのopt-inだけでは対応hostにならない。descendantsへ固定入力を流す経路も、この工程では拒否する。
12
+
13
+ ## 読取と保存
14
+
15
+ `FixedBlockSnapshot`は通常のraw引数と、契約ID/revision・generation・入力のfield/接続identity・読取専用集合・selector/dependentの宣言を持つ。rawの非有限値や負のzeroも専用captureで保持する。新しい書込み候補は有限の保存primitiveに限定し、既存rawと同じ制約で取り直さない。
16
+
17
+ `editableArguments`と`readOnlyArguments`は重複できない。固定metadataはこの宣言集合に対応させ、段階4などの非対象引数はrawのまま保持・比較する。読取専用引数の変更や接続identityの変化も競合となる。`captureFixedSnapshot`/`sameFixedSnapshot`を使い、旧snapshot captureによるmetadata消失を避ける。
18
+
19
+ 各bindingはSchema bundleと同期の`read`、`encode`、`validateCandidate`を持つ。`read`は表示用のJSON投影を作り、投影できない既存rawではthrowしてreadonlyにする。rawの意味を推測して代替値へ変更しない。変更済み入力だけに対して、保存候補を一度`encode`し、その候補の再投影へSchema検査を行い、同じ候補をowner検査とcommitへ渡す。`validateCandidate(candidate, context, snapshot)`の第3引数から関連literalやreadonly値を純粋に確認できる。ownerの例外・診断本文をUIへそのまま表示しない。
20
+
21
+ selector/dependentはownerが有限の`branchPolicies`を静的宣言する。未宣言のgroupやreporter/不明なselectorには既定branchを推測せず、依存入力をreadonlyにして独立入力だけを保存できる。対応する正本policyがあるgroupだけをprepared/session/hostで再検査して変更でき、未対応のgroup書込みは従来どおり拒否する。
22
+
23
+ draftは`inputs[argument]`ごとに`value`・`changed`と、必要に応じ数値`buffer`・明示修復`repair`を保持する。原文の正本はsnapshotに置く。数値bufferがある場合、投影値が同じでも字句を検査する。無効な`1e`を直前の投影値で保存しない。bufferは有限JSON number字句で投影値と一致する必要があり、codecは受け取った検証済みtokenをそのまま返す。同じdialogでは非表示でもbufferを保持し、再表示で正確に復元・再検査する。非表示bufferは検証とpatchから除外し、今回保存しない旨を表示する。
24
+
25
+ `parseFixedNumberInput`はrootと`./schema`から使える純粋な**新入力用**の関数である。有限JSON数値字句とtyped finite numberを扱い、`-0`・指数表記をtokenとして保持する。空文字・hex・`+1`・`.5`・非有限値・overflow・未完成bufferを拒否し、ownerの整数・sentinel・clamp・単位変換後の境界は追加しない。既存rawを開閉だけでこのparserへ通して書き換えない。`./schema`は引き続きReact/DOMを必要としない。
26
+
27
+ 非投影rawの修復は、対応するliteral fieldに`repair: true`を明示して有効候補へ変更する場合だけに限る。reporter・未対応fieldを修復名目で置換しない。未変更入力や編集後に元の投影へ戻した入力は、原文のalias・空白等を保持する。
28
+
29
+ ## 同期境界と後続の責務
30
+
31
+ owner設定型は既存`SchemaValidationContext<C>`のJSON設定制約に従い、既定は`C = null`。ポートの型消去にはJSON設定を保持する`FixedHostCommitRequest`を使う。同期callbackからのPromise/thenable、getter、独自iterator等を保存データとして実行せず拒否する。設定・候補・metadataは切り離して凍結し、登録解除後の保存も拒否する。
32
+
33
+ 新しいfactory/固定入力登録のoptions・definition・bindingも通常の宣言objectのown data propertyから一度だけ採取する。accessorや独自iteratorを実行して宣言を得ることはせず、検査済みのcallback・opcode配列をそのまま登録する。旧legacy登録の宣言仕様は変更しない。
34
+
35
+ hostはcommitの実書込み直前にも全identity・読取依存・登録寿命を再確認し、readonly変更を全件拒否する責務を持つ。registry経由のsessionは、commit待機中に登録が解除されたらrequestの`signal`をabortする。hostは実書込み直前にもsignalを確認し、失効時には無変更で拒否する。購読はcommit完了/拒否時に解除する。S3-2の標準field hostは全field適用・同期VMイベント・undo/redo・dirty・event groupをまとめてcommit/rollbackする。mockに加えて、固定した実ScratchBlocksとVM adapterのfixtureで保存と途中例外を確認する。headless native fixtureは実GUIやnative pickerのE2Eと区別する。S3-3では実GUIと23展開fixtureのモデル・UIを検証し、各owner製品の全境界・旧runtime比較はS3-4、新artifactの依存閉包はS3-5で検証する。
36
+
37
+ 切戻しはサービスのopt-inを外すことで新契約を公開しない状態に戻せる。旧host/旧登録の型・実行経路は維持する。0.2.1配布物の`gitHead`と`x-turbowarp-source`は元Git SHAを示し、版更新等を含むworking-tree release overlayをcleanなrelease commitと区別する。
38
+
39
+
40
+ ## S3-2の標準field host
41
+
42
+ `/turbowarp`の`createTurboWarpBlockEditorHost({...options, enableFixedInputs: true})`でだけ`fixedInputs` portを作る。省略・falseでは旧TEXT hostを維持する。`attachTurboWarpBlockEditors`には`fixedInputs: true`を渡す。GUI起動時フラグ、サービスopt-in、host有効化を一致させ、旧artifactに存在しないAPIを偽造しない。
43
+
44
+ hostはregistryの`resolveFixed(opcode)`が返すcallbackを含まないimmutable宣言を正本とする。同じ内容で再登録しても宣言identityは変わり、以前のsnapshotで保存できない。呼出し側のdeclarationによるreadonly集合の省略・偽造は認めない。旧`resolve()`のdescriptorは変えない。
45
+
46
+ 標準allowlistは`text.TEXT`の`FieldTextInput`、`math_number.NUM`の`FieldNumber`、拡張namespace配下の静的menu shadowと親の直接`FieldDropdown`、`colour_picker.COLOUR`の`FieldColourSlider`である。実保存primitiveがstringで、VMとfield値が厳密に一致する場合だけ書込み候補にする。custom subclass・独自validator/field method・動的menu callback・reporterは実行せず書込み対象外とする。BOOLEAN socketを作ったりreporterをliteralへ置換したりしない。
47
+
48
+ 新候補はfieldごとに純粋に全件検査してから適用する。数値は有限JSON数値token、menuは保存valueの既存静的候補、色は受理する色字句に制限し、field setterの結果と候補が厳密に一致しなければrollbackする。ownerの範囲・sentinel・単位・clampはここへ追加しない。既存未知menu値、数値の空白/alias、色の表記等は変更しない限りrawを保持する。
49
+
50
+ commit直前にproject/target、親・shadow・field・VM、読取依存、登録寿命、signalを再確認する。readonlyへのpatchや不正候補を一つ含む要求も全件拒否する。同期適用中のsetter・VM adapter・listener例外や中断では、この保存が変更したfield/VMと自己イベントのundo/redoを復旧し、この保存に由来するdirtyを増やさない。再入した外部操作の値・履歴・dirty通知と、外部のtarget/project切替後の履歴は保持し、古い状態へ巻き戻さない。成功時だけこの保存の一つのundo groupとdirty通知を作り、no-opではどちらも作らない。色fieldはrawだけでなくHSVとblockの表示色も復旧する。
51
+
52
+ 固定入力のChangeは同期配送中に`recordUndo: false`でVMとlistenerへ渡し、全検査成功後に同じeventを`recordUndo: true`としてundo履歴へ追加する。redoのclearも成功時まで保留する。これにより失敗・project切替時に旧履歴を復元するための書戻しを避け、外部操作が持つ現在の履歴を保持する。旧SOURCEのevent配送は変更しない。保存対象と同じfieldへの外部Changeが再入した場合は外部値を残し、最初の外部eventのundo起点をこの保存開始前のrawに対応させる。未commit値をundoで復活させない。外部の色変更ではそのrawと表示状態も保持する。
53
+
54
+ 正本branch policyのないgroupとfixed descendantsの集合保存は拒否する。Descendants ONでもfixed rootはsingle sessionで開き、旧SOURCE aggregateへfixed childが混在する場合はfail closedを維持する。ownerの正本Schema・境界検査・依存固定は拡張側の責務であり、共通側の試験を製品の実測の代用にしない。
55
+
56
+
57
+ ## S3-3の有限policyとUI
58
+
59
+ `FixedInputEditorOptions.branchPolicies`はselector・normalize(trim/lowercase)・有限case(保存value/alias、activeDependents、selector変更時のreadonly literal/nonempty要件)をownerが宣言する。caseのbinding overrideで固定Schema/read/encode/owner検査とcontrolを選ぶ。各Schemaは登録時にcompileし、実行時のreporter値やSchema生成providerは追加しない。common本体に特定拡張のproperty名・triggerを内蔵しない。
60
+
61
+ callbackを含まない`branchRules`をregistryの正本に保持する。sessionとhostはこの正本でgroupの全patchを検査する。selectorの保存rawが変わる場合は未編集のactive依存も最終branchで検査し、reporterを黙って置換しない。selector未変更なら変更active入力だけを検査するので、現在のbranchで必須でないreadonly reporterは評価せず保持できる。変更候補のencodeは各入力一度だけ、構築済み候補を再投影したSchemaとowner検査へ同じ値を渡す。
62
+
63
+ `describeFixed`とoptional `EditorViewContext.getFixedInputView()`はeditable/readonly/hidden・control/choices・表示上の問題を返す。表示時にcontext provider・encode・owner validatorを呼ばない。フォームは`/rjsf`登録時のmountで接続し、rootのpure factoryと`./schema`はReact非依存を維持する。enumは保存valueとlabelを分離し、未知raw・aliasを表示して、既知候補を明示選択するまで保持する。数値はtext bufferで未完成の`1e`も保持し、色は原文の入力と表示用pickerを分離する。Schema defaultを補わない。
64
+
65
+ `fixedInputMessages`には表示文のobjectまたはmount時同期providerを渡せる。GUIは実際のIntl localeに基づく日英文言を供給する。readonly・reporter未評価・非表示draft・validation・resetもlocaleへ従い、診断code/contract IDはAPIに残してdialog本文では一般的な説明を示す。各fieldにはlabel、固有error ID、aria-invalid/aria-describedbyを付ける。
66
+
67
+ 失敗して同scopeのsessionが開いている間はdraftを保持する。保存成功・取消・dispose・project/target/登録失効では破棄し、再openは現在のrawから読む。optional host `subscribeInvalidation(reference,declaration,listener)`はproject generation/target/実block/VM/登録scopeの失効を通知する。pending保存はsignalをabortし、他scopeへbufferを復活させない。通常の同target値変更は保存時に競合として拒否し、そのdialogのdraftを保持する。
68
+
69
+ GUI・commonの試験では16フラグ分類、日英・focus/keyboard、23展開fixtureをcommonのモデル・UIで確認する。両Asset各6/Bubble10/common1の適用先を区別し、common fixtureを各owner製品の実測に代用しない。実ownerのSchema正本・全境界・旧runtime比較はS3-4、pin/lock/実解決を一致させる閉包はS3-5の別証拠で確認する。ローカルGUI検証でartifact overlayを使う場合は元実体を保全し、declared pin/lockと実際のtest解決先の差を明記する。
70
+
71
+ ## E2Eの対象と明示profile
72
+
73
+ `pnpm test:e2e:block-editor`は既存SOURCE経路・reload・light/darkの6件を実行する。Pagesと公開後検証もこの既定profileを使う。`site/source.json`では選定した最新GUI/coreの元Git SHAを固定し、使用するnpm版・配布物hash・working-treeの区分も別に照合する。Pages公開は別の明示承認を要する。
74
+
75
+ S3-3のfixed対応GUIとcommon artifactを明示した検証先には、`pnpm test:e2e:fixed-inputs`で固定入力21件を実行する。既存6件も合わせる場合は`E2E_FIXED_INPUTS=1 pnpm test:e2e:block-editor`で27件を選択する。ローカル検証先は`E2E_GUI_ROOT`、外部検証先は`E2E_BASE_URL`と完全SHAの`E2E_EXPECT_GUI_REVISION` / `E2E_EXPECT_CORE_REVISION`で指定する。fixed profileは対応を期待する対象にだけ明示し、対象が未対応なら検査失敗とする。機能不足を実行時skipに置き換えない。
76
+
77
+ `pnpm test:e2e:native`はmacOSの既存OS picker用editor 2件を維持し、fixed profileを併記しても対象を増やさない。固定入力の実Blockly dropdown操作は21件側の検証で、OS pickerとは別に数える。公開siteの変更はnpm公開から独立した承認を要し、実施時はdeployment SHA・元Git SHA・npm版・配布物の一致を確認してから公開後fixed検証を行う。
@@ -20,6 +20,11 @@ CIは公開配布物のSHAと、検証手順を所有する共通checkoutの固
20
20
 
21
21
  公開前は変更をcommitして作業ツリーが空であることを確認する。`npm pack`のprepackはビルドを実行するため、必ず公開対象のcommit上でpackする。
22
22
 
23
+ `0.2.2`はPR #41の編集見出し・項目操作・key-value表示の修正を配布します。
24
+ 旧`0.2.1`のworking-tree release overlayを示す固定`gitHead` / `x-turbowarp-source`は引き継がず、cleanな公開コミットから生成する`dist/build-info.json`をソース照合に使用します。
25
+ GUIのmanifestとlockをnpm完全versionへ揃えた後、サイトのGUI pinと実配布物のcore revisionを更新します。
26
+ 受け入れ基準は全共通テスト・実ScratchBlocks/VMの境界・8公開入口・tarball照合、GUIの対象テストとproduction build、公開前後のE2E成功です。
27
+
23
28
  ## 初回公開の検証
24
29
 
25
30
  - `pnpm typecheck`、`pnpm test`、`pnpm test:e2e:infrastructure`。
@@ -27,3 +27,9 @@
27
27
  共通0.2.0はまだnpm未公開の時点で、direct fast-uri3.1.0に8high/1moderateのadvisoryを確認した。対象packageはfast-uriだけである。間接AJVで既に使っている3.1.8へ直接依存も固定し、lockの全fast-uri edgeを3.1.8へ統一する。Schemaの正本・owner・既存API・保存形式は変更しない。
28
28
 
29
29
  0.2.0の公開前修正として別PRでmainへ統合し、後続pinには修正後の最終SHAを使う。旧4818a4dの検証は履歴として保持し、最終配布の証拠と区別する。fresh install後にaudit、Schema/ref/診断/Source/Form/8入口を含む全common検証、packを確認する。一次資料: https://github.com/advisories/GHSA-qw65-cvwx-89v3 および保存した9件のaudit JSON。
30
+
31
+ ## 最終GUI/site固定の追補
32
+
33
+ 共通配布artifactはsecurity修正を含むGit `76fa1d50a3c188082ceef723ea018a9d8769ea6e`、GUIは `1caa902a51ec3338b9b30372174f71d04044ecd8` へ固定する。site/source.jsonのGUI/coreをこの対応へ更新する。siteのmain revisionと共通配布のcore revisionは役割が異なるため、siteだけの追補でconsumerのcore pinを循環更新しない。source/package/build入力がcore76faから不変であることを確認する。
34
+
35
+ 最終production GUIの実依存34edgeがlockと一致し、62block-editorテスト・既存addon33テスト・全6browserentryのproduction buildが成功。共通所有のChromium E2E6件もこのGUI/coreの組合せで成功した。npm公開とowner代表Source/Form確認の最終結果は集約記録へ保存する。既定OFFは維持する。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubohiroya/turbowarp-extension-data-editor",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Custom editor sessions and UI for structured data handled by TurboWarp extensions",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -58,6 +58,7 @@
58
58
  "build": "tsc --project tsconfig.json && node scripts/copy-react-css.mjs && node scripts/build-webpack4.mjs && node scripts/write-build-info.mjs",
59
59
  "test": "pnpm build && node --test test/*.test.mjs",
60
60
  "test:e2e:block-editor": "playwright test --config test/e2e/turbowarp/playwright.config.cjs",
61
+ "test:e2e:fixed-inputs": "E2E_FIXED_INPUTS=1 playwright test --config test/e2e/turbowarp/playwright.config.cjs --project=chromium-project-url fixed-inputs.spec.cjs",
61
62
  "test:e2e:infrastructure": "node --test test/e2e/turbowarp/infrastructure.test.cjs",
62
63
  "test:e2e:native": "E2E_NATIVE=1 pnpm test:e2e:block-editor",
63
64
  "prepack": "npm run build",
@@ -1 +0,0 @@
1
- //# sourceMappingURL=shared-CQB3NG2A.js.map