diff --git a/setup.py b/setup.py index 3c6ed7d..fcaa472 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,12 @@ from __future__ import print_function +import os import pipes import shutil import subprocess import sys import traceback + from distutils import log from distutils.command.build import build # type: ignore from distutils.command.sdist import sdist # type: ignore @@ -31,8 +33,6 @@ def list2cmdline(cmd_list): ROOT_DIR = Path(__file__).parent SRC_DIR = ROOT_DIR / "src" PKG_DIR = SRC_DIR / NAME -JS_DIR = SRC_DIR / "idom-bokeh-extension" - # ----------------------------------------------------------------------------- # Package Definition @@ -126,11 +126,13 @@ def list2cmdline(cmd_list): def build_javascript_first(cls, rebuild=False): class Command(cls): def run(self): - build_bokeh_extension(JS_DIR, rebuild=rebuild) - shutil.move( - str(JS_DIR / "dist" / f"{JS_DIR.name}.min.js"), - str(PKG_DIR / "bundle.js"), - ) + build_bokeh_extension(PKG_DIR, rebuild=rebuild) + npm = "npm" if sys.platform != "win32" else "npm.bat" + os.chdir("src/idom_bokeh") + try: + self.spawn([npm, "run", "rollup"]) + finally: + os.chdir("../..") super().run() return Command diff --git a/src/idom-bokeh-extension/.bokeh b/src/idom-bokeh-extension/.bokeh deleted file mode 100644 index fa4e4f5..0000000 --- a/src/idom-bokeh-extension/.bokeh +++ /dev/null @@ -1 +0,0 @@ -{"bokeh_version":"2.4.2","signatures":{"package.json":"5223113a05cdbc77a98a35c4b8e9c3f8d0156ebcd3a6561fd0f386b254a0b868","package-lock.json":"025fc5e64b5f24c96f6b23fdb63a46a4858c0dcf1cb949a41d52162544c1a170","tsconfig.json":"8ad947cf43506ee0078b30ad5282ca601f450e2ab72c462003b7b8a0a63c992d"}} \ No newline at end of file diff --git a/src/idom-bokeh-extension/README.md b/src/idom-bokeh-extension/README.md deleted file mode 100644 index e226fd2..0000000 --- a/src/idom-bokeh-extension/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# {{ cookiecutter.npm_package_name }} - -{{ cookiecutter.project_short_description }} - -# Package Installation - -Requires [Node](https://nodejs.org/en/) to be installed: - -```bash -npm install --save {{ cookiecutter.npm_package_name }} -``` - -For a developer installation, `cd` into this directory and run: - -```bash -npm install -npm run build -``` - -This will install required dependencies and generate a Javascript bundle that is saved -to `{{ cookiecutter.python_package_name }}/bundle.js`` and is distributed with the -associated Python package. diff --git a/src/idom_bokeh/_model.py b/src/idom_bokeh/_model.py index 88cb1f8..cf49b2a 100644 --- a/src/idom_bokeh/_model.py +++ b/src/idom_bokeh/_model.py @@ -1,12 +1,19 @@ from bokeh.core.properties import Any, Dict, Either, String, Null, Tuple +from bokeh.events import ModelEvent from bokeh.models import HTMLBox +class IDOMEvent(ModelEvent): + + event_name = 'idom_event' + + def __init__(self, model, data=None): + self.data = data + super().__init__(model=model) + + class IDOM(HTMLBox): - __implementation__ = "bundle.js" importSourceUrl = String() event = Tuple(Any, Any) - - msg = Either(Dict(String, Any), Null) diff --git a/src/idom-bokeh-extension/bokeh.ext.json b/src/idom_bokeh/bokeh.ext.json similarity index 100% rename from src/idom-bokeh-extension/bokeh.ext.json rename to src/idom_bokeh/bokeh.ext.json diff --git a/src/idom-bokeh-extension/package-lock.json b/src/idom_bokeh/package-lock.json similarity index 80% rename from src/idom-bokeh-extension/package-lock.json rename to src/idom_bokeh/package-lock.json index d483dae..fde33e0 100644 --- a/src/idom-bokeh-extension/package-lock.json +++ b/src/idom_bokeh/package-lock.json @@ -1,11 +1,12 @@ { - "name": "idom-bokeh-extension", + "name": "idom-bokeh", "version": "0.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "idom-bokeh-extension", + "name": "idom-bokeh", + "version": "0.0.1", "dependencies": { "@bokeh/bokehjs": "^2.4.2", "idom-client-react": "^0.35.1" @@ -13,8 +14,6 @@ "devDependencies": { "prettier": "^2.2.1", "rollup": "^2.35.1", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-replace": "^2.2.0" } }, @@ -84,12 +83,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", - "dev": true - }, "node_modules/@types/jquery": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.13.tgz", @@ -98,21 +91,6 @@ "@types/sizzle": "*" } }, - "node_modules/@types/node": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", - "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -126,18 +104,6 @@ "@types/jquery": "*" } }, - "node_modules/builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/choices.js": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/choices.js/-/choices.js-9.1.0.tgz", @@ -325,12 +291,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "node_modules/fuse.js": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", @@ -347,18 +307,6 @@ "node": ">=0.8.0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/htm": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.0.tgz", @@ -377,33 +325,6 @@ "react-dom": ">=16" } }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -489,12 +410,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, "node_modules/prettier": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", @@ -561,28 +476,14 @@ "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.0.tgz", "integrity": "sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==" }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/rollup": { "version": "2.66.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", "dev": true, + "dependencies": { + "fsevents": "~2.3.2" + }, "bin": { "rollup": "dist/bin/rollup" }, @@ -593,40 +494,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - }, - "peerDependencies": { - "rollup": ">=1.12.0" - } - }, - "node_modules/rollup-plugin-node-resolve": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", - "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-node-resolve.", - "dev": true, - "dependencies": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.11.1", - "rollup-pluginutils": "^2.8.1" - }, - "peerDependencies": { - "rollup": ">=1.11.0" - } - }, "node_modules/rollup-plugin-replace": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", @@ -681,18 +548,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/timezone": { "version": "1.0.23", "resolved": "https://registry.npmjs.org/timezone/-/timezone-1.0.23.tgz", @@ -791,12 +646,6 @@ } } }, - "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", - "dev": true - }, "@types/jquery": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.13.tgz", @@ -805,21 +654,6 @@ "@types/sizzle": "*" } }, - "@types/node": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", - "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==", - "dev": true - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -833,12 +667,6 @@ "@types/jquery": "*" } }, - "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true - }, "choices.js": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/choices.js/-/choices.js-9.1.0.tgz", @@ -1014,12 +842,6 @@ "dev": true, "optional": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "fuse.js": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz", @@ -1030,15 +852,6 @@ "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "htm": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.0.tgz", @@ -1053,30 +866,6 @@ "htm": "^3.0.3" } }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, "jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -1156,12 +945,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "peer": true }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, "prettier": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", @@ -1216,17 +999,6 @@ "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.0.tgz", "integrity": "sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==" }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, "rollup": { "version": "2.66.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", @@ -1236,32 +1008,6 @@ "fsevents": "~2.3.2" } }, - "rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-node-resolve": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", - "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", - "dev": true, - "requires": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.11.1", - "rollup-pluginutils": "^2.8.1" - } - }, "rollup-plugin-replace": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", @@ -1312,12 +1058,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, "timezone": { "version": "1.0.23", "resolved": "https://registry.npmjs.org/timezone/-/timezone-1.0.23.tgz", diff --git a/src/idom-bokeh-extension/package.json b/src/idom_bokeh/package.json similarity index 69% rename from src/idom-bokeh-extension/package.json rename to src/idom_bokeh/package.json index 999ae0f..5d506fe 100644 --- a/src/idom-bokeh-extension/package.json +++ b/src/idom_bokeh/package.json @@ -1,25 +1,24 @@ { - "name": "idom-bokeh-extension", + "name": "idom-bokeh", + "version": "0.0.1", "description": "A Bokeh extension for IDOM", "author": "Ryan Morshead", "repository": { "type": "git", - "url": "{{ cookiecutter.repository_url }}" + "url": "https://github.com/idom-team/idom-bokeh" }, - "main": "src/index.js", + "main": "dist/idom_bokeh.js", "files": [ "src/**/*.js" ], "scripts": { - "build": "rollup --config", + "rollup": "rollup --config", "format": "prettier --ignore-path .gitignore --write .", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { "prettier": "^2.2.1", "rollup": "^2.35.1", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-replace": "^2.2.0" }, "dependencies": { diff --git a/src/idom_bokeh/panel.py b/src/idom_bokeh/panel.py index fe11a59..a314dd8 100644 --- a/src/idom_bokeh/panel.py +++ b/src/idom_bokeh/panel.py @@ -1,6 +1,7 @@ import shutil import sys import asyncio + from functools import partial from threading import Thread from queue import Queue as SyncQueue @@ -78,15 +79,20 @@ def _get_model(self, doc, root=None, parent=None, comm=None): model = self._bokeh_model( event=[update.path, update.changes], importSourceUrl=url, **props ) - if root is None: - root = model - self._link_props(model, ["msg"], doc, root, comm) + if comm: + model.on_event('idom_event', self._comm_event) + else: + model.on_event('idom_event', partial(self._server_event, doc)) if root is None: root = model self._models[root.ref["id"]] = (model, parent) return model + def _process_event(self, event): + dispatch = self._idom_layout.deliver(LayoutEvent(**event.data)) + asyncio.run_coroutine_threadsafe(dispatch, loop=self._idom_loop) + def _cleanup(self, root): super()._cleanup(root) if not self._models: @@ -114,16 +120,6 @@ def _cleanup(self, root): self._idom_loop = None self._idom_layout = None - def _process_property_change(self, msg): - if msg["msg"] is None: - return {} - dispatch = self._idom_layout.dispatch(LayoutEvent(**msg["msg"])) - asyncio.run_coroutine_threadsafe(dispatch, loop=self._idom_loop) - for ref, (m, _) in self._models.items(): - m.msg = None - push_on_root(ref) - return {} - async def _idom_layout_render_loop(self): with self._idom_layout: while True: diff --git a/src/idom_bokeh/rollup.config.js b/src/idom_bokeh/rollup.config.js new file mode 100644 index 0000000..affc2d3 --- /dev/null +++ b/src/idom_bokeh/rollup.config.js @@ -0,0 +1,21 @@ +import replace from "rollup-plugin-replace"; + +export default { + input: ["dist/idom_bokeh.min.js", "dist/idom_bokeh.js"], + output: { + dir: "dist/", + format: "es", + }, + context: "this", + plugins: [ + replace({ + "process.env.NODE_ENV": JSON.stringify("production"), + preventAssignment: true, + }), + // Hacky workaround for avoiding __esExport + replace({ + "__esExport(": "(", + delimiters: ['', ''] + }), + ], +}; diff --git a/src/idom-bokeh-extension/src/declaration.d.ts b/src/idom_bokeh/src/declaration.d.ts similarity index 100% rename from src/idom-bokeh-extension/src/declaration.d.ts rename to src/idom_bokeh/src/declaration.d.ts diff --git a/src/idom-bokeh-extension/src/index.ts b/src/idom_bokeh/src/index.ts similarity index 76% rename from src/idom-bokeh-extension/src/index.ts rename to src/idom_bokeh/src/index.ts index 4c9f782..003c8c5 100644 --- a/src/idom-bokeh-extension/src/index.ts +++ b/src/idom_bokeh/src/index.ts @@ -1,11 +1,36 @@ import { mountLayout } from "idom-client-react"; +import {ModelEvent, JSON} from "@bokehjs/core/bokeh_events" import * as p from "@bokehjs/core/properties"; import { HTMLBox } from "@bokehjs/models/layouts/html_box"; import { register_models } from "@bokehjs/base"; import { PanelHTMLBoxView, set_size } from "./layout"; +export class IDOMEvent extends ModelEvent { + event_name: string = "idom_event" + + constructor(readonly data: any) { + super() + } + + protected _to_json(): JSON { + const events = [] + for (let e of this.data.data) { + e = {...e} + if (e.target?.boundingClientRect != null) { + e.target.boundingClientRect = {...e.target.boundingClientRect} + } + if (e.currentTarget?.boundingClientRect != null) { + e.target.boundingClientRect = {...e.currentTarget.boundingClientRect} + } + events.push(e) + } + const data: any = {target: this.data.target, data: events} + return {model: this.origin, data: data} + } +} + export class IDOMView extends PanelHTMLBoxView { model: IDOM; _update: any; @@ -71,7 +96,7 @@ export class IDOMView extends PanelHTMLBoxView { } _send(event: any): any { - this.model.msg = event; + this.model.trigger_event(new IDOMEvent(event)) } } @@ -81,7 +106,6 @@ export namespace IDOM { export type Props = HTMLBox.Props & { event: p.Property; importSourceUrl: p.Property; - msg: p.Property; }; } @@ -101,9 +125,8 @@ export class IDOM extends HTMLBox { this.define(({ Any, String }) => ({ event: [Any, []], importSourceUrl: [String, ""], - msg: [Any, {}], })); } } -register_models([IDOMView]); +register_models([IDOM]); diff --git a/src/idom-bokeh-extension/src/layout.ts b/src/idom_bokeh/src/layout.ts similarity index 100% rename from src/idom-bokeh-extension/src/layout.ts rename to src/idom_bokeh/src/layout.ts diff --git a/src/idom-bokeh-extension/tsconfig.json b/src/idom_bokeh/tsconfig.json similarity index 89% rename from src/idom-bokeh-extension/tsconfig.json rename to src/idom_bokeh/tsconfig.json index c7344e1..1c4a005 100644 --- a/src/idom-bokeh-extension/tsconfig.json +++ b/src/idom_bokeh/tsconfig.json @@ -28,9 +28,7 @@ "@bokehjs/*": [ "node_modules/@bokeh/bokehjs/build/js/lib/*", "node_modules/@bokeh/bokehjs/build/js/types/*" - ], - "react": ["node_modules/preact/compat"], - "react-dom": ["node_modules/preact/compat"] + ] } }, "include": ["src/**/*.ts"]