diff --git a/.binder/environment.yml b/.binder/environment.yml index 9b3ef98..ac8a04b 100644 --- a/.binder/environment.yml +++ b/.binder/environment.yml @@ -49,14 +49,16 @@ dependencies: ############################################################################ ### ipydrawio-docs-deps ### + - jupyter-server-mathjax - myst-nb + - pkginfo - pydata-sphinx-theme - pytest-check-links - sphinx - sphinx-jsonschema - sphinxext-rediraffe - pip: - - jupyterlite ==0.1.0a16 + - jupyterlite ==0.1.0a17 ### ipydrawio-docs-deps ### @@ -71,7 +73,7 @@ dependencies: - python # this gets patched in ci # run - ipywidgets >=7.6 - - jupyterlab >=3.1.9,<4.0.0a0 + - jupyterlab >=3.2.4,<4.0.0a0 - jupyterlab_widgets >=1 - lxml - pillow @@ -92,6 +94,7 @@ dependencies: - pytest - pytest-console-scripts - pytest-cov + - pytest-html - pytest-tornasync # acceptance testing - firefox =91 diff --git a/.github/environment.yml b/.github/environment.yml index 281c0cd..09638b7 100644 --- a/.github/environment.yml +++ b/.github/environment.yml @@ -29,7 +29,7 @@ dependencies: - python # this gets patched in ci # run - ipywidgets >=7.6 - - jupyterlab >=3.1.9,<4.0.0a0 + - jupyterlab >=3.2.4,<4.0.0a0 - jupyterlab_widgets >=1 - lxml - pillow @@ -50,6 +50,7 @@ dependencies: - pytest - pytest-console-scripts - pytest-cov + - pytest-html - pytest-tornasync # acceptance testing - firefox =91 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e69749c..ac94efe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -302,6 +302,15 @@ jobs: cd ../ipydrawio-export codecov --root ../.. + - name: upload (utest) + if: always() + uses: actions/upload-artifact@v2 + with: + name: + ipydrawio ${{ github.run_number }} utest ${{ matrix.os }}${{ + matrix.python-version }} + path: ./build/pytest + - name: upload (atest) if: always() uses: actions/upload-artifact@v2 @@ -354,10 +363,16 @@ jobs: use-only-tar-bz2: true use-mamba: true + - name: download (dist) + uses: actions/download-artifact@v2 + with: + name: ipydrawio ${{ github.run_number }} dist + path: ./dist + - name: build docs shell: bash -l {0} run: | - doit $DOIT_N_TEST docs || doit docs + doit $DOIT_N_TEST docs || doit docs || doit docs - name: check docs shell: bash -l {0} @@ -367,7 +382,7 @@ jobs: - name: lite tests shell: bash -l {0} run: | - doit $DOIT_N_TEST test + doit $DOIT_N_TEST test:robot - name: upload (atest lite) if: always() diff --git a/CHANGELOG.md b/CHANGELOG.md index 065d627..24287a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,9 +10,9 @@ #### @deathbeds/ipydrawio-notebook 1.1.2 -#### @deathbeds/ipydrawio-webpack 15.7.300 +#### @deathbeds/ipydrawio-webpack 15.8.600 -- upgrade to drawio v15.7.3 for enhancements and bug fixes +- upgrade to drawio v15.8.6 for enhancements and bug fixes #### @deathbeds/ipydrawio-jupyter-templates 1.1.2 @@ -20,6 +20,9 @@ #### @deathbeds/ipydrawio-pdf 1.1.2 +- a `yarn.lock` is shipped to reduce provisioning time and increase + reproducibility + [#72]: https://github.com/deathbeds/ipydrawio/issues/72 ## Releases diff --git a/demo/.gitignore b/demo/.gitignore index 4f3d653..4ac966a 100644 --- a/demo/.gitignore +++ b/demo/.gitignore @@ -4,3 +4,4 @@ _output *.ipynb *doit.db files/ +pypi/ diff --git a/demo/jupyter_lite_config.json b/demo/jupyter_lite_config.json index 11a59ce..aa967aa 100644 --- a/demo/jupyter_lite_config.json +++ b/demo/jupyter_lite_config.json @@ -1,6 +1,5 @@ { "LiteBuildConfig": { - "contents": ["."], "federated_extensions": [ "../py_packages/ipydrawio/dist/ipydrawio-1.1.2-py3-none-any.whl", "https://github.com/conda-forge/releases/releases/download/noarch/bqplot-0.12.31-pyhd8ed1ab_0.tar.bz2/bqplot-0.12.31-pyhd8ed1ab_0.tar.bz2", @@ -11,9 +10,6 @@ "https://github.com/conda-forge/releases/releases/download/noarch/wxyz_lab-0.5.1-pyhd8ed1ab_0.tar.bz2/wxyz_lab-0.5.1-pyhd8ed1ab_0.tar.bz2", "https://github.com/conda-forge/releases/releases/download/noarch/wxyz_svg-0.5.1-pyhd8ed1ab_0.tar.bz2/wxyz_svg-0.5.1-pyhd8ed1ab_0.tar.bz2" ], - "ignore_contents": [ - "(lab/|_output|.gitignore|doit.db|\\.json$|jupyter_config|log$|\\.cache|\\.ipynb_checkpoints)" - ], "ignore_sys_prefix": true, "lite_dir": ".", "output_archive": "../build/demo/ipydrawio-lite-1.1.2.tgz", diff --git a/demo/requirements.txt b/demo/requirements.txt new file mode 100644 index 0000000..c95d295 --- /dev/null +++ b/demo/requirements.txt @@ -0,0 +1,2 @@ +# a set of packages we capture offline for the demo site +ipywidgets >=7.6,<8 diff --git a/docs/environment.yml b/docs/environment.yml index dfe1df5..09d0255 100644 --- a/docs/environment.yml +++ b/docs/environment.yml @@ -23,14 +23,16 @@ channels: dependencies: ### ipydrawio-docs-deps ### + - jupyter-server-mathjax - myst-nb + - pkginfo - pydata-sphinx-theme - pytest-check-links - sphinx - sphinx-jsonschema - sphinxext-rediraffe - pip: - - jupyterlite ==0.1.0a16 + - jupyterlite ==0.1.0a17 ### ipydrawio-docs-deps ### @@ -44,7 +46,7 @@ dependencies: - python # this gets patched in ci # run - ipywidgets >=7.6 - - jupyterlab >=3.1.9,<4.0.0a0 + - jupyterlab >=3.2.4,<4.0.0a0 - jupyterlab_widgets >=1 - lxml - pillow @@ -65,6 +67,7 @@ dependencies: - pytest - pytest-console-scripts - pytest-cov + - pytest-html - pytest-tornasync # acceptance testing - firefox =91 diff --git a/dodo.py b/dodo.py index 9a40a6e..3d8de15 100644 --- a/dodo.py +++ b/dodo.py @@ -131,6 +131,19 @@ def task_setup(): targets=[P.YARN_INTEGRITY], ) + yield dict( + name="js:ipde", + file_dep=[P.IPDE_DIE2_PACKAGE_JSON], + targets=[P.IPDE_DIE2_YARN_LOCK], + actions=[ + CmdAction( + [*P.JLPM, "--ignore-optional", "--prefer-offline"], + shell=False, + cwd=P.IPDE_DIE2, + ), + ], + ) + for pkg, pkg_setup in P.PY_SETUP.items(): # TODO: refactor ext_deps = [ @@ -495,6 +508,10 @@ def task_build(): ] ) ) + + if py_setup.parent == P.IPDE: + file_dep += [P.IPDE_DIE2_YARN_LOCK] + yield dict( name=f"sdist:{py_pkg}", file_dep=file_dep, @@ -683,6 +700,27 @@ def task_demo(): print("jupyterlite not found, this might be okay", flush=True) return + demo_dest = [*P.DEMO.glob("*.json")] + demo_tasks = [] + final_dest = [] + + yield dict( + name="pyodide:packages", + doc="fetch the pyodide packages.json", + uptodate=[doit.tools.config_changed(P.PYODIDE_URL)], + targets=[P.PYODIDE_PACKAGES], + actions=[P.fetch_pyodide_packages], + ) + + demo_tasks += ["demo:wheels"] + + yield dict( + name="wheels", + doc="fetch wheels", + file_dep=[P.PYODIDE_PACKAGES, P.DEMO_REQS], + actions=[P.fetch_wheels], + ) + yield dict( name="extensions", doc="update jupyter-lite.json from the conda env", @@ -701,12 +739,9 @@ def task_demo(): ], ) - demo_dest = [] - demo_tasks = [] - final_dest = [] for path in P.ALL_DEMO_CONTENTS: name = f"stage:{path.name}" - dest = P.DEMO / path.name.replace(" ", "_") + dest = P.DEMO_FILES / path.name.replace(" ", "_") demo_dest += [dest] demo_tasks += [f"demo:{name}"] final_dest += [P.DEMO_BUILD / f"files/{path.name}"] @@ -721,19 +756,10 @@ def task_demo(): assert final_dest assert demo_tasks - lite_src_files = [ - p - for p in P.DEMO.rglob("*") - if not p.is_dir() - and "/_output/" not in str(p) - and not p.name.endswith(".tgz") - and ".doit" not in p.name - ] - yield dict( name="archive", task_dep=demo_tasks, - file_dep=[*demo_dest, *lite_src_files], + file_dep=[*demo_dest, *P.DEMO_WHEELS.glob(f"*{P.NOARCH_WHL}")], targets=[P.DEMO_ARCHIVE, P.DEMO_HASHES, *final_dest, P.DEMO_CONTENTS_API], actions=[P._build_lite], ) @@ -861,13 +887,12 @@ def task_provision(): ) -def _pytest(setup_py): - def _test(): - subprocess.check_call( - [*P.PYM, "pytest", *P.PYTEST_ARGS], shell=False, cwd=str(setup_py.parent) - ) - - return _test +def _pytest(setup_py, *pytest_args): + return CmdAction( + [*P.PYM, "pytest", *P.PYTEST_ARGS, *pytest_args], + shell=False, + cwd=str(setup_py.parent), + ) def task_test(): @@ -892,6 +917,13 @@ def task_test(): ) for pkg, setup in P.PY_SETUP.items(): + html = P.BUILD / f"pytest/{pkg}/test.html" + htmlcov = P.BUILD / f"pytest/{pkg}/htmlcov" + pytest_args = [ + f"--cov-report=html:{htmlcov}", + f"--html={html}", + "--self-contained-html", + ] yield P._ok( dict( name=f"pytest:{pkg}", @@ -903,7 +935,11 @@ def task_test(): P.OK_PROVISION, P.OK_PIP_CHECK, ], - actions=[PythonInteractiveAction(_pytest(setup))], + actions=[ + (P.delete_some, [htmlcov, html]), + _pytest(setup, *pytest_args), + ], + targets=[htmlcov / "status.json", html], ), P.OK_PYTEST[pkg], ) diff --git a/packages/ipydrawio-webpack/.npmignore b/packages/ipydrawio-webpack/.npmignore index b43f79d..e29c65a 100644 --- a/packages/ipydrawio-webpack/.npmignore +++ b/packages/ipydrawio-webpack/.npmignore @@ -1,10 +1,8 @@ *.tgz **/.ipynb_checkpoints dio/.git* -dio/*.json dio/*.md dio/*/.npmignore -dio/*/*.json dio/*/*.orig dio/connect/* dio/dropbox* @@ -17,6 +15,7 @@ dio/math/jax/output/HTML-CSS/* dio/META-INF/* dio/onedrive* dio/onedrive*.html +dio/package.json dio/WEB-INF/* dio/yarn.lock drawio/ diff --git a/packages/ipydrawio-webpack/drawio b/packages/ipydrawio-webpack/drawio index 8660125..8bd26f3 160000 --- a/packages/ipydrawio-webpack/drawio +++ b/packages/ipydrawio-webpack/drawio @@ -1 +1 @@ -Subproject commit 866012510a3dc291356cca6f0667911e680e7a99 +Subproject commit 8bd26f358da648fd00b002815d39a37cbf160b57 diff --git a/packages/ipydrawio-webpack/lib/_static.js b/packages/ipydrawio-webpack/lib/_static.js index 1fe3346..89464e2 100644 --- a/packages/ipydrawio-webpack/lib/_static.js +++ b/packages/ipydrawio-webpack/lib/_static.js @@ -89,11 +89,6 @@ import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/google-dri import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/google-share.png'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/grid.gif'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/handle-connect.png'; -import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/handle-fixed.png'; -import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/handle-main.png'; -import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/handle-rotate.png'; -import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/handle-secondary.png'; -import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/handle-terminal.png'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/help.png'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/hs.png'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/hv.png'; @@ -112,6 +107,7 @@ import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/logo-quip. import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/logo-small.gif'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/logo-white.png'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/logo.png'; +import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/manifest.json'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/move.png'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/mstile-150x150.png'; import '!!file-loader?name=[path][name].[ext]&context=.!../dio/images/my-diagrams-sel.svg'; diff --git a/packages/ipydrawio-webpack/package.json b/packages/ipydrawio-webpack/package.json index 6cb5b10..7cd8903 100644 --- a/packages/ipydrawio-webpack/package.json +++ b/packages/ipydrawio-webpack/package.json @@ -43,5 +43,5 @@ "build:pre": "python scripts/patch.py && python scripts/static.py" }, "types": "lib/index.d.ts", - "version": "15.7.300" + "version": "15.8.600" } diff --git a/packages/ipydrawio-webpack/webpack.config.js b/packages/ipydrawio-webpack/webpack.config.js index 27fefda..a083bce 100644 --- a/packages/ipydrawio-webpack/webpack.config.js +++ b/packages/ipydrawio-webpack/webpack.config.js @@ -16,4 +16,12 @@ module.exports = { optimization: { minimize: false, }, + module: { + rules: [ + { + test: /dio\/.*/, + type: 'asset/resource', + }, + ], + }, }; diff --git a/packages/ipydrawio/package.json b/packages/ipydrawio/package.json index 8c7e8f9..78b7ded 100644 --- a/packages/ipydrawio/package.json +++ b/packages/ipydrawio/package.json @@ -8,7 +8,7 @@ "@jupyterlab/application": "^3.1.0", "@jupyterlab/launcher": "^3.1.0", "@jupyterlab/mainmenu": "^3.1.0", - "@deathbeds/ipydrawio-webpack": "^15.7.300" + "@deathbeds/ipydrawio-webpack": "^15.8.600" }, "description": "A JupyterLab extension for embedding interactive drawio / mxgraph diagrams.", "devDependencies": { diff --git a/packages/ipydrawio/src/editor.ts b/packages/ipydrawio/src/editor.ts index 8b6fb05..fbb3a14 100644 --- a/packages/ipydrawio/src/editor.ts +++ b/packages/ipydrawio/src/editor.ts @@ -76,6 +76,7 @@ export class Diagram extends IFrame { private _app: IMXApp; private _appChanged = new Signal(this); private _escaped = new Signal(this); + private _loaded = new Signal(this); constructor(options: Diagram.IOptions) { super({ sandbox: SANDBOX_EXCEPTIONS, ...options }); @@ -135,6 +136,13 @@ export class Diagram extends IFrame { return this._escaped; } + /** + * A signal emitted when a load action completes + */ + get loaded(): ISignal { + return this._loaded; + } + /** * Handle messages from the iframe over the drawio embed protocol */ @@ -165,25 +173,19 @@ export class Diagram extends IFrame { break; case 'load': this.app = (this._frame?.contentWindow as any).IPYDRAWIO_APP; - this._ready.resolve(void 0); - this._initialLoad = true; this.addClass(READY_CLASS); + if (!this._initialLoad) { + this.onSaveMsg(msg); + } + this._initialLoad = true; + this._loaded.emit(void 0); + this._ready.resolve(void 0); break; case 'save': - if (this.format?.isTransformed) { - this.saveWithExport(true); - break; - } - this._lastEmitted = msg.xml; - this.save(msg.xml, true); + this.onSaveMsg(msg, true); break; case 'autosave': - if (this.adapter.saveNeedsExport()) { - this.saveWithExport(); - break; - } - this._lastEmitted = msg.xml; - this.save(msg.xml); + this.onSaveMsg(msg); break; case 'export': if (this._exportPromise != null) { @@ -202,6 +204,15 @@ export class Diagram extends IFrame { } } + onSaveMsg(msg: any, hardSave: boolean = false) { + if (this.adapter.saveNeedsExport()) { + this.saveWithExport(hardSave); + } else { + this._lastEmitted = msg.xml; + this.save(msg.xml, hardSave); + } + } + /** * Install the message listener, the first time, and potentially reload the frame */ diff --git a/packages/ipydrawio/src/manager.ts b/packages/ipydrawio/src/manager.ts index 60ac676..0144468 100644 --- a/packages/ipydrawio/src/manager.ts +++ b/packages/ipydrawio/src/manager.ts @@ -16,6 +16,7 @@ */ import { Widget } from '@lumino/widgets'; import { ISignal, Signal } from '@lumino/signaling'; +import { PromiseDelegate } from '@lumino/coreutils'; import { IWidgetTracker, WidgetTracker, @@ -96,7 +97,7 @@ export class DiagramManager implements IDiagramManager { caption: `Create a blank ${IO.XML_NATIVE.ext} file`, execute: async (args) => { let cwd = this._browserFactory.defaultBrowser.model.path; - return this.createNew({ ...(args as any), cwd }); + return await this.createNew({ ...(args as any), cwd }); }, }); @@ -110,14 +111,27 @@ export class DiagramManager implements IDiagramManager { this._templatesChanged.connect(onChange); const content = new CreateCustom(model); const main = new MainAreaWidget({ content }); - model.documentRequested.connect(async () => { - await commands.execute(CommandIds.createNew, model.args as any); + const promiseDelegate = new PromiseDelegate(); + + const onDisposed = async () => promiseDelegate.reject(void 0); + + const onRequested = async () => { + const diagramDocument: DiagramDocument = await commands.execute( + CommandIds.createNew, + model.args as any + ); this._settings.changed.disconnect(onChange); this._templatesChanged.disconnect(onChange); + main.disposed.disconnect(onDisposed); + promiseDelegate.resolve(diagramDocument); main.dispose(); model.dispose(); - }); + }; + + model.documentRequested.connect(onRequested); + main.disposed.connect(onDisposed); this._app.shell.add(main); + return promiseDelegate.promise; }, icon: IO.drawioIcon, }); @@ -210,7 +224,7 @@ export class DiagramManager implements IDiagramManager { /** * Create a new untitled diagram file, given the current working directory. */ - async createNew(args: ICreateNewArgs) { + async createNew(args: ICreateNewArgs): Promise { let { cwd } = args; const format = diff --git a/py_packages/ipydrawio-export/MANIFEST.in b/py_packages/ipydrawio-export/MANIFEST.in index 10dc5c4..a8cb868 100644 --- a/py_packages/ipydrawio-export/MANIFEST.in +++ b/py_packages/ipydrawio-export/MANIFEST.in @@ -1,6 +1,7 @@ include README.md LICENSE.txt -recursive-exclude src/ipydrawio_export/vendor/draw-image-export2 node_modules recursive-include src/ipydrawio_export/etc *.json recursive-include src/ipydrawio_export/ext *.* recursive-include src/ipydrawio_export/tests/fixtures *.* recursive-include src/ipydrawio_export/vendor/draw-image-export2 *.json *.js README.md LICENSE yarn.lock +recursive-exclude src/ipydrawio_export/vendor/draw-image-export2/node_modules *.* LICENSE *.md *.json +recursive-exclude src/ipydrawio_export/vendor/draw-image-export2/iisnode *.* LICENSE *.md *.json diff --git a/py_packages/ipydrawio-export/setup.cfg b/py_packages/ipydrawio-export/setup.cfg index fd2fd5a..8cf2868 100644 --- a/py_packages/ipydrawio-export/setup.cfg +++ b/py_packages/ipydrawio-export/setup.cfg @@ -89,7 +89,7 @@ addopts = --cov ipydrawio_export --cov-branch --cov-report term-missing:skip-covered - --cov-report html + --no-cov-on-fail [isort] combine_as_imports = True diff --git a/py_packages/ipydrawio-export/src/ipydrawio_export/app.py b/py_packages/ipydrawio-export/src/ipydrawio_export/app.py index 0ff2fea..94d0c08 100644 --- a/py_packages/ipydrawio-export/src/ipydrawio_export/app.py +++ b/py_packages/ipydrawio-export/src/ipydrawio_export/app.py @@ -37,7 +37,7 @@ class BaseApp(Application): class ManagedApp(BaseApp): - drawio_manager = T.Instance(IPyDrawioExportManager) + drawio_manager: IPyDrawioExportManager = T.Instance(IPyDrawioExportManager) io_loop = T.Instance(ioloop.IOLoop) @T.default("io_loop") diff --git a/py_packages/ipydrawio-export/src/ipydrawio_export/manager.py b/py_packages/ipydrawio-export/src/ipydrawio_export/manager.py index 0a3a8da..ca73bb2 100644 --- a/py_packages/ipydrawio-export/src/ipydrawio_export/manager.py +++ b/py_packages/ipydrawio-export/src/ipydrawio_export/manager.py @@ -269,6 +269,8 @@ class IPyDrawioExportManager(LoggingConfigurable): for diagram in self.extract_diagrams(pdf_request): tree.append(diagram) next_pdf = tdp / f"doc-{i}.pdf" + if pdf_request.get("pdf") is None: # pragma: no cover + raise ValueError("PDF request is empty") wrote = next_pdf.write_bytes(b64decode(pdf_request["pdf"])) if wrote: merger.append(PdfFileReader(str(next_pdf))) @@ -362,7 +364,8 @@ class IPyDrawioExportManager(LoggingConfigurable): self.drawio_export_app, ) subprocess.check_call( - [str(JLPM), "--silent"], cwd=str(self.drawio_export_app) + [str(JLPM), "--silent", "--ignore-optional"], + cwd=str(self.drawio_export_app), ) self.is_provisioning = False diff --git a/py_packages/ipydrawio-export/src/ipydrawio_export/tests/test_pdf.py b/py_packages/ipydrawio-export/src/ipydrawio_export/tests/test_pdf.py index 50d936a..7cf4e31 100644 --- a/py_packages/ipydrawio-export/src/ipydrawio_export/tests/test_pdf.py +++ b/py_packages/ipydrawio-export/src/ipydrawio_export/tests/test_pdf.py @@ -43,8 +43,10 @@ def test_export_merged(tmp_path, export_app, empty_dio, svg, png, ipynb, attach_ export_app.start() out = tmp_path / f"{empty_dio.stem}.pdf" + assert out.exists(), f"{out} was not created" + reader = PdfFileReader(str(out), "rb") - assert reader.getNumPages() == 4 + assert reader.getNumPages() == 4, "unexpected number of pages" attachments = sorted(manager.attachments(out)) - assert len(attachments) == attach_xml + assert len(attachments) == attach_xml, "unexpected attachment status" diff --git a/py_packages/ipydrawio-export/src/ipydrawio_export/vendor/draw-image-export2 b/py_packages/ipydrawio-export/src/ipydrawio_export/vendor/draw-image-export2 index f559902..754f2c7 160000 --- a/py_packages/ipydrawio-export/src/ipydrawio_export/vendor/draw-image-export2 +++ b/py_packages/ipydrawio-export/src/ipydrawio_export/vendor/draw-image-export2 @@ -1 +1 @@ -Subproject commit f559902a8ade5f2e29ce0609781dec031426ff24 +Subproject commit 754f2c784d13535e38b14a11434d573a856a0fba diff --git a/py_packages/ipydrawio/setup.cfg b/py_packages/ipydrawio/setup.cfg index 8e1e6fa..0f21cf8 100644 --- a/py_packages/ipydrawio/setup.cfg +++ b/py_packages/ipydrawio/setup.cfg @@ -98,7 +98,7 @@ addopts = --cov ipydrawio --cov-branch --cov-report term-missing:skip-covered - --cov-report html + --no-cov-on-fail [isort] combine_as_imports = True diff --git a/scripts/project.py b/scripts/project.py index d94190a..d6e320b 100644 --- a/scripts/project.py +++ b/scripts/project.py @@ -76,6 +76,16 @@ def _clean(*paths_or_globs): return cleaned +def delete_some(*paths_or_globs): + for p_or_g in paths_or_globs: + paths = [p_or_g] if isinstance(p_or_g, Path) else [*p_or_g] + for p in paths: + if p.is_dir(): + shutil.rmtree(p) + elif p.exists(): + p.unlink() + + _SESSION = None @@ -86,6 +96,7 @@ OSX = PLATFORM == "Darwin" UNIX = not WIN PREFIX = Path(sys.prefix) ENC = dict(encoding="utf-8") +JSON_FMT = dict(indent=2, sort_keys=True) BUILDING_IN_CI = bool(json.loads(os.environ.get("BUILDING_IN_CI", "0"))) TESTING_IN_CI = bool(json.loads(os.environ.get("TESTING_IN_CI", "0"))) @@ -199,9 +210,7 @@ NO_TYPEDOC = ["_meta", "ipydrawio-webpack"] # so many js packages JS_PKG_JSON = {p.parent.name: p for p in PACKAGES.glob("*/package.json")} -JS_PKG_DATA = { - k: json.loads(v.read_text(encoding="utf-8")) for k, v in JS_PKG_JSON.items() -} +JS_PKG_DATA = {k: json.loads(v.read_text(**ENC)) for k, v in JS_PKG_JSON.items()} JS_PKG_JSON_LABEXT = { k: v @@ -310,6 +319,10 @@ PY_VERSION = { IPD = PY_SETUP["ipydrawio"].parent IPDE = PY_SETUP["ipydrawio-export"].parent +IPDE_VENDOR = IPDE / "src/ipydrawio_export/vendor" +IPDE_DIE2 = IPDE_VENDOR / "draw-image-export2" +IPDE_DIE2_PACKAGE_JSON = IPDE_DIE2 / "package.json" +IPDE_DIE2_YARN_LOCK = IPDE_DIE2 / "yarn.lock" IPD_VERSION = PY_VERSION["ipydrawio"] IPDE_VERSION = PY_VERSION["ipydrawio-export"] @@ -339,7 +352,9 @@ RE_CONDA_FORGE_URL = r"/conda-forge/(.*/)?(noarch|linux-64|win-64|osx-64)/([^/]+ CONDA_FORGE_RELEASE = "https://github.com/conda-forge/releases/releases/download" FED_EXT_MARKER = "### FEDERATED EXTENSIONS ###" DEMO = ROOT / "demo" +DEMO_FILES = DEMO / "files" DEMO_CONFIG = DEMO / "jupyter_lite_config.json" +DEMO_REQS = DEMO / "requirements.txt" DEMO_APPS = ["lab"] DEMO_BUILD = BUILD / "demo" DEMO_HASHES = DEMO_BUILD / "SHA256SUMS" @@ -347,6 +362,12 @@ DEMO_CONTENTS_API = DEMO_BUILD / "api/contents/all.json" DEMO_ARCHIVE = ( DEMO_BUILD / f"""ipydrawio-lite-{JS_PKG_DATA["ipydrawio"]["version"]}.tgz""" ) +DEMO_WHEELS = DEMO / "pypi" +NOARCH_WHL = "py3-none-any.whl" +IGNORED_WHEELS = ["widgetsnbextension", "nbformat", "ipykernel", "pyolite"] +PYODIDE_URL = "https://cdn.jsdelivr.net/pyodide/v0.18.1/full" +PYODIDE_PACKAGES = BUILD / "pyodide-packages.json" + # docs SPHINX_ARGS = json.loads(os.environ.get("SPHINX_ARGS", "[]")) @@ -421,7 +442,11 @@ ALL_JSON = [ *PACKAGES.glob("*/schema/*.json"), *ATEST.glob("fixtures/*.json"), *BINDER.glob("*.json"), - *[p for p in DEMO.rglob("*.json") if "/_output/" not in str(p)], + *[ + p + for p in DEMO.rglob("*.json") + if "/_output/" not in str(p) and "/.cache/" not in str(p) + ], ] ALL_DIO = [*DOCS_DIO, *IPJT_TMPL_DIO, *ATEST_DIO] ALL_MD = [*ROOT.glob("*.md"), *PACKAGES.glob("*/*.md"), *DOCS_MD] @@ -596,10 +621,10 @@ def fetch_one(url, path): def patch_one_env(source, target): - source_text = source.read_text(encoding="utf-8") + source_text = source.read_text(**ENC) name = re.findall(r"name: (.*)", source_text)[0] comment = f" ### {name}-deps ###" - old_target = target.read_text(encoding="utf-8").split(comment) + old_target = target.read_text(**ENC).split(comment) new_source = source_text.split(comment) target.write_text( "\n".join( @@ -635,7 +660,7 @@ def typedoc_conf(): if json.dumps(original_entry_points) != json.dumps(new_entry_points): typedoc["entryPoints"] = new_entry_points - TYPEDOC_JSON.write_text(json.dumps(typedoc, indent=2, sort_keys=True), **ENC) + TYPEDOC_JSON.write_text(json.dumps(typedoc, **JSON_FMT), **ENC) tsconfig = json.loads(TSCONFIG_TYPEDOC.read_text(**ENC)) original_references = tsconfig["references"] @@ -653,9 +678,7 @@ def typedoc_conf(): if json.dumps(original_references) != json.dumps(new_references): tsconfig["references"] = new_references - TSCONFIG_TYPEDOC.write_text( - json.dumps(tsconfig, indent=2, sort_keys=True), **ENC - ) + TSCONFIG_TYPEDOC.write_text(json.dumps(tsconfig, **JSON_FMT), **ENC) def mystify(): @@ -807,11 +830,19 @@ def _build_lite(): lite = ["jupyter", "lite"] args = ["--source-date-epoch", SOURCE_DATE_EPOCH] - for act in ["build", "check", "archive"]: + try: + from jupyter_server_mathjax.app import STATIC_ASSETS_PATH as MATHJAX_DIR + except Exception: + MATHJAX_DIR = None + + if MATHJAX_DIR: + args += ["--mathjax-dir", str(MATHJAX_DIR)] + + for act in ["build", "archive"]: act_args = list(map(str, [*lite, act, *args])) - if subprocess.call(act_args, cwd=DEMO) == 0: - continue - return False + if subprocess.call(act_args, cwd=DEMO) != 0: + print("FAILED", *act_args) + return False def _sync_lite_config(from_env, to_json, marker, extras): @@ -819,7 +850,7 @@ def _sync_lite_config(from_env, to_json, marker, extras): raw_lock = subprocess.check_output(["conda", "list", "--explicit"]) ext_packages = [ p.strip().split(" ")[0] - for p in from_env.read_text(encoding="utf-8").split(marker)[1].split(" - ") + for p in from_env.read_text(**ENC).split(marker)[1].split(" - ") if p.strip() ] @@ -838,12 +869,37 @@ def _sync_lite_config(from_env, to_json, marker, extras): if pkg.startswith(ext): tarball_urls += ["/".join([CONDA_FORGE_RELEASE, subdir, pkg, pkg])] - config = json.loads(to_json.read_text(encoding="utf-8")) + config = json.loads(to_json.read_text(**ENC)) config["LiteBuildConfig"]["federated_extensions"] = sorted(tarball_urls) - to_json.write_text(json.dumps(config, indent=2, sort_keys=True)) + to_json.write_text(json.dumps(config, **JSON_FMT)) subprocess.call([*PRETTIER, "--write", to_json]) +def fetch_pyodide_packages(): + import urllib.request + + url = f"{PYODIDE_URL}/packages.json" + print("fetching pyodide packages from", url) + with urllib.request.urlopen(url) as response: + packages = json.loads(response.read().decode("utf-8")) + PYODIDE_PACKAGES.parent.mkdir(exist_ok=True, parents=True) + PYODIDE_PACKAGES.write_text(json.dumps(packages, **JSON_FMT)) + + +def fetch_wheels(): + DEMO_WHEELS.mkdir(exist_ok=True, parents=True) + subprocess.check_call( + ["pip", "download", "-r", str(DEMO_REQS), "--prefer-binary"], + cwd=str(DEMO_WHEELS), + ) + for pkg in sorted(DEMO_WHEELS.glob("*")): + if not pkg.name.endswith(NOARCH_WHL): + pkg.unlink + continue + if any(re.findall(f"{p}-\\d", pkg.name) for p in IGNORED_WHEELS): + pkg.unlink() + + # Late environment hacks os.environ.update( CONDARC=str(CONDARC), diff --git a/yarn.lock b/yarn.lock index 878c4cc..d0325d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -106,14 +106,14 @@ "@jupyterlab/application" "^3.1.0" "@deathbeds/ipydrawio-webpack@file:packages/ipydrawio-webpack": - version "15.7.300" + version "15.8.600" dependencies: "@jupyterlab/application" "^3.1.0" "@deathbeds/ipydrawio@file:packages/ipydrawio": version "1.1.2" dependencies: - "@deathbeds/ipydrawio-webpack" "^15.7.300" + "@deathbeds/ipydrawio-webpack" "^15.8.600" "@jupyterlab/application" "^3.1.0" "@jupyterlab/launcher" "^3.1.0" "@jupyterlab/mainmenu" "^3.1.0" @@ -520,10 +520,10 @@ react "^17.0.1" y-codemirror "^2.1.1" -"@jupyterlab/coreutils@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@jupyterlab/coreutils/-/coreutils-5.2.0.tgz#f645c4c401118fcff4c0e46b3a7b5b379045d958" - integrity sha512-bAL3Gb9bhQWlAP6kF2ElgH5tlFrzPGO9w5hRcLkVYkeOuwR6SlwcMzyv5o9XenaW4u97R3gVJ2LdXLlGz6t3aQ== +"@jupyterlab/coreutils@^5.2.0", "@jupyterlab/coreutils@^5.2.4": + version "5.2.4" + resolved "https://registry.yarnpkg.com/@jupyterlab/coreutils/-/coreutils-5.2.4.tgz#7cf858a35dc3076b77a7194c0abf1340564b1c39" + integrity sha512-0QXhg8R0bkb5LILhfphE/K5k4zJI8N+fNsmy/Nr4mDo8l8mB7km6OUcbSSNuJg1mYikOhEA+UxhqE0954UgxkQ== dependencies: "@lumino/coreutils" "^1.5.3" "@lumino/disposable" "^1.4.3" @@ -663,10 +663,10 @@ "@lumino/coreutils" "^1.5.3" "@lumino/widgets" "^1.19.0" -"@jupyterlab/nbformat@^3.0.0", "@jupyterlab/nbformat@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@jupyterlab/nbformat/-/nbformat-3.2.0.tgz#162e3e7013eda4c6fe9d44966bc2203ad7f37d3e" - integrity sha512-9AwwCx4tuI550YHFQQeuuOoU2F0uZX15jIkH4IK70sDDdAnG+lijB9mtDpc2cAZuxYiBT/e8Ylgwdy+ZvSxxaw== +"@jupyterlab/nbformat@^3.0.0", "@jupyterlab/nbformat@^3.2.0", "@jupyterlab/nbformat@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@jupyterlab/nbformat/-/nbformat-3.2.4.tgz#dca9720804c949371d30227a8254de3b9feffc59" + integrity sha512-tEwt+vKAQEqj2smC8B5Myg693/5md3T9Nm3BM3Ix2NYqioCLlnGJ+aYQaOx1bsjyYWGLH/liW26O0NAUB3oEWg== dependencies: "@lumino/coreutils" "^1.5.3" @@ -699,10 +699,10 @@ "@lumino/widgets" "^1.19.0" react "^17.0.1" -"@jupyterlab/observables@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@jupyterlab/observables/-/observables-4.2.0.tgz#062b3bedab6ccb9eda42d40851e324c173ceaaa5" - integrity sha512-4Tirqme6KguTxV7odl0wFO5jbSZv1J/c9zlwFD6d111B0Xa+btZJWtpfu90jtYMUW0yYgMkHuNbXEFY7yjBu6Q== +"@jupyterlab/observables@^4.2.0", "@jupyterlab/observables@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@jupyterlab/observables/-/observables-4.2.4.tgz#77be638b9a8b660576087151e275b9e08239dd4a" + integrity sha512-9b1a2+Tmda/Jr8oLMpMhQJAEpMRgILo8unjTnpMCb9RZgOZAwMRs+vItNqrjrapa4OO1vhIFVRWWqmxa5vz/6Q== dependencies: "@lumino/algorithm" "^1.3.3" "@lumino/coreutils" "^1.5.3" @@ -731,11 +731,11 @@ resize-observer-polyfill "^1.5.1" "@jupyterlab/rendermime-interfaces@^3.0.0", "@jupyterlab/rendermime-interfaces@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@jupyterlab/rendermime-interfaces/-/rendermime-interfaces-3.2.0.tgz#ef7161b4a743c7ad1b33e53979b264860d150d36" - integrity sha512-TFapppF4XqbL7G6LS4jrY1m9iXFNAJR8uS+bR0YcBet4a5n54P4bfD7N9LCiCtCw/aFCEK5Hq15YwepAJCLG3w== + version "3.2.4" + resolved "https://registry.yarnpkg.com/@jupyterlab/rendermime-interfaces/-/rendermime-interfaces-3.2.4.tgz#671e52465fa4e8fba54faafb21642b9dffea45f5" + integrity sha512-/zVDeW2ZaRMzQW0EFj5v/hjpJNSDfhJfbx96rprYZC8d0qEvm3Bxyyda4CvsRhmaJKMTAQLW+oOEBn1kNbFTmg== dependencies: - "@jupyterlab/translation" "^3.2.0" + "@jupyterlab/translation" "^3.2.4" "@lumino/coreutils" "^1.5.3" "@lumino/widgets" "^1.19.0" @@ -760,16 +760,16 @@ lodash.escape "^4.0.1" marked "^2.0.0" -"@jupyterlab/services@^6.0.0", "@jupyterlab/services@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@jupyterlab/services/-/services-6.2.0.tgz#789d79d1742e58a2a0fb7be5be99a5c841290fe7" - integrity sha512-/Pf/qjYzSOsfUIVy1om5OYISodXIdwo7CmgB61ShQMLimmK1cCZjeFPz6pVk+k9bMQf2YzFohPJsxWyp/VmaIg== +"@jupyterlab/services@^6.0.0", "@jupyterlab/services@^6.2.0", "@jupyterlab/services@^6.2.4": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@jupyterlab/services/-/services-6.2.4.tgz#bf6262f9807bbf341d02532736607c9fa085fd58" + integrity sha512-WpcKLDkwpq9jUQXUWJJn1cybxwwe8YMC8fdkVnI7RmCg5n0tGSV8+urfUv5Q8DdMdkAJnzSHEC6kIRbGoFpceQ== dependencies: - "@jupyterlab/coreutils" "^5.2.0" - "@jupyterlab/nbformat" "^3.2.0" - "@jupyterlab/observables" "^4.2.0" - "@jupyterlab/settingregistry" "^3.2.0" - "@jupyterlab/statedb" "^3.2.0" + "@jupyterlab/coreutils" "^5.2.4" + "@jupyterlab/nbformat" "^3.2.4" + "@jupyterlab/observables" "^4.2.4" + "@jupyterlab/settingregistry" "^3.2.4" + "@jupyterlab/statedb" "^3.2.4" "@lumino/algorithm" "^1.3.3" "@lumino/coreutils" "^1.5.3" "@lumino/disposable" "^1.4.3" @@ -778,12 +778,12 @@ node-fetch "^2.6.0" ws "^7.4.6" -"@jupyterlab/settingregistry@^3.0.0", "@jupyterlab/settingregistry@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@jupyterlab/settingregistry/-/settingregistry-3.2.0.tgz#318aa082a8c6567c14b6b7a8e82f304e561876e3" - integrity sha512-2EO7guw4K2uWOj/mNk9u/meGaSSoplMqgwZgSqqHdwYCbacmhDKOXIzPimwrLwpj8HsNiwb51GXAuntFIPzcoQ== +"@jupyterlab/settingregistry@^3.0.0", "@jupyterlab/settingregistry@^3.2.0", "@jupyterlab/settingregistry@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@jupyterlab/settingregistry/-/settingregistry-3.2.4.tgz#6d863891702769769c4840435602206be06e84a6" + integrity sha512-kyr6y32YTD4S2XGthy17yRa6BdEQyuXqIl2hIKrn9oPdfM0OF3TDkAByB8W79KLQojsKcmGka19LvQov/N4+6A== dependencies: - "@jupyterlab/statedb" "^3.2.0" + "@jupyterlab/statedb" "^3.2.4" "@lumino/commands" "^1.12.0" "@lumino/coreutils" "^1.5.3" "@lumino/disposable" "^1.4.3" @@ -803,10 +803,10 @@ y-protocols "^1.0.5" yjs "^13.5.6" -"@jupyterlab/statedb@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@jupyterlab/statedb/-/statedb-3.2.0.tgz#a243850bd20085979ec2e1111959d97106d0ba79" - integrity sha512-fVyOcW2O9ERUyA0G9nLIW1+GSS7NKP6G/i5lOdJ24GwxcPnhQMXACCkD+41P5L/ILok2adHwPKbKt3V+VheY+w== +"@jupyterlab/statedb@^3.2.0", "@jupyterlab/statedb@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@jupyterlab/statedb/-/statedb-3.2.4.tgz#6581223bf4aac29f2aa8c2fe99e6307c7b88a8a8" + integrity sha512-md9AlnrW1pzZTQiVUIJrZgijB3CsSs2J05V5cywo4/sgjwBTO1YGKQDEi6qtMAeO03gxfomGK7xLpoP+2Uaa2A== dependencies: "@lumino/commands" "^1.12.0" "@lumino/coreutils" "^1.5.3" @@ -834,14 +834,14 @@ react "^17.0.1" typestyle "^2.0.4" -"@jupyterlab/translation@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@jupyterlab/translation/-/translation-3.2.0.tgz#063221ca7f6772eae407148fa01a421273171c18" - integrity sha512-ZdWKA3QsJlvWVzKdEqbSkXwJzAkHZGv2pZobLksWNDDdcIcZ3PZg/vpPZ40pZdNE5b3Xz14/cDw2bfOCILoSzg== +"@jupyterlab/translation@^3.2.0", "@jupyterlab/translation@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@jupyterlab/translation/-/translation-3.2.4.tgz#948c548f304c5d2d18878f2a578c8cee5ea43ef4" + integrity sha512-FTXhNw/KRmGGR/stWWyaeyyha3Y7k1jh/dVJIXMO5xlT+zzFHvquGCiMeMZR20P+xBDstrgX8Ei/LhG+gkx0yw== dependencies: - "@jupyterlab/coreutils" "^5.2.0" - "@jupyterlab/services" "^6.2.0" - "@jupyterlab/statedb" "^3.2.0" + "@jupyterlab/coreutils" "^5.2.4" + "@jupyterlab/services" "^6.2.4" + "@jupyterlab/statedb" "^3.2.4" "@lumino/coreutils" "^1.5.3" "@jupyterlab/ui-components@^3.2.0": @@ -2418,10 +2418,10 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -3399,11 +3399,16 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cors@2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -4949,7 +4954,19 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~7.1.6: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -5625,9 +5642,9 @@ is-glob@^3.1.0: is-extglob "^2.1.0" is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -6678,17 +6695,17 @@ micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.49.0, "mime-db@>= 1.43.0 < 2": - version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.49.0" + mime-db "1.51.0" mime@1.6.0: version "1.6.0" @@ -7004,9 +7021,11 @@ node-fetch-npm@^2.0.2: safe-buffer "^5.1.1" node-fetch@^2.5.0, node-fetch@^2.6.0, node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== + dependencies: + whatwg-url "^5.0.0" node-gyp-build@~4.1.0: version "4.1.1" @@ -8756,9 +8775,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== slash@^2.0.0: version "2.0.0" @@ -9079,13 +9098,13 @@ string-width@^3.0.0, string-width@^3.1.0: strip-ansi "^5.1.0" string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" string.prototype.matchall@^4.0.5: version "4.0.5" @@ -9152,12 +9171,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^2.0.0: version "2.0.0" @@ -9504,6 +9523,11 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -10000,6 +10024,11 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -10087,6 +10116,14 @@ whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"