├── .gitignore ├── .nvmrc ├── LICENSE.md ├── README.md ├── documentation ├── SolidOS_fetcher.md ├── Using_Private_Resources_In_SolidOS.md ├── auth-upgrade-to-use-DPoP.md ├── guidelines │ ├── coding_guidelines.md │ ├── dependencies_and_release_guidelines.md │ └── testing_guidelines.md ├── resources │ └── architecture.svg └── solidos_dependencies.svg ├── lerna.json ├── package-lock.json ├── package.json └── scripts ├── add ├── delete ├── install ├── release ├── reset ├── start ├── start-css ├── start-nss ├── switch-branch ├── update-mashlib-repo.sh ├── update-solid-panes-repo.sh ├── update-this-panes-repo.sh ├── watch └── watch-css /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/git,osx,node,webstorm,intellij,visualstudiocode 3 | # Edit at https://www.gitignore.io/?templates=git,osx,node,webstorm,intellij,visualstudiocode 4 | 5 | ### Git ### 6 | # Created by git for backups. To disable backups in Git: 7 | # $ git config --global mergetool.keepBackup false 8 | *.orig 9 | 10 | # Created by git when using merge tools for conflicts 11 | *.BACKUP.* 12 | *.BASE.* 13 | *.LOCAL.* 14 | *.REMOTE.* 15 | *_BACKUP_*.txt 16 | *_BASE_*.txt 17 | *_LOCAL_*.txt 18 | *_REMOTE_*.txt 19 | 20 | ### Intellij ### 21 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm 22 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 23 | 24 | # User-specific stuff 25 | .idea/**/workspace.xml 26 | .idea/**/tasks.xml 27 | .idea/**/usage.statistics.xml 28 | .idea/**/dictionaries 29 | .idea/**/shelf 30 | 31 | # Generated files 32 | .idea/**/contentModel.xml 33 | 34 | # Sensitive or high-churn files 35 | .idea/**/dataSources/ 36 | .idea/**/dataSources.ids 37 | .idea/**/dataSources.local.xml 38 | .idea/**/sqlDataSources.xml 39 | .idea/**/dynamic.xml 40 | .idea/**/uiDesigner.xml 41 | .idea/**/dbnavigator.xml 42 | 43 | # Gradle 44 | .idea/**/gradle.xml 45 | .idea/**/libraries 46 | 47 | # Gradle and Maven with auto-import 48 | # When using Gradle or Maven with auto-import, you should exclude module files, 49 | # since they will be recreated, and may cause churn. Uncomment if using 50 | # auto-import. 51 | # .idea/modules.xml 52 | # .idea/*.iml 53 | # .idea/modules 54 | # *.iml 55 | # *.ipr 56 | 57 | # CMake 58 | cmake-build-*/ 59 | 60 | # Mongo Explorer plugin 61 | .idea/**/mongoSettings.xml 62 | 63 | # File-based project format 64 | *.iws 65 | 66 | # IntelliJ 67 | out/ 68 | 69 | # mpeltonen/sbt-idea plugin 70 | .idea_modules/ 71 | 72 | # JIRA plugin 73 | atlassian-ide-plugin.xml 74 | 75 | # Cursive Clojure plugin 76 | .idea/replstate.xml 77 | 78 | # Crashlytics plugin (for Android Studio and IntelliJ) 79 | com_crashlytics_export_strings.xml 80 | crashlytics.properties 81 | crashlytics-build.properties 82 | fabric.properties 83 | 84 | # Editor-based Rest Client 85 | .idea/httpRequests 86 | 87 | # Android studio 3.1+ serialized cache file 88 | .idea/caches/build_file_checksums.ser 89 | 90 | ### Intellij Patch ### 91 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 92 | 93 | # *.iml 94 | # modules.xml 95 | # .idea/misc.xml 96 | # *.ipr 97 | 98 | # Sonarlint plugin 99 | .idea/sonarlint 100 | 101 | ### Node ### 102 | # Logs 103 | logs 104 | *.log 105 | npm-debug.log* 106 | yarn-debug.log* 107 | yarn-error.log* 108 | lerna-debug.log* 109 | 110 | # Diagnostic reports (https://nodejs.org/api/report.html) 111 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 112 | 113 | # Runtime data 114 | pids 115 | *.pid 116 | *.seed 117 | *.pid.lock 118 | 119 | # Directory for instrumented libs generated by jscoverage/JSCover 120 | lib-cov 121 | 122 | # Coverage directory used by tools like istanbul 123 | coverage 124 | *.lcov 125 | 126 | # nyc test coverage 127 | .nyc_output 128 | 129 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 130 | .grunt 131 | 132 | # Bower dependency directory (https://bower.io/) 133 | bower_components 134 | 135 | # node-waf configuration 136 | .lock-wscript 137 | 138 | # Compiled binary addons (https://nodejs.org/api/addons.html) 139 | build/Release 140 | 141 | # Dependency directories 142 | node_modules/ 143 | jspm_packages/ 144 | 145 | # TypeScript v1 declaration files 146 | typings/ 147 | 148 | # TypeScript cache 149 | *.tsbuildinfo 150 | 151 | # Optional npm cache directory 152 | .npm 153 | 154 | # Optional eslint cache 155 | .eslintcache 156 | 157 | # Optional REPL history 158 | .node_repl_history 159 | 160 | # Output of 'npm pack' 161 | *.tgz 162 | 163 | # Yarn Integrity file 164 | .yarn-integrity 165 | 166 | # dotenv environment variables file 167 | .env 168 | .env.test 169 | 170 | # parcel-bundler cache (https://parceljs.org/) 171 | .cache 172 | 173 | # next.js build output 174 | .next 175 | 176 | # nuxt.js build output 177 | .nuxt 178 | 179 | # vuepress build output 180 | .vuepress/dist 181 | 182 | # Serverless directories 183 | .serverless/ 184 | 185 | # FuseBox cache 186 | .fusebox/ 187 | 188 | # DynamoDB Local files 189 | .dynamodb/ 190 | 191 | ### OSX ### 192 | # General 193 | .DS_Store 194 | .AppleDouble 195 | .LSOverride 196 | 197 | # Icon must end with two \r 198 | Icon 199 | 200 | # Thumbnails 201 | ._* 202 | 203 | # Files that might appear in the root of a volume 204 | .DocumentRevisions-V100 205 | .fseventsd 206 | .Spotlight-V100 207 | .TemporaryItems 208 | .Trashes 209 | .VolumeIcon.icns 210 | .com.apple.timemachine.donotpresent 211 | 212 | # Directories potentially created on remote AFP share 213 | .AppleDB 214 | .AppleDesktop 215 | Network Trash Folder 216 | Temporary Items 217 | .apdisk 218 | 219 | ### VisualStudioCode ### 220 | .vscode/* 221 | !.vscode/settings.json 222 | !.vscode/tasks.json 223 | !.vscode/launch.json 224 | !.vscode/extensions.json 225 | 226 | ### VisualStudioCode Patch ### 227 | # Ignore all local history of files 228 | .history 229 | 230 | ### WebStorm ### 231 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm 232 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 233 | 234 | # User-specific stuff 235 | 236 | # Generated files 237 | 238 | # Sensitive or high-churn files 239 | 240 | # Gradle 241 | 242 | # Gradle and Maven with auto-import 243 | # When using Gradle or Maven with auto-import, you should exclude module files, 244 | # since they will be recreated, and may cause churn. Uncomment if using 245 | # auto-import. 246 | # .idea/modules.xml 247 | # .idea/*.iml 248 | # .idea/modules 249 | # *.iml 250 | # *.ipr 251 | 252 | # CMake 253 | 254 | # Mongo Explorer plugin 255 | 256 | # File-based project format 257 | 258 | # IntelliJ 259 | 260 | # mpeltonen/sbt-idea plugin 261 | 262 | # JIRA plugin 263 | 264 | # Cursive Clojure plugin 265 | 266 | # Crashlytics plugin (for Android Studio and IntelliJ) 267 | 268 | # Editor-based Rest Client 269 | 270 | # Android studio 3.1+ serialized cache file 271 | 272 | ### WebStorm Patch ### 273 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 274 | 275 | # *.iml 276 | # modules.xml 277 | # .idea/misc.xml 278 | # *.ipr 279 | 280 | # Sonarlint plugin 281 | 282 | # End of https://www.gitignore.io/api/git,osx,node,webstorm,intellij,visualstudiocode 283 | 284 | .idea 285 | workspaces/* 286 | !workspaces/.gitkeep 287 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 18.12.1 2 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2019 - present 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included 13 | in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 19 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 20 | OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🤗 Welcome to the repo of SolidOS 2 | 3 | [Solid logo] 4 | 5 | [![MIT license](https://img.shields.io/github/license/solidos/solidos)](https://github.com/solidos/solidos/blob/main/LICENSE.md) 6 | [![SolidOS issues](https://img.shields.io/github/issues/solidos/solidos)](https://github.com/solidos/solidos/issues) 7 | [![Matrix](https://img.shields.io/matrix/solid_solidos:gitter.im.svg?label=Join%20the%20chat%20at%20Matrix&logo=matrix&server_fqdn=matrix.org)](https://app.element.io/#/room/#solid_solidos:gitter.im) 8 | 9 | If you made it here you must already have heard about [Solid](https://solidproject.org). 10 | This space is home to the SolidOS code. Keep reading if you want to know: 11 | 12 | - 🤔 [What is SolidOS](#-What-is-SolidOS) 13 | - [What you can do today with SolidOS](#What-you-can-do-today-with-SolidOS) 14 | - [SolidOS vision, mission and roadmap](#solidos-vision-mission-and-roadmap) 15 | - 👩🏽‍💻 [SolidOS technical intro](#-solidos-technical-intro) 16 | - [SolidOS deeper technical topics](#solidos-deeper-technical-topics) 17 | - 👯 [How the SolidOS team works](#-How-the-SolidOS-team-works) 18 | - [SolidOS team meetings](#SolidOS-team-meetings) 19 | - [SolidOS team instant chat](#SolidOS-team-instant-chat) 20 | - [SolidOS team discussions](#SolidOS-team-discussions) 21 | - [SolidOS tasks](#SolidOS-tasks) 22 | - 🙋🏻 [How you can contribute and help SolidOS thrive](#-How-you-can-contribute-and-help-SolidOS-thrive) 23 | - [For anyone up to writing some code](#For-anyone-up-to-writing-some-code) 24 | - [For anyone who likes builds or releases or GitHub CI or deployments](#for-anyone-who-likes-builds-or-github-ci-or-releases-or-deployments) 25 | - [For anyone who likes writing text](#For-anyone-who-likes-writing-text) 26 | - [For anyone with an eye for design](#For-anyone-with-an-eye-for-design) 27 | - 🆕 [Getting started with the SolidOS code](#-Getting-started-with-the-SolidOS-code) 28 | - [SolidOS first time setup of code](#SolidOS-first-time-setup-of-code) 29 | - [How to use SolidOS on localhost](#How-to-use-SolidOS-on-localhost) 30 | - [How to make changes in repos](#How-to-make-changes-in-repos) 31 | - [Developing SolidOS code](#Developing-SolidOS-code) 32 | - [Testing SolidOS code](#Testing-SolidOS-code) 33 | - [SolidOS build & release](#SolidOS-build-and-release) 34 | - 📜 [License](#-License) 35 | - 🎤 [Feedback and questions](#-Feedback-and-questions) 36 | 37 | For experimenting with SolidOS implementations, you can: 38 | 39 | - try SolidOS on a [test-pod](https://test-pod.solidcommunity.net:8443/) (provider: `https://solidcommunity.net:8443`, user and password: `test-pod`) 40 | - take a pod on or [another provider](https://solidproject.org/users/get-a-pod#get-a-pod-from-a-pod-provider) 41 | - check out the [SolidOS WebApp](https://solidos.github.io/mashlib/dist/browse.html) 42 | - use as a stand-alone desktop app with [Data-Kitchen](https://github.com/solidos/data-kitchen) 43 | 44 | If you are looking for something else, let us try and guide you: 45 | 46 | - for learning about Solid, read [about Solid](https://github.com/solid/solid) and visit [solidproject.org](https://solidproject.org) 47 | - to try out Solid, head over to [getting started with Solid](https://solidproject.org/developers/tutorials/getting-started) 48 | - for how SolidOS works, [visit the user guide](https://github.com/solidos/userguide) and [SolidOS project Pod](https://solidos.solidcommunity.net/) 49 | - for how the community works, go over to [Solid process](https://github.com/solid/process) 50 | - chat with others about Solid on the [forum](https://forum.solidproject.org/) and on [instant chats](https://gitter.im/solid/home) 51 | - join an event over at [Solid events](https://solidproject.org/events) or sign up for the [Solid newsletter](https://solidproject.org/newsletter) to not miss any news 52 | - read the Solid community code of conduct at [Solid CoC](https://github.com/solid/process/blob/main/code-of-conduct.md) 53 | 54 | Further links: 55 | 56 | - [SolidOS explanation video](https://vimeo.com/643594034#t=9m39s) 57 | - [SolidOS goals & roadmap](https://solidos.solidcommunity.net/Team/docs/SolidOSNorthStar.html) 58 | - [SolidOS FAQs](https://github.com/solidos/solidos/wiki/FAQs) 59 | - [SolidOS Wiki](https://github.com/solidos/solidos/wiki) 60 | - [SolidOS Guidelines](./documentation/guidelines/) 61 | - report a problem with SolidOS by [creating a git issue](https://github.com/solidos/solidos/issues) 62 | - have a new idea? Create a Solid [user story/new idea ticket](https://github.com/solid/user-stories) 63 | - check out the in-progress [Solid specification](https://solidproject.org/TR/protocol) and in-progress [Solid specification repo](https://solid.github.io/specification/). Find the previous specifications, now outdated but still in use if you work with NSS: [https://github.com/solid/solid-spec](https://github.com/solid/solid-spec). 64 | - [Glossary](https://github.com/solid/solidcommunity.net/wiki/Glossary) of terms frequently used in Solid environment 65 | 66 | ## 🤔 What is SolidOS? 67 | 68 | _**🌟🌟🌟 SolidOS is an Operating System for Solid. 🌟🌟🌟**_ 69 | 70 | [Solid](https://solidproject.org) is developing into a booming ecosystem which involves specifications 📃, tech stack 🛠, servers 💻, and apps 🕹. We, the SolidOS team, believe that this ecosystem also needs an Operating System. 71 | 72 | When you get a new phone, PC, or tablet, they usually come with an operating system that provides some basic functionality to get started and be productive. More importantly, you can personalize your OS to your needs, by installing apps, managing content, and much more. 73 | 74 | Solid is not shipped with a piece of hardware (who knows, maybe in the future it will...). For now, you get into the ecosystem once you create a WebID and provision your own personal data store (often called a "Pod") ([see getting started with Solid - get a pod](https://solidproject.org/users/get-a-pod#get-a-pod-from-a-pod-provider)). Immediately after getting your new Solid WebID and Pod space, SolidOS is helping you to navigate the Solid ecosystem. 75 | 76 | SolidOS is much more. SolidOS showcases the possibility of [Solid](https://solidproject.org) for the future, by which we mean — 77 | 78 | - **true data ownership** — management of personal data & authorization control 79 | - **avoidance of vendor lock-in to services** — easy moving to a different Pod or WebID provider 80 | - **data reuse between applications** — with help of data interoperability and data discoverability 81 | 82 | Watch a [SolidOS explanation video](https://vimeo.com/643594034#t=9m39s) as part of the [Solid World event series](https://solidproject.org/events). 83 | 84 | ### What you can do today with SolidOS 85 | 86 | Take a look at an example: [SolidOS project Pod](https://solidos.solidcommunity.net/). SolidOS implemented features: 87 | 88 | - 📰 create a personal webpage 89 | - 📝 manage your WebID and the data about yourself 90 | - 📝 manage personal data/files on your Pod 91 | - 🤝 directly connect and engage with other people who are part of the ecosystem (add friends, chat, ...) 92 | - 💡 make use of interconnected apps 93 | - 🔧 create your own app [with Inrupt's Solid Reach SDK](https://docs.inrupt.com/developer-tools/javascript/react-sdk/application/) or [get inspired from a blog post](https://solidos.solidcommunity.net/public/2021/BuildingSolidAppsUsingPublicData-V3.html) 94 | - and more ([see SolidOS user guide](https://github.com/solidos/userguide)) 95 | 96 | ### SolidOS vision, mission and roadmap 97 | 98 | Read more about the current SolidOS 🌟 vision, goals 🎯, and roadmap 🚗 on the [SolidOS project Pod](https://solidos.solidcommunity.net/Team/docs/SolidOSNorthStar.html). 99 | 100 | _**Note:** SolidOS is also known by names like Data Browser (default) or Databrowser, and at times as mashlib._ Which name is used depends on which flavour of SolidOS you are referring to: 101 | 102 | - The SolidOS Databrowser Frontend - a frontend for Solid Servers like [solidcommunity.net](https://solidcommunity.net), represented by this codebase; 103 | - The SolidOS Databrowser Webapp - a stand-alone web app served from mashlib: [https://solidos.github.io/mashlib/dist/browse.html](https://solidos.github.io/mashlib/dist/browse.html); 104 | - The SolidOS Data-Kitchen - a stand-alone desktop app: [https://github.com/solidos/data-kitchen](https://github.com/solidos/data-kitchen); 105 | - The SolidOS software stack - a set of libraries that may be used independently of the databrowser, see next section. 106 | 107 | ## 👩🏽‍💻 SolidOS technical intro 108 | 109 | The SolidOS stack contains — 110 | 111 | - [Node.js](https://nodejs.dev/) 112 | - [Javascript](https://www.w3schools.com/js/) 113 | - [Typescript](https://www.typescriptlang.org/) 114 | - [npm](https://www.npmjs.com/) 115 | - [Node Version Manager (nvm)](https://github.com/nvm-sh/nvm) 116 | - [Lerna](https://lerna.js.org/) 117 | - [GitHub CI](https://docs.github.com/en/actions/automating-builds-and-tests/about-continuous-integration) 118 | - [bash scripts](https://www.gnu.org/software/bash/manual/html_node/index.html) 119 | 120 | It also makes use of — 121 | 122 | - [Storybook](https://storybook.js.org/) 123 | - [Webpack](https://webpack.js.org/) 124 | - [Jest](https://jestjs.io/) 125 | - [Cypress](https://www.cypress.io/) 126 | - [ESLint](https://eslint.org/) 127 | - [Babel](https://babeljs.io/) 128 | - [Travis](https://travis-ci.org/) 129 | 130 | Let's take a look at an architecture diagram of SolidOS: 131 | ![SolidOS architectural overview](documentation/architecture.svg) 132 | 133 | A colorful dependency tree can be seen here: 134 | ![SolidOS dependencies](documentation/solidos_dependencies.svg) 135 | 136 | As you can see, SolidOS is composed of several repositories: 137 | 138 | - [**rdflib.js**](https://github.com/linkeddata/rdflib.js) — Javascript RDF library for browsers and Node.js 139 | - [**solid-logic**](https://github.com/solidos/solid-logic) — core business logic of SolidOS 140 | - [**mashlib**](https://github.com/solidos/mashlib/) — a solid-compatible code library of application-level functionality for the world of Solid 141 | - [**solid-panes**](https://github.com/solidos/solid-panes) — a set of core solid-compatible panes based on solid-ui 142 | - [**solid-ui**](https://github.com/solidos/solid-ui) — User Interface widgets and utilities for Solid. Building blocks for solid-based apps 143 | 144 | In the above diagram, SolidOS is deployed on the [Node Solid Server (NSS)](https://github.com/solid/node-solid-server), but it can also be set up to run on the [Community Solid Server (CSS)](https://github.com/CommunitySolidServer) or on ANY Solid-compliant server. When you download and compile the SolidOS code, an NSS is also installed locally, to have everything ready to develop. 145 | 146 | ### SolidOS deeper technical topics 147 | 148 | For further details about each GitHub repository, please visit them via the links above for `Documentation`. 149 | 150 | We collect SolidOS code good practices and know how in [SolidOS documentation pages](https://github.com/solidos/solidos/tree/main/documentation). 151 | 152 | [SolidOS FAQs](https://github.com/solidos/solidos/wiki/FAQs) part of the [SolidOS developer guide](https://github.com/solidos/solidos/wiki) also contains some Q&A and technical troubleshooting infos. 153 | 154 | ## 👯 How the SolidOS team works 155 | 156 | First and foremost who are the contributors of SolidOS? 157 | 158 | The SolidOS codebase has a long history and there have been a lot of contributors over the years (see: [GitHub contributors](https://github.com/solidos/solidos/graphs/contributors)). The most active team members are mentioned in the SolidOS Team on the [SolidOS Pod Contacts](https://solidos.solidcommunity.net/Contacts/). 159 | 160 | ### SolidOS team meetings 161 | 162 | The SolidOS team meets every week for a 1h touchdown. We discuss what was done over the past week, what needs to be done next, and delegation of tasks. Find the meeting time and link on the [SolidOS project Pod](https://solidos.solidcommunity.net/Team/team%20meetings/schedule.html). 163 | 164 | We take minutes on our meetings. You can find them on the [SolidOS pod](https://solidos.solidcommunity.net/public/SolidOS%20team%20meetings/). 165 | 166 | ### SolidOS team instant chat 167 | 168 | In between team meetings, we avidly communicate over at the [gitter SolidOS channel](https://gitter.im/solid/solidos). Drop by to chat with us, ask questions, or simply say "Hi". 169 | 170 | ### SolidOS team discussions 171 | 172 | Sometimes some ideas need an incubation period and further discussion. We make use of [GitHub discussions](https://github.com/solidos/solidos/discussions) for that. 173 | 174 | ### SolidOS tasks 175 | 176 | For daily tasks, we have a [Project Board](https://github.com/orgs/SolidOS/projects/1) with different views. 177 | 178 | For a longer-term roadmap, we use a [Solid task manager](https://solidos.solidcommunity.net/public/Roadmap/Tasks/), and plan the next milestones on Kanban. 179 | 180 | ### Additional useful information 181 | 182 | - Find answers over at [SolidOS FAQs](https://github.com/solidos/solidos/wiki/FAQs) or at the [SolidOS Wiki](https://github.com/solidos/solidos/wiki). 183 | - For an overall description of how the whole ecosystem works head over to [solid process](https://github.com/solid/process). 184 | - Make sure to get into discussions on the [forum](https://forum.solidproject.org/) and on Solid [instant chat channels](https://gitter.im/solid/home). 185 | - Join an event over at [Solid events](https://solidproject.org/events) or sign up for the [Solid newsletter](https://solidproject.org/newsletter) to not miss any news 186 | - Read the community code of conduct [Solid CoC](https://github.com/solid/process/blob/main/code-of-conduct.md). 187 | 188 | ## 🙋🏽‍ How you can contribute and help SolidOS thrive 189 | 190 | The SolidOS team is always looking for volunteers to help improve SolidOS. Pull Requests (PRs) and edits are always welcome from code, to text, to style. We are looking for UX designers, technical writers, frontend developers, backend developers, DevOps. Don't let these titles intimidate you; they are just some examples. You can find your own place no matter the level of knowledge you are at. 191 | 192 | To check for tasks you might help with immediately, look at the [Newcomer View in the Project Board](https://github.com/orgs/SolidOS/projects/1/views/3). You are welcome to visit us at a [weekly team meeting](https://solidos.solidcommunity.net/Team/2021/schedule/solidos-schedule.html) or on the [ongoing Gitter-based chat](https://gitter.im/solid/solidos) to say 'Hi' or let us know about any blocker you might have encountered. 193 | 194 | ### For anyone up to writing some code 195 | 196 | We keep track of stuff to do in Git issues of each repo. [An overview](https://github.com/orgs/SolidOS/projects/1/views/4) you can find on the project board. 197 | 198 | Writing tests as a way to understand the code is always a good idea. Tests, in each repo, should be found in the `test` folder. One can start from there or/and add tests. 199 | 200 | _**Note:** Please get familiar with [coding](./documentation/guidelines/coding_guidelines.md) and [testing](./documentation/guidelines/testing_guidelines.md) guidelines._ 201 | 202 | ### For anyone who likes builds or GitHub CI or releases or deployments 203 | 204 | There is an existing process and codebase in place to help with SolidOS releases. However, we would like to get better and automate as much as possible. Open issues can be found on the [Project Board](https://github.com/orgs/SolidOS/projects/1/views/4) under the CI category. 205 | 206 | _**Note:** Please get familiar with [release guidelines](./documentation/guidelines/dependencies_and_release_guidelines.md)._ 207 | 208 | #### Builds 209 | 210 | SolidOS contains different repositories (mashlib, solid-logic, solid-ui, solid-panes, ...). Each repository contains a `package.json` with `scripts`. Most repos contain an `npm run build` which is used to build the project. 211 | 212 | #### GitHub CI 213 | 214 | When you push or PR a change to a repo, a git CI is activated and runs every time. An example is the [solid-panes workflow](https://github.com/solidos/solid-panes/blob/main/.github/workflows/ci.yml). This CI YML can contain instructions to test and build the repo on different Node versions. If upon push or PR, an instruction fails, one should take care to fix it and keep the branches green. 215 | 216 | #### Testing & releasing a new SolidOS version 217 | 218 | In SolidOS, you will find a `bash scripts` under [scripts](https://github.com/solidos/solidos/tree/main/scripts) which is related to releasing a new SolidOS stack. The [release script](https://github.com/solidos/solidos/blob/main/scripts/release) is also used to update dependencies in each repo. 219 | 220 | Following best practices, we deploy the new version on the [testserver](https://solidcommunity.net:8443/) as mentioned [here](https://github.com/solid/solidcommunity.net/wiki#solidcommunitynet8443-test-server-instance). 221 | 222 | #### Deployment on solidcommunity.net server 223 | 224 | Before you start, make sure you have access to all the GitHub repos and all the `npm` packages. Using Ubuntu or other Unix-like OS, `ssh` into the server as `root`. 225 | 226 | ```sh 227 | tmux new 228 | adduser --shell /bin/bash --home /home/build --ingroup sudo build 229 | su - build 230 | whoami 231 | sudo whoami 232 | ``` 233 | 234 | Then: 235 | 236 | ```s 237 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh | bash 238 | export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" 239 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 240 | nvm install 16 241 | nvm use 16 242 | 243 | ssh-keygen -t ed25519 -C "michiel+build@unhosted.org" 244 | git config --global user.name "Solid OS Build (Michiel)" 245 | git config --global user.email "michiel+build@unhosted.org" 246 | cat .ssh/id_ed25519.pub 247 | npm login 248 | ``` 249 | 250 | Log in to npm with your npm account and add the SSH public key to your GitHub account. Then continue: 251 | 252 | ```sh 253 | git clone https://github.com/solidos/solidos 254 | cd solidos 255 | npm run install-nvm 256 | npm run release 257 | ``` 258 | 259 | More information can be also found over at the [server, solidcommunity.net, repo](https://github.com/solid/solidcommunity.net/wiki). 260 | 261 | ### For anyone who likes writing text 262 | 263 | SolidOS has quite some documentation around that needs constant improvement. 264 | Places to start: 265 | 266 | - for how SolidOS works [visit the user guide](https://github.com/solidos/userguide) and [SolidOS project Pod](https://solidos.solidcommunity.net/); 267 | - [SolidOS FAQs](https://github.com/solidos/solidos/wiki/FAQs); 268 | - [SolidOS Wiki](https://github.com/solidos/solidos/wiki). 269 | 270 | We are open to suggestions to improve these resources from structure, translation, UI to content in general. 271 | 272 | ### For anyone with an eye for design 273 | 274 | [Solid-ui](https://github.com/solidos/solid-ui) does the heavy lifting to all things UI for SolidOS. 275 | Currently, we use [Storybook](https://storybook.js.org/) to help develop components independent of other panes. Make sure to visit the [solid-ui readme](https://github.com/solidos/solid-ui) for information on how to set it up and get started. 276 | There is a second option to run solid-ui on its own. Read about it at [Debugging solid-ui using Solid Pane Tester](https://github.com/solidos/solidos/wiki/1.-SolidOS-know-how#debugging-solid-ui-using-solid-pane-tester). 277 | 278 | You can also find the current issues over at the [solid-ui issues](https://github.com/solidos/solid-ui/issues). And some more information over at the [SolidOS Wiki](https://github.com/solidos/solidos/wiki/2.-Solid-UI-know-how). 279 | 280 | SolidOS needs a lot of improvements on UI, including UX and style-guides. Maybe you are the one who can help out? Visit the [Project Board](https://github.com/orgs/SolidOS/projects/1/views/4) and look for UX and UI categories. 281 | 282 | ## 🆕 Getting started with the SolidOS code 283 | 284 | Before you start coding, please review our guidelines: 285 | 286 | - [coding guidelines](./documentation/guidelines/coding_guidelines.md); 287 | - [testing guidelines](./documentation/guidelines/testing_guidelines.md); 288 | - [dependency and release guidelines](./documentation/guidelines/dependencies_and_release_guidelines.md). 289 | 290 | ### SolidOS first time setup of code 291 | 292 | Make sure you have the needed environment: [nvm for SolidOS](https://github.com/solidos/solidos/wiki/FAQs#setting-up-nvm-to-develop-for-solidos), npm, Node. If you have problems with node versions on the Apple M1 chip, in the [Troubleshooting SolidOS](https://github.com/solidos/solidos/wiki/Troubleshooting-SolidOS) you can find a solution. 293 | 294 | ``` 295 | git clone https://github.com/solidos/solidos 296 | cd solidos 297 | npm run setup 298 | ``` 299 | 300 | _**Note:** It might prompt you to install a specific `node` version, something like `nvm install xxx # version missing mentioned in console log`._ 301 | 302 | _**Note:** In case of errors, try to follow what the output messages (errors) suggest in the console to fix the problems, and let us know on the [SolidOS team chat](https://gitter.im/solid/solidos)._ 303 | 304 | Run the above lines in a terminal of your choice to setup your SolidOS project folder. By default, some dependent repos are also set up for you: 305 | 306 | - [rdflib.js](https://github.com/linkeddata/rdflib.js): Javascript RDF library for browsers and Node.js 307 | - [solid-logic](https://github.com/solidos/solid-logic): core business logic of SolidOS 308 | - [pane-registry](https://github.com/solidos/pane-registry): an index to hold all loaded solid panes 309 | - [mashlib](https://github.com/solidos/mashlib/): a solid-compatible code library of application-level functionality for the world of Solid 310 | - [solid-panes](https://github.com/solidos/solid-panes): a set of core solid-compatible panes based on solid-ui 311 | - [solid-ui](https://github.com/solidos/solid-ui): User Interface widgets and utilities for Solid. Building blocks for solid-based apps 312 | - [node-solid-server](https://github.com/solid/node-solid-server): the server that allows you to test your changes 313 | 314 | You can start your server and test out your code with: 315 | 316 | ``` 317 | npm start 318 | ``` 319 | 320 | If you get into problems check out [SolidOS FAQs](https://github.com/solidos/solidos/wiki/FAQs) or ask us directly at [SolidOS team chat](https://.im/solid/solidos). 321 | 322 | _**Note:** The NPM scripts are using `bash` scripts. These might not work if you're developing on a Windows machine. Let us know, over at [SolidOS team chat](https://gitter.im/solid/solidos) if you want support for this._ 323 | 324 | ### How to use SolidOS on localhost 325 | 326 | Once you managed to get SolidOS running locally (`npm start`) you can see it over at `https://localhost:8443/`. If you encounter any problems make sure to check the [Troubleshooting SolidOS page](https://github.com/solidos/solidos/wiki/Troubleshooting-SolidOS). 327 | 328 | To work on localhost, first you need to register a local user, so hit `register` on `https://localhost:8443/`. After you have created your user, you can navigate to your new pod over at `https://username.localhost:8443/`. 329 | Whenever you need to login again, remember to put `https://localhost:8443/` in the `Enter the URL of your identity provider:` input field. Otherwise you will be logged in with a different provider and redirected out of the localhost environment. 330 | 331 | ### How to make changes in repos 332 | 333 | As a newcomer, you do not have direct access to the repos, but you can still contribute through Pull Requests (PRs). First, navigate to the repo you want to work on, and create a fork. Make your changes on your fork, and then create a PR. We will be notified, and you will receive feedback on your changes. For more details on how to do this, visit [the GitHub documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request), which explains it much better than we ever could. 334 | 335 | If you do have direct access to the repos, it is usual to create a branch for your changes and then a PR. A PR helps you receive feedback and lets us know easily about any changes to the code. Read more about Pull Requests over at the GitHub documentation. 336 | 337 | Make sure to read more about working with branches and missing repos over at the [SolidOS Wiki](https://github.com/solidos/solidos/wiki/1.-SolidOS-know-how#dealing-with-github-branches). 338 | 339 | ### Developing SolidOS code 340 | 341 | Very likely you will want to make changes in the dependent packages/repos of SolidOS (mashlib, solid-logic, solid-ui, solid-panes...). 342 | 343 | You have two choices: 344 | 345 | - [work directly in SolidOS](#Work-directly-in-SolidOS) 346 | - [work in the according dependent package](#Work-in-the-according-dependent-package) 347 | 348 | #### Work directly in SolidOS 349 | 350 | The `npm start` script contains a lerna command: `npx lerna bootstrap --force-local` which makes sure that packages are bootstrapped/taken from your local machine even if versions don't match. 351 | 352 | If you need to bootstrap any packages again (e.g. you've run `npm install` in any of the projects) and don't want to stop the server, you can do `npx lerna bootstrap --force-local` only. You do not need to stop the server and start it again (`npm start`). 353 | 354 | Another option is to start SolidOS with the `npm run watch` script. This triggers the watch-script for mashlib, solid-ui, and solid-panes. If you want to run watch-script for rdflib or any of the panes, you'll have to open another terminal window, navigate to the respective project and start its watch-script doing `npm run watch`. 355 | 356 | The output for the watch-script can be a bit difficult to interpret since all output for mashlib, solid-ui, and solid-panes are presented in the same window. You might also consider having each watch scripts running in a separate terminal window. The downside of using this approach is that at its worst, you'll have five separate watch-scripts running (in addition to the terminal window where you started the server) when working on a pane that needs to pick up a change in rdflib. If you find this unwieldy for your setup, or require too many resources, you should consider to [work in the according dependent package](#Work-in-the-according-dependent-package). 357 | 358 | #### Work in the according dependent package 359 | 360 | Any changes you do in a project need to be committed to their original repos and eventually be pushed to NPM manually (this is the part of Lerna that we do not use for this project). 361 | 362 | Some projects require you to build a package before you can see changes, so check the various package.json files to see which scripts are available. You can usually do `npm run build`, and some also support `npm run watch` which builds a new version each time you do a local change. 363 | 364 | Be aware, the packages depend on one another. Here's a simplified view of the dependencies: 365 | 366 | ``` 367 | node-solid-server --> rdflib 368 | node-solid-server --> mashlib --> rdflib 369 | node-solid-server --> mashlib --> solid-panes --> rdflib 370 | node-solid-server --> mashlib --> solid-panes --> solid-ui --> rdflib 371 | node-solid-server --> mashlib --> solid-panes --> [pane project] --> solid-ui --> rdflib 372 | ``` 373 | 374 | This means that if you do a change in solid-panes and want to see the result on your local NSS, you need to make sure that mashlib compiles the changes as well. Similarly, if you do changes to solid-ui, and some pane relies on those changes, you need to make sure that the pane compiles those changes, that solid-panes compiles the changes from the pane, and finally that mashlib compiles the changes from solid-panes. This quickly becomes hard to track, so we've devised a couple of ways to mitigate this. 375 | 376 | Read about in detail how each pane can be debugged over at the [SolidOS Wiki](https://github.com/solidos/solidos/wiki/1.-SolidOS-know-how#debugging-panesrepos-standalone-without-running-whole-solidos). 377 | 378 | ### Testing SolidOS code 379 | 380 | Most of the modules in SolidOS have a `test` script which can be called with `npm run test`. 381 | In some cases the tests run an [ESLint](https://eslint.org/) command `eslint 'src/**/*.ts'` or a [jest](https://jestjs.io/) test or both. 382 | 383 | Jest can also offer information related to test coverage by simply runnig `npm run coverage`. 384 | 385 | You can find a repo's tests usually in a dedicated folder called `test`. 386 | 387 | ### SolidOS build and release 388 | 389 | The SolidOS code stack build and release are [described above](#For-anyone-who-likes-builds-or-GitHub-CI-or-releases-or-deployments). 390 | 391 | ## 📜 License 392 | 393 | The SolidOS code is available under the MIT License. 394 | 395 | ## 🎤 Feedback and questions 396 | 397 | Don't hesitate to [chat with us on gitter](https://gitter.im/solid/home) or [report a bug](https://github.com/solidos/solidos/issues). 398 | -------------------------------------------------------------------------------- /documentation/SolidOS_fetcher.md: -------------------------------------------------------------------------------- 1 | # SolidOS Fetcher 2 | ## Redefining the fetch method in rdflib and SolidOS 3 | 4 | An app may wish to redefine the method rdflib and SolidOS use to read and write data. One reason is to handle protocols other than https:, e.g. file: or browser:. Another reason would be local-first replicating fetches. Once rdflib's fetch is redefined, the new fetch will be used by all fetcher and updateManager methods (load, webOperation, update, etc). 5 | 6 | ### An app using *rdflib* 7 | Can override the fetch globally 8 | ``` 9 | window.solidFetch = myFetchMethod // in browser 10 | global.solidFetch = myFetchMethod // in nodejs 11 | ``` 12 | Or modify a specific fetcher 13 | ``` 14 | myFetcher = $rdf.fetcher(store,{fetch:myFetchMethod}) 15 | ``` 16 | 17 | ### An app using mashlib or panes 18 | Can override the fetch globally 19 | ``` 20 | panes.UI.store.fetcher._fetch = myFetchMethod 21 | ``` 22 | 23 | ### Additional details 24 | 25 | Please keep in mind that rdflib's fetcher object does a lot more than simply fetch a document, it loads the headers and other details into the store and performs various checks. Redefining the *fetch* only redefines the actual reading and writing, all other parts of what the fetcher does remain in place. This includes checking authentication status when needed. Redefining the fetch has no necessary impact on the authentication process, to alter that see [the documentation on private resources in SolidOS](https://github.com/solidos/solidos/blob/main/documentation/Using_Private_Resources_In_SolidOS.md). 26 | 27 | The fetcher object's other activities mean that the fetch you redefine must conform to the Solid REST Protocol - content-types are required for methods that write, wac-allow headers are expected in responses, etc. Without these, you can do a simple fetcher.webOperation but fetcher.load and updateManager.update will fail somewhere within rdflib or SolidOS. The [Solid Rest](https://github.com/solid/solid-rest) library provides an in-client version of REST that reads incoming headers and sends back appropriate Solid REST responses. An app wishing to redefine the fetch will need to use Solid Rest or an equivalent layer that interprets incoming requests and formulates outgoing responses. 28 | 29 | ### Note for SolidOS developers 30 | 31 | Within the SolidOS stack, please do not ever use `window.fetch` or `cross-fetch` unless you are certain it will not interfere with user-defined fetches. Instead use `fetcher.webOperation()` which will respect any user defined fetch and fallback to cross-fetch or Inrupt authenticated fetch when needed. 32 | 33 | ### A code example 34 | 35 | This example creates a trivial fetch method that does nothing but return a new Response object, which, by default has a status of 200. We then try to fetch a non-existant URI. The default fetch gives 404 and the altered fetch 200 for the same URI. This proves we have redefined the fetch. 36 | ``` 37 | const $rdf = require('rdflib'); 38 | const store = $rdf.graph(); 39 | const uri = 'https://example.com/fribble-frabble'; 40 | 41 | const myFetchMethod = async ()=> { return new Response(); } 42 | const defaultFetcher = $rdf.fetcher(store); 43 | const alteredFetcher = $rdf.fetcher(store,{fetch:myFetchMethod}); 44 | 45 | (async()=>{ 46 | console.log('Default fetch status : '+ await getStatus(uri,defaultFetcher)); 47 | console.log('Altered fetch status : '+ await getStatus(uri,alteredFetcher)); 48 | })(); 49 | 50 | async function getStatus(uri,fetcher){ 51 | try { 52 | response = await fetcher.webOperation('GET',uri); 53 | return response.status; 54 | } 55 | catch(e){ 56 | return e.response.status; 57 | } 58 | } 59 | ``` 60 | 61 | See also [the original issue on github](https://github.com/solidos/solidos/issues/72) 62 | 63 | ## Requesting public data through using the fetcher 64 | 65 | Each `store` (or rdflib.graph()) has a fetcher (see [code in rdflib](https://github.com/linkeddata/rdflib.js/blob/f8a0b35364313157f6af511738e830881f18f312/src/index.ts#L125). And so does the `store` in SolidOS, see [code in solid-logic](https://github.com/solidos/solid-logic/blob/1f5bc16a9b5eaa2af97267ec8e48b66a8cc4a2c2/src/logic/SolidLogic.ts#L37)). 66 | 67 | The rdflib fetcher has code which tries to fetch a URL on the web, first with credentials, after a failed request with credentials it checkes without (see [code](https://github.com/linkeddata/rdflib.js/blob/f8a0b35364313157f6af511738e830881f18f312/src/fetcher.ts#L1847)). 68 | 69 | Tim BL: "It is a pain that you can’t just look up a URI online, in general without knowing an extra bit of data “is it public”. This sort of breaks the web a bit." 70 | 71 | When you as a web app do a http request with the credentials omitted, then the browser is kinder to you CORS wise. It allows access to servers which use the “*” wildcard for origins they trust. 72 | For public data, therefore, it is good to force credentials to be omiteed. You don’t want the fetcher trying to log into wikidata with solidOS for example. 73 | 74 | The possibility to omit credentials is also used in the SolidOS fetcher (see [code in solid-logic](https://github.com/solidos/solid-logic/blob/1f5bc16a9b5eaa2af97267ec8e48b66a8cc4a2c2/src/logic/solidLogicSingleton.ts#L6)). And is propagated in [solid-ui for wikidata](https://github.com/solidos/solid-ui/blob/c5a8888d6cb61363bc0445be007e3c96de593338/src/widgets/forms/autocomplete/publicData.ts#L98) and [solid-ui SPARQL query](https://github.com/solidos/solid-ui/blob/c5a8888d6cb61363bc0445be007e3c96de593338/src/widgets/forms/autocomplete/publicData.ts#L376). 75 | -------------------------------------------------------------------------------- /documentation/Using_Private_Resources_In_SolidOS.md: -------------------------------------------------------------------------------- 1 | # Using Private Resources in SolidOS 2 | 3 | ## Short Answer 4 | 5 | In SolidOS, always use `solid-ui.authn.currentUser()` to check if the user has a webID; do not directly check 6 | `authSession.info.webId` **except during operations on the `authSession` itself**. 7 | 8 | * use `me = authn.currentUser()` in places not directly part of `authSession` management 9 | * use `me = authn.authSession.info.webId` during `authSession` operations such as `box.refresh` and other login functions 10 | * use `await authn.checkUser()` when you need to activate a session after login 11 | * check URLs like `http//foo/?uri=http://bar` or web app and Dk will not function 12 | 13 | The basic idea is that `currentUser()` is for answering the question, "should this user have access to this resource?", 14 | while `checkUser` and `session.info.webId` are for answering the question, "is this user logged in?" These are the same 15 | thing on a normal server, but they are two different things when dealing with apps similar to Data-Kitchen, which need 16 | to differentiate between _having access to the local server without being logged in_ and _needing to login to access 17 | private respources on remote pods_. 18 | 19 | ## Longer answer 20 | 21 | We want the SolidOS experience of private resources, like local file systems and cloud storages, to be the same as for 22 | Pods, except that the user is treated as already logged-in for the private resources, assuming that they have their own 23 | authentication system outside of Solid. 24 | 25 | An app — a deployment of `mashlib/dist/browse.html` — can mark itself as serving private resources that do not need Solid 26 | authentication. For example, a desktop app might serve local files, or proxy to Dropbox files, like so: 27 | ``` 28 | window.SolidAppContext = { 29 | noAuth : 'http://localhost:3000/', 30 | webId : 'http://localhost:3000/localUser/profile/card#me', 31 | } 32 | ``` 33 | That says, "when viewing pages on this private site, don't try to login or authenticate; use the webId I have supplied 34 | instead, and treat me as always logged in to this site". If the private site has profiles, preferences, etc., SolidOS 35 | can now serve them as they would to an authenticated page using that webId; for example, displaying a dashboard. 36 | 37 | From the point of view of SolidOS, this means that we should not directly use `solid-ui.authn.authSession.webId` as a way 38 | to treat the user as logged in. Instead, we should use the `solid-ui.authn.currentUser()` method, which now does a check 39 | for the `window.SolidAppContext`. Instead of checking for "is authenticated", this will check for "is logged in", which 40 | includes authenticated access to non-private sites AND unauthenticated access to a private site. 41 | 42 | Here's how the `currentUser` method (or technically, the `appContext` method it calls) knows which pages to authenticate: 43 | If the user has specified a site as `noAuth`, and the current `location.href` hostname is that site, and the `uri` 44 | parameter of the `location.href` is also on that site, treat it as a `noAuth` request. So if the databrowser is being 45 | served from a private site AND the databrowser is viewing a page on that private site, don't require authentication 46 | check or login. However, if the databrowser is served from the private site and viewing a page on any other site, _do_ 47 | require an authentication check and possible login. This point is relevant everywhere, not just login — if you are 48 | using a URL, check to see if it is viewing one page from another page, and do the action on the page being viewed. 49 | 50 | The worst that happens if someone tries to spoof things is that the UI lies about the user being logged in, and when 51 | they try to access something that requires Solid authentication, they'll get a `401 Unauthorized` response. 52 | -------------------------------------------------------------------------------- /documentation/auth-upgrade-to-use-DPoP.md: -------------------------------------------------------------------------------- 1 | # This documentation talk about the Sep 2021 auth upgrade in SolidOS 2 | 3 | SolidOS underwent a major refactoring in which the deprecated [solid-auth-client](https://github.com/solid/solid-auth-client/blob/main/src/solid-auth-client.js) lib was exchnaged with the [solid-auth-client] lib. At that time the changed code was part of solid-ui, see [here](https://github.com/solidos/solid-ui/blob/a25381feb9279d98ee58f59aef03fc05bc6fe021/src/authn/authn.ts) a previous solid-ui version that contains the old authn. 4 | The new authentication refactoring was fully merged in [this version](https://github.com/solidos/solid-ui/blob/da0a788397049a2b53eea42d2b893cf1c2f7d92e/src/authn/authn.ts) (still in solid-ui). 5 | As of February 2022 this part of the code was further refactored and is now part of solid-logic. 6 | 7 | ## What has changed? 8 | 9 | ### Code review 10 | 11 | For a detailed view of what changed, the team had a code review which was recorded and stored in the team videos, look for [auth-upgrade code review](https://solidos.solidcommunity.net/public/SolidOS%20team%20meetings/SolidOS_team_videos.html). At the same location find also videos about a knowledge transfer regarding the new authentication (look for 'Solid-OIDC'). 12 | 13 | ### UX upon login from NSS 14 | 15 | There was also a diagram created before and after auth upgrade to record the UX upon login when one comes from the server. See diagrams [here](https://github.com/solidos/solidos/discussions/54) (diagram is NSS dependent). 16 | 17 | ## How does this affect the SolidOS developer? 18 | 19 | ### Login 20 | 21 | A compact code example how to login using SolidOS code is: 22 | ``` 23 | import { sym } from "rdflib"; 24 | import { default as pane } from "../src"; 25 | import { context, fetcher } from "./context"; 26 | import { authn, authSession } from "solid-logic"; 27 | import * as UI from "solid-ui"; 28 | 29 | const loginBanner = document.getElementById("loginBanner"); 30 | const webId = document.getElementById("webId"); 31 | 32 | loginBanner.appendChild(UI.login.loginStatusBox(document, null, {})); 33 | 34 | async function finishLogin() { 35 | await authSession.handleIncomingRedirect(); 36 | const session = authSession; 37 | if (session.info.isLoggedIn) { 38 | // Update the page with the status. 39 | webId.innerHTML = "Logged in as: " + authn.currentUser().uri; 40 | } else { 41 | webId.innerHTML = ""; 42 | } 43 | } 44 | 45 | finishLogin(); 46 | ``` 47 | 48 | Full code is in [profile-pane](https://github.com/solidos/profile-pane/blob/main/dev/index.ts). 49 | 50 | A code example to use login in a website by embedding mashlib.js is in the [SolidOS Databrowser Webapp](https://github.com/solidos/mashlib/blob/main/static/browse.html). 51 | 52 | ### Redirects 53 | 54 | One of the biggest changes is probably how login redirects behave. Lets say your application A is under a domain https://applicationAdomain.com and your login code is activated under this domain A BUT after a successfull login you want to redirect the user to domain B (another domain). Well, this will not work anymore! 55 | The fact that you could before, login to domainA and get redirected to domainB was quite debatable a security gap. However, the fact that you cannot do that anymore is restrictive for some use cases. 56 | You are invited to read further about it [here](https://github.com/inrupt/solid-client-authn-js/issues/1473#issuecomment-908202681). 57 | Workarounds and hacks are welcome to be reported, let us know on gitter channel is you found any. Do handle with care. 58 | 59 | ## How does this effect other developer? 60 | 61 | ### Login code must be adapted in all previous Solid Apps 62 | 63 | All previous Solid Apps should be updated to be able to work with the current Solid Server. This effort is recorded in [this ticket](https://github.com/solid/team/issues/19). The ticket also shows further examples how to upgrade and which Apps are affected. 64 | 65 | ### Login from an iFrame 66 | 67 | One cannot login/logout from an iFrame anymore. 68 | 69 | ### Logout 70 | 71 | The way logging out is experienced is different. In the decentralized ecosystem one does not simply log into an application but at the OpenID Provider endpoint (Identity Provider IdP). The IdP than consents access to the application to access the resource on the resource server (Pod). So LogOut is at least, in this use case, a double action - do not have access to the application frontend; - do not consent the application to access the resource server anymore. In both cases, these actions need to be coded in the application by invalidating cookies and session. The IdP can possibly expire the access/id token but that depends on the IdP provider configuration. 72 | -------------------------------------------------------------------------------- /documentation/guidelines/coding_guidelines.md: -------------------------------------------------------------------------------- 1 | # 🤗 Welcome CONTRIBUTOR 2 | 3 | This is a document about coding guidelines and processes. These topics reflect the way SolidOS stack contributors work. 4 | 5 | Table of content: 6 | 7 | - [🤗 Welcome CONTRIBUTOR](#-welcome-contributor) 8 | - [General rules](#general-rules) 9 | - [Documenting your code](#documenting-your-code) 10 | - [General comments](#general-comments) 11 | - [Adding a TODO](#adding-a-todo) 12 | - [Refactoring code](#refactoring-code) 13 | - [Conversion to TypeScript](#conversion-to-typescript) 14 | - [Windows developers](#windows-developers) 15 | 16 | ## General rules 17 | 18 | - In any given branch/PR, there should be no more than a couple files modified. In general, try to stick to one, though you may need two for testing — one for the test, and one for the code you are testing. 19 | - Name branch as you want. 20 | - include **WIP** in the title of the PR if you want a review. 21 | 22 | ## Documenting your code 23 | 24 | ### General comments 25 | 26 | In general, if the code is clean, it is easy to understand the algorithm, but sometimes it may make sense to include comments to explain or give an example. 27 | 28 | Comment blocks look like this: 29 | 30 | ```js 31 | /** 32 | * comments 33 | * more comments 34 | */ 35 | doSomething() 36 | ``` 37 | 38 | One-line comments look like this: 39 | 40 | ```js 41 | // comments 42 | doSomething() 43 | ``` 44 | 45 | ### Adding a TODO 46 | 47 | An example of when you need a TODO is when you refactor code. There may be times you run across code that cannot be easily changed or that may be better suited for an alternate branch. In this case you can: 48 | 49 | 1. Create a follow-up issue 50 | 2. Document the code with a comment such as that shown below 51 | `/* @@ TODO [comment about what needs to be done and/or why it is a problem]. See [link to issue]` 52 | 53 | ## Refactoring code 54 | 55 | ### Conversion to TypeScript 56 | 57 | One of the long-term goals of the SolidOS stack is to convert the code in TypeScript. 58 | 59 | Steps: 60 | 61 | 1. Rename file to `.ts` 62 | 2. Add types to public methods (if this is difficult, you can add the `any` type and add comments as described above to indicate it needs further work) 63 | 3. Add a comment that the file was previously javascript 64 | 4. No Logic changes; only minor refactoring 65 | 5. PR is reviewed by at least one other engineer and merged to `main` branch 66 | 6. Write unit tests 67 | 7. Write examples 68 | 8. Refactor 69 | 70 | ## Windows developers 71 | 72 | Notes: Single quotes can't be used in scripts on Windows; need to use `\"` instead. 73 | Builds must be run using `bash`, because of `sh` command. 74 | -------------------------------------------------------------------------------- /documentation/guidelines/dependencies_and_release_guidelines.md: -------------------------------------------------------------------------------- 1 | 2 | # 🤗 Welcome CONTRIBUTOR 3 | 4 | This document talks about SolidOS stack Node versions, and about work required upon release; in particular, about dependency upgrades. 5 | 6 | Table of contents: 7 | 8 | - [🤗 Welcome CONTRIBUTOR](#-welcome-contributor) 9 | - [Usage of Node versions in SolidOS](#usage-of-node-versions-in-solidos) 10 | - [Update Node version used in SolidOS](#update-node-version-used-in-solidos) 11 | - [Dependency upgrades](#dependency-upgrades) 12 | - [To update dependencies you can use](#to-update-dependencies-you-can-use) 13 | - [Checklist upon relase of a new SolidOS stack](#checklist-upon-relase-of-a-new-solidos-stack) 14 | 15 | ## Usage of Node versions in SolidOS 16 | 17 | Local development should be built with the latest used Node version. One can make sure this is the case by running `nvm use` in the root of the repo. This command will look for a file named `.nvmrc`, and use the node version specified therein. 18 | Since the whole SolidOS stack is built into the `mashlib.js` at the end, the Node version used is not vitally important, but best practice is still to so do it so. 19 | 20 | ## Update Node version used in SolidOS 21 | 22 | Once a year, you should upgrade the Node version you're using. In April of each year, Node releases an even-numbered Node version which will be taken into [LTS (long term support) releases](https://nodejs.org/en/about/releases/). 23 | 24 | To upgrade the Node version in SolidOS: 25 | 26 | - change the Node version in CI of each affected SolidOS repo (including `release.yml` if available) 27 | - ensure the published node version in CI is at least one version earlier than latest release, but make sure it is still in LTS by checking the [Node Releases](https://nodejs.org/en/about/releases/) 28 | - update the officially supported development Node version on SolidOS stack mentioned in `.nvmrc`. The `.nvmrc` file is available on each repo, [for example on SolidOS repo](https://github.com/solid/solidos/blob/main/.nvmrc). 29 | 30 | ## Dependency upgrades 31 | 32 | - there are a few ways to check the dependency status of a repo, such as `npm outdated`, `npx npm-check-updates`, and `npx npm-check`. 33 | - patch-up versions can be updated without any concern using `npm update` BUT this only works if the dependencies in `package.json` include tilde (`~`). Tilde allows dependencies to ONLY be updated on the semver version. If a dependency has a caret (`^`), that dependency is also updated to latest minor release. 34 | 35 | ***Note:*** Our work follows the [Semantic Versioning practices](https://semver.org/) in which, given a version number `MAJOR.MINOR.PATCH` of a repository, increment the: 36 | 37 | - `MAJOR` version when you make incompatible API changes 38 | - `MINOR` version when you add functionality in a backwards compatible manner 39 | - `PATCH` version when you make bug fixes in a backwards compatible manner 40 | 41 | When starting a new module always start with version 1.0.0. 42 | 43 | ### To update dependencies you can use 44 | 45 | - `npm update` which updates ONLY safe minor and patch versions 46 | - `npx npm-check-updates -u` which also updates major versions 47 | 48 | - it is also good to run an `npm audit` from time to time, and run a `npm audit fix` as needed 49 | 50 | ## Checklist upon relase of a new SolidOS stack 51 | 52 | The following is a guideline of what should be considered upon a release. It is not an exhaustive list, but covers most situations. 53 | 54 | - In each repository to be released, you need to do a dependency upgrade with `npx npm-check-updates -u`. This upgrades all dependencies to major versions. Afterwards, you need to make sure the repo builds and all tests pass. 55 | - The `main` branch of each repository should be green in GitHub CI. 56 | - The build must follow a strict order because the repositories depend on each other. The priority is as follows: 57 | - rdflib 58 | - solid-logic 59 | - solid-ui 60 | - activitystreams-pane 61 | - chat-pane 62 | - contacts-pane 63 | - folder-pane 64 | - issue-pane 65 | - meeting-pane 66 | - profile-pane 67 | - source-pane 68 | - solid-panes 69 | - mashlib 70 | - NSS 71 | - solidos 72 | _**Note:** The strict build order means, for example, if you make a change in `solid-ui`, all the following panes that make use of the `solid-ui` changes also need to be upgraded; then `solid-panes` must be upgraded to contain the new `solid-ui` version, and because `solid-panes` version changes, the `mashlib` version also needs to change._ 73 | 74 | To ease this work, SolidOS contains a [release script](https://github.com/SolidOS/solidos/blob/main/scripts/release); however, the release script also updates ALL dependencies in ALL repos to major versions, which means the above steps MUST be done beforehand. 75 | -------------------------------------------------------------------------------- /documentation/guidelines/testing_guidelines.md: -------------------------------------------------------------------------------- 1 | # 🤗 Welcome CONTRIBUTOR 2 | 3 | This document helps contributors improve testing habits with guidelines and know-how. 4 | 5 | Table of contents: 6 | 7 | - [🤗 Welcome CONTRIBUTOR](#-welcome-contributor) 8 | - [Testing guidelines](#testing-guidelines) 9 | - [Testing strategy](#testing-strategy) 10 | - [Testing know-how](#testing-know-how) 11 | - [Videos about testing knowledge transfer](#videos-about-testing-knowledge-transfer) 12 | - [General information](#general-information) 13 | - [Data fixtures](#data-fixtures) 14 | - [Using custom matchers](#using-custom-matchers) 15 | 16 | ## Testing guidelines 17 | 18 | - When you fix a bug, start by creating a test to reproduce it, and then fix it. 19 | - Tests throughout the SolidOS stack should be in dedicated folders called 'test'. 20 | 21 | ## Testing strategy 22 | 23 | - At first, we will work to have more integration tests, as it is currently hard to write unit tests. As time goes on, it will eventually flip. At the same time, we will refactor code to be more modular to do unit tests. 24 | - Both unit tests and integration tests will be in all repos. 25 | - No end-to-end (e2e) tests currently; we may do some of these outside of the repos. 26 | - Add `rdflib` to the list of repos to be tested. 27 | 28 | ## Testing know-how 29 | 30 | ### Videos about testing knowledge transfer 31 | 32 | The SolidOS team did a few workshops and presentations about how to do testing in general and on the SolidOS stack. You can revisit them [here](https://solidos.solidcommunity.net/public/SolidOS%20team%20meetings/SolidOS_team_videos.html). 33 | 34 | ### General information 35 | 36 | The original code was not written with testing in mind. To make testing more efficient, you may find it easier to export a function. To do this, include the following comment above the function so that it does not get picked up by `Typedoc`. 37 | `@ignore exporting this only for the unit test` 38 | 39 | There will also be times that even exporting the function isn't enough to enable proper tests to be developed. 40 | In this case, follow the commenting procedures in the Code `Readme.md`, which is to add the comment 41 | ` \* @@ TODO` and describe the problem. 42 | 43 | You can reference in your [`TODO` comment](./coding_guidelines.md#adding-a-todo) if the code is hard to test due to DOM manipulation. 44 | 45 | ### Data fixtures 46 | 47 | See for an example of how to use `store.add` in a 48 | unit test to set up some data in the store. Don't forget to [`clearStore afterEach`](https://github.com/solidos/solid-ui/blob/5fd8fb0/test/unit/widgets/buttons.test.ts#L214). 49 | 50 | ### Using custom matchers 51 | 52 | We have added some custom matchers to ease the testing. You can see the full list at `test/setup.ts`, in 53 | the `expect.extend` part. 54 | 55 | - `expect(A).toEqualGraph(B)`: Use this matcher to check whether graphs A and B are equal (meaning they contain the 56 | same set of triples) 57 | - `expect(A).toContainGraph(B)`: Use this matcher to check whether graph B is contained in graph A. 58 | -------------------------------------------------------------------------------- /documentation/resources/architecture.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 |
16 |

17 | SolidOS -  18 | An Operating System for Solid 19 |

20 |
21 |
22 |
23 |
24 | 25 | SolidOS - An Operating System for Solid 26 | 27 |
28 |
29 |
30 | 31 | 32 | 33 | 34 | 35 |
36 |
37 |
38 | based on 39 |
40 |
41 |
42 |
43 | based 44 | on 45 | 46 |
47 |
48 | 49 | 50 | 51 | 52 | 53 |
54 |
55 |
56 | uses 57 |
58 |
59 |
60 |
61 | 62 | uses 63 | 64 |
65 |
66 | 67 | 68 | 69 | 70 | 71 |
72 |
73 |
74 | solid-panes 75 |
76 | 77 | core solid-compatible applets 78 | 79 |
80 |
81 |
82 |
83 | 84 | solid-panes... 85 | 86 |
87 |
88 |
89 | 90 | 91 | 92 | 93 | 94 |
95 |
96 |
97 | renders 98 |
99 |
100 |
101 |
102 | 103 | renders 104 | 105 |
106 |
107 | 108 | 109 | 110 | 111 | 112 |
113 |
114 |
115 | uses 116 |
117 |
118 |
119 |
120 | uses 121 | 122 |
123 |
124 | 125 | 126 | 127 | 128 | 129 |
130 |
131 |
132 | mashlib 133 |
134 | 135 | 136 | application-level functionality 137 | 138 | 139 |
140 |
141 |
142 |
143 | 144 | mashlib... 145 | 146 |
147 |
148 |
149 | 150 | 151 | 152 | 153 | 154 |
155 |
156 |
157 | uses 158 |
159 |
160 |
161 |
162 | 163 | uses 164 | 165 |
166 |
167 | 168 | 169 | 170 | 171 | 172 |
173 |
174 |
175 | uses 176 |
177 |
178 |
179 |
180 | 181 | uses 182 | 183 |
184 |
185 | 186 | 187 | 188 | 189 | 190 |
191 |
192 |
193 | solid-ui 194 |
195 | 196 | User Interface widgets and utilities 197 | 198 |
199 |
200 |
201 |
202 | 203 | solid-ui... 204 | 205 |
206 |
207 |
208 | 209 | 210 | 211 | 212 | 213 |
214 |
215 |
216 | uses 217 |
218 |
219 |
220 |
221 | uses 222 | 223 |
224 |
225 | 226 | 227 | 228 | 229 | 230 |
231 |
232 |
233 | solid-logic 234 |
235 | 236 | Core business logic 237 | 238 |
239 |
240 |
241 |
242 | 243 | solid-logic... 244 | 245 |
246 |
247 |
248 | 249 | 250 | 251 | 252 | 253 |
254 |
255 |
256 | serves 257 |
258 |
259 |
260 |
261 | 262 | serves 263 | 264 |
265 |
266 | 267 | 268 | 269 | 270 | 271 |
272 |
273 |
274 |

275 | Node Solid Server 276 |

277 |
278 |
279 |
280 |
281 | 282 | Node Solid Server 283 | 284 |
285 |
286 |
287 | 288 | 289 | 290 | 291 | 292 |
293 |
294 |
295 | rdflib.js 296 |
297 | 298 | RDF library 299 | 300 |
301 |
302 |
303 |
304 | 305 | rdflib.js... 306 | 307 |
308 |
309 |
310 |
311 | 312 | 313 | 314 | Viewer does not support full SVG 1.1 315 | 316 | 317 |
-------------------------------------------------------------------------------- /documentation/solidos_dependencies.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | %3 11 | 12 | 13 | 14 | rdflib 15 | 16 | rdflib 17 | 18 | 19 | 20 | solid_ui 21 | 22 | Solid UI 23 | 24 | 25 | 26 | solid_ui->rdflib 27 | 28 | 29 | 30 | 31 | 32 | pane_registry 33 | 34 | pane-registry 35 | 36 | 37 | 38 | solid_ui->pane_registry 39 | 40 | 41 | 42 | 43 | 44 | solid_logic 45 | 46 | solid-logic 47 | 48 | 49 | 50 | solid_ui->solid_logic 51 | 52 | 53 | 54 | 55 | 56 | solid_panes 57 | 58 | solid-panes 59 | 60 | 61 | 62 | solid_panes->rdflib 63 | 64 | 65 | 66 | 67 | 68 | solid_panes->solid_ui 69 | 70 | 71 | 72 | 73 | 74 | solid_panes->pane_registry 75 | 76 | 77 | 78 | 79 | 80 | solid_panes->solid_logic 81 | 82 | 83 | 84 | 85 | 86 | pane_registry->rdflib 87 | 88 | 89 | 90 | 91 | 92 | pane_registry->solid_logic 93 | 94 | 95 | 96 | 97 | 98 | profile_pane 99 | 100 | profile-pane 101 | 102 | 103 | 104 | profile_pane->pane_registry 105 | 106 | 107 | 108 | 109 | 110 | profile_pane->solid_logic 111 | 112 | 113 | 114 | 115 | 116 | mashlib 117 | 118 | mashlib 119 | 120 | 121 | 122 | mashlib->rdflib 123 | 124 | 125 | 126 | 127 | 128 | mashlib->solid_panes 129 | 130 | 131 | 132 | 133 | 134 | mashlib->solid_logic 135 | 136 | 137 | 138 | 139 | 140 | solid_logic->rdflib 141 | 142 | 143 | 144 | 145 | 146 | server 147 | 148 | Servers 149 | 150 | 151 | 152 | server->mashlib 153 | 154 | 155 | 156 | 157 | 158 | app 159 | 160 | Web Apps 161 | 162 | 163 | 164 | app->mashlib 165 | 166 | 167 | 168 | 169 | 170 | native 171 | 172 | Native Apps 173 | 174 | 175 | 176 | native->mashlib 177 | 178 | 179 | 180 | 181 | 182 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [ 3 | "workspaces/*" 4 | ], 5 | "version": "independent" 6 | } 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solidos", 3 | "private": true, 4 | "description": "SolidOS - Operating System for Solid", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/solidos/solidos" 8 | }, 9 | "keywords": [ 10 | "solidos", 11 | "solid", 12 | "decentralized" 13 | ], 14 | "author": "Tim Berners-Lee ", 15 | "contributors": [ 16 | "https://github.com/solidos/solidos/graphs/contributors" 17 | ], 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/solidos/solidos/issues" 21 | }, 22 | "homepage": "https://solidos.solidcommunity.net/", 23 | "scripts": { 24 | "start": "scripts/start", 25 | "start-css": "scripts/start-css", 26 | "start-nss": "scripts/start-nss", 27 | "watch": "scripts/watch", 28 | "add": "scripts/add", 29 | "addPanes": "npm run add activitystreams && npm run add chat && npm run add contacts && npm run add folder && npm run add issue && npm run add meeting && npm run add profile && npm run add source", 30 | "delete": "scripts/delete", 31 | "deletePanes": "npm run add activitystreams-pane && npm run delete chat-pane && npm run delete contacts-pane && npm run delete folder-pane && npm run delete issue-pane && npm run delete meeting-pane && npm run delete profile-pane && npm run delete source-pane", 32 | "reset": "scripts/reset", 33 | "setup": "scripts/install && scripts/reset", 34 | "release": "/bin/bash scripts/release", 35 | "bootstrap": "lerna bootstrap --force-local --scope ", 36 | "switchToBranch": "scripts/delete && scripts/switch-branch" 37 | }, 38 | "devDependencies": { 39 | "concurrently": "5.3.0", 40 | "lerna": "3.22.1" 41 | }, 42 | "dependencies": { 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /scripts/add: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | unset PREFIX npm_config_prefix 5 | export NVM_DIR="$HOME/.nvm" 6 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 7 | 8 | FOLDER=$1 9 | GIT_URL=$2 10 | case $1 in 11 | 'acl-check') 12 | GIT_URL='https://github.com/solid/acl-check.git' 13 | ;; 14 | 'activitystreams' | 'activitystreams-pane') 15 | FOLDER='activitystreams-pane' 16 | GIT_URL='https://github.com/solidos/activitystreams-pane' 17 | ;; 18 | 'chat' | 'chat-pane') 19 | FOLDER='chat-pane' 20 | GIT_URL='https://github.com/solidos/chat-pane' 21 | ;; 22 | 'contacts' | 'contacts-pane') 23 | FOLDER='contacts-pane' 24 | GIT_URL='https://github.com/solidos/contacts-pane' 25 | ;; 26 | 'css' | 'css-mashlib') 27 | FOLDER='css-mashlib' 28 | GIT_URL='https://github.com/solidos/css-mashlib' 29 | ;; 30 | 'folder' | 'folder-pane') 31 | FOLDER='folder-pane' 32 | GIT_URL='https://github.com/solidos/folder-pane' 33 | ;; 34 | 'github-solid') 35 | GIT_URL='https://github.com/solid/github-solid' 36 | ;; 37 | 'gitter-solid') 38 | GIT_URL='https://github.com/solid/gitter-solid' 39 | ;; 40 | 'issue' | 'issue-pane') 41 | FOLDER='issue-pane' 42 | GIT_URL='https://github.com/solidos/issue-pane' 43 | ;; 44 | 'profile' | 'profile-pane') 45 | FOLDER='profile-pane' 46 | GIT_URL='https://github.com/solidos/profile-pane' 47 | ;; 48 | 'jose') 49 | GIT_URL='https://github.com/solid/jose' 50 | ;; 51 | 'keychain') 52 | GIT_URL='https://github.com/solid/keychain' 53 | ;; 54 | 'markdown' | 'markdown-pane') 55 | FOLDER='markdown-pane' 56 | GIT_URL='https://github.com/solidos/markdown-pane' 57 | ;; 58 | 'mashlib') 59 | GIT_URL='https://github.com/solidos/mashlib' 60 | ;; 61 | 'meeting' | 'meeting-pane') 62 | FOLDER='meeting-pane' 63 | GIT_URL='https://github.com/solidos/meeting-pane' 64 | ;; 65 | 'node-solid-server') 66 | GIT_URL='https://github.com/solid/node-solid-server' 67 | ;; 68 | 'node-solid-ws') 69 | GIT_URL='https://github.com/solid/node-solid-ws.git' 70 | ;; 71 | 'node-webid') 72 | GIT_URL='https://github.com/linkeddata/node-webid.git' 73 | ;; 74 | 'oidc-auth-manager') 75 | GIT_URL='https://github.com/solid/oidc-auth-manager.git' 76 | ;; 77 | 'oidc-op') 78 | GIT_URL='https://github.com/solid/oidc-op' 79 | ;; 80 | 'oidc-rp') 81 | GIT_URL='https://github.com/solid/oidc-rp' 82 | ;; 83 | 'oidc-rs') 84 | GIT_URL='https://github.com/solid/oidc-rs' 85 | ;; 86 | 'pane-registry' | 'registry') 87 | GIT_URL='https://github.com/solidos/pane-registry' 88 | ;; 89 | 'rdflib') 90 | GIT_URL='https://github.com/linkeddata/rdflib.js.git' 91 | ;; 92 | 'solid-auth-cli') 93 | GIT_URL='https://github.com/jeff-zucker/solid-auth-cli.git' 94 | ;; 95 | 'solid-auth-client') 96 | GIT_URL='https://github.com/solid/solid-auth-client.git' 97 | ;; 98 | 'solid-auth-fetcher') 99 | GIT_URL='https://github.com/solid/solid-auth-fetcher.git' 100 | ;; 101 | 'solid-auth-oidc') 102 | GIT_URL='https://github.com/solid/solid-auth-oidc.git' 103 | ;; 104 | 'solid-auth-tls') 105 | GIT_URL='https://github.com/solid/solid-auth-tls.git' 106 | ;; 107 | 'solid-cli') 108 | GIT_URL='https://github.com/solid/solid-cli.git' 109 | ;; 110 | 'solid-crud-tests') 111 | GIT_URL='https://github.com/solid/solid-crud-tests.git' 112 | ;; 113 | 'solid-logic') 114 | GIT_URL='https://github.com/solidos/solid-logic.git' 115 | ;; 116 | 'money-pane') 117 | GIT_URL='https://github.com/solidos/money-pane.git' 118 | ;; 119 | 'solid-multi-rp-client') 120 | GIT_URL='https://github.com/solid/solid-multi-rp-client.git' 121 | ;; 122 | 'solid-namespace') 123 | GIT_URL='https://github.com/solid/solid-namespace' 124 | ;; 125 | 'solid-node-client') 126 | GIT_URL='https://github.com/solid/solid-node-client' 127 | ;; 128 | 'solid-panes') 129 | GIT_URL='https://github.com/solidos/solid-panes' 130 | ;; 131 | 'solid-rest') 132 | GIT_URL='https://github.com/solid/solid-rest.git' 133 | ;; 134 | 'solid-ui') 135 | GIT_URL='https://github.com/solidos/solid-ui' 136 | ;; 137 | 'source' | 'source-pane') 138 | FOLDER='source-pane' 139 | GIT_URL='https://github.com/solidos/source-pane' 140 | ;; 141 | 'web-access-control-tests') 142 | GIT_URL='https://github.com/solid/web-access-control-tests.git' 143 | ;; 144 | 'webid-provider-tests') 145 | GIT_URL='https://github.com/solid/webid-provider-tests.git' 146 | ;; 147 | esac 148 | 149 | if test -z "$GIT_URL" 150 | then 151 | echo "repo not recognized, please provide URL to Git repo" 152 | exit 1 153 | fi 154 | 155 | echo $GIT_URL 156 | 157 | echo ">>>>> ADDING REPO - $GIT_URL to $FOLDER" 158 | cd workspaces 159 | git clone $GIT_URL $FOLDER 160 | cd $FOLDER 161 | nvm use --delete-prefix 162 | npm i 163 | cd ../.. 164 | -------------------------------------------------------------------------------- /scripts/delete: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo ">>>>> DELETING REPO - $1" 4 | cd workspaces 5 | rm -rf $1 6 | cd .. 7 | npx lerna clean --yes 8 | -------------------------------------------------------------------------------- /scripts/install: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | unset PREFIX npm_config_prefix 5 | export NVM_DIR="$HOME/.nvm" 6 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 7 | 8 | nvm use --delete-prefix 9 | 10 | echo ">>>>> INSTALLING NPM DEPENDENCIES" 11 | rm -rf node_modules 12 | npm install 13 | -------------------------------------------------------------------------------- /scripts/release: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | unset PREFIX npm_config_prefix 5 | export NVM_DIR="$HOME/.nvm" 6 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 7 | 8 | function gitCheckoutMainOf { 9 | if [ ! -d workspaces/$1 ]; then 10 | echo "Creating workspace $1" 11 | npm run add $1 12 | fi 13 | if [ ! -d workspaces/$1 ]; then 14 | echo "Workspace not found! $1" 1>&2 15 | exit 64 16 | fi 17 | echo Checkout $1 18 | cd workspaces/$1 19 | sed -i -e 's/https...github.com./git@github.com:/g' .git/config 20 | git checkout main 21 | git reset origin/main 22 | git checkout -- . 23 | git pull 24 | } 25 | function npmInstallUpdateOf { 26 | echo update dependencies $1 27 | nvm use --delete-prefix 28 | rm -rf node_modules 29 | rm package-lock.json 30 | npx npm-check-updates -u --target minor # patch, minor, major 31 | # npm install --save-dev eslint@7 # eslint@8 do not works with node.j < 16 32 | } 33 | function testBuildPushTagOn { 34 | echo install $1 35 | npm install 36 | echo Test, Build and Create tag of $1 37 | npm test 38 | npm run build 39 | ( git commit -am"Update dependencies" && npm version patch && npm publish -timeout=9999999 ) || echo No change in $1 40 | git push origin main --follow-tags 41 | cd ../.. 42 | echo Finished $1 43 | } 44 | function updateRepo { 45 | echo Starting $1 46 | gitCheckoutMainOf $1 47 | npmInstallUpdateOf $1 48 | testBuildPushTagOn $1 49 | } 50 | 51 | # This is a here-document 52 | << REMOVED 53 | Any code in between is not executed. 54 | REMOVED 55 | 56 | updateRepo solid-namespace # solid-namespace 57 | 58 | gitCheckoutMainOf rdflib # rdflib (jsonld, n3, xmldom) 59 | npmInstallUpdateOf rdflib 60 | npm install --save-dev node-fetch@2 # node-fetch@3 needs import 61 | testBuildPushTagOn rdflib 62 | 63 | updateRepo solid-logic # solid-logic (rdflib, solid-namespace) 64 | updateRepo pane-registry # pane-registry (solid-logic, rdflib) 65 | 66 | gitCheckoutMainOf solid-ui # solid-ui (pane-registry, solid-logic, rdflib, solid-namespace) 67 | npm install pane-registry solid-logic rdflib solid-namespace # temporary until storybook updated to react 18 68 | # npmInstallUpdateOf solid-ui 69 | # npm install --save-dev @testing-library/user-event@13 70 | # npm install --save react@17 react-dom@17 react-is@17 # for storybook@6.4.19 71 | testBuildPushTagOn solid-ui 72 | 73 | gitCheckoutMainOf activitystreams-pane # activity-streams (solid-ui, pane-registry, solid-logic, rdflib) 74 | npm install solid-ui pane-registry solid-logic rdflib # temporary until storybook updated to react 18 75 | # npmInstallUpdateOf activitystreams-pane 76 | # npm install --save react@17 react-dom@17 # for storybook@6.4.19 77 | testBuildPushTagOn activitystreams-pane 78 | 79 | updateRepo chat-pane # chat-pane (solid-ui, solid-logic, rdflib) 80 | updateRepo folder-pane # folder-pane (solid-ui, solid-logic) 81 | updateRepo issue-pane # issue-pane (solid-ui, pane-registry, rdflib) 82 | updateRepo meeting-pane # meeting-pane (solid-ui, solid-logic, rdflib) 83 | updateRepo contacts-pane # contacts-pane (solid-ui, pane-registry, solid-logic, rdflib) 84 | updateRepo profile-pane # profile-pane (contacts-pane, solid-ui, pane-registry, solid-logic, rdflib) 85 | updateRepo source-pane # source-pane (solid-ui) 86 | updateRepo folder-pane # folder-pane (solid-ui, solid-logic) 87 | updateRepo solid-panes # solid-panes (chat-pane, contacts-pane, folder-pane, issue-pane, meeting-pane, pane-registry, rdflib, solid-ui, source-pane) 88 | 89 | updateRepo mashlib # mashlib (rdflib, solid-panes, solid-ui) 90 | 91 | << REMOVED 92 | updateRepo jose # @solid/jose 93 | updateRepo oidc-rp # @solid/oidc-rp (@solid/jose) 94 | 95 | gitCheckoutMainOf solid-auth-client # solid-auth-client (@babel/runtime, auth-header, commander, isomorphic-fetch, @solid/oidc-rp) 96 | # npmInstallUpdateOf solid-auth-client 97 | npm install @solid/oidc-rp@latest 98 | testBuildPushTagOn solid-auth-client 99 | 100 | updateRepo node-solid-ws # solid-ws () 101 | updateRepo node-webid # webid (rdflib) 102 | updateRepo acl-check # @solid/acl-check (rdflib, solid-namespace) 103 | updateRepo keychain # @solid/keychain 104 | updateRepo oidc-op # @solid/oidc-op (@solid/keychain) 105 | updateRepo oidc-rs # @solid/oidc-rs (@solid/jose) 106 | updateRepo solid-multi-rp-client # @solid/solid-multi-rp-client (oidc-rp) 107 | updateRepo oidc-auth-manager # @solid/oidc-auth-manager (oidc-rp, oidc-op, oidc-rs, solid-multi-rp-client) 108 | updateRepo solid-auth-oidc # @solid/solid-auth-oidc (@solid/oidc-rp) 109 | 110 | gitCheckoutMainOf node-solid-server # solid-server (@solid/acl-check, @solid/oidc-auth-manager, rdflib, mashlib, solid-auth-client, solid-namespace, solid-ws, @solid/oidc-op, @solid/solid-auth-oidc, webid) 111 | npmInstallUpdateOf node-solid-server 112 | npm install bootstrap@3 113 | npm install get-folder-size@2 # require needed 114 | npm install into-stream@6 # require needed 115 | npm install --save-dev @solid/solid-auth-oidc@0.3.0 116 | testBuildPushTagOn node-solid-server 117 | 118 | gitCheckoutMainOf solid-rest # solid-rest (concat-stream, cross-fetch, fs-extra, mime-types) 119 | nvm use --delete-prefix 120 | rm -rf node_modules 121 | rm package-lock.json 122 | npx npm-check-updates -u 123 | npm install --save-dev webpack@4 124 | testBuildPushTagOn solid-rest 125 | 126 | updateRepo solid-cli # solid-cli (@solid/oidc-rp) 127 | 128 | # FIXME: https://github.com/solid/solid-auth-fetcher/issues/15 129 | # updateRepo solid-auth-fetcher 130 | updateRepo solid-node-client # solid-node-client (rdflib, solid-auth-fetcher, solid-rest) 131 | updateRepo webid-provider-tests 132 | updateRepo solid-crud-tests 133 | updateRepo web-access-control-tests 134 | 135 | # FIXME: https://github.com/solid/github-solid/pull/2 136 | # updateRepo gitter-solid 137 | # FIXME: https://github.com/solid/gitter-solid/pull/12 138 | # updateRepo github-solid 139 | REMOVED 140 | -------------------------------------------------------------------------------- /scripts/reset: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | unset PREFIX npm_config_prefix 5 | export NVM_DIR="$HOME/.nvm" 6 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 7 | 8 | nvm use --delete-prefix 9 | 10 | echo ">>>>> SETTING UP/RESETTING PROJECT" 11 | mkdir -p workspaces 12 | rm -rf workspaces/* 13 | 14 | declare -a packages=( 15 | "css-mashlib" 16 | "node-solid-server" 17 | "mashlib" 18 | "solid-panes" 19 | "solid-ui" 20 | "pane-registry" 21 | "solid-logic" 22 | "rdflib") 23 | 24 | # Clone and npm install dependent packages 25 | for package in "${packages[@]}" 26 | do 27 | echo "" 28 | echo "# Installing $package" 29 | npm run add $package 30 | done 31 | 32 | # Build dependent packages, ensuring each is in proper Node environment via nvm 33 | for package in "${packages[@]}" 34 | do 35 | echo "" 36 | echo "# Building $package" 37 | pushd workspaces/$package 38 | nvm use --delete-prefix 39 | npm run build 40 | popd 41 | done 42 | 43 | openssl req -outform PEM -keyform PEM -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout workspaces/privkey.pem -days 365 -out workspaces/fullchain.pem -subj "/C=RO/ST=Bucharest/L=Bucharest/O=IT/CN=localhost" 44 | -------------------------------------------------------------------------------- /scripts/start: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | unset PREFIX npm_config_prefix 4 | export NVM_DIR="$HOME/.nvm" 5 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 6 | 7 | npx lerna bootstrap --force-local 8 | 9 | cd workspaces/node-solid-server 10 | nvm use --delete-prefix 11 | ./bin/solid-test start --root ./data --port 8443 --ssl-key ../privkey.pem --ssl-cert ../fullchain.pem & # & to run in background 12 | 13 | cd ../css-mashlib 14 | nvm use --delete-prefix 15 | npm run start 16 | -------------------------------------------------------------------------------- /scripts/start-css: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | unset PREFIX npm_config_prefix 4 | export NVM_DIR="$HOME/.nvm" 5 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 6 | 7 | npx lerna bootstrap --force-local 8 | 9 | cd workspaces/css-mashlib 10 | nvm use --delete-prefix 11 | npm run start 12 | -------------------------------------------------------------------------------- /scripts/start-nss: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | unset PREFIX npm_config_prefix 4 | export NVM_DIR="$HOME/.nvm" 5 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 6 | 7 | npx lerna bootstrap --force-local 8 | 9 | cd workspaces/node-solid-server 10 | nvm use --delete-prefix 11 | ./bin/solid-test start --root ./data --port 8443 --ssl-key ../privkey.pem --ssl-cert ../fullchain.pem 12 | 13 | -------------------------------------------------------------------------------- /scripts/switch-branch: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | unset PREFIX npm_config_prefix 5 | export NVM_DIR="$HOME/.nvm" 6 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 7 | 8 | nvm use --delete-prefix 9 | 10 | FOLDER=$1 11 | 12 | echo ">>>>> SETTING UP PROJECT WITH NEW BRANCH $1" 13 | mkdir -p workspaces 14 | rm -rf workspaces/* 15 | 16 | declare -a packages=( 17 | "rdflib" 18 | "solid-logic" 19 | "pane-registry" 20 | "solid-ui" 21 | "solid-panes" 22 | "mashlib" 23 | "node-solid-server") 24 | 25 | # Clone and npm install dependent packages 26 | for package in "${packages[@]}" 27 | do 28 | echo "" 29 | echo "# Installing $package" 30 | npm run add $package 31 | done 32 | 33 | # checkout specified branch 34 | for package in "${packages[@]}" 35 | do 36 | echo "" 37 | echo "# Checking out $1 for $package" 38 | pushd workspaces/$package 39 | git checkout $1 || true 40 | git pull 41 | npm i 42 | popd 43 | done 44 | 45 | # Build dependent packages, ensuring each is in proper Node environment via nvm 46 | for package in "${packages[@]}" 47 | do 48 | echo "" 49 | echo "# Building $package" 50 | pushd workspaces/$package 51 | nvm use --delete-prefix 52 | npm run build 53 | popd 54 | done 55 | 56 | for x in workspaces/* ; do ( echo "###### " $x; cd $x; git status) done 57 | 58 | openssl req -outform PEM -keyform PEM -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout workspaces/privkey.pem -days 365 -out workspaces/fullchain.pem -subj "/C=RO/ST=Bucharest/L=Bucharest/O=IT/CN=localhost" 59 | -------------------------------------------------------------------------------- /scripts/update-mashlib-repo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git checkout master 4 | git pull 5 | npm install rdflib@latest solid-namespace@latest solid-ui@latest solid-panes@latest 6 | git commit -am'npm install rdflib@latest solid-namespace@latest solid-ui@latest solid-panes@latest' 7 | npm version minor 8 | npm publish -timeout=9999999 9 | -------------------------------------------------------------------------------- /scripts/update-solid-panes-repo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git checkout master 4 | git pull 5 | npm install solid-ui@latest chat-pane@latest contacts-pane@latest folder-pane@latest issue-pane@latest meeting-pane@latest source-pane@latest 6 | git commit -am'npm install solid-ui@latest chat-pane@latest contacts-pane@latest folder-pane@latest issue-pane@latest meeting-pane@latest source-pane@latest' 7 | npm version minor 8 | npm publish -timeout=9999999 9 | -------------------------------------------------------------------------------- /scripts/update-this-panes-repo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git checkout master 4 | git pull 5 | npm install solid-ui@latest 6 | git commit -am'npm install solid-ui@latest' 7 | npm version minor 8 | npm publish -timeout=9999999 9 | -------------------------------------------------------------------------------- /scripts/watch: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | unset PREFIX npm_config_prefix 4 | export NVM_DIR="$HOME/.nvm" 5 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 6 | 7 | nvm use --delete-prefix 8 | 9 | npx lerna bootstrap --force-local 10 | 11 | declare -a packageNames=( 12 | "rdflib" 13 | "solid-logic" 14 | "pane-registry" 15 | "solid-ui" 16 | "solid-panes" 17 | "mashlib" 18 | "node-solid-server" 19 | ) 20 | 21 | # Via https://zaiste.net/posts/how-to-join-elements-of-array-bash/ 22 | function join { local IFS="$1"; shift; echo "$*"; } 23 | 24 | # Build the string of package names for use by concurrently 25 | packageNamesString=$(join , ${packageNames[@]}) 26 | 27 | # Concurrently start a `watch` task for solid-ui, solid-panes, and mashlib, and start Node Solid Server. 28 | # Note that mashlib chokes if the watch task of solid-panes is still starting up while it's running; 29 | # a hacky workaround to that is to delay it by 20 seconds before starting (`sleep 20`). 30 | packageCommands=() 31 | for package in "${packageNames[@]}" 32 | do 33 | command="npm run watch" 34 | if [[ "$package" == "mashlib" ]]; then 35 | command="sleep 20 && $command" 36 | elif [[ "$package" == "node-solid-server" ]]; then 37 | command="./bin/solid-test start --root ./data --port 8443 --ssl-key ../privkey.pem --ssl-cert ../fullchain.pem" 38 | fi 39 | # command="echo '---' && pwd && echo '---'" 40 | 41 | command=". $HOME/.nvm/nvm.sh; cd workspaces/$package; nvm use --delete-prefix; $command" 42 | packageCommands+=("$command") 43 | done 44 | 45 | # The next line will execute: 46 | # npx concurrently --names rdflib,solid-logic,pane-registry,solid-ui,solid-panes,mashlib,node-solid-server 47 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/rdflib; nvm use --delete-prefix; npm run watch 48 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/solid-logic; nvm use --delete-prefix; npm run watch 49 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/pane-registry; nvm use --delete-prefix; npm run watch 50 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/solid-ui; nvm use --delete-prefix; npm run watch 51 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/solid-panes; nvm use --delete-prefix; npm run watch 52 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/mashlib; nvm use --delete-prefix; sleep 20 && npm run watch 53 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/node-solid-server; nvm use --delete-prefix; 54 | #./bin/solid-test start --root ./data --port 8443 --ssl-key ../privkey.pem --ssl-cert ../fullchain.pem 55 | 56 | npx concurrently --names "$packageNamesString" "${packageCommands[@]}" 57 | -------------------------------------------------------------------------------- /scripts/watch-css: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | unset PREFIX npm_config_prefix 4 | export NVM_DIR="$HOME/.nvm" 5 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 6 | 7 | nvm use --delete-prefix 8 | 9 | npx lerna bootstrap --force-local 10 | 11 | declare -a packageNames=( 12 | source-pane 13 | solid-panes 14 | mashlib 15 | css-mashlib 16 | ) 17 | 18 | # Via https://zaiste.net/posts/how-to-join-elements-of-array-bash/ 19 | function join { local IFS="$1"; shift; echo "$*"; } 20 | 21 | # Build the string of package names for use by concurrently 22 | packageNamesString=$(join , ${packageNames[@]}) 23 | 24 | # Concurrently start a `watch` task for solid-ui, solid-panes, and mashlib, and start Node Solid Server. 25 | # Note that mashlib chokes if the watch task of solid-panes is still starting up while it's running; 26 | # a hacky workaround to that is to delay it by 20 seconds before starting (`sleep 20`). 27 | packageCommands=() 28 | for package in "${packageNames[@]}" 29 | do 30 | command="npm run watch" 31 | if [[ "$package" == "mashlib" ]]; then 32 | command="sleep 20 && $command" 33 | elif [[ "$package" == "css-mashlib" ]]; then 34 | command="npx community-solid-server -c ./config/http-mashlib-suffix-file.json -f ./data" 35 | fi 36 | # command="echo '---' && pwd && echo '---'" 37 | 38 | command=". $HOME/.nvm/nvm.sh; cd workspaces/$package; nvm use --delete-prefix; $command" 39 | packageCommands+=("$command") 40 | done 41 | 42 | # The next line will execute: 43 | # npx concurrently --names rdflib,solid-logic,pane-registry,solid-ui,solid-panes,mashlib,node-solid-server 44 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/rdflib; nvm use --delete-prefix; npm run watch 45 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/solid-logic; nvm use --delete-prefix; npm run watch 46 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/pane-registry; nvm use --delete-prefix; npm run watch 47 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/solid-ui; nvm use --delete-prefix; npm run watch 48 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/solid-panes; nvm use --delete-prefix; npm run watch 49 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/mashlib; nvm use --delete-prefix; sleep 20 && npm run watch 50 | #. /Users/imyshor/.nvm/nvm.sh; cd workspaces/node-solid-server; nvm use --delete-prefix; 51 | #./bin/solid-test start --root ./data --port 8443 --ssl-key ../privkey.pem --ssl-cert ../fullchain.pem 52 | 53 | npx concurrently --names "$packageNamesString" "${packageCommands[@]}" 54 | --------------------------------------------------------------------------------