@monimesl/dot-simulator 0.1.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/dist/client/service-bridge.js +647 -0
- package/dist/client/service-bridge.js.map +1 -0
- package/dist/client/simulator.js +1386 -0
- package/dist/client/simulator.js.map +1 -0
- package/dist/client/webview-bridge.js +44 -0
- package/dist/client/webview-bridge.js.map +1 -0
- package/dist/node/index.d.ts +108 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +1477 -0
- package/dist/node/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator.js","names":[],"sources":["../../../../core/dist/index.js","../../src/compatibility.ts","../../src/host-calls.ts","../../src/permissions.ts","../../src/host.ts","../../src/versions.ts","../../src/paths.ts","../../src/client/dash/dev-server.ts","../../src/client/dash/system.ts","../../src/client/dom.ts","../../src/client/dash/ui.ts","../../src/client/dash/index.ts","../../src/client/dash/permissions.ts","../../src/client/wire.ts","../../src/client/simulator.ts"],"sourcesContent":["//#region src/view/component.ts\nfunction defineComponent(manifest) {\n\treturn {\n\t\tprops: {},\n\t\tevents: [],\n\t\t...manifest\n\t};\n}\nfunction eventProp(event) {\n\treturn `on${event.charAt(0).toUpperCase()}${event.slice(1)}`;\n}\nfunction isEventProp(name) {\n\tconst letterAfterOn = name.charAt(2);\n\treturn name.startsWith(\"on\") && letterAfterOn >= \"A\" && letterAfterOn <= \"Z\";\n}\nfunction eventName(prop) {\n\tconst name = prop.slice(2);\n\treturn name.charAt(0).toLowerCase() + name.slice(1);\n}\nfunction componentRegistry(manifests) {\n\tconst registry = {};\n\tfor (const manifest of manifests) {\n\t\tif (manifest.name in registry) throw new Error(`Component <${manifest.name}> is defined twice`);\n\t\tregistry[manifest.name] = manifest;\n\t}\n\treturn registry;\n}\n//#endregion\n//#region src/view/values.ts\nfunction toText(value) {\n\tswitch (typeof value) {\n\t\tcase \"string\": return value;\n\t\tcase \"number\":\n\t\tcase \"boolean\":\n\t\tcase \"bigint\": return String(value);\n\t\tcase \"object\": return value === null ? \"\" : JSON.stringify(value);\n\t\tdefault: return \"\";\n\t}\n}\nfunction toList(value) {\n\tif (Array.isArray(value)) return value;\n\tif (typeof value === \"object\" && value !== null && Symbol.iterator in value) return Array.from(value);\n\treturn [];\n}\n//#endregion\n//#region src/view/components/amount-input.ts\nconst AmountInput = defineComponent({\n\tname: \"AmountInput\",\n\tprops: {\n\t\tvalue: \"number\",\n\t\tcurrency: \"string\",\n\t\tminorUnits: \"number\",\n\t\tunit: [\"minor\", \"major\"],\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/button.ts\nconst Button = defineComponent({\n\tname: \"Button\",\n\tprops: {\n\t\tvariant: [\"primary\", \"secondary\"],\n\t\tdisabled: \"boolean\",\n\t\tloading: \"boolean\"\n\t},\n\tevents: [\"click\"],\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/options.ts\nconst SIZES = [\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst SPACES = [\n\t\"none\",\n\t\"small\",\n\t\"medium\",\n\t\"large\"\n];\nconst PADDING_PROPS = {\n\tpadding: SPACES,\n\tpaddingTop: SPACES,\n\tpaddingStart: SPACES,\n\tpaddingEnd: SPACES,\n\tpaddingBottom: SPACES\n};\nconst ASPECTS = [\n\t\"1:1\",\n\t\"4:3\",\n\t\"3:2\",\n\t\"16:9\",\n\t\"3:4\",\n\t\"2:3\",\n\t\"9:16\"\n];\nconst TONES = [\n\t\"default\",\n\t\"muted\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst STATUS_TONES = [\n\t\"default\",\n\t\"info\",\n\t\"success\",\n\t\"warning\",\n\t\"danger\"\n];\nconst ICON_NAMES = [\n\t\"arrow-down\",\n\t\"arrow-left\",\n\t\"arrow-right\",\n\t\"arrow-up\",\n\t\"bank\",\n\t\"bell\",\n\t\"bolt\",\n\t\"calendar\",\n\t\"card\",\n\t\"cart\",\n\t\"cash\",\n\t\"check\",\n\t\"chevron-down\",\n\t\"chevron-left\",\n\t\"chevron-right\",\n\t\"chevron-up\",\n\t\"clock\",\n\t\"close\",\n\t\"copy\",\n\t\"download\",\n\t\"edit\",\n\t\"error\",\n\t\"external-link\",\n\t\"eye\",\n\t\"eye-off\",\n\t\"file\",\n\t\"gift\",\n\t\"globe\",\n\t\"grid\",\n\t\"headphones\",\n\t\"heart\",\n\t\"help\",\n\t\"history\",\n\t\"home\",\n\t\"image\",\n\t\"info\",\n\t\"link\",\n\t\"list\",\n\t\"location\",\n\t\"lock\",\n\t\"logout\",\n\t\"mail\",\n\t\"microphone\",\n\t\"minus\",\n\t\"mobile\",\n\t\"more\",\n\t\"music\",\n\t\"phone\",\n\t\"playlist\",\n\t\"plus\",\n\t\"qr-code\",\n\t\"receipt\",\n\t\"refresh\",\n\t\"search\",\n\t\"send\",\n\t\"settings\",\n\t\"share\",\n\t\"star\",\n\t\"success\",\n\t\"ticket\",\n\t\"trash\",\n\t\"upload\",\n\t\"user\",\n\t\"users\",\n\t\"video\",\n\t\"wallet\",\n\t\"warning\",\n\t\"water\",\n\t\"wifi\"\n];\n//#endregion\n//#region src/view/components/carousel.ts\nconst Carousel = defineComponent({\n\tname: \"Carousel\",\n\tprops: {\n\t\tautoplay: \"boolean\",\n\t\tinterval: \"number\",\n\t\tloop: \"boolean\",\n\t\tindicator: [\"dots\", \"none\"],\n\t\tgap: SPACES,\n\t\teffect: [\"slide\", \"scale\"],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/chip.ts\nconst Chip = defineComponent({\n\tname: \"Chip\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\tselected: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/code-input.ts\nconst CodeInput = defineComponent({\n\tname: \"CodeInput\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlength: \"number\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tsecure: \"boolean\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"complete\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/detail-row.ts\nconst DetailRow = defineComponent({\n\tname: \"DetailRow\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\tvalue: \"string\",\n\t\ttone: TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/divider.ts\nconst Divider = defineComponent({\n\tname: \"Divider\",\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/empty-state.ts\nconst EmptyState = defineComponent({\n\tname: \"EmptyState\",\n\tprops: {\n\t\ticon: ICON_NAMES,\n\t\ttitle: \"string\",\n\t\ttext: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/feedback.ts\nconst Spinner = defineComponent({\n\tname: \"Spinner\",\n\tprops: { size: SIZES },\n\tchildren: \"none\"\n});\nconst ProgressBar = defineComponent({\n\tname: \"ProgressBar\",\n\tprops: { value: \"number\" },\n\tchildren: \"none\"\n});\nconst Notice = defineComponent({\n\tname: \"Notice\",\n\tprops: {\n\t\ttone: STATUS_TONES,\n\t\ttitle: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\"\n});\nconst Badge = defineComponent({\n\tname: \"Badge\",\n\tprops: { tone: STATUS_TONES },\n\tchildren: \"text\"\n});\n//#endregion\n//#region src/view/components/footer.ts\nconst Footer = defineComponent({\n\tname: \"Footer\",\n\tprops: PADDING_PROPS,\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/grid.ts\nconst Grid = defineComponent({\n\tname: \"Grid\",\n\tprops: {\n\t\tcolumns: \"number\",\n\t\tgap: SPACES,\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"elements\"\n});\nconst GridItem = defineComponent({\n\tname: \"GridItem\",\n\tprops: {\n\t\tlabel: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\tbadge: \"string\"\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/icon.ts\nconst Icon = defineComponent({\n\tname: \"Icon\",\n\tprops: {\n\t\tname: ICON_NAMES,\n\t\tsize: SIZES,\n\t\ttone: TONES\n\t},\n\tchildren: \"none\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/image.ts\nconst Image = defineComponent({\n\tname: \"Image\",\n\tprops: {\n\t\tsrc: \"string\",\n\t\talt: \"string\",\n\t\twidth: \"number\",\n\t\theight: \"number\",\n\t\tfit: [\"cover\", \"contain\"],\n\t\tshape: [\n\t\t\t\"rounded\",\n\t\t\t\"square\",\n\t\t\t\"circle\"\n\t\t],\n\t\taspect: ASPECTS\n\t},\n\tevents: [\"load\", \"error\"],\n\tchildren: \"none\",\n\toverrides: [{\n\t\tprop: \"aspect\",\n\t\tignores: \"height\",\n\t\tbecause: \"the aspect sets the height\"\n\t}]\n});\n//#endregion\n//#region src/view/components/input.ts\nconst Input = defineComponent({\n\tname: \"Input\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tprefix: \"string\",\n\t\tsuffix: \"string\",\n\t\ttype: [\n\t\t\t\"text\",\n\t\t\t\"number\",\n\t\t\t\"email\",\n\t\t\t\"phone\",\n\t\t\t\"password\"\n\t\t],\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\", \"submit\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/link.ts\nconst Link = defineComponent({\n\tname: \"Link\",\n\tprops: {\n\t\thref: \"string\",\n\t\ttone: TONES\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/list.ts\nconst List = defineComponent({\n\tname: \"List\",\n\tprops: {\n\t\tsize: [\"sm\", \"md\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"endReached\"],\n\tchildren: \"elements\"\n});\nconst ListItem = defineComponent({\n\tname: \"ListItem\",\n\tprops: {\n\t\ttitle: \"string\",\n\t\tsubtitle: \"string\",\n\t\tvalue: \"string\",\n\t\ticon: ICON_NAMES,\n\t\timage: \"string\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/overlays.ts\nconst Sheet = defineComponent({\n\tname: \"Sheet\",\n\tprops: {\n\t\topen: \"boolean\",\n\t\ttitle: \"string\",\n\t\tshowCloseIcon: \"boolean\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"close\"],\n\tchildren: \"elements\"\n});\nconst Toast = defineComponent({\n\tname: \"Toast\",\n\tprops: {\n\t\tmessage: \"string\",\n\t\ttone: STATUS_TONES,\n\t\tduration: \"number\"\n\t},\n\tevents: [\"hide\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/qr-code.ts\nconst QRCode = defineComponent({\n\tname: \"QRCode\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tsize: \"number\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/select.ts\nconst Select = defineComponent({\n\tname: \"Select\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tplaceholder: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Option = defineComponent({\n\tname: \"Option\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/scroll.ts\nconst Scroll = defineComponent({\n\tname: \"Scroll\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tsnap: [\n\t\t\t\"none\",\n\t\t\t\"start\",\n\t\t\t\"center\"\n\t\t],\n\t\tindex: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/skeleton.ts\nconst Skeleton = defineComponent({\n\tname: \"Skeleton\",\n\tprops: {\n\t\tshape: [\n\t\t\t\"text\",\n\t\t\t\"circle\",\n\t\t\t\"box\"\n\t\t],\n\t\tlines: \"number\",\n\t\theight: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/tabs.ts\nconst Tabs = defineComponent({\n\tname: \"Tabs\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tvariant: [\"underline\", \"segmented\"],\n\t\t...PADDING_PROPS\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Tab = defineComponent({\n\tname: \"Tab\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tbadge: \"number\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/text.ts\nconst Text = defineComponent({\n\tname: \"Text\",\n\tprops: {\n\t\tvariant: [\n\t\t\t\"title\",\n\t\t\t\"body\",\n\t\t\t\"caption\"\n\t\t],\n\t\ttone: TONES,\n\t\tweight: [\n\t\t\t\"regular\",\n\t\t\t\"medium\",\n\t\t\t\"bold\"\n\t\t],\n\t\talign: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tmaxLines: \"number\",\n\t\t...PADDING_PROPS\n\t},\n\tchildren: \"text\",\n\tinline: true\n});\n//#endregion\n//#region src/view/components/text-area.ts\nconst TextArea = defineComponent({\n\tname: \"TextArea\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tplaceholder: \"string\",\n\t\tlabel: \"string\",\n\t\thint: \"string\",\n\t\terror: \"string\",\n\t\trows: \"number\",\n\t\tmaxLength: \"number\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/toggles.ts\nconst Switch = defineComponent({\n\tname: \"Switch\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst Checkbox = defineComponent({\n\tname: \"Checkbox\",\n\tprops: {\n\t\tchecked: \"boolean\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"none\"\n});\nconst RadioGroup = defineComponent({\n\tname: \"RadioGroup\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tevents: [\"change\"],\n\tchildren: \"elements\"\n});\nconst Radio = defineComponent({\n\tname: \"Radio\",\n\tprops: {\n\t\tvalue: \"string\",\n\t\tlabel: \"string\",\n\t\tdisabled: \"boolean\"\n\t},\n\tchildren: \"none\"\n});\n//#endregion\n//#region src/view/components/view.ts\nconst View = defineComponent({\n\tname: \"View\",\n\tprops: {\n\t\tgap: SPACES,\n\t\tdirection: [\"column\", \"row\"],\n\t\talign: [\n\t\t\t\"stretch\",\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\"\n\t\t],\n\t\tjustify: [\n\t\t\t\"start\",\n\t\t\t\"center\",\n\t\t\t\"end\",\n\t\t\t\"between\"\n\t\t],\n\t\twrap: \"boolean\",\n\t\tgrow: \"boolean\",\n\t\t...PADDING_PROPS,\n\t\tvariant: [\"plain\", \"card\"]\n\t},\n\tevents: [\"tap\"],\n\tchildren: \"elements\"\n});\n//#endregion\n//#region src/view/components/index.ts\nconst builtinComponents = {\n\tAmountInput,\n\tBadge,\n\tButton,\n\tCarousel,\n\tCheckbox,\n\tChip,\n\tCodeInput,\n\tDetailRow,\n\tDivider,\n\tEmptyState,\n\tFooter,\n\tGrid,\n\tGridItem,\n\tIcon,\n\tImage,\n\tInput,\n\tLink,\n\tList,\n\tListItem,\n\tNotice,\n\tOption,\n\tProgressBar,\n\tQRCode,\n\tRadio,\n\tRadioGroup,\n\tScroll,\n\tSelect,\n\tSheet,\n\tSkeleton,\n\tSpinner,\n\tSwitch,\n\tTab,\n\tTabs,\n\tText,\n\tTextArea,\n\tToast,\n\tView\n};\nconst builtinRegistry = componentRegistry(Object.values(builtinComponents));\n//#endregion\n//#region src/source/location.ts\nfunction createLocator(source) {\n\tconst lineStarts = [0];\n\tfor (let index = 0; index < source.length; index++) if (source[index] === \"\\n\") lineStarts.push(index + 1);\n\treturn (offset) => {\n\t\tlet low = 0;\n\t\tlet high = lineStarts.length - 1;\n\t\twhile (low < high) {\n\t\t\tconst middle = Math.floor((low + high + 1) / 2);\n\t\t\tif (lineStarts[middle] <= offset) low = middle;\n\t\t\telse high = middle - 1;\n\t\t}\n\t\treturn {\n\t\t\tline: low + 1,\n\t\t\tcolumn: offset - lineStarts[low] + 1,\n\t\t\toffset\n\t\t};\n\t};\n}\nfunction locationAt(source, offset) {\n\treturn createLocator(source)(offset);\n}\nfunction locatedMessage(message, file, location) {\n\tconst where = [\n\t\tfile,\n\t\tlocation?.line,\n\t\tlocation?.column\n\t].filter((part) => part !== void 0).join(\":\");\n\treturn where ? `${where}: ${message}` : message;\n}\n//#endregion\n//#region src/source/error.ts\nvar SourceError = class extends Error {\n\treason;\n\tfile;\n\tloc;\n\tconstructor(reason, file, location) {\n\t\tsuper(locatedMessage(reason, file, location));\n\t\tthis.reason = reason;\n\t\tthis.file = file;\n\t\tthis.loc = location;\n\t}\n};\n//#endregion\n//#region src/event/emitter.ts\nvar EventEmitter = class {\n\t#listeners = /* @__PURE__ */ new Map();\n\ton(name, listener) {\n\t\tconst listeners = this.#listeners.get(name) ?? /* @__PURE__ */ new Set();\n\t\tthis.#listeners.set(name, listeners);\n\t\tlisteners.add(listener);\n\t\treturn () => listeners.delete(listener);\n\t}\n\temit(name, ...args) {\n\t\tthis.#listeners.get(name)?.forEach((listener) => listener(...args));\n\t}\n};\n//#endregion\n//#region src/event/core.ts\nfunction createEvent(type, detail = {}, data = {}) {\n\treturn {\n\t\ttype,\n\t\tdetail,\n\t\tdata\n\t};\n}\n//#endregion\n//#region src/host/host.ts\nfunction hostTransport() {\n\tconst transport = globalThis.__hostTransport;\n\tif (!transport) throw new Error(\"No Dot host found: `globalThis.__hostTransport` is not set. Run the dot in the Dash app, or in the simulator with `dotctl dev`.\");\n\treturn transport;\n}\n//#endregion\n//#region src/host/context.ts\nconst DEFAULT_SYSTEM_CONTEXT = {\n\tscheme: \"light\",\n\tappState: \"active\"\n};\n//#endregion\n//#region src/host/calls.ts\nvar HostError = class extends Error {\n\tname = \"HostError\";\n\tcode;\n\tconstructor(code, message) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n};\nlet connectedCaller = null;\nfunction connectHost(caller) {\n\tconnectedCaller = caller;\n}\nfunction callHost(method, params, options = {}) {\n\tif (!connectedCaller) {\n\t\tconst error = new HostError(\"unsupported\", `Can't run \"${method}\" here: call Dash from the dot's logic`);\n\t\treturn createHostRequest(Promise.reject(error));\n\t}\n\treturn connectedCaller(method, params, options);\n}\nfunction createHostRequest(promise, cancel = () => {}) {\n\tconst request = promise;\n\trequest.cancel = cancel;\n\treturn request;\n}\n//#endregion\n//#region src/host/permissions.ts\nconst PERMISSIONS = [\"account\"];\nfunction isPermission(value) {\n\treturn PERMISSIONS.includes(value);\n}\n//#endregion\n//#region src/host/files.ts\nconst DOT_FILE_PATH_MAX_LENGTH = 512;\nconst MAX_NAME_LENGTH = 255;\nfunction dotFilePathProblem(path, { allowRoot = false } = {}) {\n\tif (path === \"\") return allowRoot ? null : \"A path is needed, such as \\\"receipts/42.pdf\\\"\";\n\tif (path.length > 512) return `\"${path.slice(0, 40)}…\" is longer than 512 characters`;\n\tif (path.startsWith(\"/\")) return `\"${path}\" starts with \"/\". Start paths without it, such as \"receipts/42.pdf\"`;\n\tif ([...path].some((char) => char === \"\\\\\" || char.charCodeAt(0) < 32)) return `\"${path}\" has a backslash or another character paths can't use`;\n\tfor (const name of path.split(\"/\")) {\n\t\tif (name === \"\" || name === \".\" || name === \"..\") return `\"${path}\" has an empty, \".\" or \"..\" part. Name each folder, such as \"receipts/42.pdf\"`;\n\t\tif (name.length > MAX_NAME_LENGTH) return `\"${path}\" has a name longer than ${MAX_NAME_LENGTH} characters`;\n\t}\n\treturn null;\n}\n//#endregion\n//#region src/host/network.ts\nconst LABEL = \"[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\";\nconst NETWORK_HOST_PATTERN = new RegExp(`^(?:\\\\*\\\\.${LABEL}(?:\\\\.${LABEL})+|${LABEL}(?:\\\\.${LABEL})*)$`);\nconst NETWORK_HOST_MAX_LENGTH = 253;\nfunction isNetworkHost(value) {\n\treturn value.length <= 253 && NETWORK_HOST_PATTERN.test(value);\n}\nfunction allowsHost(hosts, host) {\n\tconst name = host.toLowerCase().replace(/\\.$/, \"\");\n\treturn hosts.some((pattern) => pattern.startsWith(\"*.\") ? name.endsWith(pattern.slice(1)) : name === pattern);\n}\n//#endregion\n//#region src/version/semantic-version.ts\nconst SEMVER_PATTERN = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\nfunction isSemanticVersion(value) {\n\treturn typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\nfunction majorVersion(version) {\n\treturn parseVersion(version).major;\n}\nfunction isVersionAtLeast(version, minimum) {\n\treturn compareVersions(version, minimum) >= 0;\n}\nfunction compareVersions(left, right) {\n\tconst leftVersion = parseVersion(left);\n\tconst rightVersion = parseVersion(right);\n\tconst differences = [\n\t\tleftVersion.major - rightVersion.major,\n\t\tleftVersion.minor - rightVersion.minor,\n\t\tleftVersion.patch - rightVersion.patch\n\t];\n\tfor (const difference of differences) if (difference !== 0) return difference;\n\treturn comparePrereleases(leftVersion.prerelease, rightVersion.prerelease);\n}\nfunction parseVersion(version) {\n\tconst match = SEMVER_PATTERN.exec(version);\n\tif (!match) throw new Error(`\"${version}\" is not a semantic version`);\n\tconst [, major, minor, patch, prerelease] = match;\n\treturn {\n\t\tmajor: Number(major),\n\t\tminor: Number(minor),\n\t\tpatch: Number(patch),\n\t\tprerelease: prerelease === void 0 ? [] : prerelease.split(\".\")\n\t};\n}\nfunction comparePrereleases(left, right) {\n\tif (left.length === 0 || right.length === 0) return right.length - left.length;\n\tconst shared = Math.min(left.length, right.length);\n\tfor (let index = 0; index < shared; index++) {\n\t\tconst order = compareIdentifiers(left[index], right[index]);\n\t\tif (order !== 0) return order;\n\t}\n\treturn left.length - right.length;\n}\nfunction compareIdentifiers(left, right) {\n\tconst leftIsNumber = /^\\d+$/.test(left);\n\tconst rightIsNumber = /^\\d+$/.test(right);\n\tif (leftIsNumber && rightIsNumber) return Number(left) - Number(right);\n\tif (leftIsNumber) return -1;\n\tif (rightIsNumber) return 1;\n\tif (left < right) return -1;\n\tif (left > right) return 1;\n\treturn 0;\n}\n//#endregion\n//#region src/host/react.ts\nconst REACT_HOST_PATH = \"/__dot/react/\";\nconst REACT_HOST_MODULES = {\n\treact: \"react.js\",\n\t\"react/jsx-runtime\": \"react-jsx-runtime.js\",\n\t\"react-dom\": \"react-dom.js\",\n\t\"react-dom/client\": \"react-dom-client.js\"\n};\nfunction reactHostUrl(dotReactVersion, file) {\n\treturn `${REACT_HOST_PATH}${majorVersion(dotReactVersion)}/${file}`;\n}\nfunction isReactCompatible(hostVersion, dotVersion) {\n\treturn majorVersion(hostVersion) === majorVersion(dotVersion) && isVersionAtLeast(hostVersion, dotVersion);\n}\nfunction newestReactOfMajor(versions, major) {\n\treturn versions.filter((version) => majorVersion(version) === major).sort(compareVersions).at(-1);\n}\n//#endregion\n//#region src/protocol/transport.ts\nfunction createAdaptorTransport(adapter) {\n\treturn {\n\t\tpost: (message) => adapter.postMessage(message),\n\t\tlisten(listener) {\n\t\t\tconst onMessage = (event) => listener(event.data);\n\t\t\tadapter.addEventListener(\"message\", onMessage);\n\t\t\treturn () => adapter.removeEventListener(\"message\", onMessage);\n\t\t}\n\t};\n}\nfunction createTransportPair() {\n\tconst firstListeners = /* @__PURE__ */ new Set();\n\tconst secondListeners = /* @__PURE__ */ new Set();\n\tconst createSide = (ownListeners, otherListeners) => ({\n\t\tpost: (message) => {\n\t\t\tconst copy = JSON.parse(JSON.stringify(message));\n\t\t\totherListeners.forEach((listener) => listener(copy));\n\t\t},\n\t\tlisten(listener) {\n\t\t\townListeners.add(listener);\n\t\t\treturn () => ownListeners.delete(listener);\n\t\t}\n\t});\n\treturn [createSide(firstListeners, secondListeners), createSide(secondListeners, firstListeners)];\n}\nconst PAGE_HOOKS = Object.keys({\n\tonLoad: true,\n\tonShow: true,\n\tonHide: true,\n\tonUnload: true\n});\n//#endregion\n//#region src/page/navigation.ts\nconst MAX_STACK_DEPTH = 8;\nconst PAGE_ID = /^[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/;\nfunction isPageId(value) {\n\treturn PAGE_ID.test(value);\n}\nvar NavigationStack = class {\n\tlimit;\n\t#pages = [];\n\t#nextInstanceId = 1;\n\tconstructor(limit = 8) {\n\t\tthis.limit = limit;\n\t}\n\tget pages() {\n\t\treturn this.#pages;\n\t}\n\tget top() {\n\t\treturn this.#pages.at(-1);\n\t}\n\tapply(navigation) {\n\t\tswitch (navigation.action) {\n\t\t\tcase \"push\":\n\t\t\t\tif (this.#pages.length >= this.limit) return false;\n\t\t\t\tbreak;\n\t\t\tcase \"replace\":\n\t\t\t\tthis.#pages.pop();\n\t\t\t\tbreak;\n\t\t\tcase \"reset\":\n\t\t\t\tthis.#pages = [];\n\t\t\t\tbreak;\n\t\t\tcase \"back\": {\n\t\t\t\tconst count = Math.min(navigation.delta, this.#pages.length - 1);\n\t\t\t\tif (count < 1) return false;\n\t\t\t\tthis.#pages = this.#pages.slice(0, -count);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tconst { page, options } = navigation;\n\t\tthis.#pages = [...this.#pages, {\n\t\t\tinstanceId: this.#nextInstanceId++,\n\t\t\tpage,\n\t\t\toptions\n\t\t}];\n\t\treturn true;\n\t}\n};\n//#endregion\n//#region src/page/state.ts\nfunction applyChanges(state, changes) {\n\tconst next = { ...state };\n\tfor (const [key, value] of Object.entries(changes)) if (value !== void 0) next[key] = value;\n\treturn next;\n}\n//#endregion\n//#region src/page/bars.ts\nconst HEX_COLOR = /^#[0-9a-fA-F]{6}$/;\nfunction checkNavigationBar(options) {\n\tconst { title, hidden, backgroundColor, textColor } = options;\n\tif (title !== void 0 && typeof title !== \"string\") throw new TypeError(\"The navigation bar's title must be text\");\n\tif (hidden !== void 0 && typeof hidden !== \"boolean\") throw new TypeError(\"The navigation bar's `hidden` must be true or false\");\n\tfor (const [name, color] of Object.entries({\n\t\tbackgroundColor,\n\t\ttextColor\n\t})) if (color !== void 0 && (typeof color !== \"string\" || !HEX_COLOR.test(color))) throw new TypeError(`The navigation bar's ${name} must be a color such as \"#1A73E8\"`);\n}\nfunction checkTabBar(options) {\n\tif (options.hidden !== void 0 && typeof options.hidden !== \"boolean\") throw new TypeError(\"The tab bar's `hidden` must be true or false\");\n}\nfunction checkConfigs(configs) {\n\tcheckNavigationBar(configs.navigationBar ?? {});\n\tcheckTabBar(configs.tabBar ?? {});\n}\nfunction mergeConfigs(...configs) {\n\tconst bars = {\n\t\tnavigationBar: {},\n\t\ttabBar: {}\n\t};\n\tfor (const config of configs) {\n\t\tbars.navigationBar = {\n\t\t\t...bars.navigationBar,\n\t\t\t...config?.navigationBar\n\t\t};\n\t\tbars.tabBar = {\n\t\t\t...bars.tabBar,\n\t\t\t...config?.tabBar\n\t\t};\n\t}\n\treturn bars;\n}\n//#endregion\n//#region src/messageChannel.ts\nvar MessageChannel = class {\n\t#transport;\n\t#handlers = /* @__PURE__ */ new Map();\n\tconstructor(transport) {\n\t\tthis.#transport = transport;\n\t}\n\tsend(type, payload) {\n\t\tthis.#transport.post({\n\t\t\ttype,\n\t\t\tpayload\n\t\t});\n\t}\n\thandle(type, handler) {\n\t\tconst previous = this.#handlers.get(type);\n\t\tthis.#handlers.set(type, handler);\n\t\treturn previous;\n\t}\n\tlisten(onError) {\n\t\treturn this.#transport.listen((rawMessage) => {\n\t\t\tconst message = rawMessage;\n\t\t\tconst handler = this.#handlers.get(message.type);\n\t\t\tif (!handler) {\n\t\t\t\tonError(/* @__PURE__ */ new Error(`No handler for message \"${message.type}\"`), message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\thandler(message.payload);\n\t\t\t} catch (error) {\n\t\t\t\tonError(error, message);\n\t\t\t}\n\t\t});\n\t}\n};\n//#endregion\nexport { ASPECTS, AmountInput, Badge, Button, Carousel, Checkbox, Chip, CodeInput, DEFAULT_SYSTEM_CONTEXT, DOT_FILE_PATH_MAX_LENGTH, DetailRow, Divider, EmptyState, EventEmitter, Footer, Grid, GridItem, HostError, ICON_NAMES, Icon, Image, Input, Link, List, ListItem, MAX_STACK_DEPTH, MessageChannel, NETWORK_HOST_MAX_LENGTH, NETWORK_HOST_PATTERN, NavigationStack, Notice, Option, PADDING_PROPS, PAGE_HOOKS, PERMISSIONS, ProgressBar, QRCode, REACT_HOST_MODULES, REACT_HOST_PATH, Radio, RadioGroup, SEMVER_PATTERN, SIZES, SPACES, STATUS_TONES, Scroll, Select, Sheet, Skeleton, SourceError, Spinner, Switch, TONES, Tab, Tabs, Text, TextArea, Toast, View, allowsHost, applyChanges, builtinComponents, builtinRegistry, callHost, checkConfigs, checkNavigationBar, checkTabBar, compareVersions, componentRegistry, connectHost, createAdaptorTransport, createEvent, createHostRequest, createLocator, createTransportPair, defineComponent, dotFilePathProblem, eventName, eventProp, hostTransport, isEventProp, isNetworkHost, isPageId, isPermission, isReactCompatible, isSemanticVersion, isVersionAtLeast, locatedMessage, locationAt, majorVersion, mergeConfigs, newestReactOfMajor, reactHostUrl, toList, toText };\n\n//# sourceMappingURL=index.js.map","import { isReactCompatible, isVersionAtLeast } from '@monimesl/dot-core';\n\nimport type { HostManifest } from './manifest';\n\nexport type IncompatibilityReason = 'runtimeTooOld' | 'dashTooOld' | 'reactUnavailable';\n\nexport interface HostVersions {\n // The Dash version this host is, checked against the dot's `dash.minVersion`.\n readonly dashVersion: string;\n // The oldest @monimesl/dot-runtime this host runs. Dots built with an older one must be rebuilt.\n readonly minRuntimeVersion: string;\n // The React versions the host ships. A host that serves the React the dot was built with, such as\n // the simulator, leaves it out.\n readonly reactVersions?: readonly string[] | undefined;\n}\n\n// Thrown when a host can't run a dot. `reason` names the check that failed.\nexport class IncompatibleDotError extends Error {\n override readonly name = 'IncompatibleDotError';\n readonly reason: IncompatibilityReason;\n\n constructor(reason: IncompatibilityReason, message: string) {\n super(message);\n this.reason = reason;\n }\n}\n\n// Throws an IncompatibleDotError when a host with these versions cannot run the dot.\nexport function checkCompatibility(\n manifest: HostManifest,\n { dashVersion, minRuntimeVersion, reactVersions }: HostVersions,\n): void {\n if (!isVersionAtLeast(manifest.runtime, minRuntimeVersion)) {\n throw new IncompatibleDotError(\n 'runtimeTooOld',\n `This dot was built with an old Dot runtime, ${manifest.runtime}. ` +\n `Rebuild it with @monimesl/dot-runtime ${minRuntimeVersion} or newer.`,\n );\n }\n const minDashVersion = manifest.dash?.minVersion;\n if (minDashVersion !== undefined && !isVersionAtLeast(dashVersion, minDashVersion)) {\n throw new IncompatibleDotError(\n 'dashTooOld',\n `This dot needs Dash ${minDashVersion} or newer. This is Dash ${dashVersion}.`,\n );\n }\n if (\n reactVersions !== undefined &&\n !reactVersions.some((version) => isReactCompatible(version, manifest.react))\n ) {\n throw new IncompatibleDotError(\n 'reactUnavailable',\n `This dot needs React ${manifest.react}, which this host doesn't have.`,\n );\n }\n}\n","import type {\n DotPermission,\n HostErrorCode,\n HostResult,\n LogicLayerMessages,\n} from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\nimport type { PermissionGate } from './permissions';\n\nexport interface HostCall {\n readonly method: string;\n readonly params: unknown;\n // Aborted when the call ends early: cancelled, out of time, or dismissed with its page.\n readonly signal: AbortSignal;\n}\n\n// Runs one host method. Throw a `HostError` to fail with its code; anything else fails as `failed`.\nexport type HostHandler = (call: HostCall) => unknown;\n\n// A method that needs a permission: it runs only if the dot declared it and the person allowed it.\nexport interface PermissionedHandler {\n readonly permission: DotPermission;\n readonly handle: HostHandler;\n}\n\nexport type HostHandlers = Readonly<Record<string, HostHandler | PermissionedHandler>>;\n\nconst UI_METHOD_PREFIX = 'dash.ui.';\n\ninterface RunningCall {\n readonly method: string;\n readonly controller: AbortController;\n timer?: ReturnType<typeof setTimeout>;\n}\n\n// Runs the service's host calls with `handlers`, and answers each one exactly once.\nexport class HostCallRunner {\n readonly #handlers: HostHandlers;\n readonly #permissions: PermissionGate;\n readonly #answer: (result: HostResult) => void;\n readonly #running = new Map<number, RunningCall>();\n\n constructor(\n handlers: HostHandlers,\n permissions: PermissionGate,\n answer: (result: HostResult) => void,\n ) {\n this.#handlers = handlers;\n this.#permissions = permissions;\n this.#answer = answer;\n }\n\n run({ id, method, params, timeout }: LogicLayerMessages['hostCall']): void {\n const entry = this.#handlers[method];\n if (!entry) {\n this.#answer({\n id,\n error: { code: 'unsupported', message: `This host doesn't support \"${method}\"` },\n });\n return;\n }\n const call: RunningCall = { method, controller: new AbortController() };\n if (timeout !== undefined) {\n call.timer = setTimeout(() => {\n this.#fail(id, new HostError('timeout', `\"${method}\" took longer than ${timeout}ms`));\n }, timeout);\n }\n this.#running.set(id, call);\n void this.#invoke(id, entry, { method, params, signal: call.controller.signal });\n }\n\n // The service stopped waiting, so the call ends without an answer.\n cancel(id: number): void {\n this.#end(id)?.controller.abort();\n }\n\n // Dialogs belong to the page on top. When that page changes, any dialog still open is dismissed.\n dismissUI(): void {\n for (const [id, call] of this.#running) {\n if (call.method.startsWith(UI_METHOD_PREFIX)) {\n this.#fail(\n id,\n new HostError('cancelled', 'The page that showed this dialog is no longer on screen'),\n );\n }\n }\n }\n\n async #invoke(\n id: number,\n entry: HostHandler | PermissionedHandler,\n call: HostCall,\n ): Promise<void> {\n try {\n if (typeof entry === 'function') {\n this.#succeed(id, await entry(call));\n return;\n }\n await this.#permissions.check(call.method, entry.permission, call.signal);\n this.#succeed(id, await entry.handle(call));\n } catch (error) {\n this.#fail(id, error);\n }\n }\n\n #succeed(id: number, value: unknown): void {\n if (this.#end(id)) {\n this.#answer({ id, value });\n }\n }\n\n #fail(id: number, error: unknown): void {\n const call = this.#end(id);\n if (!call) {\n return;\n }\n call.controller.abort();\n this.#answer({ id, error: describeError(error) });\n }\n\n #end(id: number): RunningCall | undefined {\n const call = this.#running.get(id);\n if (call) {\n this.#running.delete(id);\n clearTimeout(call.timer);\n }\n return call;\n }\n}\n\nfunction describeError(error: unknown): { code: HostErrorCode; message: string } {\n if (error instanceof HostError) {\n return { code: error.code, message: error.message };\n }\n return { code: 'failed', message: error instanceof Error ? error.message : String(error) };\n}\n","import type { DotPermission } from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\n// A dot asking for a permission it declared, the first time a call needs it.\nexport interface PermissionRequest {\n readonly dotName: string;\n readonly permission: DotPermission;\n // Why the dot needs it, from its dot.json.\n readonly reason: string;\n}\n\n// Each permission a dot declared in its dot.json, with the reason Dash shows the person.\nexport type DeclaredPermissions = Readonly<Partial<Record<string, string>>>;\n\n// Asks the person, and resolves with whether they allowed it. `signal` aborts if the call that needs\n// the permission ends first. The host then takes its prompt down and rejects.\nexport type AskPermission = (request: PermissionRequest, signal: AbortSignal) => Promise<boolean>;\n\n// Lets a call that needs a permission through only if the dot declared it and the person allowed\n// it. The person is asked once per run, and their answer is kept.\nexport class PermissionGate {\n readonly #dotName: string;\n readonly #declared: DeclaredPermissions;\n readonly #ask: AskPermission;\n readonly #answers = new Map<DotPermission, boolean>();\n\n constructor(dotName: string, declared: DeclaredPermissions, ask: AskPermission) {\n this.#dotName = dotName;\n this.#declared = declared;\n this.#ask = ask;\n }\n\n // Rejects with a `denied` HostError when the call may not run.\n async check(method: string, permission: DotPermission, signal: AbortSignal): Promise<void> {\n const reason = this.#declared[permission];\n if (reason === undefined) {\n throw new HostError(\n 'denied',\n `\"${method}\" needs the \"${permission}\" permission. Add it to permissions in dot.json, with a reason to show the person.`,\n );\n }\n let allowed = this.#answers.get(permission);\n if (allowed === undefined) {\n allowed = await this.#ask({ dotName: this.#dotName, permission, reason }, signal);\n this.#answers.set(permission, allowed);\n }\n if (!allowed) {\n throw new HostError('denied', `The person didn't allow the \"${permission}\" permission`);\n }\n }\n}\n","import type {\n Envelope,\n HostLayerMessages,\n HostResult,\n LogicLayerMessages,\n Navigation,\n PageBars,\n StackEntry,\n SystemContext,\n Transport,\n} from '@monimesl/dot-core';\nimport { NavigationStack } from '@monimesl/dot-core';\n\nimport type { HostVersions } from './compatibility';\nimport { checkCompatibility } from './compatibility';\nimport type { HostHandlers } from './host-calls';\nimport { HostCallRunner } from './host-calls';\nimport type { HostManifest } from './manifest';\nimport type { AskPermission } from './permissions';\nimport { PermissionGate } from './permissions';\n\nexport type Direction = 'toService' | 'toWebview' | 'toHost' | 'fromHost';\n\n// What Dash's bars show for the page on top. The title is the dot's name unless the page set one.\nexport interface HostBars {\n readonly title: string;\n readonly navigationBarHidden: boolean;\n // As #RRGGBB, or undefined for Dash's own colors.\n readonly navigationBarColor: string | undefined;\n readonly navigationBarTextColor: string | undefined;\n readonly tabBarHidden: boolean;\n}\n\nexport interface HostOptions extends HostVersions {\n ui: Transport;\n logic: Transport;\n manifest: HostManifest;\n systemContext: SystemContext;\n // The methods dots may call, such as `dash.ui.alert`. Any other method fails as `unsupported`.\n handlers?: HostHandlers | undefined;\n // Asks the person for a permission the dot declared, the first time a method needs it.\n askPermission: AskPermission;\n observe?: ((direction: Direction, message: Envelope) => void) | undefined;\n // Opened in place of the dot's first page, such as the pages open before it reloaded. Pages the\n // dot no longer has are left out.\n restorePages?: readonly StackEntry[] | undefined;\n onBarsChange?: ((bars: HostBars, pages: readonly StackEntry[]) => void) | undefined;\n}\n\nexport interface Host {\n // The open pages, first page first.\n readonly pages: readonly StackEntry[];\n stop(): void;\n // Returns false on the first page, where a device closes the dot instead.\n back(): boolean;\n setSystemContext(context: SystemContext): void;\n}\n\n// The host contract in JavaScript. Native hosts implement the same contract in Swift or Kotlin.\n// Throws an IncompatibleDotError if it can't run the dot, before either layer hears anything.\nexport function startHost({\n logic,\n ui,\n manifest,\n dashVersion,\n minRuntimeVersion,\n systemContext,\n handlers = {},\n askPermission,\n observe,\n restorePages = [],\n onBarsChange,\n}: HostOptions): Host {\n checkCompatibility(manifest, { dashVersion, minRuntimeVersion });\n const stack = new NavigationStack();\n let context = systemContext;\n const permissions = new PermissionGate(manifest.name, manifest.permissions ?? {}, askPermission);\n const calls = new HostCallRunner(handlers, permissions, (result) => {\n const message: Envelope<'hostResult', HostResult> = { type: 'hostResult', payload: result };\n observe?.('fromHost', message);\n logic.post(message);\n });\n const broadcast = (message: Envelope) => {\n observe?.('fromHost', message);\n ui.post(message);\n logic.post(message);\n };\n const barsByInstance = new Map<number, PageBars>();\n const showBars = () => {\n const top = stack.top;\n const bars = top && barsByInstance.get(top.instanceId);\n onBarsChange?.(\n {\n title: bars?.navigationBar.title ?? manifest.name,\n navigationBarHidden: bars?.navigationBar.hidden ?? false,\n navigationBarColor: bars?.navigationBar.backgroundColor,\n navigationBarTextColor: bars?.navigationBar.textColor,\n tabBarHidden: bars?.tabBar.hidden ?? false,\n },\n stack.pages,\n );\n };\n const syncStack = () => {\n const message: Envelope<'syncStack', HostLayerMessages['syncStack']> = {\n type: 'syncStack',\n payload: { pages: stack.pages, limit: stack.limit },\n };\n broadcast(message);\n const open = new Set(stack.pages.map((entry) => entry.instanceId));\n for (const instanceId of barsByInstance.keys()) {\n if (!open.has(instanceId)) {\n barsByInstance.delete(instanceId);\n }\n }\n showBars();\n };\n const syncSystemContext = () => {\n const message: Envelope<'syncSystemContext', HostLayerMessages['syncSystemContext']> = {\n type: 'syncSystemContext',\n payload: context,\n };\n broadcast(message);\n };\n const navigate = (navigation: Navigation): boolean => {\n if (navigation.action !== 'back' && !manifest.pages.includes(navigation.page)) {\n return false;\n }\n const previousTop = stack.top;\n if (!stack.apply(navigation)) {\n return false;\n }\n syncStack();\n if (stack.top !== previousTop) {\n calls.dismissUI();\n }\n return true;\n };\n\n const openFirstPages = () => {\n const [first, ...rest] = restorePages.filter((entry) => manifest.pages.includes(entry.page));\n if (!first) {\n navigate({ action: 'reset', page: manifest.entry, options: {} });\n return;\n }\n stack.apply({ action: 'reset', page: first.page, options: first.options });\n for (const entry of rest) {\n stack.apply({ action: 'push', page: entry.page, options: entry.options });\n }\n syncStack();\n };\n\n // Only the page on top may navigate. A request from a page below it is dropped.\n const navigateFromPage = ({ from, ...navigation }: LogicLayerMessages['navigate']) => {\n if (from === stack.top?.instanceId) {\n navigate(navigation);\n }\n };\n // Service messages meant for the host itself. Every other message is relayed to the webview.\n const hostMessageHandlers = new Map<string, (payload: unknown) => void>([\n ['navigate', (payload) => navigateFromPage(payload as LogicLayerMessages['navigate'])],\n ['hostCall', (payload) => calls.run(payload as LogicLayerMessages['hostCall'])],\n ['hostCancel', (payload) => calls.cancel((payload as LogicLayerMessages['hostCancel']).id)],\n [\n 'pageBars',\n (payload) => {\n const { instanceId, ...bars } = payload as LogicLayerMessages['pageBars'];\n barsByInstance.set(instanceId, bars);\n showBars();\n },\n ],\n ]);\n\n const stopService = logic.listen((raw) => {\n const message = raw as Envelope;\n const handleHostMessage = hostMessageHandlers.get(message.type);\n if (handleHostMessage) {\n observe?.('toHost', message);\n handleHostMessage(message.payload);\n return;\n }\n observe?.('toWebview', message);\n ui.post(message);\n });\n const stopWebview = ui.listen((raw) => {\n const message = raw as Envelope;\n observe?.('toService', message);\n logic.post(message);\n if (message.type === 'connect') {\n syncSystemContext();\n openFirstPages();\n }\n });\n return {\n get pages() {\n return stack.pages;\n },\n back: () => navigate({ action: 'back', delta: 1 }),\n setSystemContext: (next) => {\n context = next;\n syncSystemContext();\n },\n stop: () => {\n stopService();\n stopWebview();\n },\n };\n}\n","import type { HostVersions } from './compatibility';\n\n// The Dash version the simulator acts as, for dots that set `dash.minVersion`.\nexport const SIMULATED_DASH_VERSION = '1.0.0';\n\n// The oldest @monimesl/dot-runtime whose bundles the simulator's bridge runs. Raise it when the\n// messages between the layers and the host change in a way that older runtimes don't understand.\nexport const MIN_RUNTIME_VERSION = '0.1.0-alpha.1';\n\nexport const SIMULATOR_VERSIONS: HostVersions = {\n dashVersion: SIMULATED_DASH_VERSION,\n minRuntimeVersion: MIN_RUNTIME_VERSION,\n};\n","export const CLIENT_PATH = '/__dot/';\nexport const EVENTS_PATH = `${CLIENT_PATH}events`;\nexport const HTTP_PATH = `${CLIENT_PATH}network/http/`;\nexport const FILE_PATH = `${CLIENT_PATH}storage/file/`;\nexport const CACHE_PATH = `${CLIENT_PATH}storage/cache/`;\nexport const SECRET_PATH = `${CLIENT_PATH}storage/secret/`;\nexport const TEMPORARY_FILES_PATH = `${CLIENT_PATH}files/`;\n\nexport const DOT_PATH = '/dot/';\nexport const WEBVIEW_URL = `${DOT_PATH}ui/index.html`;\nexport const WEBVIEW_SCRIPT_URL = `${DOT_PATH}ui/dot.js`;\nexport const SERVICE_URL = `${DOT_PATH}logic/dot.js`;\nexport const MANIFEST_URL = `${DOT_PATH}manifest.json`;\n","import type { HostErrorCode } from '@monimesl/dot-core';\nimport { HostError } from '@monimesl/dot-core';\n\ntype Answer<Result> = { result: Result } | { error: { code: HostErrorCode; message: string } };\n\n// Runs a Dash call on the dev server, as a native host runs it on the device.\nexport async function callDevServer<Result>(\n path: string,\n params: unknown,\n signal: AbortSignal,\n): Promise<Result> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n signal,\n });\n const answer = (await response.json()) as Answer<Result>;\n if ('error' in answer) {\n throw new HostError(answer.error.code, answer.error.message);\n }\n return answer.result;\n}\n","import type { DashMethods, TorchState, VibrateOptions } from '@monimesl/dot-dash';\nimport { HostError } from '@monimesl/dot-core';\n\nexport type ShareParams = DashMethods['dash.system.share']['params'];\n\nconst SHAKE_DURATION_MS = 300;\n\nconst SHAKE: Keyframe[] = [\n { transform: 'translateX(0)' },\n { transform: 'translateX(-5px)' },\n { transform: 'translateX(5px)' },\n { transform: 'translateX(-3px)' },\n { transform: 'translateX(3px)' },\n { transform: 'translateX(0)' },\n];\n\nexport async function vibrate(\n phone: HTMLElement,\n note: (text: string) => void,\n options: VibrateOptions,\n): Promise<void> {\n note(`vibrated: ${options.style}`);\n await phone.animate(SHAKE, { duration: SHAKE_DURATION_MS }).finished;\n}\n\nexport function torch(phone: HTMLElement, note: (text: string) => void, state: TorchState): void {\n phone.dataset.torch = state;\n note(`torch: ${state}`);\n}\n\nexport async function copyText(note: (text: string) => void, text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n } catch (error) {\n throw new HostError('failed', `The browser blocked the clipboard: ${(error as Error).message}`);\n }\n note(`copied: ${text}`);\n}\n\n// Logs what a device's share sheet would get.\nexport function share(note: (text: string) => void, params: ShareParams): void {\n const parts = [params.text, params.url, params.file && `file ${params.file}`].filter(Boolean);\n if (parts.length === 0) {\n throw new HostError('invalid', 'share needs a text, a url or a file');\n }\n note(`shared: ${parts.join(' · ')}`);\n}\n\n// Opens the address in a new tab, as Dash opens it in the device's browser.\nexport function openUrl(note: (text: string) => void, url: string): void {\n if (!isHttps(url)) {\n throw new HostError('invalid', `Dash only opens https addresses, not ${url}`);\n }\n window.open(url, '_blank', 'noopener');\n note(`opened: ${url}`);\n}\n\nfunction isHttps(url: string): boolean {\n try {\n return new URL(url).protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nexport function delay(milliseconds: number, signal: AbortSignal): Promise<void> {\n if (!Number.isFinite(milliseconds) || milliseconds < 0) {\n throw new HostError(\n 'invalid',\n `A delay is a number of milliseconds, 0 or more, not ${milliseconds}`,\n );\n }\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, milliseconds);\n signal.addEventListener('abort', () => clearTimeout(timer));\n });\n}\n","export function element<T extends Element>(selector: string): T {\n const node = document.querySelector<T>(selector);\n if (!node) {\n throw new Error(`The simulator page is missing ${selector}`);\n }\n return node;\n}\n\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n text?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n if (text !== undefined) {\n node.textContent = text;\n }\n return node;\n}\n","import { HostError } from '@monimesl/dot-core';\nimport type { AlertAction, AlertOptions, AlertResult } from '@monimesl/dot-dash';\n\nimport { createElement } from '../dom';\n\n// dash.ui.alert always sends actions, but a host doesn't trust what the service sends.\nconst DEFAULT_ACTIONS: AlertAction[] = [{ id: 'ok', label: 'OK' }];\n\nexport function alert(\n phone: HTMLElement,\n options: AlertOptions,\n signal: AbortSignal,\n): Promise<AlertResult> {\n return new Promise((resolve, reject) => {\n const layer = createElement('div', 'dialog-layer');\n const dialog = createElement('div', 'dialog');\n dialog.setAttribute('role', 'alertdialog');\n const body = createElement('div', 'dialog-body');\n body.append(createElement('div', 'dialog-title', options.title));\n if (options.message) {\n body.append(createElement('div', 'dialog-message', options.message));\n }\n const actions = options.actions ?? DEFAULT_ACTIONS;\n // Two actions sit side by side, as on iOS; more are stacked.\n const buttons = createElement(\n 'div',\n actions.length === 2 ? 'dialog-actions' : 'dialog-actions stacked',\n );\n for (const action of actions) {\n const button = createElement('button', action.role ?? 'default', action.label);\n button.addEventListener('click', () => {\n layer.remove();\n resolve({ action: action.id });\n });\n buttons.append(button);\n }\n dialog.append(body, buttons);\n layer.append(dialog);\n signal.addEventListener('abort', () => {\n layer.remove();\n reject(new HostError('cancelled', 'The alert was dismissed'));\n });\n phone.append(layer);\n });\n}\n","import type { AlertOptions, TorchState, VibrateOptions } from '@monimesl/dot-dash';\n\nimport type { HostCall, HostHandlers } from '../../host-calls';\nimport { CACHE_PATH, FILE_PATH, HTTP_PATH, SECRET_PATH } from '../../paths';\nimport { callDevServer } from './dev-server';\nimport type { ShareParams } from './system';\nimport { copyText, delay, openUrl, share, torch, vibrate } from './system';\nimport { alert } from './ui';\n\nconst HTTP_METHODS = ['request', 'download', 'upload'] as const;\n\nconst FILE_OPERATIONS = [\n 'read',\n 'write',\n 'stat',\n 'list',\n 'createFolder',\n 'move',\n 'copy',\n 'remove',\n 'save',\n 'open',\n 'usage',\n] as const;\n\nconst CACHE_OPERATIONS = ['get', 'set', 'remove', 'exists', 'keys', 'clear'] as const;\n\nconst SECRET_OPERATIONS = ['get', 'set', 'remove', 'clear'] as const;\n\n// Stand-ins for what a device does natively. Network and storage calls go to the dev server.\nexport function dashHandlers(phone: HTMLElement, note: (text: string) => void): HostHandlers {\n return {\n 'dash.ui.alert': ({ params, signal }) => alert(phone, params as AlertOptions, signal),\n 'dash.system.vibrate': ({ params }) => vibrate(phone, note, params as VibrateOptions),\n 'dash.system.torch': ({ params }) =>\n torch(phone, note, (params as { state: TorchState }).state),\n 'dash.system.copyText': ({ params }) => copyText(note, (params as { text: string }).text),\n 'dash.system.share': ({ params }) => share(note, params as ShareParams),\n 'dash.system.openUrl': ({ params }) => openUrl(note, (params as { url: string }).url),\n 'dash.system.delay': ({ params, signal }) =>\n delay((params as { milliseconds: number }).milliseconds, signal),\n ...devServerHandlers('dash.network.http', HTTP_PATH, HTTP_METHODS),\n ...devServerHandlers('dash.storage.file', FILE_PATH, FILE_OPERATIONS),\n ...devServerHandlers('dash.storage.cache', CACHE_PATH, CACHE_OPERATIONS),\n ...devServerHandlers('dash.storage.secret', SECRET_PATH, SECRET_OPERATIONS),\n };\n}\n\nfunction devServerHandlers(group: string, path: string, names: readonly string[]): HostHandlers {\n return Object.fromEntries(\n names.map((name) => [\n `${group}.${name}`,\n ({ params, signal }: HostCall) => callDevServer(`${path}${name}`, params, signal),\n ]),\n );\n}\n","import type { DotPermission } from '@monimesl/dot-core';\n\nimport type { PermissionRequest } from '../../permissions';\nimport { alert } from './ui';\n\n// Finishes \"Allow “Counter” to …?\".\nconst PERMISSION_SUMMARIES: Record<DotPermission, string> = {\n account: 'see your Dash account: your name, and your email or phone',\n};\n\n// Asks as Dash would, with the dot's name, what it wants, and the reason from its dot.json.\nexport async function askPermission(\n phone: HTMLElement,\n note: (text: string) => void,\n request: PermissionRequest,\n signal: AbortSignal,\n): Promise<boolean> {\n const { action } = await alert(\n phone,\n {\n title: `Allow “${request.dotName}” to ${PERMISSION_SUMMARIES[request.permission]}?`,\n message: request.reason,\n actions: [\n { id: 'deny', label: \"Don't Allow\", role: 'cancel' },\n { id: 'allow', label: 'Allow' },\n ],\n },\n signal,\n );\n const allowed = action === 'allow';\n if (allowed) {\n note(`permission ${request.permission}: allowed`);\n } else {\n note(`permission ${request.permission}: not allowed`);\n }\n return allowed;\n}\n","import type { Transport } from '@monimesl/dot-core';\n\n// Native bridges only carry strings. Encoding to JSON here makes state that a device can't carry\n// fail in the simulator too.\ninterface Wire {\n readonly dot: string;\n}\n\nfunction isWire(data: unknown): data is Wire {\n return typeof (data as Partial<Wire> | null)?.dot === 'string';\n}\n\nexport function wireTransport(channel: Transport): Transport {\n return {\n post: (message) => channel.post({ dot: JSON.stringify(message) } satisfies Wire),\n listen: (listener) =>\n channel.listen((data) => {\n if (isWire(data)) {\n listener(JSON.parse(data.dot));\n }\n }),\n };\n}\n\n// The simulator page and the webview's iframe, each accepting messages only from the other.\nexport function windowChannel(other: () => Window | null): Transport {\n return {\n post: (message) => other()?.postMessage(message, location.origin),\n listen(listener) {\n const onMessage = (event: MessageEvent) => {\n if (event.source === other()) {\n listener(event.data);\n }\n };\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n },\n };\n}\n","import type {\n AppState,\n ColorScheme,\n Envelope,\n StackEntry,\n SystemContext,\n} from '@monimesl/dot-core';\nimport { createAdaptorTransport } from '@monimesl/dot-core';\n\nimport type { Direction, Host, HostBars } from '../host';\nimport type { HostManifest } from '../manifest';\nimport { checkCompatibility } from '../compatibility';\nimport { startHost } from '../host';\nimport { SIMULATOR_VERSIONS } from '../versions';\nimport { CLIENT_PATH, EVENTS_PATH, MANIFEST_URL, WEBVIEW_URL } from '../paths';\nimport { dashHandlers } from './dash';\nimport { askPermission } from './dash/permissions';\nimport { createElement, element } from './dom';\nimport type { HotReload } from './hot-reload';\nimport { windowChannel, wireTransport } from './wire';\n\nconst MAX_LOG_ENTRIES = 500;\n\nconst screen = element<HTMLIFrameElement>('#screen');\nconst log = element<HTMLOListElement>('#log');\nconst errorBanner = element<HTMLPreElement>('#error');\nconst phone = element<HTMLDivElement>('.phone');\nconst schemeSelect = element<HTMLSelectElement>('#scheme');\nconst navigationBar = element<HTMLElement>('.navigation-bar');\nconst navigationTitle = element<HTMLElement>('#navigation-title');\nconst navigationBack = element<HTMLButtonElement>('#navigation-back');\nconst tabBar = element<HTMLElement>('.tab-bar');\nconst clock = element<HTMLElement>('.clock');\nconst browserDark = matchMedia('(prefers-color-scheme: dark)');\n// The status bar's clock follows the computer's, in 24-hour time, such as 14:05.\nconst timeFormat = new Intl.DateTimeFormat('en-GB', {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n});\nfunction showTime(): void {\n clock.textContent = timeFormat.format(new Date());\n}\nshowTime();\nsetInterval(showTime, 1000);\n\ninterface RunningDot {\n readonly host: Host;\n readonly worker: Worker;\n}\n\nlet runningDot: RunningDot | null = null;\nlet launchCount = 0;\nlet hotReloads = 0;\n\nasync function launch(restorePages: readonly StackEntry[] = []): Promise<void> {\n stopRunningDot();\n launchCount += 1;\n const thisLaunch = launchCount;\n if (log.childElementCount > 0) {\n note('dot restarted');\n }\n\n let manifest: HostManifest;\n try {\n const response = await fetch(MANIFEST_URL);\n manifest = (await response.json()) as HostManifest;\n } catch {\n showError(\n `There's nothing to run, because ${MANIFEST_URL} is missing. Check whether the build failed.`,\n );\n return;\n }\n // Another reload started while the manifest loaded. Only the newest launch may start the dot.\n if (thisLaunch !== launchCount) {\n return;\n }\n\n // startHost checks too, but checking here means a refused dot never starts a worker.\n try {\n checkCompatibility(manifest, SIMULATOR_VERSIONS);\n } catch (error) {\n screen.src = 'about:blank';\n showError((error as Error).message);\n return;\n }\n\n const worker = new Worker(`${CLIENT_PATH}service-bridge.js`);\n const service = wireTransport(createAdaptorTransport(worker));\n const webview = wireTransport(windowChannel(() => screen.contentWindow));\n const host = startHost({\n logic: service,\n ui: webview,\n manifest,\n ...SIMULATOR_VERSIONS,\n systemContext: systemContext(),\n handlers: dashHandlers(phone, note),\n askPermission: (request, signal) => askPermission(phone, note, request, signal),\n observe: record,\n restorePages,\n onBarsChange: showBars,\n });\n worker.addEventListener('error', (event) =>\n showError(`The dot's service crashed: ${event.message}`),\n );\n screen.src = WEBVIEW_URL;\n runningDot = { host, worker };\n}\n\nfunction stopRunningDot(): void {\n if (!runningDot) {\n return;\n }\n runningDot.host.stop();\n runningDot.worker.terminate();\n runningDot = null;\n}\n\n// Shows the bars for the page on top, as Dash would.\nfunction showBars(bars: HostBars, pages: readonly StackEntry[]): void {\n navigationBar.hidden = bars.navigationBarHidden;\n navigationTitle.textContent = bars.title;\n navigationBack.hidden = pages.length < 2;\n setBarColor('--bar', bars.navigationBarColor);\n setBarColor('--bar-text', bars.navigationBarTextColor);\n tabBar.hidden = bars.tabBarHidden;\n}\n\n// Falls back to Dash's own color when the page sets none.\nfunction setBarColor(property: string, color: string | undefined): void {\n if (color) {\n phone.style.setProperty(property, color);\n } else {\n phone.style.removeProperty(property);\n }\n}\n\nfunction goBack(): void {\n if (runningDot && !runningDot.host.back()) {\n note('back on the first page, where a phone would close the dot');\n }\n}\n\nconst ARROWS: Record<Direction, string> = {\n toHost: 'both --> host',\n fromHost: 'host --> both',\n toService: 'ui --> logic',\n toWebview: 'ui <-- logic',\n};\n\nfunction note(text: string): void {\n log.append(createElement('li', 'note', text));\n}\n\nfunction record(direction: Direction, message: Envelope): void {\n const entry = createElement('li', direction);\n const details = document.createElement('details');\n const summary = document.createElement('summary');\n const time = new Date().toLocaleTimeString([], { hour12: false });\n summary.append(\n createElement('span', 'time', time),\n createElement('span', 'arrow', ARROWS[direction]),\n createElement('span', 'type', message.type),\n );\n const payload = document.createElement('pre');\n payload.textContent = JSON.stringify(message.payload, null, 2);\n details.append(summary, payload);\n entry.append(details);\n if (message.type === 'error') {\n entry.classList.add('failed');\n }\n log.append(entry);\n while (log.childElementCount > MAX_LOG_ENTRIES) {\n log.firstElementChild?.remove();\n }\n log.scrollTop = log.scrollHeight;\n}\n\nfunction restart(restorePages: readonly StackEntry[] = []): void {\n launch(restorePages).catch((error: unknown) => {\n showError(`Could not start the dot: ${String(error)}`);\n });\n}\n\n// A new build, so the dot starts again on the pages it had open.\nfunction relaunch(): void {\n restart(runningDot?.host.pages ?? []);\n}\n\n// A new build that changed only pages. It runs in place, and each open page keeps its state.\nfunction hotReload(): void {\n if (!runningDot) {\n restart();\n return;\n }\n hotReloads += 1;\n const reload: HotReload = { dotHotReload: hotReloads };\n // The service goes first, so a page whose initial state changed has already reset when its view redraws.\n runningDot.worker.postMessage(reload);\n screen.contentWindow?.postMessage(reload, location.origin);\n note('dot updated in place');\n}\n\nfunction showError(message: string | null): void {\n errorBanner.hidden = message === null;\n errorBanner.textContent = message ?? '';\n}\n\nfunction syncSystemContext(): void {\n runningDot?.host.setSystemContext(systemContext());\n}\n\nfunction systemContext(): SystemContext {\n return {\n scheme: schemeSelect.value as ColorScheme,\n appState: appState(),\n };\n}\n\n// Leaving the simulator's tab stands in for leaving Dash.\nfunction appState(): AppState {\n if (document.visibilityState === 'hidden') {\n return 'background';\n }\n return 'active';\n}\n\nfunction browserScheme(): ColorScheme {\n return browserDark.matches ? 'dark' : 'light';\n}\n\nfunction changeScheme(scheme: ColorScheme): void {\n schemeSelect.value = scheme;\n phone.dataset.scheme = scheme;\n syncSystemContext();\n}\n\nconst events = new EventSource(EVENTS_PATH);\nevents.addEventListener('reload', () => {\n showError(null);\n relaunch();\n});\nevents.addEventListener('hot-reload', () => {\n showError(null);\n hotReload();\n});\nevents.addEventListener('build-error', (event) => showError(String(event.data)));\n\n// Starts the dot over, on its first page.\nelement('#reload').addEventListener('click', () => restart());\nelement('#back').addEventListener('click', goBack);\nnavigationBack.addEventListener('click', goBack);\nelement('#clear').addEventListener('click', () => log.replaceChildren());\nschemeSelect.addEventListener('change', () => changeScheme(schemeSelect.value as ColorScheme));\nbrowserDark.addEventListener('change', () => changeScheme(browserScheme()));\ndocument.addEventListener('visibilitychange', syncSystemContext);\n\nchangeScheme(browserScheme());\nrestart();\n"],"mappings":";;CACA,SAAS,gBAAgB,UAAU;EAClC,OAAO;GACN,OAAO,CAAC;GACR,QAAQ,CAAC;GACT,GAAG;EACJ;CACD;CAYA,SAAS,kBAAkB,WAAW;EACrC,MAAM,WAAW,CAAC;EAClB,KAAK,MAAM,YAAY,WAAW;GACjC,IAAI,SAAS,QAAQ,UAAU,MAAM,IAAI,MAAM,cAAc,SAAS,KAAK,mBAAmB;GAC9F,SAAS,SAAS,QAAQ;EAC3B;EACA,OAAO;CACR;CAoBA,MAAM,cAAc,gBAAgB;EACnC,MAAM;EACN,OAAO;GACN,OAAO;GACP,UAAU;GACV,YAAY;GACZ,MAAM,CAAC,SAAS,OAAO;GACvB,OAAO;GACP,aAAa;GACb,MAAM;GACN,OAAO;GACP,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,SAAS,gBAAgB;EAC9B,MAAM;EACN,OAAO;GACN,SAAS,CAAC,WAAW,WAAW;GAChC,UAAU;GACV,SAAS;EACV;EACA,QAAQ,CAAC,OAAO;EAChB,UAAU;CACX,CAAC;CAGD,MAAM,QAAQ;EACb;EACA;EACA;CACD;CACA,MAAM,SAAS;EACd;EACA;EACA;EACA;CACD;CACA,MAAM,gBAAgB;EACrB,SAAS;EACT,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,eAAe;CAChB;CACA,MAAM,UAAU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,QAAQ;EACb;EACA;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,eAAe;EACpB;EACA;EACA;EACA;EACA;CACD;CACA,MAAM,aAAa;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA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GACD;GACA,MAAM;GACN,QAAQ;IACP;IACA;IACA;GACD;GACA,OAAO;IACN;IACA;IACA;GACD;GACA,UAAU;GACV,GAAG;EACJ;EACA,UAAU;EACV,QAAQ;CACT,CAAC;CAGD,MAAM,WAAW,gBAAgB;EAChC,MAAM;EACN,OAAO;GACN,OAAO;GACP,aAAa;GACb,OAAO;GACP,MAAM;GACN,OAAO;GACP,MAAM;GACN,WAAW;GACX,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAGD,MAAM,SAAS,gBAAgB;EAC9B,MAAM;EACN,OAAO;GACN,SAAS;GACT,OAAO;GACP,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CACD,MAAM,WAAW,gBAAgB;EAChC,MAAM;EACN,OAAO;GACN,SAAS;GACT,OAAO;GACP,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CACD,MAAM,aAAa,gBAAgB;EAClC,MAAM;EACN,OAAO;GACN,OAAO;GACP,OAAO;GACP,UAAU;EACX;EACA,QAAQ,CAAC,QAAQ;EACjB,UAAU;CACX,CAAC;CAuCD,MAAM,oBAAoB;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OA9Da,gBAAgB;GAC7B,MAAM;GACN,OAAO;IACN,OAAO;IACP,OAAO;IACP,UAAU;GACX;GACA,UAAU;EACX,CAsDC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAhEY,gBAAgB;GAC5B,MAAM;GACN,OAAO;IACN,KAAK;IACL,WAAW,CAAC,UAAU,KAAK;IAC3B,OAAO;KACN;KACA;KACA;KACA;IACD;IACA,SAAS;KACR;KACA;KACA;KACA;IACD;IACA,MAAM;IACN,MAAM;IACN,GAAG;IACH,SAAS,CAAC,SAAS,MAAM;GAC1B;GACA,QAAQ,CAAC,KAAK;GACd,UAAU;EACX,CAwCC;CACD;CAC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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
(function() {
|
|
2
|
+
const WEBVIEW_SCRIPT_URL = `/dot/ui/dot.js`;
|
|
3
|
+
//#endregion
|
|
4
|
+
//#region src/client/hot-reload.ts
|
|
5
|
+
function hotReloadIn(data) {
|
|
6
|
+
const reload = data?.dotHotReload;
|
|
7
|
+
return typeof reload === "number" ? reload : void 0;
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region src/client/wire.ts
|
|
11
|
+
function isWire(data) {
|
|
12
|
+
return typeof data?.dot === "string";
|
|
13
|
+
}
|
|
14
|
+
function wireTransport(channel) {
|
|
15
|
+
return {
|
|
16
|
+
post: (message) => channel.post({ dot: JSON.stringify(message) }),
|
|
17
|
+
listen: (listener) => channel.listen((data) => {
|
|
18
|
+
if (isWire(data)) listener(JSON.parse(data.dot));
|
|
19
|
+
})
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function windowChannel(other) {
|
|
23
|
+
return {
|
|
24
|
+
post: (message) => other()?.postMessage(message, location.origin),
|
|
25
|
+
listen(listener) {
|
|
26
|
+
const onMessage = (event) => {
|
|
27
|
+
if (event.source === other()) listener(event.data);
|
|
28
|
+
};
|
|
29
|
+
window.addEventListener("message", onMessage);
|
|
30
|
+
return () => window.removeEventListener("message", onMessage);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/client/webview-bridge.ts
|
|
36
|
+
globalThis.__hostTransport = wireTransport(windowChannel(() => window.parent));
|
|
37
|
+
window.addEventListener("message", (event) => {
|
|
38
|
+
const reload = hotReloadIn(event.data);
|
|
39
|
+
if (reload !== void 0 && event.source === window.parent) import(`${WEBVIEW_SCRIPT_URL}?hot=${reload}`);
|
|
40
|
+
});
|
|
41
|
+
//#endregion
|
|
42
|
+
})();
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=webview-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webview-bridge.js","names":[],"sources":["../../src/paths.ts","../../src/client/hot-reload.ts","../../src/client/wire.ts","../../src/client/webview-bridge.ts"],"sourcesContent":["export const CLIENT_PATH = '/__dot/';\nexport const EVENTS_PATH = `${CLIENT_PATH}events`;\nexport const HTTP_PATH = `${CLIENT_PATH}network/http/`;\nexport const FILE_PATH = `${CLIENT_PATH}storage/file/`;\nexport const CACHE_PATH = `${CLIENT_PATH}storage/cache/`;\nexport const SECRET_PATH = `${CLIENT_PATH}storage/secret/`;\nexport const TEMPORARY_FILES_PATH = `${CLIENT_PATH}files/`;\n\nexport const DOT_PATH = '/dot/';\nexport const WEBVIEW_URL = `${DOT_PATH}ui/index.html`;\nexport const WEBVIEW_SCRIPT_URL = `${DOT_PATH}ui/dot.js`;\nexport const SERVICE_URL = `${DOT_PATH}logic/dot.js`;\nexport const MANIFEST_URL = `${DOT_PATH}manifest.json`;\n","// What the simulator page posts to the dot's worker and web view to run its new build in place.\nexport interface HotReload {\n readonly dotHotReload: number;\n}\n\nexport function hotReloadIn(data: unknown): number | undefined {\n const reload = (data as Partial<HotReload> | null)?.dotHotReload;\n return typeof reload === 'number' ? reload : undefined;\n}\n","import type { Transport } from '@monimesl/dot-core';\n\n// Native bridges only carry strings. Encoding to JSON here makes state that a device can't carry\n// fail in the simulator too.\ninterface Wire {\n readonly dot: string;\n}\n\nfunction isWire(data: unknown): data is Wire {\n return typeof (data as Partial<Wire> | null)?.dot === 'string';\n}\n\nexport function wireTransport(channel: Transport): Transport {\n return {\n post: (message) => channel.post({ dot: JSON.stringify(message) } satisfies Wire),\n listen: (listener) =>\n channel.listen((data) => {\n if (isWire(data)) {\n listener(JSON.parse(data.dot));\n }\n }),\n };\n}\n\n// The simulator page and the webview's iframe, each accepting messages only from the other.\nexport function windowChannel(other: () => Window | null): Transport {\n return {\n post: (message) => other()?.postMessage(message, location.origin),\n listen(listener) {\n const onMessage = (event: MessageEvent) => {\n if (event.source === other()) {\n listener(event.data);\n }\n };\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n },\n };\n}\n","import { WEBVIEW_SCRIPT_URL } from '../paths';\nimport { hotReloadIn } from './hot-reload';\nimport { windowChannel, wireTransport } from './wire';\n\nglobalThis.__hostTransport = wireTransport(windowChannel(() => window.parent));\n\n// The new build hands its views to the webview already running here.\nwindow.addEventListener('message', (event) => {\n const reload = hotReloadIn(event.data);\n if (reload !== undefined && event.source === window.parent) {\n void import(`${WEBVIEW_SCRIPT_URL}?hot=${reload}`);\n }\n});\n"],"mappings":";CAUA,MAAa,qBAAqB;;;CCLlC,SAAgB,YAAY,MAAmC;EAC7D,MAAM,SAAU,MAAoC;EACpD,OAAO,OAAO,WAAW,WAAW,SAAS,KAAA;CAC/C;;;CCAA,SAAS,OAAO,MAA6B;EAC3C,OAAO,OAAQ,MAA+B,QAAQ;CACxD;CAEA,SAAgB,cAAc,SAA+B;EAC3D,OAAO;GACL,OAAO,YAAY,QAAQ,KAAK,EAAE,KAAK,KAAK,UAAU,OAAO,EAAE,CAAgB;GAC/E,SAAS,aACP,QAAQ,QAAQ,SAAS;IACvB,IAAI,OAAO,IAAI,GACb,SAAS,KAAK,MAAM,KAAK,GAAG,CAAC;GAEjC,CAAC;EACL;CACF;CAGA,SAAgB,cAAc,OAAuC;EACnE,OAAO;GACL,OAAO,YAAY,MAAM,CAAC,EAAE,YAAY,SAAS,SAAS,MAAM;GAChE,OAAO,UAAU;IACf,MAAM,aAAa,UAAwB;KACzC,IAAI,MAAM,WAAW,MAAM,GACzB,SAAS,MAAM,IAAI;IAEvB;IACA,OAAO,iBAAiB,WAAW,SAAS;IAC5C,aAAa,OAAO,oBAAoB,WAAW,SAAS;GAC9D;EACF;CACF;;;CClCA,WAAW,kBAAkB,cAAc,oBAAoB,OAAO,MAAM,CAAC;CAG7E,OAAO,iBAAiB,YAAY,UAAU;EAC5C,MAAM,SAAS,YAAY,MAAM,IAAI;EACrC,IAAI,WAAW,KAAA,KAAa,MAAM,WAAW,OAAO,QAClD,OAAY,GAAG,mBAAmB,OAAO;CAE7C,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { DotPermission, Envelope, StackEntry, SystemContext, Transport } from "@monimesl/dot-core";
|
|
2
|
+
//#region src/permissions.d.ts
|
|
3
|
+
interface PermissionRequest {
|
|
4
|
+
readonly dotName: string;
|
|
5
|
+
readonly permission: DotPermission;
|
|
6
|
+
readonly reason: string;
|
|
7
|
+
}
|
|
8
|
+
type DeclaredPermissions = Readonly<Partial<Record<string, string>>>;
|
|
9
|
+
type AskPermission = (request: PermissionRequest, signal: AbortSignal) => Promise<boolean>;
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/manifest.d.ts
|
|
12
|
+
interface HostManifest {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly runtime: string;
|
|
15
|
+
readonly react: string;
|
|
16
|
+
readonly entry: string;
|
|
17
|
+
readonly pages: readonly string[];
|
|
18
|
+
readonly dash?: {
|
|
19
|
+
readonly minVersion?: string | undefined;
|
|
20
|
+
} | undefined;
|
|
21
|
+
readonly permissions?: DeclaredPermissions | undefined;
|
|
22
|
+
readonly network?: {
|
|
23
|
+
readonly hosts: readonly string[];
|
|
24
|
+
} | undefined;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/compatibility.d.ts
|
|
28
|
+
type IncompatibilityReason = 'runtimeTooOld' | 'dashTooOld' | 'reactUnavailable';
|
|
29
|
+
interface HostVersions {
|
|
30
|
+
readonly dashVersion: string;
|
|
31
|
+
readonly minRuntimeVersion: string;
|
|
32
|
+
readonly reactVersions?: readonly string[] | undefined;
|
|
33
|
+
}
|
|
34
|
+
export declare class IncompatibleDotError extends Error {
|
|
35
|
+
readonly name = "IncompatibleDotError";
|
|
36
|
+
readonly reason: IncompatibilityReason;
|
|
37
|
+
constructor(reason: IncompatibilityReason, message: string);
|
|
38
|
+
}
|
|
39
|
+
export declare function checkCompatibility(manifest: HostManifest, { dashVersion, minRuntimeVersion, reactVersions }: HostVersions): void;
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/host-calls.d.ts
|
|
42
|
+
interface HostCall {
|
|
43
|
+
readonly method: string;
|
|
44
|
+
readonly params: unknown;
|
|
45
|
+
readonly signal: AbortSignal;
|
|
46
|
+
}
|
|
47
|
+
type HostHandler = (call: HostCall) => unknown;
|
|
48
|
+
interface PermissionedHandler {
|
|
49
|
+
readonly permission: DotPermission;
|
|
50
|
+
readonly handle: HostHandler;
|
|
51
|
+
}
|
|
52
|
+
type HostHandlers = Readonly<Record<string, HostHandler | PermissionedHandler>>;
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src/host.d.ts
|
|
55
|
+
type Direction = 'toService' | 'toWebview' | 'toHost' | 'fromHost';
|
|
56
|
+
interface HostBars {
|
|
57
|
+
readonly title: string;
|
|
58
|
+
readonly navigationBarHidden: boolean;
|
|
59
|
+
readonly navigationBarColor: string | undefined;
|
|
60
|
+
readonly navigationBarTextColor: string | undefined;
|
|
61
|
+
readonly tabBarHidden: boolean;
|
|
62
|
+
}
|
|
63
|
+
interface HostOptions extends HostVersions {
|
|
64
|
+
ui: Transport;
|
|
65
|
+
logic: Transport;
|
|
66
|
+
manifest: HostManifest;
|
|
67
|
+
systemContext: SystemContext;
|
|
68
|
+
handlers?: HostHandlers | undefined;
|
|
69
|
+
askPermission: AskPermission;
|
|
70
|
+
observe?: ((direction: Direction, message: Envelope) => void) | undefined;
|
|
71
|
+
restorePages?: readonly StackEntry[] | undefined;
|
|
72
|
+
onBarsChange?: ((bars: HostBars, pages: readonly StackEntry[]) => void) | undefined;
|
|
73
|
+
}
|
|
74
|
+
interface Host {
|
|
75
|
+
readonly pages: readonly StackEntry[];
|
|
76
|
+
stop(): void;
|
|
77
|
+
back(): boolean;
|
|
78
|
+
setSystemContext(context: SystemContext): void;
|
|
79
|
+
}
|
|
80
|
+
export declare function startHost({ logic, ui, manifest, dashVersion, minRuntimeVersion, systemContext, handlers, askPermission, observe, restorePages, onBarsChange }: HostOptions): Host;
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region src/versions.d.ts
|
|
83
|
+
export declare const SIMULATED_DASH_VERSION = "1.0.0";
|
|
84
|
+
export declare const MIN_RUNTIME_VERSION = "0.1.0-alpha.1";
|
|
85
|
+
export declare const SIMULATOR_VERSIONS: HostVersions;
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region src/server.d.ts
|
|
88
|
+
interface SimulatorOptions {
|
|
89
|
+
dotDir: string;
|
|
90
|
+
reactHostDir?: string | undefined;
|
|
91
|
+
name?: string | undefined;
|
|
92
|
+
port?: number | undefined;
|
|
93
|
+
host?: string | undefined;
|
|
94
|
+
clientDir?: string | undefined;
|
|
95
|
+
storageDir?: string | undefined;
|
|
96
|
+
}
|
|
97
|
+
interface Simulator {
|
|
98
|
+
readonly url: string;
|
|
99
|
+
reload(): void;
|
|
100
|
+
hotReload(): void;
|
|
101
|
+
error(message: string): void;
|
|
102
|
+
close(): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
export declare const DEFAULT_PORT = 3680;
|
|
105
|
+
export declare function startSimulator({ dotDir, reactHostDir, name, port, host, clientDir, storageDir }: SimulatorOptions): Promise<Simulator>;
|
|
106
|
+
//#endregion
|
|
107
|
+
export type { AskPermission, DeclaredPermissions, Direction, Host, HostCall, HostHandler, HostHandlers, HostManifest, HostOptions, HostVersions, IncompatibilityReason, PermissionRequest, PermissionedHandler, Simulator, SimulatorOptions };
|
|
108
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/permissions.ts","../../src/manifest.ts","../../src/compatibility.ts","../../src/host-calls.ts","../../src/host.ts","../../src/versions.ts","../../src/server.ts"],"mappings":";;UAIiB;WACN;WACA,YAAY;WAEZ;;KAIC,sBAAsB,SAAS,QAAQ;KAIvC,iBAAiB,SAAS,mBAAmB,QAAQ,gBAAgB;;;UCbhE;WACN;WAEA;WAEA;WACA;WACA;WACA;aAAkB;;WAClB,cAAc;WAEd;aAAqB;;;;;KCVpB;UAEK;WAEN;WAEA;WAGA;;qBAIE,6BAA6B;WACtB;WACT,QAAQ;EAEL,YAAA,QAAQ,uBAAuB;;wBAO7B,mBACd,UAAU,gBACR,aAAa,mBAAmB,iBAAiB;;;UCpBpC;WACN;WACA;WAEA,QAAQ;;KAIP,eAAe,MAAM;UAGhB;WACN,YAAY;WACZ,QAAQ;;KAGP,eAAe,SAAS,eAAe,cAAc;;;KCLrD;UAGK;WACN;WACA;WAEA;WACA;WACA;;UAGM,oBAAoB;EACnC,IAAI;EACJ,OAAO;EACP,UAAU;EACV,eAAe;EAEf,WAAW;EAEX,eAAe;EACf,YAAY,WAAW,WAAW,SAAS;EAG3C,wBAAwB;EACxB,iBAAiB,MAAM,UAAU,gBAAgB;;UAGlC;WAEN,gBAAgB;EACzB;EAEA;EACA,iBAAiB,SAAS;;wBAKZ,YACd,OACA,IACA,UACA,aACA,mBACA,eACA,UACA,eACA,SACA,cACA,gBACC,cAAc;;;qBCrEJ;qBAIA;qBAEA,oBAAoB;;;UCoBhB;EACf;EAGA;EACA;EACA;EACA;EACA;EAEA;;UAGe;WACN;EAET;EAEA;EACA,MAAM;EACN,SAAS;;qBAGE;wBAmBS,iBACpB,QACA,cACA,MACA,MACA,MACA,WACA,cACC,mBAAmB,QAAQ"}
|