From 676928c1f6c753e90fa98c4fecb8e7bd34a9acbb Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 14 Oct 2024 22:31:59 +0200 Subject: [PATCH] chore: wip --- .editorconfig | 9 +++ .gitattributes | 2 + .github/CODE_OF_CONDUCT.md | 83 +++++++++++++++++++ .github/SECURITY.md | 70 ++++++++++++++++ .github/art/cover.jpg | Bin 0 -> 71948 bytes .github/renovate.json | 3 + .github/stale.yml | 14 ++++ .github/workflows/README.md | 13 +++ .github/workflows/ci.yml | 84 ++++++++++++++++++++ .github/workflows/release.yml | 43 ++++++++++ .gitignore | 14 ++++ .vscode/dictionary.txt | 41 ++++++++++ .vscode/extensions.json | 9 +++ .vscode/settings.json | 145 ++++++++++++++++++++++++++++++++++ CHANGELOG.md | 68 ++++++++++++++++ LICENSE.md | 21 +++++ README.md | 136 +++++++++++++++++++++++++++++++ bin/cli.ts | 33 ++++++++ build.ts | 23 ++++++ bun.lockb | Bin 0 -> 85837 bytes bunfig.toml | 2 + commitlint.config.js | 77 ++++++++++++++++++ docs/.vitepress/config.ts | 26 ++++++ docs/api-examples.md | 49 ++++++++++++ docs/index.md | 24 ++++++ docs/markdown-examples.md | 85 ++++++++++++++++++++ dts | 2 + dts.config.ts | 2 + eslint.config.js | 12 +++ package.json | 80 +++++++++++++++++++ pkgx.yaml | 2 + scripts/generate-keys.ts | 10 +++ src/config.ts | 8 ++ src/generate.ts | 18 +++++ src/index.ts | 3 + src/types.ts | 5 ++ test/dts.test.ts | 11 +++ tsconfig.json | 25 ++++++ 38 files changed, 1252 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/SECURITY.md create mode 100644 .github/art/cover.jpg create mode 100644 .github/renovate.json create mode 100644 .github/stale.yml create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .vscode/dictionary.txt create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CHANGELOG.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 bin/cli.ts create mode 100644 build.ts create mode 100755 bun.lockb create mode 100644 bunfig.toml create mode 100644 commitlint.config.js create mode 100644 docs/.vitepress/config.ts create mode 100644 docs/api-examples.md create mode 100644 docs/index.md create mode 100644 docs/markdown-examples.md create mode 100755 dts create mode 100644 dts.config.ts create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 pkgx.yaml create mode 100644 scripts/generate-keys.ts create mode 100644 src/config.ts create mode 100644 src/generate.ts create mode 100644 src/index.ts create mode 100644 src/types.ts create mode 100644 test/dts.test.ts create mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6f28e15 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto +*.lockb binary diff=lockb diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..68282da --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,83 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at chris@stacksjs.org. All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of actions. + +**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000..1139343 --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,70 @@ +# Security Policy + +**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, [SEE BELOW](#reporting-a-vulnerability).** + +## Supported Versions + +Only the latest major version receives security fixes. + +## Reporting a Vulnerability + +If you discover a security vulnerability within this package, please send an email to Chris Breuer at chris@stacksjs.org. All security vulnerabilities will be promptly addressed. + +### Public PGP Key + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: OpenPGP v2.0.8 +Comment: https://sela.io/pgp/ + +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 +HF/6SiI= +=le/X +-----END PGP PUBLIC KEY BLOCK----- +``` diff --git a/.github/art/cover.jpg b/.github/art/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba6e4181827fe95883dc1474a16f2882dbcbd070 GIT binary patch literal 71948 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 A`2YX_ literal 0 HcmV?d00001 diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..66937d2 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,3 @@ +{ + "extends": ["@ow3"] +} diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..ece9846 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,14 @@ +daysUntilStale: 60 +daysUntilClose: 7 +exemptLabels: + - pinned + - security + - no-stale + - no stale + - pr welcome +staleLabel: stale +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. + Thank you for your contributions. +closeComment: false diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000..79d40a0 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,13 @@ +# GitHub Actions + +This folder contains the following GitHub Actions: + +- [CI][CI] - all CI jobs for the project + - lints the code + - `typecheck`s the code + - runs test suite + - runs on `ubuntu-latest` +- [Release][Release] - automates the release process & changelog generation + +[CI]: ./workflows/ci.yml +[Release]: ./workflows/release.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d0ab6fe --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,84 @@ +name: CI + +on: + push: + branches: + - main + + pull_request: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + + - name: Use cached node_modules + uses: actions/cache@v4 + with: + path: node_modules + key: node-modules-${{ hashFiles('**/bun.lockb') }} + restore-keys: | + node-modules- + + - name: Install Dependencies + run: bun install + + - name: Lint + run: bun run lint + + typecheck: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + + - name: Use cached node_modules + uses: actions/cache@v4 + with: + path: node_modules + key: node-modules-${{ hashFiles('**/bun.lockb') }} + restore-keys: | + node-modules- + + - name: Install Dependencies + run: bun install + + - name: Typecheck + run: bun --bun run typecheck + + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + + - name: Use cached node_modules + uses: actions/cache@v4 + with: + path: node_modules + key: node-modules-${{ hashFiles('**/bun.lockb') }} + restore-keys: | + node-modules- + + - name: Install Dependencies + run: bun install + + - name: Unit Test + run: bun test diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..e808da4 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,43 @@ +name: CI + +on: + push: + tags: + - 'v*' + +jobs: + release: + name: release + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + + - name: Use cached node_modules + uses: actions/cache@v4 + with: + path: node_modules + key: node-modules-${{ hashFiles('**/bun.lockb') }} + restore-keys: | + node-modules- + + - name: Install Dependencies + run: bun install + + - name: Build the release + run: bun run build + + - name: Publish to npm + run: bun publish --access public + env: + BUN_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + - name: Create GitHub release + run: bunx changelogithub + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a572eb1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +.cache +.DS_Store +.idea +*.log +*.tgz +*.pem +coverage +dist +lib-cov +logs +node_modules +temp +docs/.vitepress/cache +storage diff --git a/.vscode/dictionary.txt b/.vscode/dictionary.txt new file mode 100644 index 0000000..5973a3a --- /dev/null +++ b/.vscode/dictionary.txt @@ -0,0 +1,41 @@ +antfu +biomejs +booleanish +bumpp +bunx +changelogen +changelogithub +codecov +commitlint +commitlintrc +composables +davidanson +degit +deps +destructurable +entrypoints +heroicons +lockb +mkcert +openweb +outdir +outfile +pausable +pkgx +Postcardware +postcompile +prefetch +preinstall +socio +Solana +stacksjs +typecheck +unplugin +unref +upath +vite +vitebook +vitejs +vitepress +vue-demi +vueus diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a4d6a99 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "biomejs.biome", + "streetsidesoftware.code-spell-checker", + "davidanson.vscode-markdownlint" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..bf5d2c9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,145 @@ +{ + // Disable the default formatter, use eslint instead + "prettier.enable": false, + "biome.enabled": false, + "editor.formatOnSave": false, + + // Auto fix + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "never" + }, + + // Silent the stylistic rules in you IDE, but still auto fix them + "eslint.rules.customizations": [ + { "rule": "style/*", "severity": "off", "fixable": true }, + { "rule": "format/*", "severity": "off", "fixable": true }, + { "rule": "*-indent", "severity": "off", "fixable": true }, + { "rule": "*-spacing", "severity": "off", "fixable": true }, + { "rule": "*-spaces", "severity": "off", "fixable": true }, + { "rule": "*-order", "severity": "off", "fixable": true }, + { "rule": "*-dangle", "severity": "off", "fixable": true }, + { "rule": "*-newline", "severity": "off", "fixable": true }, + { "rule": "*quotes", "severity": "off", "fixable": true }, + { "rule": "*semi", "severity": "off", "fixable": true } + ], + + // Enable eslint for all supported languages + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue", + "html", + "markdown", + "json", + "jsonc", + "yaml", + "toml", + "xml", + "gql", + "graphql", + "astro", + "svelte", + "css", + "less", + "scss", + "pcss", + "postcss" + ], + + "[stx]": { + "editor.defaultFormatter": "dbaeumer.vscode-eslint" + }, + + // TypeScript + "typescript.tsdk": "${workspaceFolder}/node_modules/typescript/lib", + "unocss.root": "${workspaceFolder}/storage/framework/core/ui/src/uno.config.ts", + // Shell + "[shellscript]": { + "editor.defaultFormatter": "foxundermoon.shell-format" + }, + + // Markdown + "[markdown]": { + "editor.defaultFormatter": "DavidAnson.vscode-markdownlint", + "editor.formatOnSave": true + }, + + "[dockerfile]": { + "editor.defaultFormatter": "foxundermoon.shell-format" + }, + + "markdownlint.config": { + "default": true, + "MD033": { + "allowed_elements": [ + "details", + "summary", + "VPTeamPage", + "VPTeamPageTitle", + "VPTeamMembers", + "script" + ] + }, + "MD041": false + }, + + // Stacks + "vue.inlayHints.missingProps": true, + "typescript.preferGoToSourceDefinition": true, + "files.associations": { + "buddy": "typescript", + "*.stx": "vue" + }, + "editor.quickSuggestions": { + "strings": true + }, + "vsicons.associations.files": [ + { + "icon": "${workspaceFolder}/public/favicon.svg", + "extensions": ["stx"], + "format": "svg" + } + ], + "git.enableSmartCommit": true, + "npm.enableRunFromFolder": true, + "npm.packageManager": "bun", + "editor.gotoLocation.multipleDefinitions": "goto", + "search.exclude": { + "**/node_modules": true, + "**/cdk.out": true, + "**/dist": true, + "**/storage/public": true, + "CHANGELOG.md": true + }, + "explorer.confirmDragAndDrop": false, + "todo-tree.highlights.enabled": true, + "cSpell.ignorePaths": [ + "node_modules", + "lang/de.yml" + ], + "cSpell.dictionaries": [ + "custom-dictionary" + ], + "cSpell.diagnosticLevel": "Hint", + "cSpell.customDictionaries": { + "stacks": { + "name": "custom-dictionary", + "path": "./.vscode/dictionary.txt", + "scope": "user", + "addWords": true + }, + "custom": true // enable the `custom` dictionary + }, + "terminal.integrated.scrollback": 10000, + "grammarly.files.include": [ + "**/README.md", + "**/readme.md", + "**/*.txt" + ], + "grammarly.files.exclude": [ + "**/dictionary.txt" + ], +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ec90a7a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,68 @@ +# Changelog + + +## v0.0.1...main + +[compare changes](https://github.com/stacksjs/reverse-proxy/compare/v0.0.1...main) + +### 🏡 Chore + +- Wip ([c5e31d5](https://github.com/stacksjs/reverse-proxy/commit/c5e31d5)) +- Wip ([6020df1](https://github.com/stacksjs/reverse-proxy/commit/6020df1)) +- Wip ([be3dde1](https://github.com/stacksjs/reverse-proxy/commit/be3dde1)) +- Wip ([e9e0feb](https://github.com/stacksjs/reverse-proxy/commit/e9e0feb)) +- Wip ([383854c](https://github.com/stacksjs/reverse-proxy/commit/383854c)) +- Wip ([363445b](https://github.com/stacksjs/reverse-proxy/commit/363445b)) +- Add `rp` ([beced3c](https://github.com/stacksjs/reverse-proxy/commit/beced3c)) +- Wip ([99cf0df](https://github.com/stacksjs/reverse-proxy/commit/99cf0df)) +- Wip ([c9341a4](https://github.com/stacksjs/reverse-proxy/commit/c9341a4)) +- Use `bun publish` ([6f6ae9d](https://github.com/stacksjs/reverse-proxy/commit/6f6ae9d)) +- Add tests ([da19c51](https://github.com/stacksjs/reverse-proxy/commit/da19c51)) +- Ignore docs cache ([81f2296](https://github.com/stacksjs/reverse-proxy/commit/81f2296)) +- Use bunx ([ec65717](https://github.com/stacksjs/reverse-proxy/commit/ec65717)) +- Adjust examples ([d4745fc](https://github.com/stacksjs/reverse-proxy/commit/d4745fc)) +- Adjust build process ([1e5c63c](https://github.com/stacksjs/reverse-proxy/commit/1e5c63c)) +- Remove postcompile ([52a9bc6](https://github.com/stacksjs/reverse-proxy/commit/52a9bc6)) +- Remove lint:fix-unsafe ([91ad947](https://github.com/stacksjs/reverse-proxy/commit/91ad947)) + +### ❤️ Contributors + +- Chris + +## ...main + + +### 🏡 Chore + +- Initial commit ([beb4d96](https://github.com/stacksjs/reverse-proxy/commit/beb4d96)) +- Wip ([8e3fce6](https://github.com/stacksjs/reverse-proxy/commit/8e3fce6)) +- Wip ([bbb6783](https://github.com/stacksjs/reverse-proxy/commit/bbb6783)) +- Wip ([2cfb363](https://github.com/stacksjs/reverse-proxy/commit/2cfb363)) +- Wip ([6bb85ac](https://github.com/stacksjs/reverse-proxy/commit/6bb85ac)) +- Wip ([602c9e1](https://github.com/stacksjs/reverse-proxy/commit/602c9e1)) +- Wip ([5986105](https://github.com/stacksjs/reverse-proxy/commit/5986105)) +- Wip ([c2bfec6](https://github.com/stacksjs/reverse-proxy/commit/c2bfec6)) +- Wip ([454dd58](https://github.com/stacksjs/reverse-proxy/commit/454dd58)) +- Wip ([b55ae41](https://github.com/stacksjs/reverse-proxy/commit/b55ae41)) +- Wip ([e2f1350](https://github.com/stacksjs/reverse-proxy/commit/e2f1350)) +- Wip ([61b2aa5](https://github.com/stacksjs/reverse-proxy/commit/61b2aa5)) +- Wip ([a80283b](https://github.com/stacksjs/reverse-proxy/commit/a80283b)) +- Wip ([97b9b16](https://github.com/stacksjs/reverse-proxy/commit/97b9b16)) +- Wip ([fc8d633](https://github.com/stacksjs/reverse-proxy/commit/fc8d633)) +- Wip ([e924f9c](https://github.com/stacksjs/reverse-proxy/commit/e924f9c)) +- Wip ([249e8fa](https://github.com/stacksjs/reverse-proxy/commit/249e8fa)) +- Wip ([1045bb1](https://github.com/stacksjs/reverse-proxy/commit/1045bb1)) +- Wip ([c0a8bad](https://github.com/stacksjs/reverse-proxy/commit/c0a8bad)) +- Wip ([f28b118](https://github.com/stacksjs/reverse-proxy/commit/f28b118)) +- Wip ([712a5bf](https://github.com/stacksjs/reverse-proxy/commit/712a5bf)) +- Wip ([2786e8d](https://github.com/stacksjs/reverse-proxy/commit/2786e8d)) +- Wip ([1290366](https://github.com/stacksjs/reverse-proxy/commit/1290366)) +- Wip ([030a8b7](https://github.com/stacksjs/reverse-proxy/commit/030a8b7)) +- Wip ([2116f75](https://github.com/stacksjs/reverse-proxy/commit/2116f75)) +- Wip ([5352f7a](https://github.com/stacksjs/reverse-proxy/commit/5352f7a)) +- Wip ([1b99dd0](https://github.com/stacksjs/reverse-proxy/commit/1b99dd0)) + +### ❤️ Contributors + +- Chris + diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..1aef080 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Open Web Foundation + +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..be00da7 --- /dev/null +++ b/README.md @@ -0,0 +1,136 @@ +

Social Card of this repo

+ +[![npm version][npm-version-src]][npm-version-href] +[![GitHub Actions][github-actions-src]][github-actions-href] +[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) + + + +# A Better Developer Experience + +> A zero-config reverse proxy for local development with SSL support, custom domains, and more. + +## Features + +- Simple Reverse Proxy +- Custom Domains _(with wildcard support)_ +- Dependency-Free +- Zero-Config Setup + + + + +## Install + +```bash +bun install -d @stacksjs/reverse-proxy +``` + + + +## Get Started + +There are two ways of using this reverse proxy: _as a library or as a CLI._ + +### Library + +Given the npm package is installed: + +```js +import { startProxy } from '@stacksjs/reverse-proxy' + +startProxy({ + from: 'localhost:3000', + to: 'my-project.localhost' // or try 'my-project.test' +}) +``` + +### CLI + +```bash +reverse-proxy --from localhost:3000 --to my-project.localhost +reverse-proxy --from localhost:8080 --to my-project.test --keyPath ./key.pem --certPath ./cert.pem +reverse-proxy --help +reverse-proxy --version +``` + +## Configuration + +The Reverse Proxy can be configured using a `reverse-proxy.config.ts` _(or `reverse-proxy.config.js`)_ file and it will be automatically loaded when running the `reverse-proxy` command. + +```ts +// reverse-proxy.config.ts (or reverse-proxy.config.js) +export default { + 'localhost:3000': 'stacks.localhost' +} +``` + +_Then run:_ + +```bash +reverse-proxy start +``` + +To learn more, head over to the [documentation](https://reverse-proxy.sh/). + +## Testing + +```bash +bun test +``` + +## Changelog + +Please see our [releases](https://github.com/stacksjs/stacks/releases) page for more information on what has changed recently. + +## Contributing + +Please review the [Contributing Guide](https://github.com/stacksjs/contributing) for details. + +## Community + +For help, discussion about best practices, or any other conversation that would benefit from being searchable: + +[Discussions on GitHub](https://github.com/stacksjs/stacks/discussions) + +For casual chit-chat with others using this package: + +[Join the Stacks Discord Server](https://discord.gg/stacksjs) + +## Postcardware + +Two things are true: Stacks OSS will always stay open-source, and we do love to receive postcards from wherever Stacks is used! 🌍 _We also publish them on our website. And thank you, Spatie_ + +Our address: Stacks.js, 12665 Village Ln #2306, Playa Vista, CA 90094 + +## Sponsors + +We would like to extend our thanks to the following sponsors for funding Stacks development. If you are interested in becoming a sponsor, please reach out to us. + +- [JetBrains](https://www.jetbrains.com/) +- [The Solana Foundation](https://solana.com/) + +## Credits + +- [Chris Breuer](https://github.com/chrisbbreuer) +- [All Contributors](../../contributors) + +## License + +The MIT License (MIT). Please see [LICENSE](https://github.com/stacksjs/stacks/tree/main/LICENSE.md) for more information. + +Made with 💙 + + +[npm-version-src]: https://img.shields.io/npm/v/@stacksjs/reverse-proxy?style=flat-square +[npm-version-href]: https://npmjs.com/package/@stacksjs/reverse-proxy +[github-actions-src]: https://img.shields.io/github/actions/workflow/status/stacksjs/reverse-proxy/ci.yml?style=flat-square&branch=main +[github-actions-href]: https://github.com/stacksjs/reverse-proxy/actions?query=workflow%3Aci + + diff --git a/bin/cli.ts b/bin/cli.ts new file mode 100644 index 0000000..a03cbe7 --- /dev/null +++ b/bin/cli.ts @@ -0,0 +1,33 @@ +import { log, CAC } from '@stacksjs/cli' +import { version } from '../package.json' +import { config } from '../src/config' +import { generate } from '../src/generate' +import type { DtsGenerationOption } from '../src/types' + +const cli = new CAC('dts-generation') + +cli + .command('start', 'Start the Reverse Proxy Server') + .option('--from ', 'The URL to proxy from') + .option('--to ', 'The URL to proxy to') + .option('--keyPath ', 'Absolute path to the SSL key') + .option('--certPath ', 'Absolute path to the SSL certificate') + .option('--verbose', 'Enable verbose logging', { default: false }) + .example('reverse-proxy start --from localhost:3000 --to my-project.localhost') + .example('reverse-proxy start --from localhost:3001 --to my-project.localhost/api') + .example('reverse-proxy start --from localhost:3000 --to localhost:3001') + .example( + 'reverse-proxy start --from localhost:3000 --to my-project.test --keyPath /absolute/path/to/key --certPath /absolute/path/to/cert', + ) + .action(async (options?: DtsGenerationOption) => { + // + }) + +cli.command('version', 'Show the version of the Reverse Proxy CLI').action(() => { + // eslint-disable-next-line no-console + console.log(version) +}) + +cli.version(version) +cli.help() +cli.parse() diff --git a/build.ts b/build.ts new file mode 100644 index 0000000..890452f --- /dev/null +++ b/build.ts @@ -0,0 +1,23 @@ +import { log } from '@stacksjs/cli' +import { $ } from 'bun' +import dts from 'bun-plugin-dts-auto' + +log.info('Building...') + +await Bun.build({ + entrypoints: ['./src/index.ts', './bin/cli.ts'], + outdir: './dist', + format: 'esm', + target: 'bun', + external: ['rollup', 'fsevents'], + plugins: [dts()], +}) + +await $`cp ./dist/src/index.js ./dist/index.js` +await $`rm -rf ./dist/src` +await $`cp ./dist/bin/cli.js ./dist/cli.js` +await $`rm -rf ./dist/bin` +await $`cp ./bin/cli.d.ts ./dist/cli.d.ts` +await $`rm ./bin/cli.d.ts` + +log.success('Built') diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..7140ca69305438022b2fe292743c360d50e224dd GIT binary patch literal 85837 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 +import { useData } from 'vitepress' + +const { theme, page, frontmatter } = useData() + + +## Results + +### Theme Data +
{{ theme }}
+ +### Page Data +
{{ page }}
+ +### Page Frontmatter +
{{ frontmatter }}
+``` + + + +## Results + +### Theme Data +
{{ theme }}
+ +### Page Data +
{{ page }}
+ +### Page Frontmatter +
{{ frontmatter }}
+ +## More + +Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata). diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..c7a7353 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,24 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: "Reverse Proxy" + text: "A better developer environment." + tagline: My great project tagline + actions: + - theme: brand + text: Markdown Examples + link: /markdown-examples + - theme: alt + text: API Examples + link: /api-examples + +features: + - title: Feature A + details: Lorem ipsum dolor sit amet, consectetur adipiscing elit + - title: Feature B + details: Lorem ipsum dolor sit amet, consectetur adipiscing elit + - title: Feature C + details: Lorem ipsum dolor sit amet, consectetur adipiscing elit +--- diff --git a/docs/markdown-examples.md b/docs/markdown-examples.md new file mode 100644 index 0000000..f9258a5 --- /dev/null +++ b/docs/markdown-examples.md @@ -0,0 +1,85 @@ +# Markdown Extension Examples + +This page demonstrates some of the built-in markdown extensions provided by VitePress. + +## Syntax Highlighting + +VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting: + +**Input** + +````md +```js{4} +export default { + data () { + return { + msg: 'Highlighted!' + } + } +} +``` +```` + +**Output** + +```js{4} +export default { + data () { + return { + msg: 'Highlighted!' + } + } +} +``` + +## Custom Containers + +**Input** + +```md +::: info +This is an info box. +::: + +::: tip +This is a tip. +::: + +::: warning +This is a warning. +::: + +::: danger +This is a dangerous warning. +::: + +::: details +This is a details block. +::: +``` + +**Output** + +::: info +This is an info box. +::: + +::: tip +This is a tip. +::: + +::: warning +This is a warning. +::: + +::: danger +This is a dangerous warning. +::: + +::: details +This is a details block. +::: + +## More + +Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown). diff --git a/dts b/dts new file mode 100755 index 0000000..c3d8286 --- /dev/null +++ b/dts @@ -0,0 +1,2 @@ +#!/usr/bin/env bun +import('./bin/cli') diff --git a/dts.config.ts b/dts.config.ts new file mode 100644 index 0000000..efba7fa --- /dev/null +++ b/dts.config.ts @@ -0,0 +1,2 @@ +export default { +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..44b7d05 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,12 @@ +import stacks from '@stacksjs/eslint-config' + +export default stacks({ + stylistic: { + indent: 2, + quotes: 'single', + }, + + typescript: true, + jsonc: true, + yaml: true, +}) diff --git a/package.json b/package.json new file mode 100644 index 0000000..5ce11f5 --- /dev/null +++ b/package.json @@ -0,0 +1,80 @@ +{ + "name": "dts-generation", + "type": "module", + "version": "0.1.0", + "description": "A modern, fast .d.ts generation tool, powered by Bun.", + "author": "Chris Breuer ", + "license": "MIT", + "homepage": "https://github.com/stacksjs/dts-generation#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/stacksjs/dts-generation.git" + }, + "bugs": { + "url": "https://github.com/stacksjs/dts-generation/issues" + }, + "keywords": [ + "dts", + "generation", + "development", + "environment", + "bun", + "stacks", + "typescript", + "javascript" + ], + "exports": { + ".": { + "import": "./dist/index.js" + }, + "./*": { + "import": "./dist/*" + } + }, + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "bin": { + "dts-generation": "./dist/cli.js" + }, + "files": [ + "dist", + ], + "scripts": { + "build": "bun build.ts && bun run compile", + "compile": "bun build ./bin/cli.ts --compile --minify --outfile dist/dts-generation", + "lint": "bunx eslint .", + "lint:fix": "bunx eslint . --fix", + "fresh": "bunx rimraf node_modules/ bun.lock && bun i", + "commit": "git cz", + "changelog": "bunx changelogen --output CHANGELOG.md", + "prepublishOnly": "bun --bun run build", + "release": "bun run changelog && bunx bumpp package.json --all", + "test": "bun test", + "typecheck": "bunx tsc --noEmit", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" + }, + "devDependencies": { + "@stacksjs/cli": "^0.65.0", + "@stacksjs/eslint-config": "^3.7.3-stacks-1.11", + "@stacksjs/development": "^0.65.0", + "@stacksjs/storage": "^0.65.0", + "@types/bun": "^1.1.10", + "bun-plugin-dts-auto": "^0.20.5", + "c12": "^2.0.1", + "vitepress": "^1.4.0" + }, + "simple-git-hooks": { + "pre-commit": "bunx lint-staged", + "commit-msg": "bunx --no -- commitlint --edit $1" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,vue}": "bunx eslint . --fix" + }, + "config": { + "commitizen": { + "path": "node_modules/cz-git" + } + } +} diff --git a/pkgx.yaml b/pkgx.yaml new file mode 100644 index 0000000..9b325ec --- /dev/null +++ b/pkgx.yaml @@ -0,0 +1,2 @@ +dependencies: + bun.sh: ^1.0.30 diff --git a/scripts/generate-keys.ts b/scripts/generate-keys.ts new file mode 100644 index 0000000..03870cb --- /dev/null +++ b/scripts/generate-keys.ts @@ -0,0 +1,10 @@ +// todo - need to import from tlsx +// import { generateAndSaveCertificates, generateRootCA } from '../src/keys' + +// Generate a root key and certificate (self-signed) +// await generateRootCA() + +// Generate a keypair and create an X.509v3 certificate for the domain +// await generateAndSaveCertificates() + +// await addRootCAToSystemTrust() diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..e7e5ffa --- /dev/null +++ b/src/config.ts @@ -0,0 +1,8 @@ +import { loadConfig } from 'c12' + +// Get loaded config +const { config } = await loadConfig({ + name: "dts", +}) + +export { config } diff --git a/src/generate.ts b/src/generate.ts new file mode 100644 index 0000000..6d1d898 --- /dev/null +++ b/src/generate.ts @@ -0,0 +1,18 @@ +import { readFileSync } from 'node:fs'; + +export function generate(): string { + return '' +} + +export function isIsolatedDeclarations(): boolean { + try { + const tsconfigPath = './tsconfig.json'; + const tsconfigContent = readFileSync(tsconfigPath, 'utf-8'); + const tsconfig = JSON.parse(tsconfigContent); + + return tsconfig.compilerOptions?.isolatedDeclarations === true; + } catch (error) { + console.error('Error reading tsconfig.json:', error); + return false; + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..6d3e6fb --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +export { config } from './config' +export * from './generate' +export * from './types' diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..8332ec1 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,5 @@ +export interface DtsGenerationOption { + // ... +} + +export type DtsGenerationOptions = DtsGenerationOption | DtsGenerationOption[] diff --git a/test/dts.test.ts b/test/dts.test.ts new file mode 100644 index 0000000..1877a42 --- /dev/null +++ b/test/dts.test.ts @@ -0,0 +1,11 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, mock } from 'bun:test' +import { generate } from '../src/generate' +import type { DtsGenerationOption } from '../src/types' + +describe('@stacksjs/reverse-proxy', () => { + beforeAll(() => { + process.env.APP_ENV = 'test' + }) + + // describe... +}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..853ce1d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "esnext", + "lib": [ + "esnext" + ], + "moduleDetection": "force", + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "strict": true, + "strictNullChecks": true, + "noFallthroughCasesInSwitch": true, + "declaration": true, + "isolatedDeclarations": true, + "noEmit": true, + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "verbatimModuleSyntax": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true + } +}