diff --git a/.copier-answers.yml b/.copier-answers.yml index 570e052..3ecdd51 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -11,4 +11,3 @@ project_short_description: A Deepnote extension for JupyterLab python_name: jupyterlab_deepnote repository: https://github.com/deepnote/jupyterlab-deepnote test: true - diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f863e6..4bfb3b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,7 +105,7 @@ jobs: run: jlpm npm audit env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - + license-check: name: License Check runs-on: ubuntu-latest diff --git a/.github/workflows/prep-release.yml b/.github/workflows/prep-release.yml index ffbc30d..b2d4454 100644 --- a/.github/workflows/prep-release.yml +++ b/.github/workflows/prep-release.yml @@ -1,26 +1,26 @@ -name: "Step 1: Prep Release" +name: 'Step 1: Prep Release' on: workflow_dispatch: inputs: version_spec: - description: "New Version Specifier" - default: "next" + description: 'New Version Specifier' + default: 'next' required: false branch: - description: "The branch to target" + description: 'The branch to target' required: false post_version_spec: - description: "Post Version Specifier" + description: 'Post Version Specifier' required: false # silent: # description: "Set a placeholder in the changelog and don't publish the release." # required: false # type: boolean since: - description: "Use PRs with activity since this date or git reference" + description: 'Use PRs with activity since this date or git reference' required: false since_last_stable: - description: "Use PRs with activity since the last stable git tag" + description: 'Use PRs with activity since the last stable git tag' required: false type: boolean jobs: @@ -43,6 +43,6 @@ jobs: since: ${{ github.event.inputs.since }} since_last_stable: ${{ github.event.inputs.since_last_stable }} - - name: "** Next Step **" + - name: '** Next Step **' run: | echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}" diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index f2be6c4..71d3fef 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -1,15 +1,15 @@ -name: "Step 2: Publish Release" +name: 'Step 2: Publish Release' on: workflow_dispatch: inputs: branch: - description: "The target branch" + description: 'The target branch' required: false release_url: - description: "The URL of the draft GitHub release" + description: 'The URL of the draft GitHub release' required: false steps_to_skip: - description: "Comma separated list of steps to skip" + description: 'Comma separated list of steps to skip' required: false jobs: @@ -45,13 +45,13 @@ jobs: token: ${{ steps.app-token.outputs.token }} release_url: ${{ steps.populate-release.outputs.release_url }} - - name: "** Next Step **" + - name: '** Next Step **' if: ${{ success() }} run: | echo "Verify the final release" echo ${{ steps.finalize-release.outputs.release_url }} - - name: "** Failure Message **" + - name: '** Failure Message **' if: ${{ failure() }} run: | echo "Failed to Publish the Draft Release Url:" diff --git a/.github/workflows/update-integration-tests.yml b/.github/workflows/update-integration-tests.yml index c4a252e..337982e 100644 --- a/.github/workflows/update-integration-tests.yml +++ b/.github/workflows/update-integration-tests.yml @@ -20,7 +20,6 @@ jobs: github.event.comment.author_association == 'MEMBER' ) && github.event.issue.pull_request && contains(github.event.comment.body, 'please update snapshots') runs-on: ubuntu-latest - steps: - name: React to the triggering comment run: | diff --git a/.gitignore b/.gitignore index 76dcc80..f711c23 100644 --- a/.gitignore +++ b/.gitignore @@ -1,131 +1,268 @@ -*.bundle.* -lib/ -node_modules/ -*.log -.eslintcache -.stylelintcache -*.egg-info/ -.ipynb_checkpoints -*.tsbuildinfo -jupyterlab_deepnote/labextension -# Version file is handled by hatchling -jupyterlab_deepnote/_version.py -# Integration tests -ui-tests/test-results/ -ui-tests/playwright-report/ -# Created by https://www.gitignore.io/api/python -# Edit at https://www.gitignore.io/?templates=python -### Python ### -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class -# C extensions -*.so -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -.installed.cfg -*.egg -MANIFEST -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec -# Installer logs -pip-log.txt -pip-delete-this-directory.txt -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage/ -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ -# Translations -*.mo -*.pot -# Scrapy stuff: -.scrapy -# Sphinx documentation -docs/_build/ -# PyBuilder -target/ -# pyenv -.python-version -# celery beat schedule file -celerybeat-schedule -# SageMath parsed files -*.sage.py -# Spyder project settings -.spyderproject -.spyproject -# Rope project settings -.ropeproject -# Mr Developer -.mr.developer.cfg -.project -.pydevproject -# mkdocs documentation -/site -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json -# Pyre type checker -.pyre/ -# End of https://www.gitignore.io/api/python -# OSX files -.DS_Store -# Yarn cache -.yarn/ + + + + + + + + + + + + + + + + + + + + + + + + + + +# Usually these files are written by a python script from a template +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +# before PyInstaller builds the exe, so as to inject date/other infos into it. +# Biome cache +# Biome cache +# Byte-compiled / optimized / DLL files +# Byte-compiled / optimized / DLL files +# C extensions +# C extensions +# Created by https://www.gitignore.io/api/python +# Created by https://www.gitignore.io/api/python +# Distribution / packaging +# Distribution / packaging +# Edit at https://www.gitignore.io/?templates=python +# Edit at https://www.gitignore.io/?templates=python +# End of https://www.gitignore.io/api/python +# End of https://www.gitignore.io/api/python +# Installer logs +# Installer logs +# Integration tests +# Integration tests +# Mr Developer +# Mr Developer +# OSX files +# OSX files +# PyBuilder +# PyBuilder +# PyInstaller +# PyInstaller +# Pyre type checker +# Pyre type checker +# Qlty cache directories # Qlty cache directories +# Rope project settings +# Rope project settings +# SageMath parsed files +# SageMath parsed files +# Scrapy stuff: +# Scrapy stuff: +# Sphinx documentation +# Sphinx documentation +# Spyder project settings +# Spyder project settings +# Translations +# Translations +# Unit test / coverage reports +# Unit test / coverage reports +# Version file is handled by hatchling +# Version file is handled by hatchling +# Yarn cache +# Yarn cache +# celery beat schedule file +# celery beat schedule file +# mkdocs documentation +# mkdocs documentation +# mypy +# mypy +# pyenv +# pyenv +### Python ### +### Python ### +*$py.class +*$py.class +*.bundle.* +*.bundle.* +*.cover +*.cover +*.egg +*.egg +*.egg-info/ +*.egg-info/ +*.log +*.log +*.manifest +*.manifest +*.mo +*.mo +*.pot +*.pot +*.py[cod] +*.py[cod] +*.sage.py +*.sage.py +*.so +*.so +*.spec +*.spec +*.tsbuildinfo +*.tsbuildinfo +.DS_Store +.DS_Store +.Python +.Python +.biome/ +.biome/ +.cache +.cache +.coverage +.coverage +.coverage.* +.coverage.* +.dmypy.json +.dmypy.json +.eggs/ +.eggs/ +.eslintcache +.eslintcache +.hypothesis/ +.hypothesis/ +.installed.cfg +.installed.cfg +.ipynb_checkpoints +.ipynb_checkpoints +.mr.developer.cfg +.mr.developer.cfg +.mypy_cache/ +.mypy_cache/ +.nox/ +.nox/ +.project +.project +.pydevproject +.pydevproject +.pyre/ +.pyre/ +.pytest_cache/ +.pytest_cache/ +.python-version +.python-version .qlty/cache +.qlty/cache +.qlty/logs .qlty/logs .qlty/out +.qlty/out .qlty/plugin_cachedir +.qlty/plugin_cachedir +.qlty/results .qlty/results +.ropeproject +.ropeproject +.scrapy +.scrapy +.spyderproject +.spyderproject +.spyproject +.spyproject +.stylelintcache +.stylelintcache +.tox/ +.tox/ +.yarn/ +.yarn/ +/site +/site +MANIFEST +MANIFEST +__pycache__/ +__pycache__/ +build/ +build/ +celerybeat-schedule +celerybeat-schedule +coverage.xml +coverage.xml +coverage/ +coverage/ +develop-eggs/ +develop-eggs/ +dist/ +dist/ +dmypy.json +dmypy.json +docs/_build/ +docs/_build/ +downloads/ +downloads/ +eggs/ +eggs/ +htmlcov/ +htmlcov/ +jupyterlab_deepnote/_version.py +jupyterlab_deepnote/_version.py +jupyterlab_deepnote/labextension +jupyterlab_deepnote/labextension +lib/ +lib/ +lib/ +lib/ +lib64/ +lib64/ +node_modules/ +node_modules/ +nosetests.xml +nosetests.xml +parts/ +parts/ +pip-delete-this-directory.txt +pip-delete-this-directory.txt +pip-log.txt +pip-log.txt +pip-wheel-metadata/ +pip-wheel-metadata/ +sdist/ +sdist/ +share/python-wheels/ +share/python-wheels/ +target/ +target/ +ui-tests/playwright-report/ +ui-tests/playwright-report/ +ui-tests/test-results/ +ui-tests/test-results/ +var/ +var/ +wheels/ +wheels/ diff --git a/.prettierignore b/.prettierignore index b677430..62d559f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,7 +1,2 @@ -node_modules -**/node_modules -**/lib -**/package.json -!/package.json -jupyterlab_deepnote -.venv +CODEOWNERS +pnpm-lock.yaml diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..4560a23 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,10 @@ +{ + "overrides": [ + { + "files": ["*.yml", "*.yaml"], + "options": { + "singleQuote": true + } + } + ] +} diff --git a/babel.config.js b/babel.config.js index 8b5c764..5532a6c 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1 +1 @@ -module.exports = require('@jupyterlab/testutils/lib/babel.config'); +module.exports = require('@jupyterlab/testutils/lib/babel.config') diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..61ea6a2 --- /dev/null +++ b/biome.json @@ -0,0 +1,81 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.2.5/schema.json", + "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, + "files": { "ignoreUnknown": false }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf", + "lineWidth": 120, + "attributePosition": "auto", + "bracketSameLine": false, + "bracketSpacing": true, + "expand": "auto", + "useEditorconfig": true, + "includes": ["**", "!./coverage", "!./dist", "!**/package.json"] + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "a11y": { + "recommended": true + }, + "complexity": { + "recommended": true, + "noBannedTypes": "error", + "noUselessTypeConstraint": "error" + }, + "correctness": { + "recommended": true, + "noUnusedImports": "error", + "noUnusedFunctionParameters": "error", + "noUnusedPrivateClassMembers": "error", + "useHookAtTopLevel": "error" + }, + "performance": { + "recommended": true + }, + "security": { + "recommended": true + }, + "style": { + "recommended": true, + "noNonNullAssertion": "error", + "useArrayLiterals": "error", + "useConst": "error", + "useForOf": "error", + "useImportType": "error", + "useNodejsImportProtocol": "error", + "useNumberNamespace": "error" + }, + "suspicious": { + "recommended": true, + "noEmptyInterface": "error", + "noExplicitAny": "error", + "noConsole": "warn", + "noDebugger": "error" + } + } + }, + "javascript": { + "formatter": { + "jsxQuoteStyle": "single", + "quoteProperties": "preserve", + "trailingCommas": "es5", + "semicolons": "asNeeded", + "arrowParentheses": "asNeeded", + "bracketSameLine": false, + "quoteStyle": "single", + "attributePosition": "auto", + "bracketSpacing": true + } + }, + "html": { "formatter": { "selfCloseVoidElements": "always" } }, + "assist": { + "enabled": true, + "actions": { "source": { "organizeImports": "on" } } + } +} diff --git a/jest.config.js b/jest.config.js index 248d8cf..2ad02fe 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,4 @@ -const jestJupyterLab = require('@jupyterlab/testutils/lib/jest-config'); +const jestJupyterLab = require('@jupyterlab/testutils/lib/jest-config') const esModules = [ '@codemirror', @@ -9,25 +9,18 @@ const esModules = [ 'vscode-ws-jsonrpc', 'y-protocols', 'y-websocket', - 'yjs' -].join('|'); + 'yjs', +].join('|') -const baseConfig = jestJupyterLab(__dirname); +const baseConfig = jestJupyterLab(__dirname) module.exports = { ...baseConfig, automock: false, - collectCoverageFrom: [ - 'src/**/*.{ts,tsx}', - '!src/**/*.d.ts', - '!src/**/.ipynb_checkpoints/*' - ], + collectCoverageFrom: ['src/**/*.{ts,tsx}', '!src/**/*.d.ts', '!src/**/.ipynb_checkpoints/*'], coverageDirectory: './coverage', coverageReporters: ['lcov', 'text'], - reporters: [ - 'default', - ['jest-junit', { outputDirectory: './coverage', outputName: 'junit.xml' }] - ], + reporters: ['default', ['jest-junit', { outputDirectory: './coverage', outputName: 'junit.xml' }]], testRegex: 'src/.*/.*.spec.ts[x]?$', - transformIgnorePatterns: [`/node_modules/(?!${esModules}).+`] -}; + transformIgnorePatterns: [`/node_modules/(?!${esModules}).+`], +} diff --git a/package.json b/package.json index ba570e5..cc14caa 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,8 @@ "url": "https://github.com/deepnote/jupyterlab-deepnote.git" }, "scripts": { + "biome:check": "biome check .", + "biome:check:fix": "biome check --write .", "build": "jlpm build:lib && jlpm build:labextension:dev", "build:prod": "jlpm clean && jlpm build:lib:prod && jlpm build:labextension", "build:labextension": "jupyter labextension build .", @@ -42,15 +44,14 @@ "clean:lintcache": "rimraf .eslintcache .stylelintcache", "clean:labextension": "rimraf jupyterlab_deepnote/labextension jupyterlab_deepnote/_version.py", "clean:all": "jlpm clean:lib && jlpm clean:labextension && jlpm clean:lintcache", - "eslint": "jlpm eslint:check --fix", - "eslint:check": "eslint . --cache --ext .ts,.tsx", "install:extension": "jlpm build", - "lint": "jlpm stylelint && jlpm prettier && jlpm eslint", - "lint:check": "jlpm stylelint:check && jlpm prettier:check && jlpm eslint:check", + "lint": "jlpm stylelint && jlpm prettier && jlpm biome:check", + "lint:check": "jlpm stylelint:check && jlpm prettier:check && jlpm biome:check", + "lintAndFormat": "biome check . && jlpm run prettier:check", + "lintAndFormat:fix": "biome check --write . && jlpm run prettier", "prepare": "husky", - "prettier": "jlpm prettier:base --write --list-different", - "prettier:base": "prettier \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", - "prettier:check": "jlpm prettier:base --check", + "prettier": "prettier --write \"**/*.{md,yml,yaml}\"", + "prettier:check": "prettier --check \"**/*.{md,yml,yaml}\"", "stylelint": "jlpm stylelint:check --fix", "stylelint:check": "stylelint --cache \"style/**/*.css\"", "test": "jest --coverage", @@ -71,6 +72,7 @@ "zod": "^4.1.11" }, "devDependencies": { + "@biomejs/biome": "2.2.5", "@jupyterlab/builder": "^4.0.0", "@jupyterlab/testutils": "^4.0.0", "@types/jest": "^29.2.0", @@ -78,18 +80,13 @@ "@types/lodash": "^4.17.20", "@types/react": "^18.0.26", "@types/react-addons-linked-state-mixin": "^0.14.22", - "@typescript-eslint/eslint-plugin": "^6.1.0", - "@typescript-eslint/parser": "^6.1.0", "css-loader": "^6.7.1", - "eslint": "^8.36.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-prettier": "^5.0.0", "husky": "9.1.7", "jest": "^29.2.0", "lint-staged": "16.2.3", "mkdirp": "^1.0.3", "npm-run-all2": "^7.0.1", - "prettier": "^3.0.0", + "prettier": "3.6.2", "rimraf": "^5.0.1", "source-map-loader": "^1.0.2", "style-loader": "^3.3.1", @@ -102,9 +99,17 @@ "yjs": "^13.5.0" }, "lint-staged": { - "src/**/*.{ts,tsx}": [ - "eslint --cache --fix", - "prettier --write" + "**/*.{ts,tsx,html,json,jsonc}": [ + "npx biome check --write" + ], + "**/*.{md,yml,yaml}": [ + "npx prettier --write" + ], + "**/*.css": [ + "npx stylelint --fix" + ], + ".gitignore": [ + "sort -o .gitignore .gitignore" ] }, "sideEffects": [ @@ -130,70 +135,6 @@ "outputDir": "jupyterlab_deepnote/labextension", "schemaDir": "schema" }, - "eslintIgnore": [ - "node_modules", - "dist", - "coverage", - "**/*.d.ts", - "tests", - "**/__tests__", - "ui-tests" - ], - "eslintConfig": { - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "tsconfig.json", - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/no-unused-vars": [ - "warn", - { - "args": "none" - } - ], - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-namespace": "off", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/quotes": [ - "error", - "single", - { - "avoidEscape": true, - "allowTemplateLiterals": false - } - ], - "curly": [ - "error", - "all" - ], - "eqeqeq": "error", - "prefer-arrow-callback": "error" - } - }, - "prettier": { - "singleQuote": true, - "trailingComma": "none", - "arrowParens": "avoid", - "endOfLine": "auto", - "overrides": [ - { - "files": "package.json", - "options": { - "tabWidth": 4 - } - } - ] - }, "stylelint": { "extends": [ "stylelint-config-recommended", diff --git a/renovate.json b/renovate.json index 28b62b4..aec87ff 100644 --- a/renovate.json +++ b/renovate.json @@ -7,13 +7,7 @@ "pinDigests": true }, "extends": ["config:recommended"], - "ignorePaths": [ - "**/dist/**", - "**/node_modules/**", - "**/tmp/**", - "lib/**", - "jupyterlab_deepnote/labextension/**" - ], + "ignorePaths": ["**/dist/**", "**/node_modules/**", "**/tmp/**", "lib/**", "jupyterlab_deepnote/labextension/**"], "docker-compose": { "enabled": false }, diff --git a/src/__tests__/jupyterlab_deepnote.spec.ts b/src/__tests__/jupyterlab_deepnote.spec.ts index 8f12a81..c2f1857 100644 --- a/src/__tests__/jupyterlab_deepnote.spec.ts +++ b/src/__tests__/jupyterlab_deepnote.spec.ts @@ -4,6 +4,6 @@ describe('jupyterlab-deepnote', () => { it('should be tested', () => { - expect(1 + 1).toEqual(2); - }); -}); + expect(1 + 1).toEqual(2) + }) +}) diff --git a/src/components/NotebookPicker.tsx b/src/components/NotebookPicker.tsx index d683106..f335a70 100644 --- a/src/components/NotebookPicker.tsx +++ b/src/components/NotebookPicker.tsx @@ -1,94 +1,85 @@ -import React from 'react'; -import { ReactWidget } from '@jupyterlab/apputils'; -import { NotebookPanel } from '@jupyterlab/notebook'; -import { HTMLSelect } from '@jupyterlab/ui-components'; -import { deepnoteMetadataSchema } from '../types'; +import { ReactWidget } from '@jupyterlab/apputils' +import type { NotebookPanel } from '@jupyterlab/notebook' +import { HTMLSelect } from '@jupyterlab/ui-components' +// biome-ignore lint/style/useImportType: React is needed as value for JSX (tsconfig jsx: "react") +import React from 'react' +import { deepnoteMetadataSchema } from '../types' export class NotebookPicker extends ReactWidget { - private selected: string | null = null; + private selected: string | null = null constructor(private panel: NotebookPanel) { - super(); + super() void panel.context.ready.then(() => { - const deepnoteMetadata = this.panel.context.model.getMetadata('deepnote'); - const metadataNames = deepnoteMetadata?.notebook_names; - const names = - Array.isArray(metadataNames) && - metadataNames.every(n => typeof n === 'string') - ? metadataNames - : []; + const deepnoteMetadata = this.panel.context.model.getMetadata('deepnote') + const metadataNames = deepnoteMetadata?.notebook_names + const names = Array.isArray(metadataNames) && metadataNames.every(n => typeof n === 'string') ? metadataNames : [] - this.selected = names.length === 0 ? null : (names[0] ?? null); - this.update(); - }); + this.selected = names.length === 0 ? null : (names[0] ?? null) + this.update() + }) } private handleChange = (event: React.ChangeEvent) => { - const model = this.panel.model; + const model = this.panel.model if (!model) { - return; + return } - const selected = event.target.value; - const deepnoteMetadata = this.panel.context.model.getMetadata('deepnote'); - const deepnoteMetadataValidated = - deepnoteMetadataSchema.safeParse(deepnoteMetadata); + const selected = event.target.value + const deepnoteMetadata = this.panel.context.model.getMetadata('deepnote') + const deepnoteMetadataValidated = deepnoteMetadataSchema.safeParse(deepnoteMetadata) if (!deepnoteMetadataValidated.success) { - console.error( - 'Invalid deepnote metadata:', - deepnoteMetadataValidated.error - ); - return; + return } - const notebooks = deepnoteMetadataValidated.data.notebooks; + const notebooks = deepnoteMetadataValidated.data.notebooks if (selected in notebooks) { model.fromJSON({ cells: notebooks[selected]?.cells ?? [], metadata: { deepnote: { - notebooks - } + notebooks, + }, }, nbformat: 4, - nbformat_minor: 0 - }); - model.dirty = false; + nbformat_minor: 0, + }) + model.dirty = false } - this.selected = selected; - this.update(); - }; + this.selected = selected + this.update() + } render(): JSX.Element { - const deepnoteMetadata = this.panel.context.model.getMetadata('deepnote'); + const deepnoteMetadata = this.panel.context.model.getMetadata('deepnote') - const deepnoteMetadataValidated = - deepnoteMetadataSchema.safeParse(deepnoteMetadata); + const deepnoteMetadataValidated = deepnoteMetadataSchema.safeParse(deepnoteMetadata) const names = deepnoteMetadataValidated.success ? Object.values(deepnoteMetadataValidated.data.notebooks).map(n => n.name) - : []; + : [] return ( {}} - aria-label="Select active notebook" - title="Select active notebook" + aria-label='Select active notebook' + title='Select active notebook' style={{ maxWidth: '120px', textOverflow: 'ellipsis', whiteSpace: 'nowrap', - overflow: 'hidden' + overflow: 'hidden', }} > {names.length === 0 ? ( - + ) : ( names.map(n => ( - ); + ) } } diff --git a/src/convert-deepnote-block-to-jupyter-cell.ts b/src/convert-deepnote-block-to-jupyter-cell.ts index 5799004..1700f2a 100644 --- a/src/convert-deepnote-block-to-jupyter-cell.ts +++ b/src/convert-deepnote-block-to-jupyter-cell.ts @@ -1,44 +1,40 @@ -import { - createMarkdown, - createPythonCode, - DeepnoteBlock -} from '@deepnote/blocks'; -import _cloneDeep from 'lodash/cloneDeep'; -import { ICodeCell, IMarkdownCell } from '@jupyterlab/nbformat'; -import { convertDeepnoteBlockTypeToJupyter } from './convert-deepnote-block-type-to-jupyter'; +import { createMarkdown, createPythonCode, type DeepnoteBlock } from '@deepnote/blocks' +import type { ICodeCell, IMarkdownCell } from '@jupyterlab/nbformat' +import _cloneDeep from 'lodash/cloneDeep' +import { convertDeepnoteBlockTypeToJupyter } from './convert-deepnote-block-type-to-jupyter' export function convertDeepnoteBlockToJupyterCell(block: DeepnoteBlock) { - const blockCopy = _cloneDeep(block); - const jupyterCellMetadata = { ...blockCopy.metadata, cell_id: blockCopy.id }; - const jupyterCellType = convertDeepnoteBlockTypeToJupyter(blockCopy.type); + const blockCopy = _cloneDeep(block) + const jupyterCellMetadata = { ...blockCopy.metadata, cell_id: blockCopy.id } + const jupyterCellType = convertDeepnoteBlockTypeToJupyter(blockCopy.type) if (jupyterCellType === 'code') { - const blockOutputs = blockCopy.outputs ?? []; + const blockOutputs = blockCopy.outputs ?? [] if (Array.isArray(blockOutputs)) { blockOutputs.forEach(output => { - delete output.truncated; - }); + delete output.truncated + }) } - const source = createPythonCode(blockCopy); + const source = createPythonCode(blockCopy) const jupyterCell: ICodeCell = { cell_type: 'code', metadata: jupyterCellMetadata, execution_count: blockCopy.executionCount ?? null, outputs: blockOutputs, - source - }; - return jupyterCell; + source, + } + return jupyterCell } else { // Markdown cell - const source = createMarkdown(blockCopy); + const source = createMarkdown(blockCopy) const jupyterCell: IMarkdownCell = { cell_type: 'markdown', metadata: {}, - source - }; - return jupyterCell; + source, + } + return jupyterCell } } diff --git a/src/convert-deepnote-block-type-to-jupyter.ts b/src/convert-deepnote-block-type-to-jupyter.ts index 8543e9d..41a24b7 100644 --- a/src/convert-deepnote-block-type-to-jupyter.ts +++ b/src/convert-deepnote-block-type-to-jupyter.ts @@ -13,20 +13,8 @@ export function convertDeepnoteBlockTypeToJupyter(blockType: string) { case 'input-date': case 'input-slider': case 'visualization': - return 'code'; - - case 'markdown': - case 'text-cell-h1': - case 'text-cell-h3': - case 'text-cell-h2': - case 'text-cell-p': - case 'text-cell-bullet': - case 'text-cell-todo': - case 'text-cell-callout': - case 'image': - case 'button': - case 'separator': + return 'code' default: - return 'markdown'; + return 'markdown' } } diff --git a/src/deepnote-content-provider.ts b/src/deepnote-content-provider.ts index 540abb6..823ef95 100644 --- a/src/deepnote-content-provider.ts +++ b/src/deepnote-content-provider.ts @@ -1,59 +1,48 @@ -import { Contents, RestContentProvider } from '@jupyterlab/services'; -import { z } from 'zod'; -import { transformDeepnoteYamlToNotebookContent } from './transform-deepnote-yaml-to-notebook-content'; +import { type Contents, RestContentProvider } from '@jupyterlab/services' +import { z } from 'zod' +import { transformDeepnoteYamlToNotebookContent } from './transform-deepnote-yaml-to-notebook-content' -export const deepnoteContentProviderName = 'deepnote-content-provider'; +export const deepnoteContentProviderName = 'deepnote-content-provider' const deepnoteFileFromServerSchema = z.object({ cells: z.array(z.any()), // or refine further with nbformat metadata: z.object({ deepnote: z.object({ - rawYamlString: z.string() - }) + rawYamlString: z.string(), + }), }), nbformat: z.number(), - nbformat_minor: z.number() -}); + nbformat_minor: z.number(), +}) export class DeepnoteContentProvider extends RestContentProvider { - async get( - localPath: string, - options?: Contents.IFetchOptions - ): Promise { - const model = await super.get(localPath, options); - const isDeepnoteFile = - localPath.endsWith('.deepnote') && model.type === 'notebook'; + async get(localPath: string, options?: Contents.IFetchOptions): Promise { + const model = await super.get(localPath, options) + const isDeepnoteFile = localPath.endsWith('.deepnote') && model.type === 'notebook' if (!isDeepnoteFile) { // Not a .deepnote file, return as-is - return model; + return model } - const validatedModelContent = deepnoteFileFromServerSchema.safeParse( - model.content - ); + const validatedModelContent = deepnoteFileFromServerSchema.safeParse(model.content) if (!validatedModelContent.success) { - console.error( - 'Invalid .deepnote file content:', - validatedModelContent.error - ); // Return an empty notebook instead of throwing an error - model.content.cells = []; - return model; + model.content.cells = [] + return model } // Transform the Deepnote YAML to Jupyter notebook content - const transformedModelContent = - await transformDeepnoteYamlToNotebookContent( - validatedModelContent.data.metadata.deepnote.rawYamlString - ); + const transformedModelContent = await transformDeepnoteYamlToNotebookContent( + validatedModelContent.data.metadata.deepnote.rawYamlString + ) const transformedModel = { ...model, - content: transformedModelContent - }; + content: transformedModelContent, + } - return transformedModel; + return transformedModel } } diff --git a/src/fallback-data.ts b/src/fallback-data.ts index 28e89cf..4f39937 100644 --- a/src/fallback-data.ts +++ b/src/fallback-data.ts @@ -1,13 +1,13 @@ -import { ICodeCell } from '@jupyterlab/nbformat'; -import { IDeepnoteNotebookContent } from './types'; +import type { ICodeCell } from '@jupyterlab/nbformat' +import type { IDeepnoteNotebookContent } from './types' export const blankCodeCell: ICodeCell = { cell_type: 'code', source: '', metadata: {}, outputs: [], - execution_count: null -}; + execution_count: null, +} export const blankDeepnoteNotebookContent: IDeepnoteNotebookContent = { cells: [ @@ -16,14 +16,14 @@ export const blankDeepnoteNotebookContent: IDeepnoteNotebookContent = { source: '# Transformed from Deepnote YAML\n', metadata: {}, outputs: [], - execution_count: null - } + execution_count: null, + }, ], metadata: { deepnote: { - notebooks: {} - } + notebooks: {}, + }, }, nbformat: 4, - nbformat_minor: 0 -}; + nbformat_minor: 0, +} diff --git a/src/handler.ts b/src/handler.ts index 06cdd74..0a8c777 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -1,6 +1,6 @@ -import { URLExt } from '@jupyterlab/coreutils'; +import { URLExt } from '@jupyterlab/coreutils' -import { ServerConnection } from '@jupyterlab/services'; +import { ServerConnection } from '@jupyterlab/services' /** * Call the API extension @@ -9,38 +9,35 @@ import { ServerConnection } from '@jupyterlab/services'; * @param init Initial values for the request * @returns The response body interpreted as JSON */ -export async function requestAPI( - endPoint = '', - init: RequestInit = {} -): Promise { +export async function requestAPI(endPoint = '', init: RequestInit = {}): Promise { // Make request to Jupyter API - const settings = ServerConnection.makeSettings(); + const settings = ServerConnection.makeSettings() const requestUrl = URLExt.join( settings.baseUrl, 'jupyterlab-deepnote', // API Namespace endPoint - ); + ) - let response: Response; + let response: Response try { - response = await ServerConnection.makeRequest(requestUrl, init, settings); + response = await ServerConnection.makeRequest(requestUrl, init, settings) } catch (error) { - throw new ServerConnection.NetworkError(error as any); + throw new ServerConnection.NetworkError(error as Error) } - let data: any = await response.text(); + const dataText = await response.text() + let data: unknown = dataText - if (data.length > 0) { + if (dataText.length > 0) { try { - data = JSON.parse(data); - } catch (error) { - console.log('Not a JSON response body.', response); - } + data = JSON.parse(dataText) + } catch (_error) {} } if (!response.ok) { - throw new ServerConnection.ResponseError(response, data.message || data); + const errorData = data as { message?: string } + throw new ServerConnection.ResponseError(response, errorData.message || dataText) } - return data; + return data as T } diff --git a/src/index.ts b/src/index.ts index c54e61a..0759e94 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,20 +1,10 @@ -import { - JupyterFrontEnd, - JupyterFrontEndPlugin -} from '@jupyterlab/application'; -import { IToolbarWidgetRegistry } from '@jupyterlab/apputils'; -import { - INotebookWidgetFactory, - NotebookPanel, - NotebookWidgetFactory -} from '@jupyterlab/notebook'; -import { Widget } from '@lumino/widgets'; -import { ContentsManager } from '@jupyterlab/services'; -import { - DeepnoteContentProvider, - deepnoteContentProviderName -} from './deepnote-content-provider'; -import { NotebookPicker } from './components/NotebookPicker'; +import type { JupyterFrontEnd, JupyterFrontEndPlugin } from '@jupyterlab/application' +import { IToolbarWidgetRegistry } from '@jupyterlab/apputils' +import { INotebookWidgetFactory, type NotebookPanel, type NotebookWidgetFactory } from '@jupyterlab/notebook' +import type { ContentsManager } from '@jupyterlab/services' +import { Widget } from '@lumino/widgets' +import { NotebookPicker } from './components/NotebookPicker' +import { DeepnoteContentProvider, deepnoteContentProviderName } from './deepnote-content-provider' const plugin: JupyterFrontEndPlugin = { id: 'jupyterlab-deepnote:plugin', @@ -27,22 +17,18 @@ const plugin: JupyterFrontEndPlugin = { toolbarRegistry: IToolbarWidgetRegistry ) => { // Register a custom contents provider for the default notebook widget factory. - const drive = (app.serviceManager.contents as ContentsManager).defaultDrive; - const registry = drive?.contentProviderRegistry; + const drive = (app.serviceManager.contents as ContentsManager).defaultDrive + const registry = drive?.contentProviderRegistry if (!registry) { - // If content provider is a non-essential feature and support for JupyterLab <4.4 is desired: - console.error( - 'Cannot initialize content provider: no content provider registry.' - ); - return; + return } const deepnoteContentProvider = new DeepnoteContentProvider({ // These options are only required if extending the `RestContentProvider`. apiEndpoint: '/api/contents', - serverSettings: app.serviceManager.serverSettings - }); - registry.register(deepnoteContentProviderName, deepnoteContentProvider); - notebookWidgetFactory.contentProviderId = deepnoteContentProviderName; + serverSettings: app.serviceManager.serverSettings, + }) + registry.register(deepnoteContentProviderName, deepnoteContentProvider) + notebookWidgetFactory.contentProviderId = deepnoteContentProviderName // Register .deepnote file type and set the notebook widget factory as the default. app.docRegistry.addFileType( @@ -52,28 +38,21 @@ const plugin: JupyterFrontEndPlugin = { extensions: ['.deepnote'], mimeTypes: ['text/yaml', 'application/x-yaml'], fileFormat: 'text', - contentType: 'file' + contentType: 'file', }, [notebookWidgetFactory.name] - ); - app.docRegistry.setDefaultWidgetFactory( - 'deepnote', - notebookWidgetFactory.name - ); + ) + app.docRegistry.setDefaultWidgetFactory('deepnote', notebookWidgetFactory.name) // Add a toolbar item to switch between notebooks in a .deepnote file. - toolbarRegistry.addFactory( - notebookWidgetFactory.name, - 'deepnote:switch-notebook', - panel => { - if (!panel.context.path.endsWith('.deepnote')) { - return new Widget(); // don’t render for .ipynb or others - } - - return new NotebookPicker(panel); + toolbarRegistry.addFactory(notebookWidgetFactory.name, 'deepnote:switch-notebook', panel => { + if (!panel.context.path.endsWith('.deepnote')) { + return new Widget() // don’t render for .ipynb or others } - ); - } -}; -export default plugin; + return new NotebookPicker(panel) + }) + }, +} + +export default plugin diff --git a/src/transform-deepnote-yaml-to-notebook-content.ts b/src/transform-deepnote-yaml-to-notebook-content.ts index a760ab8..d961f90 100644 --- a/src/transform-deepnote-yaml-to-notebook-content.ts +++ b/src/transform-deepnote-yaml-to-notebook-content.ts @@ -1,27 +1,25 @@ -import { IDeepnoteNotebookContent, IDeepnoteNotebookMetadata } from './types'; -import { blankCodeCell, blankDeepnoteNotebookContent } from './fallback-data'; -import { deserializeDeepnoteFile } from '@deepnote/blocks'; -import { convertDeepnoteBlockToJupyterCell } from './convert-deepnote-block-to-jupyter-cell'; +import { deserializeDeepnoteFile } from '@deepnote/blocks' +import { convertDeepnoteBlockToJupyterCell } from './convert-deepnote-block-to-jupyter-cell' +import { blankCodeCell, blankDeepnoteNotebookContent } from './fallback-data' +import type { IDeepnoteNotebookContent, IDeepnoteNotebookMetadata } from './types' -export async function transformDeepnoteYamlToNotebookContent( - yamlString: string -): Promise { +export async function transformDeepnoteYamlToNotebookContent(yamlString: string): Promise { try { - const deepnoteFile = await deserializeDeepnoteFile(yamlString); + const deepnoteFile = await deserializeDeepnoteFile(yamlString) const notebooks = deepnoteFile.project.notebooks.reduce( (acc, notebook) => { acc[notebook.name] = { id: notebook.id, name: notebook.name, - cells: notebook.blocks.map(convertDeepnoteBlockToJupyterCell) - }; - return acc; + cells: notebook.blocks.map(convertDeepnoteBlockToJupyterCell), + } + return acc }, {} as IDeepnoteNotebookMetadata['deepnote']['notebooks'] - ); + ) - const selectedNotebook = deepnoteFile.project.notebooks[0]; + const selectedNotebook = deepnoteFile.project.notebooks[0] if (!selectedNotebook) { return { @@ -29,28 +27,25 @@ export async function transformDeepnoteYamlToNotebookContent( cells: [ { ...blankCodeCell, - source: '# No notebooks found in the Deepnote file.\n' - } - ] - }; + source: '# No notebooks found in the Deepnote file.\n', + }, + ], + } } - const cells = selectedNotebook.blocks.map( - convertDeepnoteBlockToJupyterCell - ); + const cells = selectedNotebook.blocks.map(convertDeepnoteBlockToJupyterCell) return { cells, metadata: { deepnote: { - notebooks - } + notebooks, + }, }, nbformat: 4, - nbformat_minor: 0 - }; - } catch (error) { - console.error('Failed to deserialize Deepnote file:', error); - throw new Error('Failed to transform Deepnote YAML to notebook content.'); + nbformat_minor: 0, + } + } catch (_error) { + throw new Error('Failed to transform Deepnote YAML to notebook content.') } } diff --git a/src/types.ts b/src/types.ts index 95ad5e8..e01bfb6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,11 +1,6 @@ -import { - ICodeCell, - IMarkdownCell, - INotebookContent, - INotebookMetadata -} from '@jupyterlab/nbformat'; +import type { ICodeCell, IMarkdownCell, INotebookContent, INotebookMetadata } from '@jupyterlab/nbformat' -import { z } from 'zod'; +import { z } from 'zod' export const deepnoteMetadataSchema = z.object({ notebooks: z.record( @@ -13,25 +8,24 @@ export const deepnoteMetadataSchema = z.object({ z.object({ id: z.string(), name: z.string(), - cells: z.array(z.any()) + cells: z.array(z.any()), }) - ) -}); + ), +}) export interface IDeepnoteNotebookMetadata extends INotebookMetadata { deepnote: { notebooks: Record< string, { - id: string; - name: string; - cells: Array; + id: string + name: string + cells: Array } - >; - }; + > + } } -export interface IDeepnoteNotebookContent - extends Omit { - metadata: IDeepnoteNotebookMetadata; +export interface IDeepnoteNotebookContent extends Omit { + metadata: IDeepnoteNotebookMetadata } diff --git a/style/index.css b/style/index.css index 8a7ea29..91933fb 100644 --- a/style/index.css +++ b/style/index.css @@ -1 +1 @@ -@import url('base.css'); +@import url("base.css"); diff --git a/style/index.js b/style/index.js index a028a76..12f4bea 100644 --- a/style/index.js +++ b/style/index.js @@ -1 +1 @@ -import './base.css'; +import './base.css' diff --git a/ui-tests/playwright.config.js b/ui-tests/playwright.config.js index 9ece6fa..ba991d0 100644 --- a/ui-tests/playwright.config.js +++ b/ui-tests/playwright.config.js @@ -1,7 +1,7 @@ /** * Configuration for Playwright using default from @jupyterlab/galata */ -const baseConfig = require('@jupyterlab/galata/lib/playwright-config'); +const baseConfig = require('@jupyterlab/galata/lib/playwright-config') module.exports = { ...baseConfig, @@ -9,6 +9,6 @@ module.exports = { command: 'jlpm start', url: 'http://localhost:8888/lab', timeout: 120 * 1000, - reuseExistingServer: !process.env.CI - } -}; + reuseExistingServer: !process.env.CI, + }, +} diff --git a/ui-tests/tests/jupyterlab_deepnote.spec.ts b/ui-tests/tests/jupyterlab_deepnote.spec.ts index b2e89e9..3a8f1d4 100644 --- a/ui-tests/tests/jupyterlab_deepnote.spec.ts +++ b/ui-tests/tests/jupyterlab_deepnote.spec.ts @@ -1,23 +1,19 @@ -import { expect, test } from '@jupyterlab/galata'; +import { expect, test } from '@jupyterlab/galata' /** * Don't load JupyterLab webpage before running the tests. * This is required to ensure we capture all log messages. */ -test.use({ autoGoto: false }); +test.use({ autoGoto: false }) test('should emit an activation console message', async ({ page }) => { - const logs: string[] = []; + const logs: string[] = [] page.on('console', message => { - logs.push(message.text()); - }); + logs.push(message.text()) + }) - await page.goto(); + await page.goto() - expect( - logs.filter( - s => s === 'JupyterLab extension jupyterlab-deepnote is activated!' - ) - ).toHaveLength(1); -}); + expect(logs.filter(s => s === 'JupyterLab extension jupyterlab-deepnote is activated!')).toHaveLength(1) +}) diff --git a/yarn.lock b/yarn.lock index 0c7ce38..0a588c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1286,6 +1286,97 @@ __metadata: languageName: node linkType: hard +"@biomejs/biome@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/biome@npm:2.2.5" + dependencies: + "@biomejs/cli-darwin-arm64": 2.2.5 + "@biomejs/cli-darwin-x64": 2.2.5 + "@biomejs/cli-linux-arm64": 2.2.5 + "@biomejs/cli-linux-arm64-musl": 2.2.5 + "@biomejs/cli-linux-x64": 2.2.5 + "@biomejs/cli-linux-x64-musl": 2.2.5 + "@biomejs/cli-win32-arm64": 2.2.5 + "@biomejs/cli-win32-x64": 2.2.5 + dependenciesMeta: + "@biomejs/cli-darwin-arm64": + optional: true + "@biomejs/cli-darwin-x64": + optional: true + "@biomejs/cli-linux-arm64": + optional: true + "@biomejs/cli-linux-arm64-musl": + optional: true + "@biomejs/cli-linux-x64": + optional: true + "@biomejs/cli-linux-x64-musl": + optional: true + "@biomejs/cli-win32-arm64": + optional: true + "@biomejs/cli-win32-x64": + optional: true + bin: + biome: bin/biome + checksum: 6d03f919a3ee099cbcb2d9e1161b598bc57c889815dcd5ce9e37ba6443dd59db62ebdf3cc56d1e18c90d5b4d6ea4d9e8a6c41003ab8eee483eb3d27d322c6615 + languageName: node + linkType: hard + +"@biomejs/cli-darwin-arm64@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/cli-darwin-arm64@npm:2.2.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@biomejs/cli-darwin-x64@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/cli-darwin-x64@npm:2.2.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@biomejs/cli-linux-arm64-musl@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/cli-linux-arm64-musl@npm:2.2.5" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@biomejs/cli-linux-arm64@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/cli-linux-arm64@npm:2.2.5" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@biomejs/cli-linux-x64-musl@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/cli-linux-x64-musl@npm:2.2.5" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@biomejs/cli-linux-x64@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/cli-linux-x64@npm:2.2.5" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@biomejs/cli-win32-arm64@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/cli-win32-arm64@npm:2.2.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@biomejs/cli-win32-x64@npm:2.2.5": + version: 2.2.5 + resolution: "@biomejs/cli-win32-x64@npm:2.2.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.18.6, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.7.1": version: 6.18.7 resolution: "@codemirror/autocomplete@npm:6.18.7" @@ -1595,48 +1686,6 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.9.0 - resolution: "@eslint-community/eslint-utils@npm:4.9.0" - dependencies: - eslint-visitor-keys: ^3.4.3 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: ae9b98eea006d1354368804b0116b8b45017a4e47b486d1b9cfa048a8ed3dc69b9b074eb2b2acb14034e6897c24048fd42b6a6816d9dc8bb9daad79db7d478d2 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.6.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 - languageName: node - linkType: hard - -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 2afb77454c06e8316793d2e8e79a0154854d35e6782a1217da274ca60b5044d2c69d6091155234ed0551a1e408f86f09dd4ece02752c59568fa403e60611e880 - languageName: node - linkType: hard - "@fortawesome/fontawesome-free@npm:^5.12.0": version: 5.15.4 resolution: "@fortawesome/fontawesome-free@npm:5.15.4" @@ -1644,31 +1693,6 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" - dependencies: - "@humanwhocodes/object-schema": ^2.0.3 - debug: ^4.3.1 - minimatch: ^3.0.5 - checksum: eae69ff9134025dd2924f0b430eb324981494be26f0fddd267a33c28711c4db643242cf9fddf7dadb9d16c96b54b2d2c073e60a56477df86e0173149313bd5d6 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -3030,7 +3054,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -3069,13 +3093,6 @@ __metadata: languageName: node linkType: hard -"@pkgr/core@npm:^0.2.9": - version: 0.2.9 - resolution: "@pkgr/core@npm:0.2.9" - checksum: bb2fb86977d63f836f8f5b09015d74e6af6488f7a411dcd2bfdca79d76b5a681a9112f41c45bdf88a9069f049718efc6f3900d7f1de66a2ec966068308ae517f - languageName: node - linkType: hard - "@rjsf/core@npm:^5.13.4": version: 5.24.13 resolution: "@rjsf/core@npm:5.24.13" @@ -3270,7 +3287,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -3343,13 +3360,6 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.5.0": - version: 7.7.1 - resolution: "@types/semver@npm:7.7.1" - checksum: 76d218e414482a398148d5c28f2bfa017108869f3fc18cda379c9d8d062348f8b9653ae2fa8642d3b5b52e211928fe8be34f22da4e1f08245c84e0e51e040673 - languageName: node - linkType: hard - "@types/source-list-map@npm:*": version: 0.1.6 resolution: "@types/source-list-map@npm:0.1.6" @@ -3398,136 +3408,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.1.0": - version: 6.21.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" - dependencies: - "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/type-utils": 6.21.0 - "@typescript-eslint/utils": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.4 - natural-compare: ^1.4.0 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^6.1.0": - version: 6.21.0 - resolution: "@typescript-eslint/parser@npm:6.21.0" - dependencies: - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/scope-manager@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/type-utils@npm:6.21.0" - dependencies: - "@typescript-eslint/typescript-estree": 6.21.0 - "@typescript-eslint/utils": 6.21.0 - debug: ^4.3.4 - ts-api-utils: ^1.0.1 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/types@npm:6.21.0" - checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - minimatch: 9.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/utils@npm:6.21.0" - dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@types/json-schema": ^7.0.12 - "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0 - semver: ^7.5.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - eslint-visitor-keys: ^3.4.1 - checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.3.0 - resolution: "@ungap/structured-clone@npm:1.3.0" - checksum: 64ed518f49c2b31f5b50f8570a1e37bde3b62f2460042c50f132430b2d869c4a6586f13aa33a58a4722715b8158c68cae2827389d6752ac54da2893c83e480fc - languageName: node - linkType: hard - "@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/ast@npm:1.14.1" @@ -3759,15 +3639,6 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - "acorn-walk@npm:^8.0.2": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" @@ -3777,7 +3648,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.8.1, acorn@npm:^8.9.0": +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.8.1": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -4532,7 +4403,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -4652,7 +4523,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.1": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.4.1": version: 4.4.1 resolution: "debug@npm:4.4.1" dependencies: @@ -4707,13 +4578,6 @@ __metadata: languageName: node linkType: hard -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - "deepmerge@npm:^4.2.2": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" @@ -4751,15 +4615,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - "dom-serializer@npm:^2.0.0": version: 2.0.0 resolution: "dom-serializer@npm:2.0.0" @@ -5039,37 +4894,6 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^8.8.0": - version: 8.10.2 - resolution: "eslint-config-prettier@npm:8.10.2" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: a92b7e8a996e65adf79de1579524235687e9d3552d088cfab4f170da60d23762addb4276169c8ca3a9551329dda8408c59f7e414101b238a6385379ac1bc3b16 - languageName: node - linkType: hard - -"eslint-plugin-prettier@npm:^5.0.0": - version: 5.5.4 - resolution: "eslint-plugin-prettier@npm:5.5.4" - dependencies: - prettier-linter-helpers: ^1.0.0 - synckit: ^0.11.7 - peerDependencies: - "@types/eslint": ">=8.0.0" - eslint: ">=8.0.0" - eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" - prettier: ">=3.0.0" - peerDependenciesMeta: - "@types/eslint": - optional: true - eslint-config-prettier: - optional: true - checksum: 0dd05ed85018ab0e98da80325b7bd4c4ab6dd684398f1270a7c8cf4261df714dd4502ba4c7f85f651aade9989da0a7d2adda03af8873b73b52014141abf385de - languageName: node - linkType: hard - "eslint-scope@npm:5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" @@ -5080,82 +4904,6 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 - languageName: node - linkType: hard - -"eslint@npm:^8.36.0": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.4 - "@eslint/js": 8.57.1 - "@humanwhocodes/config-array": ^0.13.0 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - "@ungap/structured-clone": ^1.2.0 - ajv: ^6.12.4 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 - esquery: ^1.4.2 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - graphemer: ^1.4.0 - ignore: ^5.2.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.3 - strip-ansi: ^6.0.1 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: e2489bb7f86dd2011967759a09164e65744ef7688c310bc990612fc26953f34cc391872807486b15c06833bdff737726a23e9b4cdba5de144c311377dc41d91b - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 - languageName: node - linkType: hard - "esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -5166,15 +4914,6 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: ^5.1.0 - checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 - languageName: node - linkType: hard - "esrecurse@npm:^4.3.0": version: 4.3.0 resolution: "esrecurse@npm:4.3.0" @@ -5191,7 +4930,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": +"estraverse@npm:^5.2.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b @@ -5304,13 +5043,6 @@ __metadata: languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - "fast-uri@npm:^3.0.1": version: 3.1.0 resolution: "fast-uri@npm:3.1.0" @@ -5355,15 +5087,6 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - "file-entry-cache@npm:^7.0.0": version: 7.0.2 resolution: "file-entry-cache@npm:7.0.2" @@ -5409,7 +5132,7 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4, flat-cache@npm:^3.2.0": +"flat-cache@npm:^3.2.0": version: 3.2.0 resolution: "flat-cache@npm:3.2.0" dependencies: @@ -5591,15 +5314,6 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - "glob-to-regexp@npm:^0.4.1": version: 0.4.1 resolution: "glob-to-regexp@npm:0.4.1" @@ -5671,15 +5385,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: ^0.20.2 - checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c - languageName: node - linkType: hard - "globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" @@ -5715,13 +5420,6 @@ __metadata: languageName: node linkType: hard -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - "handlebars@npm:^4.7.8": version: 4.7.8 resolution: "handlebars@npm:4.7.8" @@ -5935,7 +5633,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": +"import-fresh@npm:^3.3.0": version: 3.3.1 resolution: "import-fresh@npm:3.3.1" dependencies: @@ -6062,7 +5760,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": +"is-glob@npm:^4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -6078,13 +5776,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-obj@npm:^1.1.0": version: 1.1.0 resolution: "is-plain-obj@npm:1.1.0" @@ -6853,13 +6544,6 @@ __metadata: languageName: node linkType: hard -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - "json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -6893,6 +6577,7 @@ __metadata: version: 0.0.0-use.local resolution: "jupyterlab-deepnote@workspace:." dependencies: + "@biomejs/biome": 2.2.5 "@deepnote/blocks": ^1.1.0 "@jupyterlab/application": ^4.0.0 "@jupyterlab/builder": ^4.0.0 @@ -6907,19 +6592,14 @@ __metadata: "@types/lodash": ^4.17.20 "@types/react": ^18.0.26 "@types/react-addons-linked-state-mixin": ^0.14.22 - "@typescript-eslint/eslint-plugin": ^6.1.0 - "@typescript-eslint/parser": ^6.1.0 css-loader: ^6.7.1 - eslint: ^8.36.0 - eslint-config-prettier: ^8.8.0 - eslint-plugin-prettier: ^5.0.0 husky: 9.1.7 jest: ^29.2.0 lint-staged: 16.2.3 lodash: ^4.17.21 mkdirp: ^1.0.3 npm-run-all2: ^7.0.1 - prettier: ^3.0.0 + prettier: 3.6.2 rimraf: ^5.0.1 source-map-loader: ^1.0.2 style-loader: ^3.3.1 @@ -6972,16 +6652,6 @@ __metadata: languageName: node linkType: hard -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - "lib0@npm:^0.2.85, lib0@npm:^0.2.99": version: 0.2.114 resolution: "lib0@npm:0.2.114" @@ -7110,13 +6780,6 @@ __metadata: languageName: node linkType: hard -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - "lodash.mergewith@npm:^4.6.1": version: 4.6.2 resolution: "lodash.mergewith@npm:4.6.2" @@ -7384,16 +7047,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -7709,20 +7363,6 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.9.3": - version: 0.9.4 - resolution: "optionator@npm:0.9.4" - dependencies: - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - word-wrap: ^1.2.5 - checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb - languageName: node - linkType: hard - "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -8013,13 +7653,6 @@ __metadata: languageName: node linkType: hard -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - "prettier-linter-helpers@npm:^1.0.0": version: 1.0.0 resolution: "prettier-linter-helpers@npm:1.0.0" @@ -8029,7 +7662,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.0.0": +"prettier@npm:3.6.2": version: 3.6.2 resolution: "prettier@npm:3.6.2" bin: @@ -9068,15 +8701,6 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.11.7": - version: 0.11.11 - resolution: "synckit@npm:0.11.11" - dependencies: - "@pkgr/core": ^0.2.9 - checksum: bc896d4320525501495654766e6b0aa394e522476ea0547af603bdd9fd7e9b65dcd6e3a237bc7eb3ab7e196376712f228bf1bf6ed1e1809f4b32dc9baf7ad413 - languageName: node - linkType: hard - "tabbable@npm:^5.2.0": version: 5.3.3 resolution: "tabbable@npm:5.3.3" @@ -9165,13 +8789,6 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - "tinyglobby@npm:^0.2.12": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" @@ -9235,15 +8852,6 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": - version: 1.4.3 - resolution: "ts-api-utils@npm:1.4.3" - peerDependencies: - typescript: ">=4.2.0" - checksum: ea00dee382d19066b2a3d8929f1089888b05fec797e32e7a7004938eda1dccf2e77274ee2afcd4166f53fab9b8d7ee90ebb225a3183f9ba8817d636f688a148d - languageName: node - linkType: hard - "ts-dedent@npm:^2.2.0": version: 2.2.0 resolution: "ts-dedent@npm:2.2.0" @@ -9298,15 +8906,6 @@ __metadata: languageName: node linkType: hard -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - "type-detect@npm:4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -9314,13 +8913,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -9839,13 +9431,6 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:^1.2.5": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb - languageName: node - linkType: hard - "wordwrap@npm:^1.0.0": version: 1.0.0 resolution: "wordwrap@npm:1.0.0"