2016-09-15 12:50:28 +08:00
# scratch-gui
2024-02-17 09:36:56 +08:00
Scratch GUI is a set of React components that comprise the interface for creating and running Scratch 3.0 projects
2016-09-15 12:50:28 +08:00
2024-02-20 04:29:13 +08:00
To open the current build in your browser on Github Pages:
https://scratchfoundation.github.io/scratch-gui/
2016-09-15 12:50:28 +08:00
## Installation
2024-02-17 09:36:56 +08:00
2016-09-15 12:50:28 +08:00
This requires you to have Git and Node.js installed.
In your own node environment/application:
2024-02-17 09:36:56 +08:00
2016-09-15 12:50:28 +08:00
```bash
2024-02-20 04:29:13 +08:00
npm install https://github.com/scratchfoundation/scratch-gui.git
2016-09-15 12:50:28 +08:00
```
2024-02-17 09:36:56 +08:00
2016-09-15 12:50:28 +08:00
If you want to edit/play yourself:
2024-02-17 09:36:56 +08:00
2016-09-15 12:50:28 +08:00
```bash
2024-02-20 04:29:13 +08:00
git clone https://github.com/scratchfoundation/scratch-gui.git
2016-09-15 12:50:28 +08:00
cd scratch-gui
npm install
```
2024-02-17 09:36:56 +08:00
**You may want to add `--depth=1` to the `git clone` command because there are some [large files in the git repository
2024-02-20 04:29:13 +08:00
history](https://github.com/scratchfoundation/scratch-gui/issues/5140).**
2020-02-04 05:02:14 +08:00
2016-11-09 04:57:25 +08:00
## Getting started
2024-02-17 09:36:56 +08:00
2016-11-09 04:57:25 +08:00
Running the project requires Node.js to be installed.
2016-09-15 12:50:28 +08:00
2016-11-09 04:57:25 +08:00
## Running
2024-02-17 09:36:56 +08:00
2016-09-15 12:50:28 +08:00
Open a Command Prompt or Terminal in the repository and run:
2024-02-17 09:36:56 +08:00
2016-09-15 12:50:28 +08:00
```bash
npm start
```
2024-02-17 09:36:56 +08:00
2016-09-15 12:50:28 +08:00
Then go to [http://localhost:8601/ ](http://localhost:8601/ ) - the playground outputs the default GUI component
2018-08-20 22:54:08 +08:00
## Developing alongside other Scratch repositories
2018-09-30 03:15:46 +08:00
2019-04-29 00:44:39 +08:00
### Getting another repo to point to this code
2018-09-30 03:15:46 +08:00
2019-04-29 00:44:39 +08:00
If you wish to develop `scratch-gui` alongside other scratch repositories that depend on it, you may wish
to have the other repositories use your local `scratch-gui` build instead of fetching the current production
2018-08-20 22:54:08 +08:00
version of the scratch-gui that is found by default using `npm install` .
2019-04-29 00:44:39 +08:00
Here's how to link your local `scratch-gui` code to another project's `node_modules/scratch-gui` .
#### Configuration
1. In your local `scratch-gui` repository's top level:
1. Make sure you have run `npm install`
2. Build the `dist` directory by running `BUILD_MODE=dist npm run build`
3. Establish a link to this repository by running `npm link`
2018-08-20 22:54:08 +08:00
2019-04-29 00:44:39 +08:00
2. From the top level of each repository (such as `scratch-www` ) that depends on `scratch-gui` :
1. Make sure you have run `npm install`
2. Run `npm link scratch-gui`
2021-03-29 20:44:14 +08:00
3. Build or run the repository
2019-04-29 00:44:39 +08:00
#### Using `npm run watch`
2024-02-17 09:36:56 +08:00
Instead of `BUILD_MODE=dist npm run build` , you can use `BUILD_MODE=dist npm run watch` instead. This will watch for
changes to your `scratch-gui` code, and automatically rebuild when there are changes. Sometimes this has been
unreliable; if you are having problems, try going back to `BUILD_MODE=dist npm run build` until you resolve them.
2018-08-28 20:56:41 +08:00
2018-09-30 03:15:46 +08:00
#### Oh no! It didn't work!
2019-04-29 00:44:39 +08:00
If you can't get linking to work right, try:
2024-02-17 09:36:56 +08:00
* Follow the recipe above step by step and don't change the order. It is especially important to run `npm install`
_before_ `npm link` as installing after the linking will reset the linking.
* Make sure the repositories are siblings on your machine's file tree, like
`.../.../MY_SCRATCH_DEV_DIRECTORY/scratch-gui/` and `.../.../MY_SCRATCH_DEV_DIRECTORY/scratch-www/` .
* Consistent node.js version: If you have multiple Terminal tabs or windows open for the different Scratch
repositories, make sure to use the same node version in all of them.
2019-04-29 00:44:39 +08:00
* If nothing else works, unlink the repositories by running `npm unlink` in both, and start over.
2018-08-28 20:56:41 +08:00
2016-09-15 12:50:28 +08:00
## Testing
2024-02-17 09:36:56 +08:00
2018-08-28 05:14:09 +08:00
### Documentation
2024-02-17 09:36:56 +08:00
You may want to review the documentation for [Jest ](https://facebook.github.io/jest/docs/en/api.html ) and
[Enzyme ](http://airbnb.io/enzyme/docs/api/ ) as you write your tests.
2018-08-28 05:14:09 +08:00
See [jest cli docs ](https://facebook.github.io/jest/docs/en/cli.html#content ) for more options.
### Running tests
2021-07-27 01:38:44 +08:00
*NOTE: If you're a Windows user, please run these scripts in Windows `cmd.exe` instead of Git Bash/MINGW64.*
2018-08-28 05:14:09 +08:00
2020-02-05 00:30:57 +08:00
Before running any tests, make sure you have run `npm install` from this (scratch-gui) repository's top level.
2018-08-28 05:14:09 +08:00
#### Main testing command
To run linter, unit tests, build, and integration tests, all at once:
2024-02-17 09:36:56 +08:00
2016-09-15 12:50:28 +08:00
```bash
2016-10-17 11:47:20 +08:00
npm test
2016-09-15 12:50:28 +08:00
```
2018-08-28 05:14:09 +08:00
#### Running unit tests
To run unit tests in isolation:
2024-02-17 09:36:56 +08:00
2018-08-28 05:14:09 +08:00
```bash
npm run test:unit
```
To run unit tests in watch mode (watches for code changes and continuously runs tests):
2024-02-17 09:36:56 +08:00
2017-06-14 05:37:58 +08:00
```bash
2018-08-28 05:14:09 +08:00
npm run test:unit -- --watch
2017-06-14 05:37:58 +08:00
```
2018-10-13 18:58:28 +08:00
You can run a single file of integration tests (in this example, the `button` tests):
```bash
$(npm bin)/jest --runInBand test/unit/components/button.test.jsx
```
2018-08-28 05:14:09 +08:00
#### Running integration tests
2023-03-14 02:14:19 +08:00
2021-07-27 01:38:44 +08:00
Integration tests use a headless browser to manipulate the actual HTML and javascript that the repo
2018-08-28 05:14:09 +08:00
produces. You will not see this activity (though you can hear it when sounds are played!).
2024-02-17 09:36:56 +08:00
To run the integration tests, you'll first need to install Chrome, Chromium, or a variant, along with Chromedriver.
2018-08-28 05:14:09 +08:00
Note that integration tests require you to first create a build that can be loaded in a browser:
2017-06-14 05:37:58 +08:00
```bash
2018-08-28 05:14:09 +08:00
npm run build
2017-06-14 05:37:58 +08:00
```
2018-08-28 05:14:09 +08:00
Then, you can run all integration tests:
2017-08-10 00:19:29 +08:00
```bash
2018-08-28 05:14:09 +08:00
npm run test:integration
2017-08-10 00:19:29 +08:00
```
2018-08-28 05:14:09 +08:00
Or, you can run a single file of integration tests (in this example, the `backpack` tests):
```bash
$(npm bin)/jest --runInBand test/integration/backpack.test.js
```
If you want to watch the browser as it runs the test, rather than running headless, use:
```bash
USE_HEADLESS=no $(npm bin)/jest --runInBand test/integration/backpack.test.js
```
2017-06-14 06:12:50 +08:00
2019-04-07 15:26:02 +08:00
## Troubleshooting
2019-04-11 00:47:52 +08:00
### Ignoring optional dependencies
2021-07-27 01:38:44 +08:00
When running `npm install` , you can get warnings about optional dependencies:
2019-04-11 00:47:52 +08:00
2024-02-17 09:36:56 +08:00
```text
2019-04-11 00:47:52 +08:00
npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.2.7
```
You can suppress them by adding the `no-optional` switch:
2024-02-17 09:36:56 +08:00
```bash
2019-04-11 00:47:52 +08:00
npm install --no-optional
```
Further reading: [Stack Overflow ](https://stackoverflow.com/questions/36725181/not-compatible-with-your-operating-system-or-architecture-fsevents1-0-11 )
### Resolving dependencies
2021-07-27 01:38:44 +08:00
When installing for the first time, you can get warnings that need to be resolved:
2019-04-11 00:47:52 +08:00
2024-02-17 09:36:56 +08:00
```text
2019-04-11 00:47:52 +08:00
npm WARN eslint-config-scratch@5.0.0 requires a peer of babel-eslint@^8.0.1 but none was installed.
npm WARN eslint-config-scratch@5.0.0 requires a peer of eslint@^4.0 but none was installed.
npm WARN scratch-paint@0.2.0-prerelease.20190318170811 requires a peer of react-intl-redux@^0.7 but none was installed.
npm WARN scratch-paint@0.2.0-prerelease.20190318170811 requires a peer of react-responsive@^4 but none was installed.
```
You can check which versions are available:
2024-02-17 09:36:56 +08:00
```bash
2019-04-11 00:47:52 +08:00
npm view react-intl-redux@0.* version
```
2021-07-27 01:38:44 +08:00
You will need to install the required version:
2019-04-11 00:47:52 +08:00
2024-02-17 09:36:56 +08:00
```bash
2019-04-11 00:47:52 +08:00
npm install --no-optional --save-dev react-intl-redux@^0.7
```
The dependency itself might have more missing dependencies, which will show up like this:
2024-02-17 09:36:56 +08:00
```bash
2019-04-11 00:47:52 +08:00
user@machine:~/sources/scratch/scratch-gui (491-translatable-library-objects)$ npm install --no-optional --save-dev react-intl-redux@^0.7
scratch-gui@0.1.0 /media/cuideigin/Linux/sources/scratch/scratch-gui
├── react-intl-redux@0.7.0
└── UNMET PEER DEPENDENCY react-responsive@5.0.0
```
You will need to install those as well:
2024-02-17 09:36:56 +08:00
```bash
2019-04-11 00:47:52 +08:00
npm install --no-optional --save-dev react-responsive@^5.0.0
```
Further reading: [Stack Overflow ](https://stackoverflow.com/questions/46602286/npm-requires-a-peer-of-but-all-peers-are-in-package-json-and-node-modules )
2020-07-16 22:55:14 +08:00
## Troubleshooting
If you run into npm install errors, try these steps:
2024-02-17 09:36:56 +08:00
2020-07-16 22:55:14 +08:00
1. run `npm cache clean --force`
2. Delete the node_modules directory
3. Delete package-lock.json
4. run `npm install` again
2019-04-07 15:26:02 +08:00
2017-06-09 02:46:20 +08:00
## Publishing to GitHub Pages
2024-02-17 09:36:56 +08:00
2017-06-09 02:46:20 +08:00
You can publish the GUI to github.io so that others on the Internet can view it.
2024-02-20 04:29:13 +08:00
[Read the wiki for a step-by-step guide. ](https://github.com/scratchfoundation/scratch-gui/wiki/Publishing-to-GitHub-Pages )
2017-06-09 02:46:20 +08:00
2020-02-05 00:32:56 +08:00
## Understanding the project state machine
2024-02-17 09:36:56 +08:00
Since so much code throughout scratch-gui depends on the state of the project, which goes through many different
phases of loading, displaying and saving, we created a "finite state machine" to make it clear which state it is in at
any moment. This is contained in the file src/reducers/project-state.js .
2020-02-05 00:32:56 +08:00
2024-02-17 09:36:56 +08:00
It can be hard to understand the code in src/reducers/project-state.js . There are several types of data and functions
used, which relate to each other:
2020-02-05 00:32:56 +08:00
### Loading states
These include state constant strings like:
* `NOT_LOADED` (the default state),
* `ERROR` ,
* `FETCHING_WITH_ID` ,
* `LOADING_VM_WITH_ID` ,
* `REMIXING` ,
* `SHOWING_WITH_ID` ,
* `SHOWING_WITHOUT_ID` ,
* etc.
### Transitions
These are names for the action which causes a state change. Some examples are:
* `START_FETCHING_NEW` ,
* `DONE_FETCHING_WITH_ID` ,
* `DONE_LOADING_VM_WITH_ID` ,
* `SET_PROJECT_ID` ,
* `START_AUTO_UPDATING` ,
### How transitions relate to loading states
2024-02-17 09:36:56 +08:00
Like this diagram of the project state machine shows, various transition actions can move us from one loading state to
another:
2020-02-05 00:32:56 +08:00
![Project state diagram ](docs/project_state_diagram.svg )
2020-02-05 02:11:48 +08:00
_Note: for clarity, the diagram above excludes states and transitions relating to error handling._
#### Example
2020-02-05 23:31:49 +08:00
Here's an example of how states transition.
2024-02-17 09:36:56 +08:00
Suppose a user clicks on a project, and the page starts to load with URL `https://scratch.mit.edu/projects/123456` .
2020-02-05 02:11:48 +08:00
2020-02-05 23:31:49 +08:00
Here's what will happen in the project state machine:
2020-02-05 00:32:56 +08:00
2020-02-05 23:31:49 +08:00
![Project state example ](docs/project_state_example.png )
2020-02-05 00:32:56 +08:00
2020-02-05 23:31:49 +08:00
1. When the app first mounts, the project state is `NOT_LOADED` .
2024-02-17 09:36:56 +08:00
2. The `SET_PROJECT_ID` redux action is dispatched (from src/lib/project-fetcher-hoc.jsx), with `projectId` set to
`123456` . This transitions the state from `NOT_LOADED` to `FETCHING_WITH_ID` .
3. The `FETCHING_WITH_ID` state. In src/lib/project-fetcher-hoc.jsx, the `projectId` value `123456` is used to request
the data for that project from the server.
4. When the server responds with the data, src/lib/project-fetcher-hoc.jsx dispatches the `DONE_FETCHING_WITH_ID`
action, with `projectData` set. This transitions the state from `FETCHING_WITH_ID` to `LOADING_VM_WITH_ID` .
5. The `LOADING_VM_WITH_ID` state. In src/lib/vm-manager-hoc.jsx, we load the `projectData` into Scratch's virtual
machine ("the vm").
6. When loading is done, src/lib/vm-manager-hoc.jsx dispatches the `DONE_LOADING_VM_WITH_ID` action. This transitions
the state from `LOADING_VM_WITH_ID` to `SHOWING_WITH_ID` .
2020-02-05 23:31:49 +08:00
7. The `SHOWING_WITH_ID` state. Now the project appears normally and is playable and editable.
2020-02-05 00:32:56 +08:00
2016-09-15 12:50:28 +08:00
## Donate
2024-02-17 09:36:56 +08:00
We provide [Scratch ](https://scratch.mit.edu ) free of charge, and want to keep it that way! Please consider making a
[donation ](https://www.scratchfoundation.org/donate ) to support our continued engineering, design, community, and
resource development efforts. Donations of any size are appreciated. Thank you!