A monorepo containing jupyter-blocks and jupyter-tidyblocks. Blockly extension for JupyterLab.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix build pipeline: bypass jlpm, fix turbo outputs, add LICENSE/README

Extension labextension build:
- Replace `jupyter labextension build` with direct `build-labextension`
invocations in both extension packages, bypassing the jlpm install
step that conflicts with npm workspace symlinks (EEXIST error)
- Add per-package turbo.json for blocks-extension and tidyblocks-extension
so each package declares only its own labextension output; removes
incorrect shared output declarations from root turbo.json that caused
turbo cache restores to overwrite freshly built labextension artifacts
- Rebuild tidyblocks-extension in production mode

Python package install:
- Add LICENSE and README.md symlinks to jupyter_blocks/ and
jupyter_tidyblocks/ so hatchling can resolve them during pip install -e

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

+170 -65
+1
jupyter_blocks/LICENSE
··· 1 + ../LICENSE
+1
jupyter_blocks/README.md
··· 1 + ../README.md
+104
jupyter_blocks/labextension/package.json
··· 1 + { 2 + "name": "jupyter-blocks-extension", 3 + "version": "0.1.0-alpha.0", 4 + "description": "Generic Blockly editor for JupyterLab — extension plugin.", 5 + "keywords": [ 6 + "jupyter", 7 + "jupyterlab", 8 + "jupyterlab-extension", 9 + "blockly", 10 + "blocks" 11 + ], 12 + "homepage": "https://github.com/teonbrooks/jupyter-blocks", 13 + "bugs": { 14 + "url": "https://github.com/teonbrooks/jupyter-blocks/issues" 15 + }, 16 + "license": "BSD-3-Clause", 17 + "author": { 18 + "name": "Teon L. Brooks", 19 + "email": "teon.brooks@gmail.com" 20 + }, 21 + "files": [ 22 + "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", 23 + "style/**/*.{css,js,eot,gif,html,jpg,json,png,svg,woff2,ttf}" 24 + ], 25 + "main": "lib/index.js", 26 + "types": "lib/index.d.ts", 27 + "style": "style/index.css", 28 + "repository": { 29 + "type": "git", 30 + "url": "https://github.com/teonbrooks/jupyter-blocks" 31 + }, 32 + "scripts": { 33 + "build": "npm run build:lib && npm run build:labextension:dev", 34 + "build:prod": "npm run clean && npm run build:lib && npm run build:labextension", 35 + "build:labextension": "build-labextension --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") .", 36 + "build:labextension:dev": "build-labextension --development --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") .", 37 + "build:lib": "tsc", 38 + "clean": "npm run clean:lib", 39 + "clean:lib": "rimraf lib tsconfig.tsbuildinfo", 40 + "clean:labextension": "rimraf ../../jupyter_blocks/labextension", 41 + "clean:all": "npm run clean:lib && npm run clean:labextension", 42 + "install:extension": "npm run build", 43 + "watch": "run-p watch:src watch:labextension", 44 + "watch:src": "tsc -w --sourceMap", 45 + "watch:labextension": "build-labextension --development --watch --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") ." 46 + }, 47 + "dependencies": { 48 + "@jupyter-widgets/base": "^6.0.10", 49 + "@jupyter-widgets/jupyterlab-manager": "^5.0.13", 50 + "@jupyterlab/application": "^4.5", 51 + "@jupyterlab/apputils": "^4.5", 52 + "@jupyterlab/cells": "^4.5", 53 + "@jupyterlab/codeeditor": "^4.5", 54 + "@jupyterlab/filebrowser": "^4.5", 55 + "@jupyterlab/launcher": "^4.5", 56 + "@jupyterlab/mainmenu": "^4.5", 57 + "@jupyterlab/rendermime": "^4.5", 58 + "@jupyterlab/settingregistry": "^4.5", 59 + "@jupyterlab/translation": "^4.5", 60 + "@jupyterlab/ui-components": "^4.5", 61 + "jupyter-blocks": "^0.1.0-alpha.0" 62 + }, 63 + "devDependencies": { 64 + "@jupyterlab/builder": "^4.5", 65 + "npm-run-all2": "^7.0.0", 66 + "rimraf": "^6.0.0", 67 + "typescript": "~5.7" 68 + }, 69 + "sideEffects": [ 70 + "style/*.css", 71 + "style/index.js" 72 + ], 73 + "styleModule": "style/index.js", 74 + "publishConfig": { 75 + "access": "public" 76 + }, 77 + "jupyterlab": { 78 + "extension": true, 79 + "outputDir": "../../jupyter_blocks/labextension", 80 + "sharedPackages": { 81 + "jupyter-blocks": { 82 + "bundled": true, 83 + "singleton": true 84 + }, 85 + "blockly": { 86 + "bundled": true, 87 + "singleton": true 88 + }, 89 + "@jupyter-widgets/base": { 90 + "bundled": false, 91 + "singleton": true 92 + }, 93 + "@jupyter-widgets/jupyterlab-manager": { 94 + "bundled": false, 95 + "singleton": true 96 + } 97 + }, 98 + "_build": { 99 + "load": "static/remoteEntry.eb8234410442ad00ae98.js", 100 + "extension": "./extension", 101 + "style": "./style" 102 + } 103 + } 104 + }
+1
jupyter_tidyblocks/LICENSE
··· 1 + ../LICENSE
+1
jupyter_tidyblocks/README.md
··· 1 + ../README.md
+15 -16
jupyter_tidyblocks/labextension/build_log.json jupyter_blocks/labextension/build_log.json
··· 10 10 { 11 11 "test": "/(?<!\\.raw)\\.css$/", 12 12 "use": [ 13 - "/Users/teonbrooks/codespace/jupyter-tidyblocks/node_modules/style-loader/dist/cjs.js", 14 - "/Users/teonbrooks/codespace/jupyter-tidyblocks/node_modules/css-loader/dist/cjs.js" 13 + "/Users/teonbrooks/codespace/jupyter-blocks/node_modules/style-loader/dist/cjs.js", 14 + "/Users/teonbrooks/codespace/jupyter-blocks/node_modules/css-loader/dist/cjs.js" 15 15 ] 16 16 }, 17 17 { ··· 81 81 "test": "/\\.js$/", 82 82 "enforce": "pre", 83 83 "use": [ 84 - "/Users/teonbrooks/codespace/jupyter-tidyblocks/node_modules/source-map-loader/dist/cjs.js" 84 + "/Users/teonbrooks/codespace/jupyter-blocks/node_modules/source-map-loader/dist/cjs.js" 85 85 ] 86 86 } 87 87 ] ··· 91 91 "url": false, 92 92 "buffer": false, 93 93 "crypto": false, 94 - "path": "/Users/teonbrooks/codespace/jupyter-tidyblocks/node_modules/path-browserify/index.js", 95 - "process": "/Users/teonbrooks/codespace/jupyter-tidyblocks/node_modules/process/browser.js" 94 + "path": "/Users/teonbrooks/codespace/jupyter-blocks/node_modules/path-browserify/index.js", 95 + "process": "/Users/teonbrooks/codespace/jupyter-blocks/node_modules/process/browser.js" 96 96 } 97 97 }, 98 98 "watchOptions": { ··· 102 102 "output": { 103 103 "hashFunction": "sha256", 104 104 "filename": "[name].[contenthash].js", 105 - "path": "/Users/teonbrooks/codespace/jupyter-tidyblocks/jupyter_tidyblocks/labextension/static", 105 + "path": "/Users/teonbrooks/codespace/jupyter-blocks/jupyter_blocks/labextension/static", 106 106 "publicPath": "auto" 107 107 }, 108 108 "plugins": [ ··· 113 113 }, 114 114 { 115 115 "_options": { 116 - "name": "jupyter-tidyblocks-extension", 116 + "name": "jupyter-blocks-extension", 117 117 "library": { 118 118 "type": "var", 119 119 "name": [ 120 120 "_JUPYTERLAB", 121 - "jupyter-tidyblocks-extension" 121 + "jupyter-blocks-extension" 122 122 ] 123 123 }, 124 124 "filename": "remoteEntry.[contenthash].js", 125 125 "exposes": { 126 - "./index": "/Users/teonbrooks/codespace/jupyter-tidyblocks/packages/blockly-extension/lib/index.js", 127 - "./extension": "/Users/teonbrooks/codespace/jupyter-tidyblocks/packages/blockly-extension/lib/index.js", 128 - "./style": "/Users/teonbrooks/codespace/jupyter-tidyblocks/packages/blockly-extension/style/index.js" 126 + "./index": "/Users/teonbrooks/codespace/jupyter-blocks/packages/blocks-extension/lib/index.js", 127 + "./extension": "/Users/teonbrooks/codespace/jupyter-blocks/packages/blocks-extension/lib/index.js", 128 + "./style": "/Users/teonbrooks/codespace/jupyter-blocks/packages/blocks-extension/style/index.js" 129 129 }, 130 130 "shared": { 131 131 "@jupyterlab/application": { ··· 719 719 "singleton": true, 720 720 "import": false 721 721 }, 722 - "jupyter-tidyblocks": { 722 + "jupyter-blocks": { 723 723 "singleton": true 724 724 }, 725 - "jupyter-tidyblocks-blocks": {}, 726 725 "blockly": { 727 726 "singleton": true 728 727 }, 729 - "jupyter-tidyblocks-extension": { 730 - "version": "0.1.0", 728 + "jupyter-blocks-extension": { 729 + "version": "0.1.0-alpha.0", 731 730 "singleton": true, 732 - "import": "/Users/teonbrooks/codespace/jupyter-tidyblocks/packages/blockly-extension/lib/index.js" 731 + "import": "/Users/teonbrooks/codespace/jupyter-blocks/packages/blocks-extension/lib/index.js" 733 732 } 734 733 } 735 734 }
+15 -31
jupyter_tidyblocks/labextension/package.json
··· 1 1 { 2 2 "name": "jupyter-tidyblocks-extension", 3 - "version": "0.1.0", 4 - "description": "Tidy data analysis with Blockly blocks for JupyterLab — extension plugin.", 3 + "version": "0.1.0-alpha.0", 4 + "description": "Tidy data analysis extension for jupyter-blocks.", 5 5 "keywords": [ 6 6 "jupyter", 7 7 "jupyterlab", ··· 10 10 "tidy-data", 11 11 "data-analysis" 12 12 ], 13 - "homepage": "https://github.com/teonbrooks/jupyter-tidyblocks", 13 + "homepage": "https://github.com/teonbrooks/jupyter-blocks", 14 14 "bugs": { 15 - "url": "https://github.com/teonbrooks/jupyter-tidyblocks/issues" 15 + "url": "https://github.com/teonbrooks/jupyter-blocks/issues" 16 16 }, 17 17 "license": "BSD-3-Clause", 18 18 "author": { ··· 28 28 "style": "style/index.css", 29 29 "repository": { 30 30 "type": "git", 31 - "url": "https://github.com/teonbrooks/jupyter-tidyblocks" 31 + "url": "https://github.com/teonbrooks/jupyter-blocks" 32 32 }, 33 33 "scripts": { 34 34 "build": "npm run build:lib && npm run build:labextension:dev", 35 35 "build:prod": "npm run clean && npm run build:lib && npm run build:labextension", 36 - "build:labextension": "jupyter labextension build .", 37 - "build:labextension:dev": "jupyter labextension build --development True .", 36 + "build:labextension": "build-labextension --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") .", 37 + "build:labextension:dev": "build-labextension --development --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") .", 38 38 "build:lib": "tsc", 39 39 "clean": "npm run clean:lib", 40 40 "clean:lib": "rimraf lib tsconfig.tsbuildinfo", ··· 43 43 "install:extension": "npm run build", 44 44 "watch": "run-p watch:src watch:labextension", 45 45 "watch:src": "tsc -w --sourceMap", 46 - "watch:labextension": "jupyter labextension watch ." 46 + "watch:labextension": "build-labextension --development --watch --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") ." 47 47 }, 48 48 "dependencies": { 49 - "@jupyter-widgets/base": "^6.0.10", 50 - "@jupyter-widgets/jupyterlab-manager": "^5.0.13", 51 49 "@jupyterlab/application": "^4.5", 52 - "@jupyterlab/apputils": "^4.5", 53 - "@jupyterlab/cells": "^4.5", 54 - "@jupyterlab/codeeditor": "^4.5", 55 - "@jupyterlab/filebrowser": "^4.5", 56 - "@jupyterlab/launcher": "^4.5", 57 - "@jupyterlab/mainmenu": "^4.5", 58 - "@jupyterlab/rendermime": "^4.5", 59 - "@jupyterlab/settingregistry": "^4.5", 60 - "@jupyterlab/translation": "^4.5", 61 - "@jupyterlab/ui-components": "^4.5", 62 - "jupyter-tidyblocks": "^0.1.0", 63 - "jupyter-tidyblocks-blocks": "^0.1.0" 50 + "jupyter-blocks": "^0.1.0-alpha.0", 51 + "jupyter-tidyblocks": "^0.1.0-alpha.0" 64 52 }, 65 53 "devDependencies": { 66 54 "@jupyterlab/builder": "^4.5", ··· 80 68 "extension": true, 81 69 "outputDir": "../../jupyter_tidyblocks/labextension", 82 70 "sharedPackages": { 71 + "jupyter-blocks": { 72 + "bundled": false, 73 + "singleton": true 74 + }, 83 75 "jupyter-tidyblocks": { 84 76 "bundled": true, 85 77 "singleton": true 86 78 }, 87 79 "blockly": { 88 - "bundled": true, 89 - "singleton": true 90 - }, 91 - "@jupyter-widgets/base": { 92 - "bundled": false, 93 - "singleton": true 94 - }, 95 - "@jupyter-widgets/jupyterlab-manager": { 96 80 "bundled": false, 97 81 "singleton": true 98 82 } 99 83 }, 100 84 "_build": { 101 - "load": "static/remoteEntry.a2e6fa6b678931659f31.js", 85 + "load": "static/remoteEntry.2b8d4329eca3b2e79b96.js", 102 86 "extension": "./extension", 103 87 "style": "./style" 104 88 }
+2 -2
package.json
··· 64 64 "@typescript-eslint/eslint-plugin": "^8.0.0", 65 65 "@typescript-eslint/parser": "^8.0.0", 66 66 "eslint": "^9.0.0", 67 - "typescript-eslint": "^8.0.0", 68 67 "eslint-config-prettier": "^9.0.0", 69 68 "eslint-plugin-prettier": "^5.0.0", 70 69 "eslint-plugin-react": "^7.37.0", 71 70 "prettier": "^3.4.0", 72 71 "turbo": "^2.0.0", 73 - "typescript": "~5.7" 72 + "typescript": "~5.7", 73 + "typescript-eslint": "^8.0.0" 74 74 } 75 75 }
+3 -3
packages/blocks-extension/package.json
··· 32 32 "scripts": { 33 33 "build": "npm run build:lib && npm run build:labextension:dev", 34 34 "build:prod": "npm run clean && npm run build:lib && npm run build:labextension", 35 - "build:labextension": "jupyter labextension build .", 36 - "build:labextension:dev": "jupyter labextension build --development True .", 35 + "build:labextension": "build-labextension --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") .", 36 + "build:labextension:dev": "build-labextension --development --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") .", 37 37 "build:lib": "tsc", 38 38 "clean": "npm run clean:lib", 39 39 "clean:lib": "rimraf lib tsconfig.tsbuildinfo", ··· 42 42 "install:extension": "npm run build", 43 43 "watch": "run-p watch:src watch:labextension", 44 44 "watch:src": "tsc -w --sourceMap", 45 - "watch:labextension": "jupyter labextension watch ." 45 + "watch:labextension": "build-labextension --development --watch --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") ." 46 46 }, 47 47 "dependencies": { 48 48 "@jupyter-widgets/base": "^6.0.10",
+11
packages/blocks-extension/turbo.json
··· 1 + { 2 + "extends": ["//"], 3 + "tasks": { 4 + "build": { 5 + "outputs": ["lib/**", "../../jupyter_blocks/labextension/**"] 6 + }, 7 + "build:prod": { 8 + "outputs": ["lib/**", "../../jupyter_blocks/labextension/**"] 9 + } 10 + } 11 + }
+3 -3
packages/tidyblocks-extension/package.json
··· 33 33 "scripts": { 34 34 "build": "npm run build:lib && npm run build:labextension:dev", 35 35 "build:prod": "npm run clean && npm run build:lib && npm run build:labextension", 36 - "build:labextension": "jupyter labextension build .", 37 - "build:labextension:dev": "jupyter labextension build --development True .", 36 + "build:labextension": "build-labextension --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") .", 37 + "build:labextension:dev": "build-labextension --development --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") .", 38 38 "build:lib": "tsc", 39 39 "clean": "npm run clean:lib", 40 40 "clean:lib": "rimraf lib tsconfig.tsbuildinfo", ··· 43 43 "install:extension": "npm run build", 44 44 "watch": "run-p watch:src watch:labextension", 45 45 "watch:src": "tsc -w --sourceMap", 46 - "watch:labextension": "jupyter labextension watch ." 46 + "watch:labextension": "build-labextension --development --watch --core-path $(python3 -c \"import jupyterlab,pathlib; print(pathlib.Path(jupyterlab.__file__).parent/'staging')\") ." 47 47 }, 48 48 "dependencies": { 49 49 "@jupyterlab/application": "^4.5",
+11
packages/tidyblocks-extension/turbo.json
··· 1 + { 2 + "extends": ["//"], 3 + "tasks": { 4 + "build": { 5 + "outputs": ["lib/**", "../../jupyter_tidyblocks/labextension/**"] 6 + }, 7 + "build:prod": { 8 + "outputs": ["lib/**", "../../jupyter_tidyblocks/labextension/**"] 9 + } 10 + } 11 + }
+2 -10
turbo.json
··· 3 3 "tasks": { 4 4 "build": { 5 5 "dependsOn": ["^build"], 6 - "outputs": [ 7 - "lib/**", 8 - "../../jupyter_blocks/labextension/**", 9 - "../../jupyter_tidyblocks/labextension/**" 10 - ] 6 + "outputs": ["lib/**"] 11 7 }, 12 8 "build:prod": { 13 9 "dependsOn": ["^build:prod"], 14 - "outputs": [ 15 - "lib/**", 16 - "../../jupyter_blocks/labextension/**", 17 - "../../jupyter_tidyblocks/labextension/**" 18 - ] 10 + "outputs": ["lib/**"] 19 11 }, 20 12 "clean": { 21 13 "cache": false