diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..df19a20 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: RustForWeb +open_collective: rustforweb diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 0000000..78937ac --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,15 @@ +- name: 'type: bug' + description: 'Bug' + color: '3e63dd' +- name: 'type: documentation' + description: 'Documentation' + color: '3e63dd' +- name: 'type: feature' + description: 'Feature' + color: '3e63dd' +- name: 'type: maintenance' + description: 'Maintenance' + color: '3e63dd' +- name: 'type: question' + description: 'Question' + color: '3e63dd' diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..8e2b279 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,3 @@ +{ + "extends": ["config:recommended", "schedule:weekly", ":prConcurrentLimitNone", ":prHourlyLimitNone"] +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..42126f6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,54 @@ +name: CI + +on: + pull_request: {} + push: + branches: + - main + +env: + RUSTFLAGS: '-Dwarnings' + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Rust toolchain + run: rustup toolchain install stable --no-self-update --profile default --target wasm32-unknown-unknown + + - name: Set up Rust cache + uses: swatinem/rust-cache@v2 + with: + cache-on-failure: true + save-if: ${{ github.ref == 'refs/heads/main' }} + + - name: Check formatting + run: cargo fmt --all --check + + - name: Lint + run: cargo clippy --all-features + + test: + name: Test + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Rust toolchain + run: rustup toolchain install stable --no-self-update --profile default --target wasm32-unknown-unknown + + - name: Set up Rust cache + uses: swatinem/rust-cache@v2 + with: + cache-on-failure: true + save-if: ${{ github.ref == 'refs/heads/main' }} + + - name: Test + run: cargo test --all-features diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml new file mode 100644 index 0000000..3b97717 --- /dev/null +++ b/.github/workflows/labels.yml @@ -0,0 +1,17 @@ +name: Labels + +on: + workflow_dispatch: + +jobs: + sync-labels: + name: Sync Labels + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: .github/labels.yml + + - uses: EndBug/label-sync@v2 + with: + config-file: .github/labels.yml diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 0000000..188a368 --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,111 @@ +name: Website +on: + pull_request: {} + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + +jobs: + book-test: + name: Test Book + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Rust toolchain + run: | + rustup toolchain install stable --no-self-update --profile minimal + rustup target add wasm32-unknown-unknown + + - name: Set up Rust cache + uses: swatinem/rust-cache@v2 + with: + cache-on-failure: true + save-if: ${{ github.ref == 'refs/heads/main' }} + + - name: Install Cargo Binary Install + uses: cargo-bins/cargo-binstall@main + + - name: Install mdBook + run: cargo binstall --force -y mdbook mdbook-tabs + + - name: Run tests + run: mdbook test + working-directory: book + + book-build: + name: Build Book + needs: book-test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Rust toolchain + run: | + rustup toolchain install stable --no-self-update --profile minimal + rustup target add wasm32-unknown-unknown + + - name: Set up Rust cache + uses: swatinem/rust-cache@v2 + with: + cache-on-failure: true + save-if: ${{ github.ref == 'refs/heads/main' }} + + - name: Install Cargo Binary Install + uses: cargo-bins/cargo-binstall@main + + - name: Install mdBook + run: cargo binstall --force -y mdbook mdbook-tabs + + - name: Install Node.js dependencies + run: npm install + + - name: Build Book + run: mdbook build + working-directory: book + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: book + path: book/book + retention-days: 1 + if-no-files-found: error + + deploy: + name: Deploy + needs: book-build + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + permissions: + contents: read + pages: write + id-token: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: dist + merge-multiple: true + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: dist + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73f61ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,166 @@ +# Created by https://www.toptal.com/developers/gitignore/api/rust,node +# Edit at https://www.toptal.com/developers/gitignore?templates=rust,node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### Rust ### +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +# Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +# End of https://www.toptal.com/developers/gitignore/api/rust,node + +# mdBook +book/book/ + +# Tailwind CSS ouput +tailwind.output.css diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ba98b61 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,12 @@ +repos: + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v3.1.0 + hooks: + - id: prettier + additional_dependencies: + - prettier@^3.4.2 + - repo: https://github.com/doublify/pre-commit-rust + rev: v1.0 + hooks: + - id: fmt + - id: clippy diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..2f7896d --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +target/ diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..7fd3381 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "bracketSpacing": false, + "printWidth": 120, + "singleQuote": true, + "tabWidth": 4, + "trailingComma": "none" +} diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..b18025f --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "auth" +version = "0.0.1" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..cafac18 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[workspace] +members = ["packages/*"] +resolver = "2" + +[workspace.package] +authors = ["Rust For Web "] +edition = "2021" +license = "MIT" +repository = "https://github.com/RustForWeb/auth" +version = "0.0.1" + +[workspace.dependencies] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..c367fe7 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Rust For Web + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a3b1d22 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +

Auth

+ +Web authentication for Rust. + +## Documentation + +TODO + +## License + +This project is available under the [MIT license](LICENSE.md). + +## Rust For Web + +The Auth project is part of the [Rust For Web](https://github.com/RustForWeb). + +[Rust For Web](https://github.com/RustForWeb) creates and ports web UI libraries for Rust. All projects are free and open source. diff --git a/book/book.toml b/book/book.toml new file mode 100644 index 0000000..ae51f81 --- /dev/null +++ b/book/book.toml @@ -0,0 +1,17 @@ +[book] +authors = ["Daniƫlle Huisman"] +language = "en" +multilingual = false +src = "src" +title = "Auth" + +[preprocessor.tabs] + +[output.html] +additional-css = ["theme/tabs.css", "theme/theme.css"] +additional-js = ["theme/tabs.js"] +edit-url-template = "https://github.com/RustForWeb/auth/edit/main/book/{path}" +git-repository-url = "https://github.com/RustForWeb/auth" + +[rust] +edition = "2021" diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md new file mode 100644 index 0000000..8d452f5 --- /dev/null +++ b/book/src/SUMMARY.md @@ -0,0 +1,4 @@ +# Summary + +- [Introduction](./introduction.md) +- [Contributing]() diff --git a/book/src/introduction.md b/book/src/introduction.md new file mode 100644 index 0000000..2ae5288 --- /dev/null +++ b/book/src/introduction.md @@ -0,0 +1,13 @@ +# Introduction + +Web authentication for Rust. + +## License + +This project is available under the [MIT license](https://github.com/RustForWeb/auth/blob/main/LICENSE.md). + +## Rust For Web + +The Auth project is part of the [Rust For Web](https://github.com/RustForWeb). + +[Rust For Web](https://github.com/RustForWeb) creates and ports web UI libraries for Rust. All projects are free and open source. diff --git a/book/theme/tabs.css b/book/theme/tabs.css new file mode 100644 index 0000000..8712b85 --- /dev/null +++ b/book/theme/tabs.css @@ -0,0 +1,25 @@ +.mdbook-tabs { + display: flex; +} + +.mdbook-tab { + background-color: var(--table-alternate-bg); + padding: 0.5rem 1rem; + cursor: pointer; + border: none; + font-size: 1.6rem; + line-height: 1.45em; +} + +.mdbook-tab.active { + background-color: var(--table-header-bg); + font-weight: bold; +} + +.mdbook-tab-content { + padding: 1rem 0rem; +} + +.mdbook-tab-content table { + margin: unset; +} diff --git a/book/theme/tabs.js b/book/theme/tabs.js new file mode 100644 index 0000000..8ba5e87 --- /dev/null +++ b/book/theme/tabs.js @@ -0,0 +1,75 @@ +/** + * Change active tab of tabs. + * + * @param {Element} container + * @param {string} name + */ +const changeTab = (container, name) => { + for (const child of container.children) { + if (!(child instanceof HTMLElement)) { + continue; + } + + if (child.classList.contains('mdbook-tabs')) { + for (const tab of child.children) { + if (!(tab instanceof HTMLElement)) { + continue; + } + + if (tab.dataset.tabname === name) { + tab.classList.add('active'); + } else { + tab.classList.remove('active'); + } + } + } else if (child.classList.contains('mdbook-tab-content')) { + if (child.dataset.tabname === name) { + child.classList.remove('hidden'); + } else { + child.classList.add('hidden'); + } + } + } +}; + +document.addEventListener('DOMContentLoaded', () => { + const tabs = document.querySelectorAll('.mdbook-tab'); + for (const tab of tabs) { + tab.addEventListener('click', () => { + if (!(tab instanceof HTMLElement)) { + return; + } + + if (!tab.parentElement || !tab.parentElement.parentElement) { + return; + } + + const container = tab.parentElement.parentElement; + const name = tab.dataset.tabname; + const global = container.dataset.tabglobal; + + changeTab(container, name); + + if (global) { + localStorage.setItem(`mdbook-tabs-${global}`, name); + + const globalContainers = document.querySelectorAll( + `.mdbook-tabs-container[data-tabglobal="${global}"]` + ); + for (const globalContainer of globalContainers) { + changeTab(globalContainer, name); + } + } + }); + } + + const containers = document.querySelectorAll('.mdbook-tabs-container[data-tabglobal]'); + for (const container of containers) { + const global = container.dataset.tabglobal; + + const name = localStorage.getItem(`mdbook-tabs-${global}`); + if (name && document.querySelector(`.mdbook-tab[data-tabname=${name}]`)) { + changeTab(container, name); + } + } +}); diff --git a/book/theme/theme.css b/book/theme/theme.css new file mode 100644 index 0000000..ea07a3e --- /dev/null +++ b/book/theme/theme.css @@ -0,0 +1,3 @@ +table { + margin: unset; +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..68dc8c0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "@rustforweb/auth", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@rustforweb/auth", + "license": "MIT", + "devDependencies": { + "prettier": "^3.4.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d0cdcd6 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "@rustforweb/auth", + "description": "Web authentication for Rust.", + "author": "Rust For Web ", + "repository": "github:RustForWeb/auth", + "license": "MIT", + "private": true, + "scripts": {}, + "devDependencies": { + "prettier": "^3.4.2" + }, + "engines": { + "node": ">=22" + } +} diff --git a/packages/auth/Cargo.toml b/packages/auth/Cargo.toml new file mode 100644 index 0000000..a67be97 --- /dev/null +++ b/packages/auth/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "auth" +description = "Web authentication for Rust." + +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +version.workspace = true + +[dependencies] diff --git a/packages/auth/src/lib.rs b/packages/auth/src/lib.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/packages/auth/src/lib.rs @@ -0,0 +1 @@ +