From ffeac298a2bc68a8b34a501d284d13742940735d Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Fri, 10 Jul 2020 23:11:07 -0600 Subject: [PATCH] Move from gitbook to docusaurus, build docs in Travis CI (#10970) * fix: ignore unknown fields in more RPC responses * Remove mdbook infrastructure * Delete gitattributes and other theme related items Move all docs to /docs folder to support Docusaurus * all docs need to be moved to /docs * can be changed in the future Add Docusaurus infrastructure * initialize docusaurus repo Remove trailing whitespace, add support for eslint Change Docusaurus configuration to support `src` * No need to rename the folder! Change a setting and we're all good to go. * Fixing rebase items * Remove unneccessary markdown file, fix type * Some fonts are hard to read. Others, not so much. Rubik, you've been sidelined. Roboto, into the limelight! * As much as we all love tutorials, I think we all can navigate around a markdown file. Say goodbye, `mdx.md`. * Setup deployment infrastructure * Move docs job from buildkite to travic * Fix travis config * Add vercel token to travis config * Only deploy docs after merge * Docker rust env * Revert "Docker rust env" This reverts commit f84bc208e807aab1c0d97c7588bbfada1fedfa7c. * Build CLI usage from docker * Pacify shellcheck * Run job on PR and new commits for publication * Update README * Fix svg image building * shellcheck Co-authored-by: Michael Vines Co-authored-by: Ryan Shea Co-authored-by: publish-docs.sh --- .travis.yml | 22 + ci/buildkite-pipeline.sh | 7 +- docs/.eslintrc | 21 + docs/.gitattributes | 1 - docs/.gitignore | 22 + docs/.travis/before_install.sh | 9 + docs/.travis/script.sh | 4 + docs/README.md | 47 +- docs/babel.config.js | 3 + docs/book.toml | 15 - docs/build-cli-usage.sh | 3 + docs/build.sh | 36 +- docs/convert-ascii-to-svg.sh | 21 + docs/docusaurus.config.js | 113 ++++ docs/makefile | 51 -- docs/package.json | 39 ++ docs/set-solana-release-tag.sh | 3 +- docs/set-vercel-project-name.sh | 25 + docs/sidebars.js | 173 +++++ .../assets/economic_design_infl_230719.png | Bin 65880 -> 0 bytes .../ledger-live-enable-developer-mode.png | Bin 188017 -> 0 bytes .../assets/ledger-live-install-solana-app.png | Bin 199342 -> 0 bytes .../ledger-live-latest-version-installed.png | Bin 251127 -> 0 bytes .../ledger-live-update-available-v0.2.2.png | Bin 194587 -> 0 bytes docs/src/.gitbook/assets/p_ex_interest.png | Bin 555107 -> 0 bytes docs/src/.gitbook/assets/p_ex_schedule.png | Bin 261726 -> 0 bytes docs/src/.gitbook/assets/p_ex_supply.png | Bin 275689 -> 0 bytes docs/src/.gitbook/assets/porep_reward.png | Bin 380503 -> 0 bytes docs/src/.gitbook/assets/ramp-tps-rounds.png | Bin 197458 -> 0 bytes ...ur-de-sol-participation-terms-20190723.pdf | Bin 164530 -> 0 bytes docs/src/SUMMARY.md | 4 +- docs/src/apps/README.md | 6 +- docs/src/apps/builtins/README.md | 26 +- docs/src/apps/drones.md | 7 +- docs/src/apps/javascript-api.md | 5 +- docs/src/apps/jsonrpc-api.md | 601 +++++++++--------- docs/src/apps/rent.md | 4 +- docs/src/apps/tictactoe.md | 5 +- docs/src/apps/webwallet.md | 5 +- docs/src/cli/README.md | 16 +- docs/src/cli/choose-a-cluster.md | 9 +- docs/src/cli/conventions.md | 15 +- docs/src/cli/delegate-stake.md | 21 +- docs/src/cli/install-solana-cli-tools.md | 104 +-- docs/src/cli/manage-stake-accounts.md | 4 +- docs/src/cli/transfer-tokens.md | 18 +- docs/src/cluster/README.md | 4 +- docs/src/cluster/bench-tps.md | 10 +- docs/src/cluster/fork-generation.md | 14 +- docs/src/cluster/leader-rotation.md | 12 +- docs/src/cluster/managing-forks.md | 18 +- docs/src/cluster/performance-metrics.md | 5 +- .../cluster/stake-delegation-and-rewards.md | 108 ++-- docs/src/cluster/synchronization.md | 9 +- docs/src/cluster/turbine-block-propagation.md | 63 +- docs/src/cluster/vote-signing.md | 25 +- docs/src/clusters.md | 92 +-- docs/src/css/custom.css | 69 ++ docs/src/file-system-wallet/README.md | 19 +- docs/src/hardware-wallets/README.md | 13 +- docs/src/hardware-wallets/ledger.md | 44 +- docs/src/history.md | 4 +- docs/src/implemented-proposals/README.md | 5 +- .../implemented-proposals/abi-management.md | 6 +- docs/src/implemented-proposals/commitment.md | 12 +- .../cross-program-invocation.md | 14 +- .../durable-tx-nonces.md | 30 +- .../ed_overview/README.md | 6 +- .../ed_overview/ed_economic_sustainability.md | 4 +- .../ed_overview/ed_mvp.md | 12 +- .../ed_overview/ed_references.md | 5 +- .../ed_overview/ed_storage_rent_economics.md | 7 +- .../ed_validation_client_economics/README.md | 5 +- ...state_validation_protocol_based_rewards.md | 20 +- ...d_vce_state_validation_transaction_fees.md | 12 +- .../ed_vce_validation_stake_delegation.md | 33 +- .../implemented-proposals/embedding-move.md | 11 +- docs/src/implemented-proposals/installer.md | 17 +- .../leader-leader-transition.md | 33 +- .../leader-validator-transition.md | 5 +- .../persistent-account-storage.md | 23 +- .../program-derived-addresses.md | 34 +- .../readonly-accounts.md | 6 +- .../reliable-vote-transmission.md | 5 +- docs/src/implemented-proposals/rent.md | 14 +- .../implemented-proposals/repair-service.md | 82 +-- .../snapshot-verification.md | 17 +- .../implemented-proposals/staking-rewards.md | 17 +- .../implemented-proposals/testing-programs.md | 21 +- docs/src/implemented-proposals/tower-bft.md | 72 ++- .../implemented-proposals/transaction-fees.md | 14 +- .../validator-timestamp-oracle.md | 24 +- docs/src/integrations/exchange.md | 38 +- docs/src/introduction.md | 4 +- docs/src/offline-signing/README.md | 58 +- docs/src/offline-signing/durable-nonce.md | 74 +-- docs/src/pages/index.js | 133 ++++ docs/src/pages/styles.module.css | 37 ++ docs/src/paper-wallet/README.md | 11 +- docs/src/paper-wallet/paper-wallet-usage.md | 50 +- docs/src/proposals/README.md | 4 +- docs/src/proposals/bankless-leader.md | 8 +- docs/src/proposals/block-confirmation.md | 16 +- docs/src/proposals/cluster-test-framework.md | 5 +- .../interchain-transaction-verification.md | 39 +- .../ledger-replication-to-implement.md | 92 +-- .../optimistic-confirmation-and-slashing.md | 23 +- docs/src/proposals/optimistic_confirmation.md | 96 +-- docs/src/proposals/rust-clients.md | 16 +- .../simple-payment-and-state-verification.md | 22 +- docs/src/proposals/slashing.md | 16 +- docs/src/proposals/snapshot-verification.md | 4 +- docs/src/proposals/tick-verification.md | 63 +- docs/src/proposals/validator-proposal.md | 24 +- .../proposals/vote-signing-to-implement.md | 39 +- docs/src/running-validator/README.md | 4 +- docs/src/running-validator/validator-info.md | 14 +- .../running-validator/validator-monitor.md | 5 +- docs/src/running-validator/validator-reqs.md | 54 +- docs/src/running-validator/validator-stake.md | 28 +- docs/src/running-validator/validator-start.md | 20 +- .../validator-troubleshoot.md | 27 +- docs/src/terminology.md | 10 +- docs/src/theme/Footer/index.js | 126 ++++ docs/src/theme/Footer/styles.module.css | 15 + docs/src/theme/SearchBar.js | 1 + docs/src/tour-de-sol/README.md | 4 +- .../steps-to-create-a-validator.md | 6 +- .../validator-public-key-registration.md | 10 +- .../validator-technical-requirements.md | 6 +- .../registration/confidentiality.md | 4 +- .../registration/how-to-register.md | 22 +- docs/src/tour-de-sol/registration/rewards.md | 4 +- .../registration/terms-of-participation.md | 7 +- .../validator-registration-and-rewards-faq.md | 8 +- docs/src/tour-de-sol/submitting-bugs.md | 4 +- docs/src/tour-de-sol/useful-links.md | 19 +- docs/src/transaction.md | 16 +- docs/src/validator/README.md | 6 +- docs/src/validator/blockstore.md | 24 +- docs/src/validator/gossip.md | 21 +- docs/src/validator/runtime.md | 38 +- docs/src/validator/tpu.md | 6 +- docs/src/validator/tvu.md | 8 +- docs/src/wallet-guide/README.md | 29 +- docs/src/wallet-guide/apps.md | 23 +- docs/src/wallet-guide/cli.md | 14 +- docs/src/wallet-guide/ledger-live.md | 72 ++- docs/src/wallet-guide/support.md | 7 +- docs/src/wallet-guide/trust-wallet.md | 127 ++-- docs/static/.nojekyll | 0 docs/static/img/android-chrome-192x192.png | Bin 0 -> 2217 bytes docs/static/img/android-chrome-512x512.png | Bin 0 -> 6622 bytes docs/static/img/apple-touch-icon.png | Bin 0 -> 1998 bytes docs/static/img/dark-mark-white.inline.svg | 5 + docs/static/img/favicon-16x16.png | Bin 0 -> 204 bytes docs/static/img/favicon-32x32.png | Bin 0 -> 319 bytes docs/static/img/favicon.ico | Bin 0 -> 15406 bytes docs/static/img/logo-horizontal-dark.svg | 12 + docs/static/img/logo-horizontal.svg | 12 + docs/static/img/logo.svg | 6 + docs/static/img/spiral.svg | 206 ++++++ docs/theme/book.js | 600 ----------------- docs/theme/css/chrome.css | 524 --------------- docs/theme/css/general.css | 155 ----- docs/theme/css/print.css | 54 -- docs/theme/css/variables.css | 210 ------ docs/theme/favicon.png | Bin 5679 -> 0 bytes docs/theme/highlight.css | 69 -- docs/theme/highlight.js | 2 - docs/theme/index.hbs | 231 ------- docs/vercel.json | 4 + 172 files changed, 2862 insertions(+), 3429 deletions(-) create mode 100644 docs/.eslintrc delete mode 100644 docs/.gitattributes create mode 100644 docs/.gitignore create mode 100644 docs/.travis/before_install.sh create mode 100644 docs/.travis/script.sh create mode 100644 docs/babel.config.js delete mode 100644 docs/book.toml create mode 100755 docs/convert-ascii-to-svg.sh create mode 100644 docs/docusaurus.config.js delete mode 100644 docs/makefile create mode 100644 docs/package.json create mode 100755 docs/set-vercel-project-name.sh create mode 100644 docs/sidebars.js delete mode 100644 docs/src/.gitbook/assets/economic_design_infl_230719.png delete mode 100644 docs/src/.gitbook/assets/ledger-live-enable-developer-mode.png delete mode 100644 docs/src/.gitbook/assets/ledger-live-install-solana-app.png delete mode 100644 docs/src/.gitbook/assets/ledger-live-latest-version-installed.png delete mode 100644 docs/src/.gitbook/assets/ledger-live-update-available-v0.2.2.png delete mode 100755 docs/src/.gitbook/assets/p_ex_interest.png delete mode 100644 docs/src/.gitbook/assets/p_ex_schedule.png delete mode 100644 docs/src/.gitbook/assets/p_ex_supply.png delete mode 100644 docs/src/.gitbook/assets/porep_reward.png delete mode 100644 docs/src/.gitbook/assets/ramp-tps-rounds.png delete mode 100644 docs/src/.gitbook/assets/solana-tour-de-sol-participation-terms-20190723.pdf create mode 100644 docs/src/css/custom.css create mode 100644 docs/src/pages/index.js create mode 100644 docs/src/pages/styles.module.css create mode 100644 docs/src/theme/Footer/index.js create mode 100644 docs/src/theme/Footer/styles.module.css create mode 100644 docs/src/theme/SearchBar.js create mode 100644 docs/static/.nojekyll create mode 100644 docs/static/img/android-chrome-192x192.png create mode 100644 docs/static/img/android-chrome-512x512.png create mode 100644 docs/static/img/apple-touch-icon.png create mode 100644 docs/static/img/dark-mark-white.inline.svg create mode 100644 docs/static/img/favicon-16x16.png create mode 100644 docs/static/img/favicon-32x32.png create mode 100644 docs/static/img/favicon.ico create mode 100644 docs/static/img/logo-horizontal-dark.svg create mode 100644 docs/static/img/logo-horizontal.svg create mode 100644 docs/static/img/logo.svg create mode 100644 docs/static/img/spiral.svg delete mode 100644 docs/theme/book.js delete mode 100644 docs/theme/css/chrome.css delete mode 100644 docs/theme/css/general.css delete mode 100644 docs/theme/css/print.css delete mode 100644 docs/theme/css/variables.css delete mode 100644 docs/theme/favicon.png delete mode 100644 docs/theme/highlight.css delete mode 100644 docs/theme/highlight.js delete mode 100644 docs/theme/index.hbs create mode 100644 docs/vercel.json diff --git a/.travis.yml b/.travis.yml index f18039a42f..252d8cef98 100644 --- a/.travis.yml +++ b/.travis.yml @@ -106,3 +106,25 @@ jobs: script: - ../.travis/commitlint.sh - source .travis/script.sh + + # docs pull request + - name: "docs" + if: type IN (push, pull_request) + language: node_js + node_js: + - "node" + + services: + - docker + + cache: + directories: + - ~/.npm + + before_install: + - .travis/affects.sh docs/ .travis || travis_terminate 0 + - cd docs/ + - source .travis/before_install.sh + + script: + - source .travis/script.sh diff --git a/ci/buildkite-pipeline.sh b/ci/buildkite-pipeline.sh index 234df514a2..bc7a52315b 100755 --- a/ci/buildkite-pipeline.sh +++ b/ci/buildkite-pipeline.sh @@ -211,12 +211,7 @@ pull_or_push_steps() { all_test_steps fi - # doc/ changes: - if affects ^docs/; then - command_step docs ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_nightly_docker_image docs/build.sh" 5 - fi - - # web3.js and explorer changes run on Travis... + # web3.js, explorer and docs changes run on Travis... } diff --git a/docs/.eslintrc b/docs/.eslintrc new file mode 100644 index 0000000000..d2204b0b8d --- /dev/null +++ b/docs/.eslintrc @@ -0,0 +1,21 @@ +{ + "env": { + "browser": true, + "node": true + }, + "parser": "babel-eslint", + "rules": { + "strict": 0, + "no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], + "no-trailing-spaces": ["error", { "skipBlankLines": true }] + }, + "settings": { + "react": { + "version": "detect", // React version. "detect" automatically picks the version you have installed. + } + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended" + ] + } \ No newline at end of file diff --git a/docs/.gitattributes b/docs/.gitattributes deleted file mode 100644 index fd04e543b4..0000000000 --- a/docs/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -theme/highlight.js binary diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000000..dfd0740615 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,22 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader +.vercel +/static/img/*.svg + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/docs/.travis/before_install.sh b/docs/.travis/before_install.sh new file mode 100644 index 0000000000..724311cc3a --- /dev/null +++ b/docs/.travis/before_install.sh @@ -0,0 +1,9 @@ +# |source| this file + +curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - +sudo apt install -y nodejs + +npm install --global docusaurus-init +docusaurus-init + +npm install --global vercel diff --git a/docs/.travis/script.sh b/docs/.travis/script.sh new file mode 100644 index 0000000000..a4fee2dabc --- /dev/null +++ b/docs/.travis/script.sh @@ -0,0 +1,4 @@ +# |source| this file + +set -ex +./build.sh diff --git a/docs/README.md b/docs/README.md index 458e67756e..b3a0bdb370 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,31 +1,38 @@ -Building the Solana Docs ---- +# Docs Readme -Install dependencies, build, and test the docs: +Solana's Docs are built using [Docusaurus 2](https://v2.docusaurus.io/) with `npm`. +Static content delivery is handled using `vercel`. -```bash -$ brew install coreutils -$ brew install mscgen -$ cargo install svgbob_cli -$ cargo install mdbook-linkcheck -$ cargo install mdbook -$ ./build.sh +### Installation + +``` +$ npm install ``` -Run any Rust tests in the markdown: +### Local Development -```bash -$ make test +``` +$ npm run start ``` -Render markdown as HTML: +This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. -```bash -$ make build +### Build +#### Local Build Testing +``` +$ npm run build ``` -Render and view the docs: +This command generates static content into the `build` directory and can be +served using any static contents hosting service. -```bash -$ make open -``` +#### CI Build Flow +The docs are built and published in Travis CI with the `docs/build.sh` script. +On each PR, the docs are built, but not published. + +In each post-commit build, docs are built and published using `vercel` to their +respective domain depending on the build branch. + + - Master branch docs are published to `edge.docs.solana.com` + - Beta branch docs are published to `beta.docs.solana.com` + - Latest release tag docs are published to `docs.solana.com` diff --git a/docs/babel.config.js b/docs/babel.config.js new file mode 100644 index 0000000000..bfd75dbdfc --- /dev/null +++ b/docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], +}; diff --git a/docs/book.toml b/docs/book.toml deleted file mode 100644 index a05881c58e..0000000000 --- a/docs/book.toml +++ /dev/null @@ -1,15 +0,0 @@ -[book] -title = "Solana: Blockchain Rebuilt for Scale" -authors = ["The Solana Team"] - -[build] -build-dir = "html" -create-missing = false - -[output.html] -theme = "theme" - -[output.linkcheck] -# Exclude some special links and `README.md` which causes false-positive errors -# Also, crates.io returns 404 for correct links accessed from curl and linkcheck -exclude = [ 'http://192\.168\.1\.88', 'http://localhost', 'LATEST_SOLANA_RELEASE_VERSION', 'README\.md', 'https://crates\.io' ] diff --git a/docs/build-cli-usage.sh b/docs/build-cli-usage.sh index 0c5091b685..4fb5cb6de7 100755 --- a/docs/build-cli-usage.sh +++ b/docs/build-cli-usage.sh @@ -3,6 +3,9 @@ set -e cd "$(dirname "$0")" +# shellcheck source=ci/rust-version.sh +source ../ci/rust-version.sh stable + : "${rust_stable:=}" # Pacify shellcheck usage=$(cargo +"$rust_stable" -q run -p solana-cli -- -C ~/.foo --help | sed -e 's|'"$HOME"'|~|g' -e 's/[[:space:]]\+$//') diff --git a/docs/build.sh b/docs/build.sh index f610deb76f..a19c45cd02 100755 --- a/docs/build.sh +++ b/docs/build.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash -set -e +set -ex + +# shellcheck source=ci/env.sh +source ../ci/env.sh cd "$(dirname "$0")" @@ -12,6 +15,31 @@ find src -name '*.md' -a \! -name SUMMARY.md | fi done -mdbook --version -mdbook-linkcheck --version -make -j"$(nproc)" test +: "${rust_stable_docker_image:=}" # Pacify shellcheck + +# shellcheck source=ci/rust-version.sh +source ../ci/rust-version.sh +../ci/docker-run.sh "$rust_stable_docker_image" docs/build-cli-usage.sh +../ci/docker-run.sh "$rust_stable_docker_image" docs/convert-ascii-to-svg.sh +./set-solana-release-tag.sh + +# Build from /src into /build +npm run build + +# Deploy the /build content using vercel +if [[ -d .vercel ]]; then + rm -r .vercel +fi +./set-vercel-project-name.sh + +if [[ -n $CI ]]; then + if [[ -z $CI_PULL_REQUEST ]]; then + [[ -n $VERCEL_TOKEN ]] || { + echo "VERCEL_TOKEN is undefined. Needed for Vercel authentication." + exit 1 + } + vercel deploy . --local-config=vercel.json --confirm --token "$VERCEL_TOKEN" --prod + fi +else + vercel deploy . --local-config=vercel.json +fi diff --git a/docs/convert-ascii-to-svg.sh b/docs/convert-ascii-to-svg.sh new file mode 100755 index 0000000000..097beae8c3 --- /dev/null +++ b/docs/convert-ascii-to-svg.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +# Convert .bob and .msc files in docs/art to .svg files located where the +# site build will find them. + +set -e + +cd "$(dirname "$0")" +output_dir=static/img + +mkdir -p "$output_dir" + +while read -r bob_file; do + svg_file=$(basename "${bob_file%.*}".svg) + svgbob "$bob_file" --output "$output_dir/$svg_file" +done < <(find art/*.bob) + +while read -r msc_file; do + svg_file=$(basename "${msc_file%.*}".svg) + mscgen -T svg -o "$output_dir/$svg_file" -i "$msc_file" +done < <(find art/*.msc) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 0000000000..a4bb124e9e --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,113 @@ +module.exports = { + title: "Solana Docs", + tagline: + "Solana is an open source project implementing a new, high-performance, permissionless blockchain.", + url: "https://docs.solana.com", + baseUrl: "/", + favicon: "img/favicon.ico", + organizationName: "solana-labs", // Usually your GitHub org/user name. + projectName: "solana", // Usually your repo name. + themeConfig: { + navbar: { + logo: { + alt: "Solana Logo", + src: "img/logo-horizontal.svg", + srcDark: "img/logo-horizontal-dark.svg", + }, + links: [ + { + to: "docs/", + activeBasePath: "docs", + label: "Docs", + position: "left", + }, + { + to: "docs/apps/README", + activeBasePath: "docs2", + label: "Developers", + position: "left", + }, + { + to: "docs/running-validator/README", + activeBasePath: "docs2", + label: "Validators", + position: "left", + }, + { + href: "https://discordapp.com/invite/pquxPsq", + label: "Chat", + position: "right", + }, + + { + href: "https://github.com/solana-labs/solana", + label: "GitHub", + position: "right", + }, + ], + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { + label: "Introduction", + to: "docs/introduction", + }, + { + label: "Tour de SOL", + to: "docs/tour-de-sol/README", + }, + ], + }, + { + title: "Community", + items: [ + { + label: "Discord", + href: "https://discordapp.com/invite/pquxPsq", + }, + { + label: "Twitter", + href: "https://twitter.com/solana", + }, + { + label: "Forums", + href: "https://forums.solana.com", + }, + ], + }, + { + title: "More", + items: [ + { + label: "GitHub", + href: "https://github.com/solana-labs/solana", + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} Solana Foundation`, + }, + }, + presets: [ + [ + "@docusaurus/preset-classic", + { + docs: { + path: "src", + // It is recommended to set document id as docs home page (`docs/` path). + homePageId: "introduction", + sidebarPath: require.resolve("./sidebars.js"), + // Please change this to your repo. + editUrl: "https://github.com/solana-labs/solana/edit/master/docs/", + }, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + }, + ], + ], +}; diff --git a/docs/makefile b/docs/makefile deleted file mode 100644 index 5c223ef5e3..0000000000 --- a/docs/makefile +++ /dev/null @@ -1,51 +0,0 @@ -BOB_SRCS=$(wildcard art/*.bob) -MSC_SRCS=$(wildcard art/*.msc) -MD_SRCS=$(wildcard src/*.md src/*/*.md) src/cli/usage.md - -SVG_IMGS=$(BOB_SRCS:art/%.bob=src/.gitbook/assets/%.svg) $(MSC_SRCS:art/%.msc=src/.gitbook/assets/%.svg) - -TARGET=html/index.html -TEST_STAMP=src/tests.ok - -all: $(TARGET) - -svg: $(SVG_IMGS) - -test: $(TEST_STAMP) - -open: $(TEST_STAMP) - mdbook build --open - ./set-solana-release-tag.sh - -watch: $(SVG_IMGS) - mdbook watch - -src/.gitbook/assets/%.svg: art/%.bob - @mkdir -p $(@D) - svgbob < $< > $@ - -src/.gitbook/assets/%.svg: art/%.msc - @mkdir -p $(@D) - mscgen -T svg -i $< -o $@ - -../target/debug/solana: - cd ../cli && cargo build - -src/cli/usage.md: build-cli-usage.sh ../target/debug/solana - ./$< - -src/%.md: %.md - @mkdir -p $(@D) - @cp $< $@ - -$(TEST_STAMP): $(TARGET) - mdbook test - touch $@ - -$(TARGET): $(SVG_IMGS) $(MD_SRCS) - mdbook build - ./set-solana-release-tag.sh - -clean: - rm -f $(SVG_IMGS) src/tests.ok - rm -rf html diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000000..9965552971 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,39 @@ +{ + "name": "solana-docs", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "format": "prettier --check \"**/*.{js,jsx,json,md,scss}\"", + "format:fix": "prettier --write \"**/*.{js,jsx,json,md,scss}\"", + "lint": "set -ex; eslint .", + "lint:fix": "npm run lint -- --fix" + }, + "dependencies": { + "@docusaurus/core": "^2.0.0-alpha.58", + "@docusaurus/preset-classic": "^2.0.0-alpha.58", + "@docusaurus/theme-search-algolia": "^2.0.0-alpha.32", + "babel-eslint": "^10.1.0", + "clsx": "^1.1.1", + "eslint": "^7.3.1", + "eslint-plugin-react": "^7.20.0", + "prettier": "^2.0.5", + "react": "^16.8.4", + "react-dom": "^16.8.4" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/docs/set-solana-release-tag.sh b/docs/set-solana-release-tag.sh index c3b3499c5f..bafdd031d0 100755 --- a/docs/set-solana-release-tag.sh +++ b/docs/set-solana-release-tag.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash - set -e + cd "$(dirname "$0")" if [[ -n $CI_TAG ]]; then @@ -23,7 +23,6 @@ if [[ -z "$LATEST_SOLANA_RELEASE_VERSION" ]]; then fi set -x -find html/ -name \*.html -exec sed -i "s/LATEST_SOLANA_RELEASE_VERSION/$LATEST_SOLANA_RELEASE_VERSION/g" {} \; if [[ -n $CI ]]; then find src/ -name \*.md -exec sed -i "s/LATEST_SOLANA_RELEASE_VERSION/$LATEST_SOLANA_RELEASE_VERSION/g" {} \; fi diff --git a/docs/set-vercel-project-name.sh b/docs/set-vercel-project-name.sh new file mode 100755 index 0000000000..c090ae225e --- /dev/null +++ b/docs/set-vercel-project-name.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Replaces the PROJECT_NAME value in vercel.json commit based on channel or tag +# so we push the updated docs to the right domain + +set -e + +if [[ -n $CI_TAG ]]; then + NAME=docs-solana-com +else + eval "$(../ci/channel-info.sh)" + case $CHANNEL in + edge) + NAME=edge-docs-solana-com + ;; + beta) + NAME=beta-docs-solana-com + ;; + *) + NAME=docs + ;; + esac +fi + +sed -i s/PROJECT_NAME/$NAME/g vercel.json diff --git a/docs/sidebars.js b/docs/sidebars.js new file mode 100644 index 0000000000..6c72ff0cef --- /dev/null +++ b/docs/sidebars.js @@ -0,0 +1,173 @@ +module.exports = { + docs: { + Introduction: ["introduction"], + "Wallet Guide": [ + "wallet-guide/README", + { + type: "category", + label: "App Wallets", + items: [ + "wallet-guide/apps", + "wallet-guide/trust-wallet", + "wallet-guide/ledger-live", + ], + }, + { + type: "category", + label: "Command-line Wallets", + items: [ + "wallet-guide/cli", + { + type: "category", + label: "Paper Wallets", + items: ["paper-wallet/README", "paper-wallet/paper-wallet-usage"], + }, + { + type: "category", + label: "Hardware Wallets", + items: ["hardware-wallets/README", "hardware-wallets/ledger"], + }, + "file-system-wallet/README", + ], + }, + "wallet-guide/support", + ], + "Command Line Guide": [ + "cli/README", + "cli/install-solana-cli-tools", + "cli/conventions", + "cli/choose-a-cluster", + "cli/transfer-tokens", + "cli/manage-stake-accounts", + "offline-signing/README", + "offline-signing/durable-nonce", + ], + "Solana Clusters": ["clusters"], + "Develop Applications": [ + "apps/README", + "apps/rent", + "apps/webwallet", + "apps/tictactoe", + "apps/drones", + "transaction", + "apps/jsonrpc-api", + "apps/javascript-api", + "apps/builtins/README", + ], + "Integration Guides": ["integrations/exchange"], + "Run a Validator": [ + "running-validator/README", + "running-validator/validator-reqs", + "running-validator/validator-start", + "running-validator/validator-stake", + "running-validator/validator-monitor", + "running-validator/validator-info", + "running-validator/validator-troubleshoot", + ], + "Tour de SOL": [ + "tour-de-sol/README", + "tour-de-sol/useful-links", + { + type: "category", + label: "Registration", + items: [ + "tour-de-sol/registration/how-to-register", + "tour-de-sol/registration/terms-of-participation", + "tour-de-sol/registration/rewards", + "tour-de-sol/registration/confidentiality", + "tour-de-sol/registration/validator-registration-and-rewards-faq", + ], + }, + { + type: "category", + label: "Participation", + items: [ + "tour-de-sol/participation/validator-technical-requirements", + "tour-de-sol/participation/validator-public-key-registration", + "tour-de-sol/participation/steps-to-create-a-validator", + ], + }, + "tour-de-sol/submitting-bugs", + ], + "Benchmark a Cluster": ["cluster/bench-tps", "cluster/performance-metrics"], + "Solana's Architecture": [ + "cluster/README", + "cluster/synchronization", + "cluster/leader-rotation", + "cluster/fork-generation", + "cluster/managing-forks", + "cluster/turbine-block-propagation", + "cluster/vote-signing", + "cluster/stake-delegation-and-rewards", + ], + "Anatomy of a Validator": [ + "validator/README", + "validator/tpu", + "validator/tvu", + "validator/blockstore", + "validator/gossip", + "validator/runtime", + ], + Terminology: ["terminology"], + History: ["history"], + "Implemented Design Proposals": [ + { + type: "category", + label: "Economic Design", + items: [ + "implemented-proposals/ed_overview/README", + { + type: "category", + label: "Validation Client Economics", + items: [ + "implemented-proposals/ed_overview/ed_validation_client_economics/README", + "implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_state_validation_protocol_based_rewards", + "implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_state_validation_transaction_fees", + "implemented-proposals/ed_overview/ed_validation_client_economics/ed_vce_validation_stake_delegation", + ], + }, + "implemented-proposals/ed_overview/ed_storage_rent_economics", + "implemented-proposals/ed_overview/ed_economic_sustainability", + "implemented-proposals/ed_overview/ed_mvp", + "implemented-proposals/ed_overview/ed_references", + ], + }, + "implemented-proposals/transaction-fees", + "implemented-proposals/tower-bft", + "implemented-proposals/leader-leader-transition", + "implemented-proposals/leader-validator-transition", + "implemented-proposals/persistent-account-storage", + "implemented-proposals/reliable-vote-transmission", + "implemented-proposals/repair-service", + "implemented-proposals/testing-programs", + "implemented-proposals/readonly-accounts", + "implemented-proposals/embedding-move", + "implemented-proposals/staking-rewards", + "implemented-proposals/rent", + "implemented-proposals/durable-tx-nonces", + "implemented-proposals/validator-timestamp-oracle", + "implemented-proposals/commitment", + "implemented-proposals/snapshot-verification", + "implemented-proposals/cross-program-invocation", + "implemented-proposals/program-derived-addresses", + "implemented-proposals/abi-management", + ], + "Accepted Design Proposals": [ + "proposals/README", + "proposals/ledger-replication-to-implement", + "proposals/optimistic-confirmation-and-slashing", + "proposals/vote-signing-to-implement", + "proposals/cluster-test-framework", + "proposals/validator-proposal", + "proposals/simple-payment-and-state-verification", + "proposals/interchain-transaction-verification", + "proposals/snapshot-verification", + "proposals/bankless-leader", + "proposals/slashing", + "proposals/tick-verification", + "proposals/block-confirmation", + "proposals/rust-clients", + "proposals/optimistic_confirmation", + ], + }, +}; diff --git a/docs/src/.gitbook/assets/economic_design_infl_230719.png b/docs/src/.gitbook/assets/economic_design_infl_230719.png deleted file mode 100644 index 2ce0958cc421fb25c9816cdff3e30b707602a35a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65880 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