diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 357d2cb..d530241 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -8,7 +8,10 @@ on:
jobs:
build:
- runs-on: ubuntu-latest
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v4
@@ -19,7 +22,7 @@ jobs:
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
- node-version: 20
+ node-version: 24
- name: Install dependencies
run: pnpm install --ignore-scripts
@@ -28,3 +31,5 @@ jobs:
run: pnpm build
- name: Test all packages
run: pnpm test
+ env:
+ BEGIT_GH_API_KEY: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index b1d8509..ba04bab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -135,5 +135,8 @@ dist
.yarn/install-state.gz
.pnp.*
-# Testing directory
-testing
\ No newline at end of file
+# Test directory
+test
+
+# Build output
+types
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
index 1ef1d53..39e2e9f 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,3 +1,2 @@
**/*.rs
**/*.yaml
-packages/swc-plugin-solid-cli
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
index 8af17f2..df8a347 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -7,5 +7,6 @@
"tabWidth": 2,
"trailingComma": "all",
"useTabs": true,
- "quoteProps": "consistent"
+ "quoteProps": "consistent",
+ "endOfLine": "auto"
}
diff --git a/README.md b/README.md
index ac1727f..aa0e49a 100644
--- a/README.md
+++ b/README.md
@@ -2,64 +2,19 @@
-> [!WARNING]
-> This project is under heavy development and is not yet complete. More features coming soon!
-
# Solid CLI
[](https://github.com/solidjs-community/solid-cli/actions/workflows/tests.yml)
[](https://app.netlify.com/sites/solid-cli/deploys)
-A custom-built CLI for creating and managing SolidJS apps and projects.
-
-## Roadmap/Features
-
-- [x] Templates
- - [x] From Degit
-- [x] Docs
-- [ ] Primitives
- - [ ] Add/remove/update primitives
- - [x] Search list of primitives
-- [ ] Integrations
- - [ ] Auth.js
- - [x] Tailwind
- - [ ] PandaCSS
- - [ ] Cypress
- - [ ] PostCSS
- - [x] UnoCSS
- - [ ] Vanilla Extract
- - [ ] Vitest
- - [ ] Tauri
- - [ ] Playwright
-- [ ] Utilities
- - [ ] eslint-plugin-solid
- - [x] solid-devtools
-- [ ] Misc
- - [x] Launch new Stackblitz
- - [ ] Launch new CodeSandBox
-- [x] SolidStart
- - [x] New route
- - [x] New data file
- - [x] Enable Adapters
- - [x] Enable SSR/CSR/SSG mode
-
-## Structure
+A CLI for creating and managing SolidJS apps and projects.
-The CLI is invoked with `solid`. The commands then cascade, where actions are grouped with other similar actions. The actions will be:
+## Commands
-- `version`: Displays a changelog of recent Solid versions
- - `start`: Specific command for Start versions
-- `docs`: List a `man`-like page for versioned docs or link out to the docs
-- `primitives`: Potential integration with Solid Primitives
-- `add`, `remove`: Used for adding and installing integrations/packages ie. `solid add tailwind`
-- `config`: For enabling a certain features ie. `solid config vite _____`
-- `start`: Special keyword for SolidStart commands
- - `mode`: Changes the Start serving mode (ssr/csr/ssg) `solid mode ssr`
- - `route`: Creates a new route ie. `solid start route login`
-- `new`: Opens your browser to a new template via CSB/SB ie. `solid new bare --stackblitz` opens
-- `ecosystem`
- - `add`: Starts the process of submitting your current project to our ecosystem listing (Solidex) ie. `solid ecosystem publish`
- - `search`: Initializes an ecosystem search result `solid ecosystem search auth`
+- `sd create`: See [create-solid](./packages/create-solid)
+- `sd docs`: Opens the Solid docs in the browser
+- `sd start`: Special keyword for SolidStart commands
+ - `route`: Creates a new route ie. `sd start route login`
## Contributing
diff --git a/docs/.gitignore b/docs/.gitignore
deleted file mode 100644
index f3c937e..0000000
--- a/docs/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-vitepress_docs/.vitepress/cache
\ No newline at end of file
diff --git a/docs/package.json b/docs/package.json
deleted file mode 100644
index ea22902..0000000
--- a/docs/package.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "private": true,
- "type": "module",
- "scripts": {
- "docs:dev": "vitepress dev vitepress_docs",
- "docs:build": "vitepress build vitepress_docs",
- "docs:preview": "vitepress preview vitepress_docs"
- },
- "devDependencies": {
- "flexsearch": "^0.7.43",
- "vitepress": "1.0.0-rc.42",
- "vitepress-plugin-search": "1.0.4-alpha.22",
- "vue": "^3.4.19"
- }
-}
diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml
deleted file mode 100644
index 2089310..0000000
--- a/docs/pnpm-lock.yaml
+++ /dev/null
@@ -1,1135 +0,0 @@
-lockfileVersion: '6.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- devDependencies:
- flexsearch:
- specifier: ^0.7.43
- version: 0.7.43
- vitepress:
- specifier: 1.0.0-rc.42
- version: 1.0.0-rc.42(@algolia/client-search@4.22.1)(search-insights@2.13.0)
- vitepress-plugin-search:
- specifier: 1.0.4-alpha.22
- version: 1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.0.0-rc.42)(vue@3.4.19)
- vue:
- specifier: ^3.4.19
- version: 3.4.19
-
-packages:
-
- /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0):
- resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==}
- dependencies:
- '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0)
- '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)
- transitivePeerDependencies:
- - '@algolia/client-search'
- - algoliasearch
- - search-insights
- dev: true
-
- /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0):
- resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==}
- peerDependencies:
- search-insights: '>= 1 < 3'
- dependencies:
- '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)
- search-insights: 2.13.0
- transitivePeerDependencies:
- - '@algolia/client-search'
- - algoliasearch
- dev: true
-
- /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1):
- resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==}
- peerDependencies:
- '@algolia/client-search': '>= 4.9.1 < 6'
- algoliasearch: '>= 4.9.1 < 6'
- dependencies:
- '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)
- '@algolia/client-search': 4.22.1
- algoliasearch: 4.22.1
- dev: true
-
- /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1):
- resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==}
- peerDependencies:
- '@algolia/client-search': '>= 4.9.1 < 6'
- algoliasearch: '>= 4.9.1 < 6'
- dependencies:
- '@algolia/client-search': 4.22.1
- algoliasearch: 4.22.1
- dev: true
-
- /@algolia/cache-browser-local-storage@4.22.1:
- resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==}
- dependencies:
- '@algolia/cache-common': 4.22.1
- dev: true
-
- /@algolia/cache-common@4.22.1:
- resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==}
- dev: true
-
- /@algolia/cache-in-memory@4.22.1:
- resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==}
- dependencies:
- '@algolia/cache-common': 4.22.1
- dev: true
-
- /@algolia/client-account@4.22.1:
- resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==}
- dependencies:
- '@algolia/client-common': 4.22.1
- '@algolia/client-search': 4.22.1
- '@algolia/transporter': 4.22.1
- dev: true
-
- /@algolia/client-analytics@4.22.1:
- resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==}
- dependencies:
- '@algolia/client-common': 4.22.1
- '@algolia/client-search': 4.22.1
- '@algolia/requester-common': 4.22.1
- '@algolia/transporter': 4.22.1
- dev: true
-
- /@algolia/client-common@4.22.1:
- resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==}
- dependencies:
- '@algolia/requester-common': 4.22.1
- '@algolia/transporter': 4.22.1
- dev: true
-
- /@algolia/client-personalization@4.22.1:
- resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==}
- dependencies:
- '@algolia/client-common': 4.22.1
- '@algolia/requester-common': 4.22.1
- '@algolia/transporter': 4.22.1
- dev: true
-
- /@algolia/client-search@4.22.1:
- resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==}
- dependencies:
- '@algolia/client-common': 4.22.1
- '@algolia/requester-common': 4.22.1
- '@algolia/transporter': 4.22.1
- dev: true
-
- /@algolia/logger-common@4.22.1:
- resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==}
- dev: true
-
- /@algolia/logger-console@4.22.1:
- resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==}
- dependencies:
- '@algolia/logger-common': 4.22.1
- dev: true
-
- /@algolia/requester-browser-xhr@4.22.1:
- resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==}
- dependencies:
- '@algolia/requester-common': 4.22.1
- dev: true
-
- /@algolia/requester-common@4.22.1:
- resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==}
- dev: true
-
- /@algolia/requester-node-http@4.22.1:
- resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==}
- dependencies:
- '@algolia/requester-common': 4.22.1
- dev: true
-
- /@algolia/transporter@4.22.1:
- resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==}
- dependencies:
- '@algolia/cache-common': 4.22.1
- '@algolia/logger-common': 4.22.1
- '@algolia/requester-common': 4.22.1
- dev: true
-
- /@babel/helper-string-parser@7.23.4:
- resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
- engines: {node: '>=6.9.0'}
- dev: true
-
- /@babel/helper-validator-identifier@7.22.20:
- resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
- engines: {node: '>=6.9.0'}
- dev: true
-
- /@babel/parser@7.23.9:
- resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==}
- engines: {node: '>=6.0.0'}
- hasBin: true
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/types@7.23.6:
- resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.23.4
- '@babel/helper-validator-identifier': 7.22.20
- to-fast-properties: 2.0.0
- dev: true
-
- /@docsearch/css@3.5.2:
- resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==}
- dev: true
-
- /@docsearch/js@3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0):
- resolution: {integrity: sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==}
- dependencies:
- '@docsearch/react': 3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0)
- preact: 10.19.3
- transitivePeerDependencies:
- - '@algolia/client-search'
- - '@types/react'
- - react
- - react-dom
- - search-insights
- dev: true
-
- /@docsearch/react@3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0):
- resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==}
- peerDependencies:
- '@types/react': '>= 16.8.0 < 19.0.0'
- react: '>= 16.8.0 < 19.0.0'
- react-dom: '>= 16.8.0 < 19.0.0'
- search-insights: '>= 1 < 3'
- peerDependenciesMeta:
- '@types/react':
- optional: true
- react:
- optional: true
- react-dom:
- optional: true
- search-insights:
- optional: true
- dependencies:
- '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0)
- '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)
- '@docsearch/css': 3.5.2
- algoliasearch: 4.22.1
- search-insights: 2.13.0
- transitivePeerDependencies:
- - '@algolia/client-search'
- dev: true
-
- /@esbuild/aix-ppc64@0.19.11:
- resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [aix]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/android-arm64@0.19.11:
- resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/android-arm@0.19.11:
- resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/android-x64@0.19.11:
- resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/darwin-arm64@0.19.11:
- resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/darwin-x64@0.19.11:
- resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/freebsd-arm64@0.19.11:
- resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/freebsd-x64@0.19.11:
- resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-arm64@0.19.11:
- resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-arm@0.19.11:
- resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-ia32@0.19.11:
- resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-loong64@0.19.11:
- resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==}
- engines: {node: '>=12'}
- cpu: [loong64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-mips64el@0.19.11:
- resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-ppc64@0.19.11:
- resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-riscv64@0.19.11:
- resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-s390x@0.19.11:
- resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-x64@0.19.11:
- resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/netbsd-x64@0.19.11:
- resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/openbsd-x64@0.19.11:
- resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/sunos-x64@0.19.11:
- resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/win32-arm64@0.19.11:
- resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/win32-ia32@0.19.11:
- resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/win32-x64@0.19.11:
- resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@jridgewell/sourcemap-codec@1.4.15:
- resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
- dev: true
-
- /@rollup/rollup-android-arm-eabi@4.9.5:
- resolution: {integrity: sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-android-arm64@4.9.5:
- resolution: {integrity: sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-darwin-arm64@4.9.5:
- resolution: {integrity: sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-darwin-x64@4.9.5:
- resolution: {integrity: sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-arm-gnueabihf@4.9.5:
- resolution: {integrity: sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-arm64-gnu@4.9.5:
- resolution: {integrity: sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-arm64-musl@4.9.5:
- resolution: {integrity: sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-riscv64-gnu@4.9.5:
- resolution: {integrity: sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-x64-gnu@4.9.5:
- resolution: {integrity: sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-x64-musl@4.9.5:
- resolution: {integrity: sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-win32-arm64-msvc@4.9.5:
- resolution: {integrity: sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-win32-ia32-msvc@4.9.5:
- resolution: {integrity: sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-win32-x64-msvc@4.9.5:
- resolution: {integrity: sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@shikijs/core@1.1.2:
- resolution: {integrity: sha512-ERVzNQz88ZkDqUpWeC57Kp+Kmx5RjqeDBR1M8AGWGom4yrkITiTfXCGmjchlDSw12MhDTuPYR4HVFW8uT61RaQ==}
- dev: true
-
- /@shikijs/transformers@1.1.2:
- resolution: {integrity: sha512-tldkUMW7RBkU2F6eXbiRMw3ja+hQer1EjwhD2NGOv6K0pgZdVp3JKjU8uisRtg65tyBqrVHq7zlLHVk7EKmUZA==}
- dependencies:
- shiki: 1.1.2
- dev: true
-
- /@types/estree@1.0.5:
- resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
- dev: true
-
- /@types/flexsearch@0.7.6:
- resolution: {integrity: sha512-H5IXcRn96/gaDmo+rDl2aJuIJsob8dgOXDqf8K0t8rWZd1AFNaaspmRsElESiU+EWE33qfbFPgI0OC/B1g9FCA==}
- dev: true
-
- /@types/linkify-it@3.0.5:
- resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==}
- dev: true
-
- /@types/markdown-it@12.2.3:
- resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==}
- dependencies:
- '@types/linkify-it': 3.0.5
- '@types/mdurl': 1.0.5
- dev: true
-
- /@types/markdown-it@13.0.7:
- resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==}
- dependencies:
- '@types/linkify-it': 3.0.5
- '@types/mdurl': 1.0.5
- dev: true
-
- /@types/mdurl@1.0.5:
- resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==}
- dev: true
-
- /@types/web-bluetooth@0.0.20:
- resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
- dev: true
-
- /@vitejs/plugin-vue@5.0.3(vite@5.0.12)(vue@3.4.19):
- resolution: {integrity: sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==}
- engines: {node: ^18.0.0 || >=20.0.0}
- peerDependencies:
- vite: ^5.0.0
- vue: ^3.2.25
- dependencies:
- vite: 5.0.12
- vue: 3.4.19
- dev: true
-
- /@vue/compiler-core@3.4.19:
- resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==}
- dependencies:
- '@babel/parser': 7.23.9
- '@vue/shared': 3.4.19
- entities: 4.5.0
- estree-walker: 2.0.2
- source-map-js: 1.0.2
- dev: true
-
- /@vue/compiler-dom@3.4.19:
- resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==}
- dependencies:
- '@vue/compiler-core': 3.4.19
- '@vue/shared': 3.4.19
- dev: true
-
- /@vue/compiler-sfc@3.4.19:
- resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==}
- dependencies:
- '@babel/parser': 7.23.9
- '@vue/compiler-core': 3.4.19
- '@vue/compiler-dom': 3.4.19
- '@vue/compiler-ssr': 3.4.19
- '@vue/shared': 3.4.19
- estree-walker: 2.0.2
- magic-string: 0.30.7
- postcss: 8.4.33
- source-map-js: 1.0.2
- dev: true
-
- /@vue/compiler-ssr@3.4.19:
- resolution: {integrity: sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==}
- dependencies:
- '@vue/compiler-dom': 3.4.19
- '@vue/shared': 3.4.19
- dev: true
-
- /@vue/devtools-api@7.0.14:
- resolution: {integrity: sha512-TluWR9qZ6aO11bwtYK8+fzXxBqLfsE0mWZz1q/EQBmO9k82Cm6deieLwNNXjNFJz7xutazoia5Qa+zTYkPPOfw==}
- dependencies:
- '@vue/devtools-kit': 7.0.14
- dev: true
-
- /@vue/devtools-kit@7.0.14:
- resolution: {integrity: sha512-wAAJazr4hI0aVRpgWOCVPw+NzMQdthhnprHHIg4njp1MkKrpCNGQ7MtQbZF1AltAA7xpMCGyyt+0kYH0FqTiPg==}
- dependencies:
- '@vue/devtools-schema': 7.0.14
- '@vue/devtools-shared': 7.0.14
- hookable: 5.5.3
- mitt: 3.0.1
- perfect-debounce: 1.0.0
- speakingurl: 14.0.1
- dev: true
-
- /@vue/devtools-schema@7.0.14:
- resolution: {integrity: sha512-tpUeCLVrdHX+KzWMLTAwx/vAPFbo6jAUi7sr6Q+0mBIqIVSSIxNr5wEhegiFvYva+OtDeM2OrT+f7/X/5bvZNg==}
- dev: true
-
- /@vue/devtools-shared@7.0.14:
- resolution: {integrity: sha512-79RP1NDakBVWou9rDpVnT1WMjTbL1lJKm6YEOodjQ0dq5ehf0wsRbeYDhgAlnjehWRzTq5GAYFBFUPYBs0/QpA==}
- dependencies:
- rfdc: 1.3.1
- dev: true
-
- /@vue/reactivity@3.4.19:
- resolution: {integrity: sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==}
- dependencies:
- '@vue/shared': 3.4.19
- dev: true
-
- /@vue/runtime-core@3.4.19:
- resolution: {integrity: sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==}
- dependencies:
- '@vue/reactivity': 3.4.19
- '@vue/shared': 3.4.19
- dev: true
-
- /@vue/runtime-dom@3.4.19:
- resolution: {integrity: sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==}
- dependencies:
- '@vue/runtime-core': 3.4.19
- '@vue/shared': 3.4.19
- csstype: 3.1.3
- dev: true
-
- /@vue/server-renderer@3.4.19(vue@3.4.19):
- resolution: {integrity: sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==}
- peerDependencies:
- vue: 3.4.19
- dependencies:
- '@vue/compiler-ssr': 3.4.19
- '@vue/shared': 3.4.19
- vue: 3.4.19
- dev: true
-
- /@vue/shared@3.4.19:
- resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==}
- dev: true
-
- /@vueuse/core@10.7.2(vue@3.4.19):
- resolution: {integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==}
- dependencies:
- '@types/web-bluetooth': 0.0.20
- '@vueuse/metadata': 10.7.2
- '@vueuse/shared': 10.7.2(vue@3.4.19)
- vue-demi: 0.14.6(vue@3.4.19)
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
- dev: true
-
- /@vueuse/integrations@10.7.2(focus-trap@7.5.4)(vue@3.4.19):
- resolution: {integrity: sha512-+u3RLPFedjASs5EKPc69Ge49WNgqeMfSxFn+qrQTzblPXZg6+EFzhjarS5edj2qAf6xQ93f95TUxRwKStXj/sQ==}
- peerDependencies:
- async-validator: '*'
- axios: '*'
- change-case: '*'
- drauu: '*'
- focus-trap: '*'
- fuse.js: '*'
- idb-keyval: '*'
- jwt-decode: '*'
- nprogress: '*'
- qrcode: '*'
- sortablejs: '*'
- universal-cookie: '*'
- peerDependenciesMeta:
- async-validator:
- optional: true
- axios:
- optional: true
- change-case:
- optional: true
- drauu:
- optional: true
- focus-trap:
- optional: true
- fuse.js:
- optional: true
- idb-keyval:
- optional: true
- jwt-decode:
- optional: true
- nprogress:
- optional: true
- qrcode:
- optional: true
- sortablejs:
- optional: true
- universal-cookie:
- optional: true
- dependencies:
- '@vueuse/core': 10.7.2(vue@3.4.19)
- '@vueuse/shared': 10.7.2(vue@3.4.19)
- focus-trap: 7.5.4
- vue-demi: 0.14.6(vue@3.4.19)
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
- dev: true
-
- /@vueuse/metadata@10.7.2:
- resolution: {integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==}
- dev: true
-
- /@vueuse/shared@10.7.2(vue@3.4.19):
- resolution: {integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==}
- dependencies:
- vue-demi: 0.14.6(vue@3.4.19)
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
- dev: true
-
- /algoliasearch@4.22.1:
- resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==}
- dependencies:
- '@algolia/cache-browser-local-storage': 4.22.1
- '@algolia/cache-common': 4.22.1
- '@algolia/cache-in-memory': 4.22.1
- '@algolia/client-account': 4.22.1
- '@algolia/client-analytics': 4.22.1
- '@algolia/client-common': 4.22.1
- '@algolia/client-personalization': 4.22.1
- '@algolia/client-search': 4.22.1
- '@algolia/logger-common': 4.22.1
- '@algolia/logger-console': 4.22.1
- '@algolia/requester-browser-xhr': 4.22.1
- '@algolia/requester-common': 4.22.1
- '@algolia/requester-node-http': 4.22.1
- '@algolia/transporter': 4.22.1
- dev: true
-
- /argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- dev: true
-
- /csstype@3.1.3:
- resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
- dev: true
-
- /entities@3.0.1:
- resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
- engines: {node: '>=0.12'}
- dev: true
-
- /entities@4.5.0:
- resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
- engines: {node: '>=0.12'}
- dev: true
-
- /esbuild@0.19.11:
- resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.19.11
- '@esbuild/android-arm': 0.19.11
- '@esbuild/android-arm64': 0.19.11
- '@esbuild/android-x64': 0.19.11
- '@esbuild/darwin-arm64': 0.19.11
- '@esbuild/darwin-x64': 0.19.11
- '@esbuild/freebsd-arm64': 0.19.11
- '@esbuild/freebsd-x64': 0.19.11
- '@esbuild/linux-arm': 0.19.11
- '@esbuild/linux-arm64': 0.19.11
- '@esbuild/linux-ia32': 0.19.11
- '@esbuild/linux-loong64': 0.19.11
- '@esbuild/linux-mips64el': 0.19.11
- '@esbuild/linux-ppc64': 0.19.11
- '@esbuild/linux-riscv64': 0.19.11
- '@esbuild/linux-s390x': 0.19.11
- '@esbuild/linux-x64': 0.19.11
- '@esbuild/netbsd-x64': 0.19.11
- '@esbuild/openbsd-x64': 0.19.11
- '@esbuild/sunos-x64': 0.19.11
- '@esbuild/win32-arm64': 0.19.11
- '@esbuild/win32-ia32': 0.19.11
- '@esbuild/win32-x64': 0.19.11
- dev: true
-
- /estree-walker@2.0.2:
- resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
- dev: true
-
- /flexsearch@0.7.43:
- resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==}
- dev: true
-
- /focus-trap@7.5.4:
- resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==}
- dependencies:
- tabbable: 6.2.0
- dev: true
-
- /fsevents@2.3.3:
- resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /glob-to-regexp@0.4.1:
- resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
- dev: true
-
- /hookable@5.5.3:
- resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
- dev: true
-
- /linkify-it@4.0.1:
- resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==}
- dependencies:
- uc.micro: 1.0.6
- dev: true
-
- /magic-string@0.30.7:
- resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==}
- engines: {node: '>=12'}
- dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
- dev: true
-
- /mark.js@8.11.1:
- resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==}
- dev: true
-
- /markdown-it@13.0.2:
- resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==}
- hasBin: true
- dependencies:
- argparse: 2.0.1
- entities: 3.0.1
- linkify-it: 4.0.1
- mdurl: 1.0.1
- uc.micro: 1.0.6
- dev: true
-
- /mdurl@1.0.1:
- resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
- dev: true
-
- /minisearch@6.3.0:
- resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==}
- dev: true
-
- /mitt@3.0.1:
- resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
- dev: true
-
- /nanoid@3.3.7:
- resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
- dev: true
-
- /perfect-debounce@1.0.0:
- resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
- dev: true
-
- /picocolors@1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
- dev: true
-
- /postcss@8.4.33:
- resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==}
- engines: {node: ^10 || ^12 || >=14}
- dependencies:
- nanoid: 3.3.7
- picocolors: 1.0.0
- source-map-js: 1.0.2
- dev: true
-
- /preact@10.19.3:
- resolution: {integrity: sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==}
- dev: true
-
- /rfdc@1.3.1:
- resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==}
- dev: true
-
- /rollup@4.9.5:
- resolution: {integrity: sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
- dependencies:
- '@types/estree': 1.0.5
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.9.5
- '@rollup/rollup-android-arm64': 4.9.5
- '@rollup/rollup-darwin-arm64': 4.9.5
- '@rollup/rollup-darwin-x64': 4.9.5
- '@rollup/rollup-linux-arm-gnueabihf': 4.9.5
- '@rollup/rollup-linux-arm64-gnu': 4.9.5
- '@rollup/rollup-linux-arm64-musl': 4.9.5
- '@rollup/rollup-linux-riscv64-gnu': 4.9.5
- '@rollup/rollup-linux-x64-gnu': 4.9.5
- '@rollup/rollup-linux-x64-musl': 4.9.5
- '@rollup/rollup-win32-arm64-msvc': 4.9.5
- '@rollup/rollup-win32-ia32-msvc': 4.9.5
- '@rollup/rollup-win32-x64-msvc': 4.9.5
- fsevents: 2.3.3
- dev: true
-
- /search-insights@2.13.0:
- resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==}
- dev: true
-
- /shiki@1.1.2:
- resolution: {integrity: sha512-qNzFwTv5uhEDNUIwp7wHjsrffVeLbmOgWnM5mZZhoiz7G2qAUvqVfUzuWfieD45/YAKipzCtdV9SndacKtABow==}
- dependencies:
- '@shikijs/core': 1.1.2
- dev: true
-
- /source-map-js@1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /speakingurl@14.0.1:
- resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /tabbable@6.2.0:
- resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
- dev: true
-
- /to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
- dev: true
-
- /uc.micro@1.0.6:
- resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
- dev: true
-
- /vite@5.0.12:
- resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- dependencies:
- esbuild: 0.19.11
- postcss: 8.4.33
- rollup: 4.9.5
- optionalDependencies:
- fsevents: 2.3.3
- dev: true
-
- /vitepress-plugin-search@1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.0.0-rc.42)(vue@3.4.19):
- resolution: {integrity: sha512-IAOEJu+kjVY+0pb6/PeRjIbr175HFFbnMdLmLjqcy7VWxkabIRZbLoQL1VUYDZl804o/Or+GaX02gsiMOnVxFA==}
- engines: {node: ^14.13.1 || ^16.7.0 || >=18}
- peerDependencies:
- flexsearch: ^0.7.31
- vitepress: ^1.0.0-rc.35
- vue: '3'
- dependencies:
- '@types/flexsearch': 0.7.6
- '@types/markdown-it': 12.2.3
- flexsearch: 0.7.43
- glob-to-regexp: 0.4.1
- markdown-it: 13.0.2
- vitepress: 1.0.0-rc.42(@algolia/client-search@4.22.1)(search-insights@2.13.0)
- vue: 3.4.19
- dev: true
-
- /vitepress@1.0.0-rc.42(@algolia/client-search@4.22.1)(search-insights@2.13.0):
- resolution: {integrity: sha512-VeiVVXFblt/sjruFSJBNChMWwlztMrRMe8UXdNpf4e05mKtTYEY38MF5qoP90KxPTCfMQiKqwEGwXAGuOTK8HQ==}
- hasBin: true
- peerDependencies:
- markdown-it-mathjax3: ^4.3.2
- postcss: ^8.4.34
- peerDependenciesMeta:
- markdown-it-mathjax3:
- optional: true
- postcss:
- optional: true
- dependencies:
- '@docsearch/css': 3.5.2
- '@docsearch/js': 3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0)
- '@shikijs/core': 1.1.2
- '@shikijs/transformers': 1.1.2
- '@types/markdown-it': 13.0.7
- '@vitejs/plugin-vue': 5.0.3(vite@5.0.12)(vue@3.4.19)
- '@vue/devtools-api': 7.0.14
- '@vueuse/core': 10.7.2(vue@3.4.19)
- '@vueuse/integrations': 10.7.2(focus-trap@7.5.4)(vue@3.4.19)
- focus-trap: 7.5.4
- mark.js: 8.11.1
- minisearch: 6.3.0
- shiki: 1.1.2
- vite: 5.0.12
- vue: 3.4.19
- transitivePeerDependencies:
- - '@algolia/client-search'
- - '@types/node'
- - '@types/react'
- - '@vue/composition-api'
- - async-validator
- - axios
- - change-case
- - drauu
- - fuse.js
- - idb-keyval
- - jwt-decode
- - less
- - lightningcss
- - nprogress
- - qrcode
- - react
- - react-dom
- - sass
- - search-insights
- - sortablejs
- - stylus
- - sugarss
- - terser
- - typescript
- - universal-cookie
- dev: true
-
- /vue-demi@0.14.6(vue@3.4.19):
- resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- peerDependencies:
- '@vue/composition-api': ^1.0.0-rc.1
- vue: ^3.0.0-0 || ^2.6.0
- peerDependenciesMeta:
- '@vue/composition-api':
- optional: true
- dependencies:
- vue: 3.4.19
- dev: true
-
- /vue@3.4.19:
- resolution: {integrity: sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@vue/compiler-dom': 3.4.19
- '@vue/compiler-sfc': 3.4.19
- '@vue/runtime-dom': 3.4.19
- '@vue/server-renderer': 3.4.19(vue@3.4.19)
- '@vue/shared': 3.4.19
- dev: true
diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml
deleted file mode 100644
index e69de29..0000000
diff --git a/docs/vitepress_docs/.vitepress/config.ts b/docs/vitepress_docs/.vitepress/config.ts
deleted file mode 100644
index d82218a..0000000
--- a/docs/vitepress_docs/.vitepress/config.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { defineConfig } from "vitepress";
-import { SearchPlugin } from "vitepress-plugin-search";
-// https://vitepress.dev/reference/site-config
-export default defineConfig({
- title: "Solid-CLI Docs",
- description: "Documentation for the Solid CLI",
- themeConfig: {
- // https://vitepress.dev/reference/default-theme-config
- nav: [
- { text: "Home", link: "/" },
- { text: "Guide", link: "/about" },
- ],
-
- sidebar: [
- {
- text: "Getting started",
- items: [
- { text: "About", link: "/about" },
- { text: "Installation", link: "/installation" },
- { text: "Basic Commands", link: "/basic-commands" },
- { text: "Solid-Start Commands", link: "/start-commands" },
- ],
- },
- { text: "Supported Integrations", link: "/supported-integrations" },
- ],
- socialLinks: [
- {
- icon: "github",
- link: "https://github.com/solidjs-community/solid-cli",
- },
- ],
- },
- vite: { plugins: [SearchPlugin()] },
-});
diff --git a/docs/vitepress_docs/.vitepress/theme/index.ts b/docs/vitepress_docs/.vitepress/theme/index.ts
deleted file mode 100644
index 09d0a1a..0000000
--- a/docs/vitepress_docs/.vitepress/theme/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-// https://vitepress.dev/guide/custom-theme
-import { h } from "vue";
-import Theme from "vitepress/theme";
-import "./style.css";
-
-export default {
- extends: Theme,
- Layout: () => {
- return h(Theme.Layout, null, {
- // https://vitepress.dev/guide/extending-default-theme#layout-slots
- });
- },
- enhanceApp({ app, router, siteData }) {
- // ...
- },
-};
diff --git a/docs/vitepress_docs/.vitepress/theme/style.css b/docs/vitepress_docs/.vitepress/theme/style.css
deleted file mode 100644
index bab0266..0000000
--- a/docs/vitepress_docs/.vitepress/theme/style.css
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Customize default theme styling by overriding CSS variables:
- * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css
- */
-
-/**
- * Colors
- * -------------------------------------------------------------------------- */
-
-:root {
- --vp-c-brand: #646cff;
- --vp-c-brand-light: #747bff;
- --vp-c-brand-lighter: #9499ff;
- --vp-c-brand-lightest: #bcc0ff;
- --vp-c-brand-dark: #535bf2;
- --vp-c-brand-darker: #454ce1;
- --vp-c-brand-dimm: rgba(100, 108, 255, 0.08);
-}
-
-/**
- * Component: Button
- * -------------------------------------------------------------------------- */
-
-:root {
- --vp-button-brand-border: var(--vp-c-brand-light);
- --vp-button-brand-text: var(--vp-c-white);
- --vp-button-brand-bg: var(--vp-c-brand);
- --vp-button-brand-hover-border: var(--vp-c-brand-light);
- --vp-button-brand-hover-text: var(--vp-c-white);
- --vp-button-brand-hover-bg: var(--vp-c-brand-light);
- --vp-button-brand-active-border: var(--vp-c-brand-light);
- --vp-button-brand-active-text: var(--vp-c-white);
- --vp-button-brand-active-bg: var(--vp-button-brand-bg);
-}
-
-/**
- * Component: Home
- * -------------------------------------------------------------------------- */
-
-:root {
- --vp-home-hero-name-color: transparent;
- --vp-home-hero-name-background: -webkit-linear-gradient(120deg, #bd34fe 30%, #41d1ff);
-
- --vp-home-hero-image-background-image: linear-gradient(-45deg, #bd34fe 50%, #47caff 50%);
- --vp-home-hero-image-filter: blur(40px);
-}
-
-@media (min-width: 640px) {
- :root {
- --vp-home-hero-image-filter: blur(56px);
- }
-}
-
-@media (min-width: 960px) {
- :root {
- --vp-home-hero-image-filter: blur(72px);
- }
-}
-
-/**
- * Component: Custom Block
- * -------------------------------------------------------------------------- */
-
-:root {
- --vp-custom-block-tip-border: var(--vp-c-brand);
- --vp-custom-block-tip-text: var(--vp-c-brand-darker);
- --vp-custom-block-tip-bg: var(--vp-c-brand-dimm);
-}
-
-.dark {
- --vp-custom-block-tip-border: var(--vp-c-brand);
- --vp-custom-block-tip-text: var(--vp-c-brand-lightest);
- --vp-custom-block-tip-bg: var(--vp-c-brand-dimm);
-}
-
-/**
- * Component: Algolia
- * -------------------------------------------------------------------------- */
-
-.DocSearch {
- --docsearch-primary-color: var(--vp-c-brand) !important;
-}
diff --git a/docs/vitepress_docs/about.md b/docs/vitepress_docs/about.md
deleted file mode 100644
index 504eb5c..0000000
--- a/docs/vitepress_docs/about.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# About
-
-The Solid CLI is a tool aiming to make the Solid development experience easier, faster, and less error prone.
-
-## Features
-
-### Automatic Config manipulation
-
-Can automatically update your config to enable solid features, such as toggling SSR, or adding adapters.
-
-### Adding integrations
-
-Can automatically install and configure supported packages.
-
-### Project creation
-
-Provides an easy way to create new projects, whether that be locally, or on a platform such as stackblitz or codesandbox.
diff --git a/docs/vitepress_docs/basic-commands.md b/docs/vitepress_docs/basic-commands.md
deleted file mode 100644
index 8fe045c..0000000
--- a/docs/vitepress_docs/basic-commands.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# Basic Commands
-
-### `Add`
-
-```sh
-solid add
-```
-
-Used to add packages and setup integrations.
-
-::: info
-By default, when no arguments or flags are passed, this command will open up a searchable multiselect for you to be able to search through
-all supported integrations and packages. You can select the ones you want to use through there.
-:::
-
-**Options**
-
-| Option | Description |
-| --------------- | ------------------------------------------------------------------------------------------------------ |
-| `` | List of integrations you want to add to your project (ie. unocss, vitepwa, solid-devtools) |
-| `--force` | Force apply any changes to the config to add the integration(s) even if they already exist `(boolean)` |
-
----
-
-### `New`
-
-```sh
-solid new
-```
-
-Creates a new solid project with the selected variation and name.
-
-This can also be used to spin up a new stackblitz or codesandbox instance.
-
-**Options**
-
-| Option | Description |
-| -------------------------- | ------------------------------------------------------------------------------------------- |
-| `` | The variation you want to start the project from. One of the following: "bare", "js", "ts". |
-| `` | The name of the project and the folder to create it in. |
-| `--stackblitz (short: -s)` | Create the project with the variation in a stackblitz instance. `(boolean)` |
-
----
-
-### `Docs`
-
-```sh
-solid docs
-```
-
-Searches for a given keyword within the main solid documentation sites
-
-**Options**
-
-| Option | Description |
-| ----------- | ---------------------------------------------- |
-| `` | The keyword to search within the docs websites |
-
----
-
-### `Set`
-
-```sh
-solid set
-```
-
-Sets a specified config parameter to a specified value
-
-**Options**
-
-| Option | Description |
-| --------- | -------------------------------- |
-| `` | The key within the config to set |
-| `` | The value to set that key to |
-
----
-
-### `Playground`
-
-```sh
-solid playground
-```
-
-Attempts to open the [Solid Playground](https://playground.solidjs.com) in the browser
diff --git a/docs/vitepress_docs/index.md b/docs/vitepress_docs/index.md
deleted file mode 100644
index 551ee49..0000000
--- a/docs/vitepress_docs/index.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-# https://vitepress.dev/reference/default-theme-home-page
-layout: home
-
-hero:
- name: "Solid-CLI Docs"
- text: "Documentation for the Solid CLI"
- tagline: A solid cli
- actions:
- - theme: brand
- text: Get started
- link: /about
-features:
- - title: Package manager
- icon: 📦
- details: Installs solid related packages, and automatically configures them in your project.
- - title: Customisable
- details: Plugins can be used to extend or manipulate existing functionality
- icon: 🎨
- - title: Automatic configuration
- icon: ♻
- details: Can automatically enable or disable features within solid, such as automatically enabling SSR
----
diff --git a/docs/vitepress_docs/installation.md b/docs/vitepress_docs/installation.md
deleted file mode 100644
index 58474ed..0000000
--- a/docs/vitepress_docs/installation.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Installation
-
-The CLI can be installed locally to your project via
-
-```sh
-npm install @solid-cli/core
-```
-
-Or installed globally:
-### UNIX/MacOS/Linux
-
-In order to install global packages on Unix based systems you will need to grant npm special system permissions using the `sudo` command, suffixed by the command you would like to run.
-
-```sh
-sudo npm install -g @solid-cli/core
-```
-
-### Windows
-
-```sh
-npm install -g @solid-cli/core
-```
-
-It can then be invoked via the keyword `solid`, and the help page can be displayed with `solid --help`
-
-```txt
-┌ Solid-CLI
-solid
-
-where can be one of:
-
-- add - Can add and install integrations: `solid add unocss`.
-- docs
-- new - Creates a new solid project
-- set
-- start - Commands specific to solid start
-- playground
-
-For more help, try running `solid --help`
-```
diff --git a/docs/vitepress_docs/start-commands.md b/docs/vitepress_docs/start-commands.md
deleted file mode 100644
index 2ffa10d..0000000
--- a/docs/vitepress_docs/start-commands.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# Solid-Start Commands
-
-### `Mode`
-
-```sh
-solid start mode
-```
-
-Set the rendering mode for solid to build for and use (ie. Client-Side Rendering (CSR), Server-Side Rendering (SSR), Static-Site Generation (SSG))
-
-**Options**
-
-| Option | Description |
-| -------- | -------------------------------------------------------------- |
-| `` | The rendering mode to use. One of the following: csr, ssr, ssg |
-
----
-
-### `Route`
-
-```sh
-solid start route
-```
-
-Creates a new route file in the file routes directory.
-
-**Options**
-
-| Option | Description |
-| -------- | ------------------------------------------- |
-| `` | The path to the new route |
-| `` | The name of the `.tsx` file to be generated |
-
----
-
-### `Adapter`
-
-```sh
-solid start adapter
-```
-
-Used to setup a Solid-Start specific adapter.
-
-**Options**
-
-| Option | Description |
-| --------- | -------------------------------- |
-| `` | The name of the adapter `string` |
-| `--force` | Force setup the adapater |
-
-### `Data`
-
-```sh
-solid start data
-```
-
-Creates a new data file at the given path
-
-**Options**
-
-| Option | Description |
-| -------- | ----------------------------------------------- |
-| `` | The path to the new data file |
-| `` | The name of the `.data.ts` file to be generated |
diff --git a/docs/vitepress_docs/supported-integrations.md b/docs/vitepress_docs/supported-integrations.md
deleted file mode 100644
index 934ee99..0000000
--- a/docs/vitepress_docs/supported-integrations.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Supported Integrations
-
-## Adapters
-
-- [AWS](https://github.com/solidjs/solid-start/tree/main/packages/start-aws)
-- [Cloudflare-pages](https://github.com/solidjs/solid-start/tree/main/packages/start-cloudflare-pages)
-- [Cloudflare-workers](https://github.com/solidjs/solid-start/tree/main/packages/start-cloudflare-workers)
-- [Deno](https://github.com/solidjs/solid-start/tree/main/packages/start-deno)
-- [Netlify](https://github.com/solidjs/solid-start/tree/main/packages/start-netlify)
-- [Node](https://github.com/solidjs/solid-start/tree/main/packages/start-node)
-- [Static](https://github.com/solidjs/solid-start/tree/main/packages/start-static)
-- [Vercel](https://github.com/solidjs/solid-start/tree/main/packages/start-vercel)
-
-## Packages
-
-These packages will be automatically installed and configured with sensible defaults:
-
-- [UnoCSS](https://unocss.dev/)
-- [Tailwind CSS](https://tailwindcss.com/)
-- [Solid Devtools](https://github.com/thetarnav/solid-devtools)
-- [VitePWA](https://vite-pwa-org.netlify.app)
diff --git a/examples/README.md b/examples/README.md
deleted file mode 100644
index bde8a57..0000000
--- a/examples/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# Example plugins for the CLI
diff --git a/examples/plugin_template/package.json b/examples/plugin_template/package.json
deleted file mode 100644
index 4f9cffc..0000000
--- a/examples/plugin_template/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "test_plugin",
- "version": "1.0.0",
- "description": "",
- "module": "./dist/index.mjs",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "build": "tsup"
- },
- "keywords": [],
- "author": "",
- "license": "ISC",
- "dependencies": {
- "cmd-ts": "^0.13.0"
- },
- "devDependencies": {
- "tsup": "^7.2.0"
- }
-}
diff --git a/examples/plugin_template/pnpm-lock.yaml b/examples/plugin_template/pnpm-lock.yaml
deleted file mode 100644
index b437238..0000000
--- a/examples/plugin_template/pnpm-lock.yaml
+++ /dev/null
@@ -1,930 +0,0 @@
-lockfileVersion: '6.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-dependencies:
- cmd-ts:
- specifier: ^0.13.0
- version: 0.13.0
-
-devDependencies:
- tsup:
- specifier: ^7.2.0
- version: 7.2.0
-
-packages:
-
- /@esbuild/android-arm64@0.18.19:
- resolution: {integrity: sha512-4+jkUFQxZkQfQOOxfGVZB38YUWHMJX2ihZwF+2nh8m7bHdWXpixiurgGRN3c/KMSwlltbYI0/i929jwBRMFzbA==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/android-arm@0.18.19:
- resolution: {integrity: sha512-1uOoDurJYh5MNqPqpj3l/TQCI1V25BXgChEldCB7D6iryBYqYKrbZIhYO5AI9fulf66sM8UJpc3UcCly2Tv28w==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/android-x64@0.18.19:
- resolution: {integrity: sha512-ae5sHYiP/Ogj2YNrLZbWkBmyHIDOhPgpkGvFnke7XFGQldBDWvc/AyYwSLpNuKw9UNkgnLlB/jPpnBmlF3G9Bg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/darwin-arm64@0.18.19:
- resolution: {integrity: sha512-HIpQvNQWFYROmWDANMRL+jZvvTQGOiTuwWBIuAsMaQrnStedM+nEKJBzKQ6bfT9RFKH2wZ+ej+DY7+9xHBTFPg==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/darwin-x64@0.18.19:
- resolution: {integrity: sha512-m6JdvXJQt0thNLIcWOeG079h2ivhYH4B5sVCgqb/B29zTcFd7EE8/J1nIUHhdtwGeItdUeqKaqqb4towwxvglQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/freebsd-arm64@0.18.19:
- resolution: {integrity: sha512-G0p4EFMPZhGn/xVNspUyMQbORH3nlKTV0bFNHPIwLraBuAkTeMyxNviTe0ZXUbIXQrR1lrwniFjNFU4s+x7veQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/freebsd-x64@0.18.19:
- resolution: {integrity: sha512-hBxgRlG42+W+j/1/cvlnSa+3+OBKeDCyO7OG2ICya1YJaSCYfSpuG30KfOnQHI7Ytgu4bRqCgrYXxQEzy0zM5Q==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-arm64@0.18.19:
- resolution: {integrity: sha512-X8g33tczY0GsJq3lhyBrjnFtaKjWVpp1gMq5IlF9BQJ3TUfSK74nQnz9mRIEejmcV+OIYn6bkOJeUaU1Knrljg==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-arm@0.18.19:
- resolution: {integrity: sha512-qtWyoQskfJlb9MD45mvzCEKeO4uCnDZ7lPFeNqbfaaJHqBiH9qA5Vu2EuckqYZuFMJWy1l4dxTf9NOulCVfUjg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-ia32@0.18.19:
- resolution: {integrity: sha512-SAkRWJgb+KN+gOhmbiE6/wu23D6HRcGQi15cB13IVtBZZgXxygTV5GJlUAKLQ5Gcx0gtlmt+XIxEmSqA6sZTOw==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-loong64@0.18.19:
- resolution: {integrity: sha512-YLAslaO8NsB9UOxBchos82AOMRDbIAWChwDKfjlGrHSzS3v1kxce7dGlSTsrb0PJwo1KYccypN3VNjQVLtz7LA==}
- engines: {node: '>=12'}
- cpu: [loong64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-mips64el@0.18.19:
- resolution: {integrity: sha512-vSYFtlYds/oTI8aflEP65xo3MXChMwBOG1eWPGGKs/ev9zkTeXVvciU+nifq8J1JYMz+eQ4J9JDN0O2RKF8+1Q==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-ppc64@0.18.19:
- resolution: {integrity: sha512-tgG41lRVwlzqO9tv9l7aXYVw35BxKXLtPam1qALScwSqPivI8hjkZLNH0deaaSCYCFT9cBIdB+hUjWFlFFLL9A==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-riscv64@0.18.19:
- resolution: {integrity: sha512-EgBZFLoN1S5RuB4cCJI31pBPsjE1nZ+3+fHRjguq9Ibrzo29bOLSBcH1KZJvRNh5qtd+fcYIGiIUia8Jw5r1lQ==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-s390x@0.18.19:
- resolution: {integrity: sha512-q1V1rtHRojAzjSigZEqrcLkpfh5K09ShCoIsdTakozVBnM5rgV58PLFticqDp5UJ9uE0HScov9QNbbl8HBo6QQ==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/linux-x64@0.18.19:
- resolution: {integrity: sha512-D0IiYjpZRXxGZLQfsydeAD7ZWqdGyFLBj5f2UshJpy09WPs3qizDCsEr8zyzcym6Woj/UI9ZzMIXwvoXVtyt0A==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/netbsd-x64@0.18.19:
- resolution: {integrity: sha512-3tt3SOS8L3D54R8oER41UdDshlBIAjYhdWRPiZCTZ1E41+shIZBpTjaW5UaN/jD1ENE/Ok5lkeqhoNMbxstyxw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/openbsd-x64@0.18.19:
- resolution: {integrity: sha512-MxbhcuAYQPlfln1EMc4T26OUoeg/YQc6wNoEV8xvktDKZhLtBxjkoeESSo9BbPaGKhAPzusXYj5n8n5A8iZSrA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/sunos-x64@0.18.19:
- resolution: {integrity: sha512-m0/UOq1wj25JpWqOJxoWBRM9VWc3c32xiNzd+ERlYstUZ6uwx5SZsQUtkiFHaYmcaoj+f6+Tfcl7atuAz3idwQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/win32-arm64@0.18.19:
- resolution: {integrity: sha512-L4vb6pcoB1cEcXUHU6EPnUhUc4+/tcz4OqlXTWPcSQWxegfmcOprhmIleKKwmMNQVc4wrx/+jB7tGkjjDmiupg==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/win32-ia32@0.18.19:
- resolution: {integrity: sha512-rQng7LXSKdrDlNDb7/v0fujob6X0GAazoK/IPd9C3oShr642ri8uIBkgM37/l8B3Rd5sBQcqUXoDdEy75XC/jg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@esbuild/win32-x64@0.18.19:
- resolution: {integrity: sha512-z69jhyG20Gq4QL5JKPLqUT+eREuqnDAFItLbza4JCmpvUnIlY73YNjd5djlO7kBiiZnvTnJuAbOjIoZIOa1GjA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@jridgewell/gen-mapping@0.3.3:
- resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
- engines: {node: '>=6.0.0'}
- dependencies:
- '@jridgewell/set-array': 1.1.2
- '@jridgewell/sourcemap-codec': 1.4.15
- '@jridgewell/trace-mapping': 0.3.18
- dev: true
-
- /@jridgewell/resolve-uri@3.1.0:
- resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
- engines: {node: '>=6.0.0'}
- dev: true
-
- /@jridgewell/set-array@1.1.2:
- resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
- engines: {node: '>=6.0.0'}
- dev: true
-
- /@jridgewell/sourcemap-codec@1.4.14:
- resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
- dev: true
-
- /@jridgewell/sourcemap-codec@1.4.15:
- resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
- dev: true
-
- /@jridgewell/trace-mapping@0.3.18:
- resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
- dependencies:
- '@jridgewell/resolve-uri': 3.1.0
- '@jridgewell/sourcemap-codec': 1.4.14
- dev: true
-
- /@nodelib/fs.scandir@2.1.5:
- resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
- engines: {node: '>= 8'}
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- run-parallel: 1.2.0
- dev: true
-
- /@nodelib/fs.stat@2.0.5:
- resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
- engines: {node: '>= 8'}
- dev: true
-
- /@nodelib/fs.walk@1.2.8:
- resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
- engines: {node: '>= 8'}
- dependencies:
- '@nodelib/fs.scandir': 2.1.5
- fastq: 1.15.0
- dev: true
-
- /ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
- dev: false
-
- /ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
- dependencies:
- color-convert: 2.0.1
- dev: false
-
- /any-promise@1.3.0:
- resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
- dev: true
-
- /anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
- dev: true
-
- /array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
- dev: true
-
- /balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- dev: true
-
- /binary-extensions@2.2.0:
- resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
- engines: {node: '>=8'}
- dev: true
-
- /brace-expansion@1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
- dev: true
-
- /braces@3.0.2:
- resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
- engines: {node: '>=8'}
- dependencies:
- fill-range: 7.0.1
- dev: true
-
- /bundle-require@4.0.1(esbuild@0.18.19):
- resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- peerDependencies:
- esbuild: '>=0.17'
- dependencies:
- esbuild: 0.18.19
- load-tsconfig: 0.2.5
- dev: true
-
- /cac@6.7.14:
- resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
- engines: {node: '>=8'}
- dev: true
-
- /chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
- dev: false
-
- /chokidar@3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
- engines: {node: '>= 8.10.0'}
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.2
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
- /cmd-ts@0.13.0:
- resolution: {integrity: sha512-nsnxf6wNIM/JAS7T/x/1JmbEsjH0a8tezXqqpaL0O6+eV0/aDEnRxwjxpu0VzDdRcaC1ixGSbRlUuf/IU59I4g==}
- dependencies:
- chalk: 4.1.2
- debug: 4.3.4
- didyoumean: 1.2.2
- strip-ansi: 6.0.1
- transitivePeerDependencies:
- - supports-color
- dev: false
-
- /color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
- dependencies:
- color-name: 1.1.4
- dev: false
-
- /color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- dev: false
-
- /commander@4.1.1:
- resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
- engines: {node: '>= 6'}
- dev: true
-
- /concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- dev: true
-
- /cross-spawn@7.0.3:
- resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
- engines: {node: '>= 8'}
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
- dev: true
-
- /debug@4.3.4:
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
- dependencies:
- ms: 2.1.2
-
- /didyoumean@1.2.2:
- resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
- dev: false
-
- /dir-glob@3.0.1:
- resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
- engines: {node: '>=8'}
- dependencies:
- path-type: 4.0.0
- dev: true
-
- /esbuild@0.18.19:
- resolution: {integrity: sha512-ra3CaIKCzJp5bU5BDfrCc0FRqKj71fQi+gbld0aj6lN0ifuX2fWJYPgLVLGwPfA+ruKna+OWwOvf/yHj6n+i0g==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- '@esbuild/android-arm': 0.18.19
- '@esbuild/android-arm64': 0.18.19
- '@esbuild/android-x64': 0.18.19
- '@esbuild/darwin-arm64': 0.18.19
- '@esbuild/darwin-x64': 0.18.19
- '@esbuild/freebsd-arm64': 0.18.19
- '@esbuild/freebsd-x64': 0.18.19
- '@esbuild/linux-arm': 0.18.19
- '@esbuild/linux-arm64': 0.18.19
- '@esbuild/linux-ia32': 0.18.19
- '@esbuild/linux-loong64': 0.18.19
- '@esbuild/linux-mips64el': 0.18.19
- '@esbuild/linux-ppc64': 0.18.19
- '@esbuild/linux-riscv64': 0.18.19
- '@esbuild/linux-s390x': 0.18.19
- '@esbuild/linux-x64': 0.18.19
- '@esbuild/netbsd-x64': 0.18.19
- '@esbuild/openbsd-x64': 0.18.19
- '@esbuild/sunos-x64': 0.18.19
- '@esbuild/win32-arm64': 0.18.19
- '@esbuild/win32-ia32': 0.18.19
- '@esbuild/win32-x64': 0.18.19
- dev: true
-
- /execa@5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 6.0.1
- human-signals: 2.1.0
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
- dev: true
-
- /fast-glob@3.3.1:
- resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
- engines: {node: '>=8.6.0'}
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.5
- dev: true
-
- /fastq@1.15.0:
- resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
- dependencies:
- reusify: 1.0.4
- dev: true
-
- /fill-range@7.0.1:
- resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
- engines: {node: '>=8'}
- dependencies:
- to-regex-range: 5.0.1
- dev: true
-
- /fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
- dev: true
-
- /fsevents@2.3.2:
- resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /get-stream@6.0.1:
- resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
- engines: {node: '>=10'}
- dev: true
-
- /glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
- dependencies:
- is-glob: 4.0.3
- dev: true
-
- /glob@7.1.6:
- resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
- dev: true
-
- /globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
- dependencies:
- array-union: 2.1.0
- dir-glob: 3.0.1
- fast-glob: 3.3.1
- ignore: 5.2.4
- merge2: 1.4.1
- slash: 3.0.0
- dev: true
-
- /has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
- dev: false
-
- /human-signals@2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
- dev: true
-
- /ignore@5.2.4:
- resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
- engines: {node: '>= 4'}
- dev: true
-
- /inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
- dev: true
-
- /inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- dev: true
-
- /is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
- dependencies:
- binary-extensions: 2.2.0
- dev: true
-
- /is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
- dependencies:
- is-extglob: 2.1.1
- dev: true
-
- /is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
- dev: true
-
- /is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
- dev: true
-
- /isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- dev: true
-
- /joycon@3.1.1:
- resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
- engines: {node: '>=10'}
- dev: true
-
- /lilconfig@2.1.0:
- resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
- engines: {node: '>=10'}
- dev: true
-
- /lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- dev: true
-
- /load-tsconfig@0.2.5:
- resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dev: true
-
- /lodash.sortby@4.7.0:
- resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
- dev: true
-
- /merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
- dev: true
-
- /merge2@1.4.1:
- resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
- engines: {node: '>= 8'}
- dev: true
-
- /micromatch@4.0.5:
- resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
- engines: {node: '>=8.6'}
- dependencies:
- braces: 3.0.2
- picomatch: 2.3.1
- dev: true
-
- /mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
- dev: true
-
- /minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
- dependencies:
- brace-expansion: 1.1.11
- dev: true
-
- /ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
- /mz@2.7.0:
- resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
- dependencies:
- any-promise: 1.3.0
- object-assign: 4.1.1
- thenify-all: 1.6.0
- dev: true
-
- /normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /npm-run-path@4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
- engines: {node: '>=8'}
- dependencies:
- path-key: 3.1.1
- dev: true
-
- /object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
- dependencies:
- wrappy: 1.0.2
- dev: true
-
- /onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
- dependencies:
- mimic-fn: 2.1.0
- dev: true
-
- /path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
- dev: true
-
- /path-type@4.0.0:
- resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
- engines: {node: '>=8'}
- dev: true
-
- /picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
- dev: true
-
- /pirates@4.0.6:
- resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
- engines: {node: '>= 6'}
- dev: true
-
- /postcss-load-config@4.0.1:
- resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
- engines: {node: '>= 14'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
- dependencies:
- lilconfig: 2.1.0
- yaml: 2.3.1
- dev: true
-
- /punycode@2.3.0:
- resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
- engines: {node: '>=6'}
- dev: true
-
- /queue-microtask@1.2.3:
- resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- dev: true
-
- /readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
- dependencies:
- picomatch: 2.3.1
- dev: true
-
- /resolve-from@5.0.0:
- resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
- engines: {node: '>=8'}
- dev: true
-
- /reusify@1.0.4:
- resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
- engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
- dev: true
-
- /rollup@3.27.2:
- resolution: {integrity: sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==}
- engines: {node: '>=14.18.0', npm: '>=8.0.0'}
- hasBin: true
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
- /run-parallel@1.2.0:
- resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
- dependencies:
- queue-microtask: 1.2.3
- dev: true
-
- /shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
- dependencies:
- shebang-regex: 3.0.0
- dev: true
-
- /shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
- dev: true
-
- /signal-exit@3.0.7:
- resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
- dev: true
-
- /slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
- dev: true
-
- /source-map@0.8.0-beta.0:
- resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
- engines: {node: '>= 8'}
- dependencies:
- whatwg-url: 7.1.0
- dev: true
-
- /strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
- dependencies:
- ansi-regex: 5.0.1
- dev: false
-
- /strip-final-newline@2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
- dev: true
-
- /sucrase@3.34.0:
- resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==}
- engines: {node: '>=8'}
- hasBin: true
- dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- commander: 4.1.1
- glob: 7.1.6
- lines-and-columns: 1.2.4
- mz: 2.7.0
- pirates: 4.0.6
- ts-interface-checker: 0.1.13
- dev: true
-
- /supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
- dependencies:
- has-flag: 4.0.0
- dev: false
-
- /thenify-all@1.6.0:
- resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
- engines: {node: '>=0.8'}
- dependencies:
- thenify: 3.3.1
- dev: true
-
- /thenify@3.3.1:
- resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
- dependencies:
- any-promise: 1.3.0
- dev: true
-
- /to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
- dependencies:
- is-number: 7.0.0
- dev: true
-
- /tr46@1.0.1:
- resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
- dependencies:
- punycode: 2.3.0
- dev: true
-
- /tree-kill@1.2.2:
- resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
- hasBin: true
- dev: true
-
- /ts-interface-checker@0.1.13:
- resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- dev: true
-
- /tsup@7.2.0:
- resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==}
- engines: {node: '>=16.14'}
- hasBin: true
- peerDependencies:
- '@swc/core': ^1
- postcss: ^8.4.12
- typescript: '>=4.1.0'
- peerDependenciesMeta:
- '@swc/core':
- optional: true
- postcss:
- optional: true
- typescript:
- optional: true
- dependencies:
- bundle-require: 4.0.1(esbuild@0.18.19)
- cac: 6.7.14
- chokidar: 3.5.3
- debug: 4.3.4
- esbuild: 0.18.19
- execa: 5.1.1
- globby: 11.1.0
- joycon: 3.1.1
- postcss-load-config: 4.0.1
- resolve-from: 5.0.0
- rollup: 3.27.2
- source-map: 0.8.0-beta.0
- sucrase: 3.34.0
- tree-kill: 1.2.2
- transitivePeerDependencies:
- - supports-color
- - ts-node
- dev: true
-
- /webidl-conversions@4.0.2:
- resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
- dev: true
-
- /whatwg-url@7.1.0:
- resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
- dependencies:
- lodash.sortby: 4.7.0
- tr46: 1.0.1
- webidl-conversions: 4.0.2
- dev: true
-
- /which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
- dependencies:
- isexe: 2.0.0
- dev: true
-
- /wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- dev: true
-
- /yaml@2.3.1:
- resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
- engines: {node: '>= 14'}
- dev: true
diff --git a/examples/plugin_template/src/index.ts b/examples/plugin_template/src/index.ts
deleted file mode 100644
index dd44b62..0000000
--- a/examples/plugin_template/src/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { command } from "cmd-ts";
-
-export default command({
- name: "custom",
- description: "A completely custom command dynamically imported at runtime!",
- args: {},
- handler() {
- console.log("CUSTOM COMMAND WORKS!!");
- },
-});
diff --git a/examples/plugin_template/tsconfig.json b/examples/plugin_template/tsconfig.json
deleted file mode 100644
index 71dfb43..0000000
--- a/examples/plugin_template/tsconfig.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "compilerOptions": {
- "jsx": "preserve",
- "noEmit": true,
- "module": "ESNext",
- "target": "ESNext",
- "moduleResolution": "node",
- "strict": true,
- "esModuleInterop": true,
- "forceConsistentCasingInFileNames": true,
- "skipLibCheck": true,
- "resolveJsonModule": true
- }
-}
diff --git a/examples/plugin_template/tsup.config.ts b/examples/plugin_template/tsup.config.ts
deleted file mode 100644
index d80d441..0000000
--- a/examples/plugin_template/tsup.config.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineConfig } from "tsup";
-
-export default defineConfig({
- entry: ["src/index.ts"],
- target: "esnext",
- format: "esm",
- splitting: false,
- sourcemap: true,
- clean: true,
-});
diff --git a/package.json b/package.json
index 0bdba7e..d897b76 100644
--- a/package.json
+++ b/package.json
@@ -10,17 +10,14 @@
"url": "https://github.com/solidjs-community/solid-cli"
},
"scripts": {
- "test": "vitest",
+ "test": "vitest run",
"test:all": "turbo run test",
"build": "turbo run build",
"release": "pnpm build && changeset publish",
- "watch:all": "nodemon --no-stdin -q --watch packages/core/src -e ts --exec 'turbo run build --scope=core' --watch packages/reactivity/src -e ts --exec 'turbo run build --scope=reactivity' --watch packages/ui/src -e ts --exec 'turbo run build --scope=ui' --watch packages/utils/src -e ts --exec 'turbo run build --scope=utils'",
- "watch:core": "nodemon --watch packages/core/src -e ts --exec 'turbo run build --scope=core'",
- "watch:reactivity": "nodemon --watch packages/reactivity/src -e ts --exec 'turbo run build --scope=reactivity'",
- "watch:ui": "nodemon --watch packages/ui/src -e ts --exec 'turbo run build --scope=ui'",
- "watch:utils": "nodemon --watch packages/utils/src -e ts --exec 'turbo run build --scope=utils'",
- "start": "cd packages/core && pnpm start",
- "format": "prettier --write ."
+ "start": "pnpm build && cd packages/create-solid && pnpm start",
+ "format": "prettier --write .",
+ "watch:build": "turbo watch build",
+ "update-deps": "ncu -u --packageFile packages/**/package.json"
},
"contributors": [
{
@@ -34,11 +31,14 @@
"./packages/*"
],
"devDependencies": {
- "@changesets/cli": "2.27.1",
- "nodemon": "^3.0.3",
- "prettier": "^3.2.5",
- "turbo": "^1.12.4",
- "vitest": "^1.2.2"
+ "@changesets/cli": "2.31.1",
+ "@types/node": "26.1.1",
+ "jiti": "^2.7.0",
+ "prettier": "^3.9.6",
+ "tsup": "^8.5.1",
+ "turbo": "^2.10.6",
+ "typescript": "^7.0.2",
+ "vitest": "^4.1.10"
},
- "packageManager": "pnpm@8.7.5"
+ "packageManager": "pnpm@11.15.1"
}
diff --git a/packages/commands/.gitignore b/packages/commands/.gitignore
deleted file mode 100644
index fbf0622..0000000
--- a/packages/commands/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-types
\ No newline at end of file
diff --git a/packages/commands/package.json b/packages/commands/package.json
deleted file mode 100644
index 6e8d64c..0000000
--- a/packages/commands/package.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "name": "@solid-cli/commands",
- "version": "0.0.12",
- "description": "The main command handlers for the Solid CLI",
- "license": "MIT",
- "homepage": "https://solid-cli.netlify.app",
- "repository": {
- "type": "git",
- "url": "https://github.com/solidjs-community/solid-cli"
- },
- "files": [
- "dist",
- "types"
- ],
- "main": "./dist/index.mjs",
- "module": "./dist/index.mjs",
- "types": "./types/index.d.ts",
- "exports": {
- ".": {
- "import": "./dist/index.mjs",
- "require": "./dist/index.mjs",
- "types": "./types/index.d.ts"
- },
- "./new": {
- "import": "./dist/handlers/new.mjs",
- "require": "./dist/handlers/new.mjs",
- "types": "./types/handlers/new.d.ts"
- }
- },
- "scripts": {
- "test": "vitest run",
- "build": "tsc && tsup"
- },
- "devDependencies": {
- "@chialab/esbuild-plugin-meta-url": "^0.18.0",
- "@types/node": "^20.11.19",
- "prettier": "^3.2.5",
- "tsup": "^8.0.2",
- "typescript": "^5.3.3"
- },
- "publishConfig": {
- "access": "public"
- },
- "dependencies": {
- "@begit/core": "^0.0.13",
- "@clack/prompts": "0.7.0",
- "@solid-cli/reactivity": "workspace:*",
- "@solid-cli/ui": "workspace:*",
- "@solid-cli/utils": "workspace:*",
- "execa": "^8.0.1",
- "picocolors": "^1.0.0",
- "sucrase": "^3.35.0"
- }
-}
diff --git a/packages/commands/src/handlers/add.ts b/packages/commands/src/handlers/add.ts
deleted file mode 100644
index eafa288..0000000
--- a/packages/commands/src/handlers/add.ts
+++ /dev/null
@@ -1,196 +0,0 @@
-import { autocomplete } from "@solid-cli/ui";
-import { S_BAR, cancelable, spinnerify } from "@solid-cli/ui";
-import { Integrations, Supported, integrations, setRootFile } from "../lib/integrations";
-import * as p from "@clack/prompts";
-import color from "picocolors";
-import { primitives, loadPrimitives } from "@solid-cli/utils/primitives";
-import { t } from "@solid-cli/utils";
-import { fileExists, getRootFile, getViteConfig, validateFilePath } from "../lib/utils/helpers";
-import { writeFile, readFile } from "@solid-cli/utils/fs";
-import { transformPlugins, type PluginOptions } from "@solid-cli/utils/transform";
-import {
- UPDATESQUEUE,
- clearQueue,
- flushCommandUpdates,
- flushFileUpdates,
- flushPackageUpdates,
- queueUpdate,
- summarizeUpdates,
-} from "@solid-cli/utils/updates";
-const handleAutocompleteAdd = async () => {
- const supportedIntegrations = (Object.keys(integrations) as Supported[]).map((value) => ({ label: value, value }));
- const opts = () => [...supportedIntegrations, ...primitives()];
- loadPrimitives().catch((e) => p.log.error(e));
- const a = await cancelable(
- autocomplete({
- message: t.ADD_PACKAGES,
- options: opts,
- }),
- );
-
- if (a.length === 0) {
- p.log.warn(t.NOTHING_SELECTED);
- return;
- }
- const shouldInstall = await cancelable(
- p.select({
- options: [
- { label: t.YES, value: true },
- { label: t.NO, value: false },
- { label: t.YES_FORCE, value: [true, "force"] },
- ],
- message: `${t.CONFIRM_INSTALL(a.length)} \n${color.red(S_BAR)} \n${color.red(S_BAR)} ${
- " " + color.yellow(a.map((opt) => opt.label).join(" ")) + " "
- } \n${color.red(S_BAR)} `,
- }),
- );
-
- if (!shouldInstall) return;
-
- let forceTransform = false;
- if (Array.isArray(shouldInstall) && shouldInstall[1] === "force") {
- forceTransform = true;
- }
- const packages = a.map((opt) => opt.value as Supported);
-
- return { packages, forceTransform };
-};
-const isIntegration = (str: string) => {
- if (Object.keys(integrations).includes(str)) return true;
- return false;
-};
-/**
- * Transforms a list containing primitives, either by name or full package name, and returns the corresponding primitive objects
- */
-const transformPrimitives = async (ps: string[]) => {
- if (!ps.length) return [];
- if (!primitives().length) {
- await spinnerify({
- startText: t.LOADING_PRIMITIVES,
- finishText: t.PRIMITIVES_LOADED,
- fn: loadPrimitives,
- });
- }
- const mappedInput = ps.map((p) => p.replace("@solid-primitives/", ""));
- return primitives().filter((p) => mappedInput.includes(p.value.replace("@solid-primitives/", "")));
-};
-type Configs = Integrations[keyof Integrations][];
-export const handleAdd = async (packages?: string[], forceTransform: boolean = false) => {
- if (!packages?.length) {
- const autocompleted = await handleAutocompleteAdd();
-
- if (!autocompleted) return;
-
- packages = autocompleted.packages;
- forceTransform = autocompleted.forceTransform;
- }
- const possiblePrimitives: string[] = [];
- const configs: Configs = packages
- .map((n) => {
- if (!n) return;
- if (!isIntegration(n)) {
- possiblePrimitives.push(n);
- return;
- }
- const res = integrations[n as Supported];
- if (!res) {
- p.log.error(t.NO_SUPPORT(n));
- return;
- }
- return res;
- })
- .filter((p) => p) as Configs;
-
- const viteConfig = await getViteConfig();
-
- for (let i = 0; i < configs.length; i++) {
- const config = configs[i];
- config.installs.forEach((p) => queueUpdate({ type: "package", name: p }));
- }
- // Queue primitives
- for (const primitive of await transformPrimitives(possiblePrimitives)) {
- queueUpdate({ type: "package", name: primitive.value });
- }
-
- if (!configs.length) return;
-
- await spinnerify({
- startText: "Processing config",
- finishText: "Config processed",
- fn: async () => {
- const code = await transformPlugins(
- configs.map((c) => c.pluginOptions).filter(Boolean) as PluginOptions[],
- { name: viteConfig, contents: (await readFile(viteConfig)).toString() },
- forceTransform,
- undefined,
- );
- writeFile(viteConfig, code);
- },
- });
-
- p.log.info("Preparing post install steps for integrations");
- let projectRoot = await getRootFile();
- setRootFile(projectRoot);
- if (!fileExists(projectRoot)) {
- p.log.error(color.red(`Can't find root file \`${projectRoot.split("/")[1]}\`.`));
- await cancelable(
- p.text({
- message: `Type path to root: `,
- validate(value) {
- if (!value.length) return `Path can not be empty`;
- const path = validateFilePath(value, ["root.tsx", "index.tsx"]);
- if (!path) return `File at \`${value}\` not found. Please try again`;
- else setRootFile(path);
- },
- }),
- );
- }
- // Run our additional configs
- await spinnerify({
- startText: "Running additional config steps",
- finishText: "Additional config steps complete",
- fn: async () => {
- for (const cfg of configs) {
- await cfg.additionalConfig?.();
- }
- },
- });
- if (UPDATESQUEUE.length === 0) return;
- const { fileUpdates, packageUpdates, commandUpdates } = summarizeUpdates();
- // Inspired by Qwik's CLI
- if (fileUpdates.length) p.log.message([`${color.cyan("Modify")}`, ...fileUpdates.map((f) => ` - ${f}`)].join("\n"));
- if (packageUpdates.length)
- p.log.message([`${color.cyan("Install")}`, ...packageUpdates.map((p) => ` - ${p}`)].join("\n"));
- if (commandUpdates.length)
- p.log.message([`${color.cyan("Run commands")}`, ...commandUpdates.map((p) => ` - ${p}`)].join("\n"));
- const confirmed = await p.confirm({ message: "Do you wish to continue?" });
- if (!confirmed || p.isCancel(confirmed)) return;
- await spinnerify({ startText: "Writing files...", finishText: "Updates written", fn: flushFileUpdates });
- await spinnerify({ startText: "Installing packages...", finishText: "Packages installed", fn: flushPackageUpdates });
- await spinnerify({ startText: "Running setup commands", finishText: "Setup commands ran", fn: flushCommandUpdates });
- clearQueue();
- const postInstalls = configs.filter((c) => c.postInstall);
- if (postInstalls.length === 0) return;
- p.log.message(
- `${postInstalls.length} ${
- postInstalls.length === 1 ? "package has" : "packages have"
- } post install steps that need to run.`,
- );
- const pInstallConfirmed = await p.confirm({ message: "Do you wish to continue?" });
- if (!pInstallConfirmed || p.isCancel(pInstallConfirmed)) return;
- p.log.info("Running post installs");
- // Run postInstalls
- for (const cfg of configs) {
- await cfg.postInstall?.();
- }
- p.log.success("Post install steps complete!");
- // await spinnerify({
- // startText: t.POST_INSTALL,
- // finishText: t.POST_INSTALL_COMPLETE,
- // fn: async () => {
- // for (const cfg of configs) {
- // await cfg.postInstall?.();
- // }
- // },
- // });
-};
diff --git a/packages/commands/src/handlers/new.ts b/packages/commands/src/handlers/new.ts
deleted file mode 100644
index 34be5c9..0000000
--- a/packages/commands/src/handlers/new.ts
+++ /dev/null
@@ -1,256 +0,0 @@
-import * as p from "@clack/prompts";
-import { openInBrowser } from "@solid-cli/utils";
-import { cancelable, spinnerify } from "@solid-cli/ui";
-import { t } from "@solid-cli/utils";
-import { insertAtEnd, readFileToString } from "@solid-cli/utils/fs";
-import { flushQueue } from "@solid-cli/utils/updates";
-import { rm } from "fs/promises";
-import { basename, join, resolve } from "path";
-import { Dirent, copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "fs";
-import { downloadAndExtract } from "@begit/core";
-import { transform } from "sucrase";
-const gitIgnore = `
-dist
-.solid
-.output
-.vercel
-.netlify
-netlify
-
-# Environment
-.env
-.env*.local
-
-# dependencies
-/node_modules
-
-# IDEs and editors
-/.idea
-.project
-.classpath
-*.launch
-.settings/
-
-# Temp
-gitignore
-
-# System Files
-.DS_Store
-Thumbs.db
-`;
-
-const startSupported = [
- "bare",
- "basic",
- "experiments",
- "hackernews",
- "todomvc",
- "with-auth",
- "with-mdx",
- "with-prisma",
- "with-solid-styled",
- "with-tailwindcss",
- "with-trpc",
-] as const;
-const localSupported = ["ts", "js"] as const;
-const stackblitzSupported = ["bare"] as const;
-
-type AllSupported = (typeof localSupported)[number] | (typeof stackblitzSupported)[number];
-
-const modifyReadme = async (name: string) => {
- await insertAtEnd(
- `${name}/README.md`,
- "\n## This project was created with the [Solid CLI](https://solid-cli.netlify.app)\n",
- );
- await flushQueue();
-};
-
-const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => {
- startPath = resolve(startPath);
-
- const files = readdirSync(startPath, { withFileTypes: true });
-
- for (const file of files) {
- cb(file, startPath);
- }
-};
-
-const convertToJS = async (file: Dirent, startPath: string) => {
- const src = join(startPath, file.name);
- const dest = resolve(startPath.replace(".solid-start", ""), file.name);
- if (file.isDirectory()) {
- mkdirSync(dest, { recursive: true });
- recurseFiles(resolve(startPath, file.name), convertToJS);
- } else if (file.isFile()) {
- if (src.endsWith(".ts") || src.endsWith(".tsx")) {
- let { code } = transform(await readFileToString(src), {
- transforms: ["typescript", "jsx"],
- jsxRuntime: "preserve",
- });
- // code = await prettier.format(code, {
- // parser: "babel",
- // });
-
- writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" });
- } else {
- copyFileSync(src, dest);
- }
- }
-};
-
-const handleTSConversion = async (tempDir: string, projectName: string) => {
- await rm(resolve(tempDir, "tsconfig.json"));
- writeFileSync(
- resolve(projectName, "jsconfig.json"),
- JSON.stringify(
- {
- compilerOptions: {
- jsx: "preserve",
- jsxImportSource: "solid-js",
- paths: {
- "~/*": ["./src/*"],
- },
- },
- },
- null,
- 2,
- ),
- { flag: "wx" },
- );
-
- // Convert all ts files in temp directory into js
- recurseFiles(tempDir, convertToJS);
-
- // Update package.json to remove type deps
- const name = basename(resolve(projectName));
- const pkg_file = join(projectName, "package.json");
- const pkg_json = JSON.parse(
- readFileSync(pkg_file, "utf-8")
- .replace(/"name": ".+"/, (_m) => `"name": "${name}"`)
- .replace(/"(.+)": "workspace:.+"/g, (_m, name) => `"${name}": "next"`),
- );
-
- delete pkg_json.dependencies["@types/cookie"];
- delete pkg_json.dependencies["@types/debug"];
- delete pkg_json.devDependencies["@types/babel__core"];
- delete pkg_json.devDependencies["@types/node"];
- delete pkg_json.devDependencies["typescript"];
- delete pkg_json.devDependencies["@types/wait-on"];
-
- writeFileSync(pkg_file, JSON.stringify(pkg_json, null, 2));
-
- // Remove temp directory
- await rm(join(process.cwd(), tempDir), {
- recursive: true,
- force: true,
- });
-};
-
-const handleNewStartProject = async (projectName: string) => {
- const template = await cancelable(
- p.select({
- message: t.NEW_START,
- initialValue: "ts",
- options: startSupported.map((s) => ({ label: s, value: s })),
- }),
- );
-
- const withTs = await cancelable(p.confirm({ message: "Use Typescript?" }));
-
- // If the user does not want ts, we create the project in a temp directory inside the project directory
- const tempDir = withTs ? projectName : join(projectName, ".solid-start");
- const readmeAlreadyExists = existsSync(join(projectName, "README.md"));
- await spinnerify({
- startText: t.CREATING_PROJECT,
- finishText: t.PROJECT_CREATED,
- fn: async () => {
- // const emitter = degit(`solidjs/solid-start/examples/${template}#main`);
- // emitter.on("info", ({ message }) => p.log.info(message));
- // await emitter.clone(tempDir);
- await downloadAndExtract({
- repo: { owner: "solidjs", name: "solid-start", subdir: `examples/${template}` },
- dest: tempDir,
- });
- },
- });
-
- if (!withTs) await handleTSConversion(tempDir, projectName);
-
- // Add .gitignore
- writeFileSync(join(projectName, ".gitignore"), gitIgnore);
- if (!readmeAlreadyExists) await modifyReadme(projectName);
-
- p.log.info(`${t.GET_STARTED}
- - cd ${projectName}
- - npm install
- - npm run dev`);
-};
-
-const handleAutocompleteNew = async () => {
- const name = await cancelable(
- p.text({ message: t.PROJECT_NAME, placeholder: "solid-project", defaultValue: "solid-project" }),
- );
-
- const isStart = await cancelable(p.confirm({ message: t.IS_START_PROJECT }));
-
- if (isStart) {
- handleNewStartProject(name);
- return;
- }
-
- const template = (await cancelable(
- p.select({
- message: t.TEMPLATE,
- initialValue: "ts",
- options: localSupported.map((s) => ({ label: s, value: s })),
- }),
- )) as unknown as AllSupported;
-
- await handleNew(template, name);
-};
-export const handleNew = async (
- variation?: AllSupported,
- name: string = "solid-project",
- stackblitz: boolean = false,
-) => {
- if (!variation) {
- await handleAutocompleteNew();
- return;
- }
-
- if (stackblitz) {
- await spinnerify({
- startText: t.OPENING_IN_BROWSER(variation),
- finishText: t.OPENED_IN_BROWSER,
- fn: () => openInBrowser(`https://solid.new/${variation}`),
- });
- return;
- }
-
- const withTs = await cancelable(p.confirm({ message: "Use Typescript?" }));
-
- // If the user does not want ts, we create the project in a temp directory inside the project directory
- const tempDir = withTs ? name : join(name, ".solid-start");
- const readmeAlreadyExists = existsSync(join(name, "README.md"));
-
- await spinnerify({
- startText: t.CREATING_PROJECT,
- finishText: t.PROJECT_CREATED,
- fn: async () => {
- // const emitter = degit(`solidjs/templates/${variation}`);
- // emitter.on("info", ({ message }) => p.log.info(message));
- // await emitter.clone(tempDir);
- await downloadAndExtract({ repo: { owner: "solidjs", name: "templates", subdir: variation }, dest: tempDir });
- },
- });
-
- if (!withTs) await handleTSConversion(tempDir, name);
-
- // Add .gitignore
- writeFileSync(join(name, ".gitignore"), gitIgnore);
- if (!readmeAlreadyExists) await modifyReadme(name ?? variation);
- p.log.info(`${t.GET_STARTED}
- - cd ${name}
- - npm install
- - npm run dev`);
-};
diff --git a/packages/commands/src/handlers/start/adapter.ts b/packages/commands/src/handlers/start/adapter.ts
deleted file mode 100644
index 7d18982..0000000
--- a/packages/commands/src/handlers/start/adapter.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { readFile, writeFile } from "@solid-cli/utils/fs";
-import { transformPlugins } from "@solid-cli/utils/transform";
-import * as p from "@clack/prompts";
-import { cancelable } from "@solid-cli/ui";
-
-export const supportedAdapters = [
- "aws",
- "cloudflare-pages",
- "cloudflare-workers",
- "deno",
- "netlify",
- "node",
- "static",
- "vercel",
-] as const;
-
-type SupportedAdapters = (typeof supportedAdapters)[number];
-
-const handleAutocompleteAdapter = async () => {
- const name = (await cancelable(
- p.select({
- message: "Select an adapter",
- options: supportedAdapters.map((a) => ({ value: a, label: a })),
- }),
- )) as SupportedAdapters;
- await handleAdapter(name, true);
-};
-
-export const handleAdapter = async (name?: string, forceTransform = false) => {
- if (!name) {
- await handleAutocompleteAdapter();
- return;
- }
- const sym = Symbol(name).toString();
- let code = await transformPlugins(
- [
- {
- importName: "solid",
- importSource: "solid-start/vite",
- isDefault: true,
- options: { adapter: sym },
- },
- ],
- { name: "vite.config.ts", contents: (await readFile("vite.config.ts")).toString() },
- forceTransform,
- );
- code = `import ${name} from "solid-start-${name}";\n` + code;
- code = code.replace(`"${sym}"`, `${name}({})`);
- await writeFile("vite.config.ts", code);
-};
diff --git a/packages/commands/src/handlers/start/api.ts b/packages/commands/src/handlers/start/api.ts
deleted file mode 100644
index 79dd2bb..0000000
--- a/packages/commands/src/handlers/start/api.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { isSolidStart, createApi } from "@solid-cli/utils";
-import * as p from "@clack/prompts";
-import { cancelable, spinnerify } from "@solid-cli/ui";
-
-const handleAutocompleteApi = async () => {
- const path = await cancelable(
- p.text({
- message: "Enter the path in which the api file will be created",
- placeholder: "/user",
- validate(value) {
- if (!value.length) return "Path is required";
- },
- }),
- );
-
- const name = await cancelable(
- p.text({
- message: "Enter the name for the api file (required)",
- validate(value) {
- if (!value.length) return "Name is required";
- },
- }),
- );
-
- await handleApi(path, name);
-};
-export const handleApi = async (path?: string, name?: string) => {
- if (!(await isSolidStart())) {
- p.log.error("Cannot run command. Your project doesn't include solid-start");
- return;
- }
- if (!path) {
- await handleAutocompleteApi();
- return;
- }
- await spinnerify({
- startText: "Creating new api file",
- finishText: "Api file created",
- fn: () => createApi(path, name),
- });
-};
diff --git a/packages/commands/src/handlers/start/data.ts b/packages/commands/src/handlers/start/data.ts
deleted file mode 100644
index 380bb1b..0000000
--- a/packages/commands/src/handlers/start/data.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { isSolidStart, createData } from "@solid-cli/utils";
-import * as p from "@clack/prompts";
-import { cancelable, spinnerify } from "@solid-cli/ui";
-
-const handleAutocompleteData = async () => {
- const path = await cancelable(
- p.text({
- message: "Enter the path in which the data file will be created",
- placeholder: "/user/login",
- validate(value) {
- if (!value.length) return "Path is required";
- },
- }),
- );
-
- const name = await cancelable(
- p.text({
- message: "Enter the name for the data file (leave this blank for the default)",
- }),
- );
-
- await handleData(path, name);
-};
-
-export const handleData = async (path?: string, name?: string) => {
- if (!(await isSolidStart())) {
- p.log.error("Cannot run command. Your project doesn't include solid-start");
- return;
- }
- if (!path) {
- await handleAutocompleteData();
- return;
- }
- await spinnerify({
- startText: "Creating new data file",
- finishText: "Data file created",
- fn: () => createData(path, name),
- });
-};
diff --git a/packages/commands/src/handlers/start/index.ts b/packages/commands/src/handlers/start/index.ts
deleted file mode 100644
index 2145bbb..0000000
--- a/packages/commands/src/handlers/start/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export * from "./adapter";
-export * from "./api";
-export * from "./data";
-export * from "./mode";
-export * from "./route";
diff --git a/packages/commands/src/handlers/start/mode.ts b/packages/commands/src/handlers/start/mode.ts
deleted file mode 100644
index e7244ee..0000000
--- a/packages/commands/src/handlers/start/mode.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { writeFile, readFile } from "@solid-cli/utils/fs";
-import { transformPlugins } from "@solid-cli/utils/transform";
-import { isSolidStart } from "@solid-cli/utils";
-import * as p from "@clack/prompts";
-import { cancelable } from "@solid-cli/ui";
-
-export const supportedModes = ["csr", "ssr", "ssg"] as const;
-type SupportedModes = (typeof supportedModes)[number];
-
-const handleAutocompleteMode = async () => {
- const mode = (await cancelable(
- p.select({
- message: "Select a mode",
- options: supportedModes.map((a) => ({ value: a, label: a.toUpperCase() })),
- }),
- )) as SupportedModes;
- await handleMode(mode);
-};
-
-export const handleMode = async (mode?: SupportedModes) => {
- if (!(await isSolidStart())) {
- p.log.error("Cannot run command. Your project doesn't include solid-start");
- return;
- }
- if (!mode) {
- handleAutocompleteMode();
- return;
- }
- p.log.info("Updating config");
- if (mode != "ssg") {
- const newConfig = await transformPlugins(
- [
- {
- importName: "solid",
- importSource: "solid-start/vite",
- isDefault: true,
- options: { ssr: mode === "ssr" },
- },
- ],
- { name: "vite.config.ts", contents: (await readFile("vite.config.ts")).toString() },
- true,
- true,
- );
- await writeFile("vite.config.ts", newConfig);
- }
-};
diff --git a/packages/commands/src/handlers/start/route.ts b/packages/commands/src/handlers/start/route.ts
deleted file mode 100644
index 6e1ea45..0000000
--- a/packages/commands/src/handlers/start/route.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import * as p from "@clack/prompts";
-import { isSolidStart, createRoute } from "@solid-cli/utils";
-import { cancelable, spinnerify } from "@solid-cli/ui";
-const handleAutocompleteRoute = async () => {
- const path = await cancelable(
- p.text({
- message: "Please provide a path for the route",
- placeholder: "/user/login",
- validate(value) {
- if (!value.length) return "Path is required";
- },
- }),
- );
- const name = await cancelable(
- p.text({
- message: "Please provide a name for the route",
-
- validate(value) {
- if (!value.length) return "Name for route is required";
- },
- }),
- );
-
- await handleRoute(path, name);
-};
-export const handleRoute = async (path?: string, name?: string) => {
- if (!(await isSolidStart())) {
- p.log.error("Cannot run command. Your project doesn't include solid-start");
- return;
- }
- if (!path) {
- await handleAutocompleteRoute();
- return;
- }
- await spinnerify({
- startText: "Creating new route",
- finishText: "Route created",
- fn: () => createRoute(path, name),
- });
-};
diff --git a/packages/commands/src/index.ts b/packages/commands/src/index.ts
deleted file mode 100644
index 32fff0a..0000000
--- a/packages/commands/src/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from "./handlers/add";
-export * from "./handlers/new";
-export * from "./handlers/start";
diff --git a/packages/commands/src/lib/integrations.ts b/packages/commands/src/lib/integrations.ts
deleted file mode 100644
index ddf3b47..0000000
--- a/packages/commands/src/lib/integrations.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import { insertAfter, insertAtBeginning } from "@solid-cli/utils/fs";
-import { fileExists, validateFilePath } from "./utils/helpers";
-import { $ } from "execa";
-import { getRunnerCommand, detectPackageManager } from "@solid-cli/utils/package-manager";
-import { createSignal } from "@solid-cli/reactivity";
-import * as p from "@clack/prompts";
-import color from "picocolors";
-import { cancelable } from "@solid-cli/ui";
-import { PluginOptions } from "@chialab/esbuild-plugin-meta-url";
-import { flushQueue } from "@solid-cli/utils/updates";
-
-// All the integrations/packages that we support
-export type Supported = keyof typeof integrations;
-
-export type IntegrationsValue = {
- pluginOptions?: PluginOptions;
- installs: string[];
- additionalConfig?: () => Promise;
- postInstall?: () => Promise;
-};
-
-export type Integrations = Record;
-
-export const [rootFile, setRootFile] = createSignal(undefined);
-
-export const integrations = {
- "tailwind": {
- installs: ["tailwindcss", "postcss", "autoprefixer"],
- postInstall: async () => {
- const pM = detectPackageManager();
- await $`${getRunnerCommand(pM)} tailwindcss init -p`;
- let tailwindConfig = "tailwind.config.js";
- if (!fileExists(tailwindConfig)) {
- p.log.error(color.red(`Can't find tailwind config file`));
- await cancelable(
- p.text({
- message: `Type path to tailwind config: `,
- validate(value) {
- if (!value.length) return `Path can not be empty`;
- const path = validateFilePath(value, "tailwind.config");
- if (!path) return `Tailwind config at \`${value}\` not found. Please try again`;
- else {
- tailwindConfig = path;
- }
- },
- }),
- );
- }
-
- let indexCss = "./src/index.css";
- if (!fileExists(indexCss)) {
- p.log.error(color.red(`Can't find index.css`));
- await cancelable(
- p.text({
- message: `Type path to index.css: `,
- validate(value) {
- if (!value.length) return `Path can not be empty`;
- const path = validateFilePath(value, "index.css");
- if (!path) return `index.css at \`${value}\` not found. Please try again`;
- else {
- indexCss = path;
- }
- },
- }),
- );
- }
- p.log.info("Updating tailwind config");
- await insertAfter(tailwindConfig, "content: [", '"./index.html", "./src/**/*.{js,ts,jsx,tsx}"');
- await insertAtBeginning(indexCss, "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n");
- // Instantly flush queue
- await flushQueue();
- },
- },
- "unocss": {
- pluginOptions: {
- importName: "UnoCss",
- importSource: "unocss/vite",
- isDefault: true,
- options: {},
- },
- installs: ["unocss"],
- additionalConfig: async () => {
- const path = rootFile();
- if (!path) return;
- await insertAtBeginning(path, `import "virtual:uno.css";\n`);
- },
- },
- "vitepwa": {
- pluginOptions: {
- importName: "VitePWA",
- importSource: "vite-plugin-pwa",
- isDefault: false,
- options: {},
- },
- installs: ["vite-plugin-pwa"],
- },
- "solid-devtools": {
- pluginOptions: {
- importName: "devtools",
- importSource: "solid-devtools/vite",
- isDefault: true,
- options: {},
- },
- installs: ["solid-devtools"],
- additionalConfig: async () => {
- const path = rootFile();
- if (!path) return;
- await insertAtBeginning(path, `import "solid-devtools";\n`);
- },
- },
-};
diff --git a/packages/commands/src/lib/utils/helpers.ts b/packages/commands/src/lib/utils/helpers.ts
deleted file mode 100644
index 1eea427..0000000
--- a/packages/commands/src/lib/utils/helpers.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import { existsSync, lstatSync, readdirSync } from "fs";
-import { isSolidStart } from "@solid-cli/utils";
-import { join, resolve } from "path";
-import { $ } from "execa";
-import { cancelable } from "@solid-cli/ui";
-import * as p from "@clack/prompts";
-import color from "picocolors";
-
-export const getProjectRoot = async () => {
- const { stdout } = await $`npm root`;
-
- return stdout.slice(0, stdout.lastIndexOf("/"));
-};
-
-export const getRootFile = async () => {
- if (await isSolidStart()) {
- return "src/root.tsx";
- }
- return "src/index.tsx";
-};
-
-export const fileExists = (path: string) => {
- return existsSync(path);
-};
-
-export function validateFilePath(path: string, lookingFor: string): string | undefined;
-export function validateFilePath(path: string, lookingFor: string[]): string | undefined;
-export function validateFilePath(path: string, lookingFor: string | string[]): string | undefined {
- path = resolve(path);
- const isDir = lstatSync(path).isDirectory();
- if (isDir) {
- const files = readdirSync(path, { withFileTypes: true });
-
- const config = files.find((file) => {
- if (Array.isArray(lookingFor)) {
- return lookingFor.some((s) => file.name.startsWith(s));
- }
-
- return file.name.startsWith(lookingFor);
- });
- return config ? join(path, config.name) : undefined;
- }
-
- const pathIsValid = Array.isArray(lookingFor)
- ? lookingFor.some((s) => path.startsWith(s))
- : path.startsWith(lookingFor);
-
- const exists = fileExists(path) && pathIsValid;
-
- return exists ? path : undefined;
-}
-
-export async function findFiles(
- startPath: string,
- lookingFor: string | string[],
- opts: { depth?: number; ignoreDirs?: string[]; startsWith?: boolean },
-): Promise {
- let { depth = Infinity, ignoreDirs = ["node_modules", "."], startsWith = true } = opts;
-
- startPath = resolve(startPath);
-
- const isDir = lstatSync(startPath).isDirectory();
-
- if (!isDir) {
- startPath = resolve(startPath.slice(0, startPath.lastIndexOf("/")));
- }
-
- let filePaths: string[] = [];
-
- const files = readdirSync(startPath, { withFileTypes: true });
-
- for (const file of files) {
- if (file.isDirectory() && !ignoreDirs.some((s) => file.name.includes(s))) {
- if (Number.isFinite(depth) && depth-- <= 0) continue;
- filePaths = filePaths.concat(await findFiles(resolve(startPath, file.name), lookingFor, opts));
- continue;
- }
-
- if (file.isFile()) {
- const fileMatch = Array.isArray(lookingFor)
- ? lookingFor.some((s) => (startsWith ? file.name.startsWith(s) : file.name.endsWith(s)))
- : startsWith
- ? file.name.startsWith(lookingFor)
- : file.name.endsWith(lookingFor);
-
- if (fileMatch) {
- filePaths.push(resolve(startPath, file.name));
- }
- }
- }
-
- return filePaths;
-}
-
-export const getViteConfig = async () => {
- let configFile = "vite.config.ts";
-
- const existsHere = fileExists(configFile);
-
- if (!existsHere) {
- const root = await getProjectRoot();
- const existsInRoot = validateFilePath(root, "vite.config");
- if (existsInRoot) {
- const correctConfig = await cancelable(
- p.confirm({
- message: `Could not find vite config in current directory, but found vite config in \`${root}\`. Is this the correct vite config?`,
- }),
- );
- if (correctConfig) return existsInRoot;
- }
-
- p.log.error(color.red(`Can't find vite config`));
- await cancelable(
- p.text({
- message: "Type path to vite config: ",
- validate(value) {
- const path = validateFilePath(value, "vite.config");
- if (!path) return `Vite config not found. Please try again`;
- else {
- configFile = path;
- }
- },
- }),
- );
- }
-
- return configFile;
-};
diff --git a/packages/commands/tests/assets/sample_unocss_result.txt b/packages/commands/tests/assets/sample_unocss_result.txt
deleted file mode 100644
index 5ae2640..0000000
--- a/packages/commands/tests/assets/sample_unocss_result.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-import UnoCss from "unocss/vite";
-import solid from "solid-start/vite";
-// Simulates a vite config
-export default defineConfig({
- plugins: [
- solid(),
- UnoCss({})
- ]
-});
diff --git a/packages/commands/tests/assets/sample_vite_config.txt b/packages/commands/tests/assets/sample_vite_config.txt
deleted file mode 100644
index b501a09..0000000
--- a/packages/commands/tests/assets/sample_vite_config.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-import solid from "solid-start/vite";
-// Simulates a vite config
-export default defineConfig({
- plugins: [solid()],
-});
diff --git a/packages/commands/tests/config_manipulation.test.ts b/packages/commands/tests/config_manipulation.test.ts
deleted file mode 100644
index d94c0fb..0000000
--- a/packages/commands/tests/config_manipulation.test.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { describe, expect, it, vi } from "vitest";
-import { handleAdd } from "../src/handlers/add";
-import { readFile as readFile1 } from "fs";
-import { UPDATESQUEUE } from "../../utils/src/updates";
-const readFile = async (path: string): Promise => {
- return await new Promise((res) =>
- // Can't use readFile from fs/promises because we've mocked it
- readFile1(path, (_, data) => res(data.toString())),
- );
-};
-const removeWhitespace = (str: string) => str.replace(/\s/g, "");
-vi.mock("fs/promises", () => {
- return {
- readFile: async (name: string) => {
- if (name === "vite.config.ts") {
- const sampleConfig: string = await readFile("./packages/commands/tests/assets/sample_vite_config.txt");
- return sampleConfig;
- }
- return "{}";
- },
- writeFile: async (contents: string) => {
- return contents;
- },
- };
-});
-vi.mock("execa", () => {
- return { $: async () => ({ stdout: "" }) };
-});
-
-vi.mock("@clack/prompts", async () => {
- const actual: object = await vi.importActual("@clack/prompts");
- return {
- ...actual,
- confirm: async ({ message }: { message: string }) => true,
- };
-});
-
-vi.mock("@solid-cli/utils/updates", async () => {
- const actual: object = await vi.importActual("@solid-cli/utils/updates");
- return {
- ...actual,
- clearQueue: async () => {},
- };
-});
-
-vi.mock("../src/lib/utils/helpers.ts", async () => {
- return {
- getViteConfig: async (): Promise => new Promise((r) => r("vite.config.ts")),
- fileExists: (path: string) =>
- path.includes("vite_config") || path.includes("root.tsx") || path.includes("index.tsx"),
- getRootFile: async (): Promise => new Promise((r) => r("./src/root.tsx")),
- };
-});
-describe("Update config", () => {
- it(
- "Adds a plugin properly to the config",
- async () => {
- await handleAdd(["unocss"]);
-
- const expected = await readFile("./packages/commands/tests/assets/sample_unocss_result.txt");
- // @ts-ignore
- const newConfig = UPDATESQUEUE.find((u) => u.name === "vite.config.ts")?.contents;
- expect(removeWhitespace(expected)).toBe(removeWhitespace(newConfig));
- },
- { timeout: 50000 },
- );
-});
diff --git a/packages/commands/tests/package_installs.test.ts b/packages/commands/tests/package_installs.test.ts
deleted file mode 100644
index c0eff16..0000000
--- a/packages/commands/tests/package_installs.test.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { expect, describe, it } from "vitest";
-
-describe("Package Installs", () => {
- it("should install packages correctly", () => {
- expect(true).toBe(true);
- });
-});
diff --git a/packages/commands/tsconfig.json b/packages/commands/tsconfig.json
deleted file mode 100644
index ecaf1e3..0000000
--- a/packages/commands/tsconfig.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "compilerOptions": {
- "target": "ESNext",
- "useDefineForClassFields": true,
- "module": "ESNext",
- "skipLibCheck": true,
- "declaration": true,
- "emitDeclarationOnly": true,
- "moduleResolution": "Bundler",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "allowSyntheticDefaultImports": true,
- "strict": true,
- // "noUnusedLocals": true,
- // "noUnusedParameters": true,
- "noFallthroughCasesInSwitch": true,
- "outDir": "types"
- },
- "include": ["src/*"]
-}
diff --git a/packages/commands/tsup.config.ts b/packages/commands/tsup.config.ts
deleted file mode 100644
index 0e6978c..0000000
--- a/packages/commands/tsup.config.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineConfig } from "tsup";
-import metaUrlPlugin from "@chialab/esbuild-plugin-meta-url";
-
-export default defineConfig({
- entry: ["src/index.ts", "src/handlers/new.ts"],
- target: "esnext",
- format: "esm",
- splitting: false,
- sourcemap: true,
- clean: true,
- minify: true,
- esbuildPlugins: [metaUrlPlugin()],
-});
diff --git a/packages/core/.gitignore b/packages/core/.gitignore
deleted file mode 100644
index bf96551..0000000
--- a/packages/core/.gitignore
+++ /dev/null
@@ -1,133 +0,0 @@
-# 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 swc cache
-.swc
-
-# 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
-.cache
-
-# 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.*
diff --git a/packages/core/README.md b/packages/core/README.md
deleted file mode 100644
index c922b0e..0000000
--- a/packages/core/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# @solid-cli/core
-
-The main package for the SolidJS CLI tool.
-
-## Installation
-
-Run the following command to install the CLI tool globally:
-
-```bash
-npm i -g @solid-cli/core
-```
-
-## Usage
-
-For a full list of commands and how to use them, you can invoke the help command like so:
-
-```bash
-solid --help
-```
-
-Which should print this:
-
-```bash
-solid
-
-where can be one of:
-
-- add - Can add and install integrations: `solid add unocss`.
-- docs
-- new - Creates a new solid project
-- set
-- start - Commands specific to solid start
-- playground
-
-For more help, try running `solid --help`
-```
-
-## Documentation
-
-Visit our [official documentation](https://solid-cli.netlify.app/)
-
-## Support
-
-Reach out to us on the official [SolidJS discord](https://discord.gg/solidjs)
-
-## Contributing
-
-If you would like to contribute or keep up to date with the package, come join the effort over on [our GitHub](https://github.com/solidjs-community/solid-cli)
diff --git a/packages/core/package.json b/packages/core/package.json
deleted file mode 100644
index a6f7602..0000000
--- a/packages/core/package.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "name": "@solid-cli/core",
- "version": "0.0.20",
- "description": "A CLI for Solid",
- "author": "Thomas Beer & Rahul Batra",
- "license": "MIT",
- "homepage": "https://solid-cli.netlify.app",
- "repository": {
- "type": "git",
- "url": "https://github.com/solidjs-community/solid-cli"
- },
- "keywords": [
- "solidjs",
- "solid",
- "cli"
- ],
- "main": "dist/index.mjs",
- "bin": {
- "solid": "./dist/index.mjs"
- },
- "files": [
- "dist"
- ],
- "dependencies": {
- "@clack/core": "0.3.3",
- "@clack/prompts": "0.7.0",
- "@solid-cli/commands": "workspace:*",
- "@solid-cli/reactivity": "workspace:*",
- "@solid-cli/swc-plugin-solid-cli": "workspace:*",
- "@solid-cli/ui": "workspace:*",
- "@solid-cli/utils": "workspace:*",
- "@swc/core": "^1.4.1",
- "cmd-ts": "^0.13.0",
- "execa": "^8.0.1",
- "picocolors": "^1.0.0",
- "smol-toml": "^1.1.4",
- "tiny-updater": "^3.5.1"
- },
- "scripts": {
- "start": "jiti ./src/index.ts",
- "build": "tsc && tsup"
- },
- "devDependencies": {
- "@chialab/esbuild-plugin-meta-url": "^0.18.0",
- "@types/node": "^20.11.19",
- "jiti": "^1.21.0",
- "tsup": "^8.0.2",
- "typescript": "^5.3.3"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/core/src/commands/index.ts b/packages/core/src/commands/index.ts
deleted file mode 100644
index e06da10..0000000
--- a/packages/core/src/commands/index.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-import { openInBrowser } from "@solid-cli/utils";
-import { startCommands } from "./start";
-import * as p from "@clack/prompts";
-import { boolean, command, flag, optional, positional, restPositionals, string } from "cmd-ts";
-import { oneOf } from "@solid-cli/utils";
-import { cancelable } from "@solid-cli/ui";
-import { PossibleFields, setField, t } from "@solid-cli/utils";
-import { spinnerify } from "@solid-cli/ui";
-import { handleNew, handleAdd } from "@solid-cli/commands";
-const add = command({
- name: "add",
- description: t.ADD_DESC,
- args: {
- packages: restPositionals({
- type: string,
- displayName: "Package Name",
- }),
- forceTransform: flag({ type: boolean, long: "force", short: "f" }),
- },
- handler: async ({ packages, forceTransform }) => {
- await handleAdd(packages, forceTransform);
- },
-});
-const new_ = command({
- name: "new",
- description: t.NEW_DESC,
- args: {
- variation: positional({
- type: optional(oneOf(["bare", "ts", "js"] as const)),
- displayName: t.NEW_VARIATION_DESC,
- description: "",
- }),
- name: positional({
- type: optional(string),
- displayName: t.PROJECT_NAME,
- description: t.NEW_NAME_DESC,
- }),
- stackblitz: flag({ type: boolean, long: "stackblitz", short: "s" }),
- },
- async handler({ variation, name, stackblitz }) {
- if (!name && variation) {
- const _name = await cancelable(
- p.text({
- message: t.PROJECT_NAME,
- placeholder: `solid-${variation}`,
- defaultValue: `solid-${variation}`,
- }),
- );
- name = _name;
- }
- await handleNew(variation, name, stackblitz);
- },
-});
-const docs = command({
- name: "docs",
- args: {
- keyword: positional({ type: optional(string), displayName: "Keyword" }),
- open: flag({ type: boolean, long: "open", short: "o" }),
- },
- async handler({ keyword, open }) {
- if (!keyword) {
- if (open) {
- await spinnerify({
- startText: "Opening",
- finishText: "Opened",
- fn: () => openInBrowser("https://docs.solidjs.com"),
- });
- return;
- }
- p.log.message("The solid documentation is available at https://docs.solidjs.com");
- return;
- }
- await spinnerify({
- startText: "Opening",
- finishText: "Opened",
- fn: () =>
- openInBrowser(
- `https://www.google.com/search?q=${keyword}+site:docs.solidjs.com+OR+site:start.solidjs.com+OR+site:solidjs.com`,
- ),
- });
- },
-});
-const set = command({
- name: "set",
- args: { field: positional({ type: oneOf(PossibleFields) }), value: positional({ type: string }) },
- async handler({ field, value }) {
- await setField(field, value);
- },
-});
-const playground = command({
- name: "playground",
- args: {},
- async handler() {
- await spinnerify({
- startText: "Opening",
- finishText: "Opened",
- fn: () => openInBrowser("https://playground.solidjs.com"),
- });
- },
-});
-export default {
- add,
- docs,
- new: new_,
- set,
- start: startCommands,
- playground,
-};
diff --git a/packages/core/src/commands/start.ts b/packages/core/src/commands/start.ts
deleted file mode 100644
index 5900eb2..0000000
--- a/packages/core/src/commands/start.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import { command, flag, optional, positional, string, subcommands } from "cmd-ts";
-import { oneOf } from "@solid-cli/utils";
-import { t } from "@solid-cli/utils";
-import {
- handleAdapter,
- handleApi,
- handleData,
- handleMode,
- handleRoute,
- supportedAdapters,
- supportedModes,
-} from "@solid-cli/commands";
-
-const mode = command({
- name: "mode",
- args: {
- mode: positional({
- type: optional(oneOf(supportedModes)),
- displayName: "Mode",
- description: t.START_MODE_DESC,
- }),
- },
- async handler({ mode }) {
- await handleMode(mode);
- },
-});
-const route = command({
- name: "route",
- args: {
- path: positional({ type: optional(string), displayName: "Route Path" }),
- name: positional({
- type: optional(string),
- displayName: "Route name",
- description: t.START_ROUTE_DESC,
- }),
- },
- async handler({ path, name }) {
- await handleRoute(path, name);
- },
-});
-const data = command({
- name: "data",
- args: {
- path: positional({ type: optional(string), displayName: "Data Path" }),
- name: positional({
- type: optional(string),
- displayName: "Data name",
- description: t.START_DATA_DESC,
- }),
- },
- async handler({ path, name }) {
- await handleData(path, name);
- },
-});
-const adapter = command({
- name: "adapter",
- args: {
- name: positional({
- type: optional(oneOf(supportedAdapters)),
- displayName: t.START_ADAPTER_DISPLAYNAME,
- }),
- forceTransform: flag({ short: "f", long: "force" }),
- },
- async handler({ name, forceTransform }) {
- await handleAdapter(name, forceTransform);
- },
-});
-
-const api = command({
- name: "api",
- args: {
- path: positional({ type: optional(string), displayName: "Api Path" }),
- name: positional({
- type: optional(string),
- displayName: t.START_API_DISPLAYNAME,
- description: t.START_API_HINT,
- }),
- },
- async handler({ path, name }) {
- await handleApi(path, name);
- },
-});
-
-export const startCommands = subcommands({
- name: "start",
- description: "Commands specific to solid start",
- cmds: {
- mode,
- route,
- data,
- adapter,
- api,
- },
-});
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
deleted file mode 100644
index 69d759f..0000000
--- a/packages/core/src/index.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-#! /usr/bin/env node
-import { run, subcommands } from "cmd-ts";
-import * as p from "@clack/prompts";
-import color from "picocolors";
-import { t, setLocale, getField } from "@solid-cli/utils";
-import { name, version } from "../package.json";
-import { readConfig } from "@solid-cli/utils";
-import loadCommands from "./plugins/plugins_entry";
-import updater from "tiny-updater";
-import { createAsync } from "@solid-cli/reactivity";
-import {
- handleAdapter,
- handleAdd,
- handleApi,
- handleData,
- handleMode,
- handleNew,
- handleRoute,
-} from "@solid-cli/commands";
-const possibleActions = () =>
- [
- { value: "add", label: t.ACTION_ADD, hint: "solid add ..." },
- { value: "new", label: t.ACTION_NEW, hint: "solid new ..." },
- { value: "start", label: t.ACTION_START, hint: "solid start ..." },
- ] as const;
-
-export const provideStartSuggestions = async () => {
- let startAction = await p.select({
- message: t.SELECT_START_ACTION,
- options: [
- { value: "mode", label: t.START_MODE, hint: t.START_MODE_HINT },
- { value: "route", label: t.START_ROUTE, hint: t.START_ROUTE_HINT },
- { value: "data", label: t.START_DATA, hint: t.START_DATA_HINT },
- {
- value: "adapter",
- label: t.START_ADAPTER,
- hint: t.START_ADAPTER_HINT,
- },
- {
- value: "api",
- label: t.START_API,
- hint: t.START_API_HINT,
- },
- ],
- });
- switch (startAction) {
- case "mode":
- await handleMode();
- break;
- case "route":
- await handleRoute();
- break;
- case "data":
- await handleData();
- break;
- case "adapter":
- await handleAdapter();
- break;
- case "api":
- await handleApi();
- break;
- }
-};
-
-const provideSuggestions = async () => {
- type ActionType = ReturnType[number]["value"];
- let action = (await p.select({
- message: t.SELECT_ACTION,
- // This thing really doesn't like `as const` things
- options: possibleActions() as any,
- })) as ActionType;
- if (!action) return;
- switch (action) {
- case "add":
- await handleAdd();
- break;
- case "new":
- await handleNew();
- break;
- case "start":
- await provideStartSuggestions();
- break;
- }
-};
-
-const main = async () => {
- p.intro(`\n${color.bgCyan(color.black(" Solid-CLI "))}`);
- await readConfig();
- const needsUpdate = createAsync(async () => await updater({ name, version, ttl: 86_400_000 }));
- setLocale(getField("lang"));
- const cli = subcommands({
- name: "solid",
- cmds: await loadCommands(),
- version,
- });
- const args = process.argv.slice(2);
-
- if (args.length === 0) {
- await provideSuggestions();
- return;
- }
-
- if (args.length === 1 && args[0] === "start") {
- await provideStartSuggestions();
- return;
- }
-
- await run(cli, args);
-};
-main();
diff --git a/packages/core/src/plugins/plugins_entry.ts b/packages/core/src/plugins/plugins_entry.ts
deleted file mode 100644
index f1aec75..0000000
--- a/packages/core/src/plugins/plugins_entry.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { join } from "path";
-import { config } from "@solid-cli/utils";
-import defaultCommands from "../commands";
-
-const resolveImport = async (packagePath: string) => {
- const packageJson = await import(join(packagePath, "package.json"));
- return await import(join(packagePath, packageJson.module));
-};
-const loadUserCommands = async () => {
- const pluginPaths = config()["plugins"] as string[];
- if (!pluginPaths) return null;
- const imports = await Promise.all(pluginPaths.map((p) => resolveImport(p)));
- const importedCommands = imports.map((i) => i.default);
- let commands = {} as any;
- importedCommands.forEach((c) => {
- const name = c.name;
- commands[name] = c;
- });
- return commands;
-};
-const loadCommands = async () => {
- const cmds = {
- ...defaultCommands,
- ...(await loadUserCommands()),
- };
- return cmds;
-};
-export default loadCommands;
diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts
deleted file mode 100644
index 75f3240..0000000
--- a/packages/core/tsup.config.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineConfig } from "tsup";
-import metaUrlPlugin from "@chialab/esbuild-plugin-meta-url";
-
-export default defineConfig({
- entry: ["src/index.ts"],
- target: "esnext",
- format: "esm",
- splitting: false,
- sourcemap: true,
- clean: true,
- minify: true,
- esbuildPlugins: [metaUrlPlugin()],
-});
diff --git a/packages/create-solid/CHANGELOG.md b/packages/create-solid/CHANGELOG.md
new file mode 100644
index 0000000..cc52156
--- /dev/null
+++ b/packages/create-solid/CHANGELOG.md
@@ -0,0 +1,115 @@
+# create-solid
+
+## 0.10.0
+
+### Minor Changes
+
+- Always scaffold from the latest templates
+
+ - Template downloads are no longer pinned to a baked-in solidjs/templates commit. Scaffolds come from live HEAD of the default branch, matching the `templates.json` manifest, so upstream template changes and dependency repins reach users without a CLI release.
+ - Removed the `SOLID_CLI_TEMPLATES_REF` environment override that shipped in 0.9.0, along with the pin it existed to escape.
+ - HEAD is resolved to a commit sha before downloading so the tarball can be cached under it and reused by later scaffolds. That lookup goes through api.github.com, which is rate limited to 60 requests/hour for unauthenticated users, so any failure — rate limited, offline, slow — falls back to fetching HEAD from the archive endpoint directly, uncached.
+ - Solid 2.0 is labelled "Solid 2.0 (RC)" in the project picker now that Solid 2.0 core is a release candidate. It stays listed first but not preselected.
+
+## 0.9.0
+
+### Minor Changes
+
+- 68caa9f: Solid 2.0 template support
+
+ - New "Solid 2.0" top-level project type scaffolding the `solid-v2/*` templates from solidjs/templates (basic, bare, fullstack, fullstack-tanstack, with-\*). Listed first but not preselected while Solid 2.0 core is in beta; existing flags (`-s`, `-v`, `-l`, `--v2`) keep their meaning, plus new `--solid` and `--ssr` flags.
+ - Optional streaming SSR on templates that support it (currently `basic`): a scaffold-time flip that sets `ssr: true` in `vite.config.ts`, adds the generic production `server.js`, and points the `start` script at it. Defaults to No.
+ - JavaScript variants of the Solid 2.0 templates via the existing sucrase TS→JS conversion (no `index.html` rewrite; `.ts`/`.tsx` references inside `vite.config` are retargeted, `.d.ts` files dropped, minimal `jsconfig.json`).
+ - Template lists, subdir paths and per-template flags are now read from a `templates.json` manifest at the templates repo HEAD (2s timeout), with silent fallback to the baked-in lists — so new templates and future repo reorganizations no longer require a CLI release.
+
+## 0.8.1
+
+### Patch Changes
+
+- make start v2 stable
+
+## 0.8.0
+
+### Minor Changes
+
+- support fetching without the github API (so fetching should no work when hitting the github api limit)
+
+## 0.6.14
+
+### Patch Changes
+
+- update dependencies and add to solid start v2 templates list
+
+## 0.6.13
+
+### Patch Changes
+
+- Keep showing `pnpm install` & `pnpm dev` commands when initialising a project in the current working directory
+
+## 0.6.12
+
+### Patch Changes
+
+- Update dependencies, add new template, and remove `cd` command if project is created in working directory
+
+## 0.6.11
+
+### Patch Changes
+
+- Rename `with-pages-router-file-based` to `with-vite-plugin-pages`
+
+## 0.6.10
+
+### Patch Changes
+
+- Fetch Vanilla templates from /vanilla subdirectory of solidjs/templates, rather than from repo root
+
+## 0.6.9
+
+### Patch Changes
+
+- Fetch Start templates from solidjs/templates, rather than the Start repo
+
+## 0.6.8
+
+### Patch Changes
+
+- Correctly perform TS->JS conversion by disabling ES transforms and preserving dynamic imports
+
+## 0.6.7
+
+### Patch Changes
+
+- Add `with-strict-csp` template to Start
+
+## 0.6.6
+
+### Patch Changes
+
+- Add CLI flags for creating `vanilla` and `library` projects
+
+## 0.6.5
+
+### Patch Changes
+
+- Don't add "Created with Solid CLI" text to README if it's already there
+
+## 0.6.4
+
+### Patch Changes
+
+- Update link in text added to project READMEs
+
+## 0.6.3
+
+### Patch Changes
+
+- Add more command line arguments
+
+## 0.6.1
+
+### Patch Changes
+
+- Fix regression from 0.5.x (.gitignore wasn't being written to new projects)
+
+## 0.6.0
diff --git a/packages/create-solid/README.md b/packages/create-solid/README.md
index 4849ea1..ce864de 100644
--- a/packages/create-solid/README.md
+++ b/packages/create-solid/README.md
@@ -1,5 +1,29 @@
-# @solid-cli/create-solid
+---
+description: Create Solid apps in one command with create-solid.
+---
-A minimal version of the [main CLI](https://www.npmjs.com/package/@solid-cli/core) just for creating new projects.
+# Create Solid
-Invoked with the `create-solid` command
+The easiest way to get started with Solid is by using `create-solid`. This CLI tool enables you to quickly start building a new Solid application, with everything set up for you. You can create a new app using the default SolidStart template or use one of the [Official SolidStart Examples](https://github.com/solidjs/solid-start/tree/main/examples). To get started, use the following command:
+
+```bash
+#or
+npm init solid@latest
+
+#or
+pnpm create solid@latest
+
+# or
+yarn create solid
+
+# or
+bunx create-solid
+```
+
+## Why use Create Solid?
+
+`create-solid` allows you to create a new Solid app within seconds. It includes a number of benefits:
+
+- **Interactive Experience**: Running `npm init solid@latest` (with no arguments) launches an interactive experience that guides you through setting up a project.
+- **Zero Dependencies**: Initializing a project is as quick as one second. Create Solid has zero runtime dependencies.
+- **Support for Examples**: Create Solid App can bootstrap your application using an example from the SolidStart official examples collection.
diff --git a/packages/create-solid/package.json b/packages/create-solid/package.json
index b0c223d..bb67865 100644
--- a/packages/create-solid/package.json
+++ b/packages/create-solid/package.json
@@ -1,8 +1,11 @@
{
- "name": "@solid-cli/create-solid",
- "version": "0.0.17",
- "description": "A stripped down Solid CLI just for creating new projects",
- "author": "Thomas Beer & Rahul Batra",
+ "name": "create-solid",
+ "version": "0.10.0",
+ "description": "Create Solid apps with low configuration",
+ "author": "Thomas Beer",
+ "contributors": [
+ "Rahul Batra"
+ ],
"license": "MIT",
"homepage": "https://solid-cli.netlify.app",
"repository": {
@@ -14,24 +17,24 @@
"solid",
"cli"
],
- "main": "dist/index.mjs",
+ "main": "./dist/index.mjs",
+ "module": "./dist/index.mjs",
"bin": {
- "create-solid": "./dist/index.mjs"
+ "create-solid": "./dist/bin.mjs"
},
"files": [
"dist"
],
"scripts": {
- "start": "jiti ./src/index.ts",
- "build": "tsc && tsup"
+ "start": "jiti ./src/bin.ts",
+ "build": "tsc && tsup",
+ "test": "vitest run"
},
"devDependencies": {
- "@solid-cli/commands": "workspace:*",
- "jiti": "^1.21.0",
- "tsup": "^8.0.2",
- "typescript": "^5.3.3",
- "@clack/prompts": "0.7.0",
- "picocolors": "^1.0.0"
+ "@clack/prompts": "1.7.0",
+ "picocolors": "^1.1.1",
+ "citty": "^0.2.2",
+ "@solid-cli/create": "workspace:*"
},
"publishConfig": {
"access": "public"
diff --git a/packages/create-solid/src/bin.ts b/packages/create-solid/src/bin.ts
new file mode 100644
index 0000000..5b848bd
--- /dev/null
+++ b/packages/create-solid/src/bin.ts
@@ -0,0 +1,11 @@
+#! /usr/bin/env node
+
+import { runMain } from "citty";
+import { createSolid } from "@solid-cli/create";
+import { intro } from "@clack/prompts";
+import color from "picocolors";
+import packageJson from "../package.json" with { type: "json" };
+
+intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`);
+
+runMain(createSolid(packageJson.version));
diff --git a/packages/create-solid/src/index.ts b/packages/create-solid/src/index.ts
deleted file mode 100644
index d34feeb..0000000
--- a/packages/create-solid/src/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-#! /usr/bin/env node
-import { handleNew } from "@solid-cli/commands/new";
-import color from "picocolors";
-import { intro } from "@clack/prompts";
-import { version } from "../package.json";
-intro(`\n${color.bgCyan(color.black(` Create-Solid v${version}`))}`);
-handleNew();
diff --git a/packages/create-solid/tsconfig.json b/packages/create-solid/tsconfig.json
index 55a0135..1115998 100644
--- a/packages/create-solid/tsconfig.json
+++ b/packages/create-solid/tsconfig.json
@@ -1,7 +1,5 @@
{
"compilerOptions": {
- "baseUrl": ".",
- "noEmit": true,
"module": "ESNext",
"target": "ESNext",
"moduleResolution": "Bundler",
@@ -9,7 +7,8 @@
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
- "resolveJsonModule": true
+ "resolveJsonModule": true,
+ "noEmit": true
},
"include": ["src/*"]
}
diff --git a/packages/create-solid/tsup.config.ts b/packages/create-solid/tsup.config.ts
index e0ff30c..ed15cdf 100644
--- a/packages/create-solid/tsup.config.ts
+++ b/packages/create-solid/tsup.config.ts
@@ -1,14 +1,13 @@
import { defineConfig } from "tsup";
export default defineConfig({
- entry: ["src/index.ts"],
+ entry: ["src/bin.ts"],
target: "esnext",
format: "esm",
- splitting: false,
+ splitting: true,
bundle: true,
sourcemap: false,
clean: true,
- noExternal: ["@solid-cli/commands"],
treeshake: true,
minify: true,
banner: {
diff --git a/packages/create/CHANGELOG.md b/packages/create/CHANGELOG.md
new file mode 100644
index 0000000..80a8250
--- /dev/null
+++ b/packages/create/CHANGELOG.md
@@ -0,0 +1,128 @@
+# @solid-cli/create
+
+## 0.10.0
+
+### Minor Changes
+
+- Always scaffold from the latest templates
+
+ - Template downloads are no longer pinned to a baked-in solidjs/templates commit. Scaffolds come from live HEAD of the default branch, matching the `templates.json` manifest, so upstream template changes and dependency repins reach users without a CLI release.
+ - Removed the `SOLID_CLI_TEMPLATES_REF` environment override that shipped in 0.9.0, along with the pin it existed to escape.
+ - HEAD is resolved to a commit sha before downloading so the tarball can be cached under it and reused by later scaffolds. That lookup goes through api.github.com, which is rate limited to 60 requests/hour for unauthenticated users, so any failure — rate limited, offline, slow — falls back to fetching HEAD from the archive endpoint directly, uncached.
+ - Solid 2.0 is labelled "Solid 2.0 (RC)" in the project picker now that Solid 2.0 core is a release candidate. It stays listed first but not preselected.
+
+## 0.9.0
+
+### Minor Changes
+
+- 68caa9f: Solid 2.0 template support
+
+ - New "Solid 2.0" top-level project type scaffolding the `solid-v2/*` templates from solidjs/templates (basic, bare, fullstack, fullstack-tanstack, with-\*). Listed first but not preselected while Solid 2.0 core is in beta; existing flags (`-s`, `-v`, `-l`, `--v2`) keep their meaning, plus new `--solid` and `--ssr` flags.
+ - Optional streaming SSR on templates that support it (currently `basic`): a scaffold-time flip that sets `ssr: true` in `vite.config.ts`, adds the generic production `server.js`, and points the `start` script at it. Defaults to No.
+ - JavaScript variants of the Solid 2.0 templates via the existing sucrase TS→JS conversion (no `index.html` rewrite; `.ts`/`.tsx` references inside `vite.config` are retargeted, `.d.ts` files dropped, minimal `jsconfig.json`).
+ - Template lists, subdir paths and per-template flags are now read from a `templates.json` manifest at the templates repo HEAD (2s timeout), with silent fallback to the baked-in lists — so new templates and future repo reorganizations no longer require a CLI release.
+
+## 0.8.1
+
+### Patch Changes
+
+- 5621942: SolidStart v2 is now Stable
+
+## 0.8.0
+
+### Minor Changes
+
+- support fetching without the github API (so fetching should no work when hitting the github api limit)
+
+### Patch Changes
+
+- Updated dependencies
+ - @solid-cli/utils@0.7.0
+
+## 0.6.14
+
+### Patch Changes
+
+- update dependencies and add to solid start v2 templates list
+- Updated dependencies
+ - @solid-cli/utils@0.6.3
+
+## 0.6.13
+
+### Patch Changes
+
+- Keep showing `pnpm install` & `pnpm dev` commands when initialising a project in the current working directory
+
+## 0.6.12
+
+### Patch Changes
+
+- Update dependencies, add new template, and remove `cd` command if project is created in working directory
+- Updated dependencies
+ - @solid-cli/utils@0.6.2
+
+## 0.6.11
+
+### Patch Changes
+
+- Rename `with-pages-router-file-based` to `with-vite-plugin-pages`
+
+## 0.6.10
+
+### Patch Changes
+
+- Fetch Vanilla templates from /vanilla subdirectory of solidjs/templates, rather than from repo root
+
+## 0.6.9
+
+### Patch Changes
+
+- Fetch Start templates from solidjs/templates, rather than the Start repo
+
+## 0.6.8
+
+### Patch Changes
+
+- Correctly perform TS->JS conversion by disabling ES transforms and preserving dynamic imports
+
+## 0.6.7
+
+### Patch Changes
+
+- Add `with-strict-csp` template to Start
+
+## 0.6.6
+
+### Patch Changes
+
+- Add CLI flags for creating `vanilla` and `library` projects
+
+## 0.6.5
+
+### Patch Changes
+
+- Don't add "Created with Solid CLI" text to README if it's already there
+
+## 0.6.4
+
+### Patch Changes
+
+- Update link in text added to project READMEs
+
+## 0.6.3
+
+### Patch Changes
+
+- Add more command line arguments
+
+## 0.6.1
+
+### Patch Changes
+
+- Fix regression from 0.5.x (.gitignore wasn't being written to new projects)
+
+## 0.6.0
+
+### Patch Changes
+
+- @solid-cli/utils@0.6.0
diff --git a/packages/create/README.md b/packages/create/README.md
new file mode 100644
index 0000000..74c4b75
--- /dev/null
+++ b/packages/create/README.md
@@ -0,0 +1,26 @@
+# @solid-cli/create
+
+A library for easily initialising Solid projects
+
+## Usage
+
+### Initialising a Vanilla project
+
+```ts
+import { createVanilla } from "@solid-cli/create";
+createVanilla({ template: "ts", destination: "./ts" });
+```
+
+### Initialising a Start project
+
+```ts
+import { createStart } from "@solid-cli/create";
+createStart({ template: "basic", destination: "./basic" });
+```
+
+### Initialising a Library project
+
+```ts
+import { createLibrary } from "@solid-cli/create";
+createLibrary({ destination: "./library-project" });
+```
diff --git a/packages/create/package.json b/packages/create/package.json
new file mode 100644
index 0000000..e745e00
--- /dev/null
+++ b/packages/create/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "@solid-cli/create",
+ "version": "0.10.0",
+ "description": "Create Solid apps with low configuration",
+ "author": "Thomas Beer",
+ "contributors": [
+ "Rahul Batra"
+ ],
+ "license": "MIT",
+ "homepage": "https://solid-cli.netlify.app",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/solidjs-community/solid-cli"
+ },
+ "keywords": [
+ "solidjs",
+ "solid",
+ "cli"
+ ],
+ "main": "./dist/index.mjs",
+ "module": "./dist/index.mjs",
+ "types": "./types/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./types/index.d.ts",
+ "import": "./dist/index.mjs",
+ "require": "./dist/index.mjs"
+ }
+ },
+ "files": [
+ "dist",
+ "types"
+ ],
+ "scripts": {
+ "start": "jiti ./src/bin.ts",
+ "build": "tsc && tsup",
+ "test": "vitest run"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "dependencies": {
+ "@clack/prompts": "1.7.0",
+ "picocolors": "^1.1.1",
+ "@begit/core": "^0.4.0",
+ "citty": "^0.2.2",
+ "sucrase": "^3.35.1",
+ "@solid-cli/utils": "workspace:*"
+ }
+}
diff --git a/packages/create/src/create-library.ts b/packages/create/src/create-library.ts
new file mode 100644
index 0000000..0366d98
--- /dev/null
+++ b/packages/create/src/create-library.ts
@@ -0,0 +1,14 @@
+import { downloadRepo, GithubFetcher } from "@begit/core";
+
+export type CreateLibraryArgs = {
+ destination: string;
+};
+export const createLibrary = ({ destination }: CreateLibraryArgs) => {
+ return downloadRepo(
+ {
+ repo: { owner: "solidjs-community", name: "solid-lib-starter" },
+ dest: destination,
+ },
+ GithubFetcher,
+ );
+};
diff --git a/packages/create/src/create-solid-v2.ts b/packages/create/src/create-solid-v2.ts
new file mode 100644
index 0000000..cfac554
--- /dev/null
+++ b/packages/create/src/create-solid-v2.ts
@@ -0,0 +1,63 @@
+import { join } from "node:path";
+import { existsSync, writeFileSync } from "node:fs";
+import { readFile, writeFile } from "node:fs/promises";
+import { handleTSConversion } from "./utils/ts-conversion";
+import { GIT_IGNORE, JS_CONFIG_SOLID_V2, SolidV2Template } from "./utils/constants";
+import { downloadTemplate } from "./utils/download";
+import { applySsrFlip } from "./utils/ssr-flip";
+
+export type CreateSolidV2Args = {
+ template: SolidV2Template | (string & {});
+ destination: string;
+ /** Subdir prefix inside the templates repo (from templates.json), defaults to "solid-v2" */
+ path?: string;
+};
+
+export const createSolidV2 = (args: CreateSolidV2Args, transpile?: boolean, ssr?: boolean) => {
+ if (transpile) {
+ return createSolidV2JS(args, ssr);
+ }
+ return createSolidV2TS(args, ssr);
+};
+
+export const createSolidV2TS = async ({ template, destination, path = "solid-v2" }: CreateSolidV2Args, ssr?: boolean) => {
+ await downloadTemplate(`${path}/${template}`, destination);
+ if (ssr) await applySsrFlip(destination);
+};
+
+/**
+ * Retarget `.ts`/`.tsx` filename mentions in converted text (vite config,
+ * README) to the transpiled `.js`/`.jsx` output. `.d.ts` files are deleted
+ * (not transpiled) by the conversion, so their mentions are left alone.
+ */
+export const retargetTSFilenames = (text: string) =>
+ text
+ .replace(/\.tsx\b/g, ".jsx")
+ .replace(/(? {
+ const deduped = [...new Set(entries.split(",").map((entry) => entry.trim()).filter(Boolean))];
+ return `extensions: [${deduped.join(", ")}]`;
+ });
+
+export const createSolidV2JS = async (args: CreateSolidV2Args, ssr?: boolean) => {
+ // Create typescript project in `/.project`
+ // then transpile this to javascript and clean up.
+ // The SSR flip runs inside the temp dir, before conversion, so the config
+ // edit happens on the `.ts` source (server.js is already plain JS).
+ const tempDir = join(args.destination, ".project");
+ await createSolidV2TS({ ...args, destination: tempDir }, ssr);
+ await handleTSConversion(tempDir, args.destination, JS_CONFIG_SOLID_V2);
+ // Solid 2.0 templates have no `index.html` (turnkey entries), but their vite
+ // config and README reference `.ts`/`.tsx` files (setup files, comments,
+ // route examples) — retarget those to the transpiled `.js`/`.jsx` output
+ for (const file of ["vite.config.js", "README.md"]) {
+ const filePath = join(args.destination, file);
+ if (existsSync(filePath)) {
+ await writeFile(filePath, retargetTSFilenames((await readFile(filePath)).toString()));
+ }
+ }
+ // Add .gitignore
+ writeFileSync(join(args.destination, ".gitignore"), GIT_IGNORE);
+};
diff --git a/packages/create/src/create-start.ts b/packages/create/src/create-start.ts
new file mode 100644
index 0000000..0b4bc29
--- /dev/null
+++ b/packages/create/src/create-start.ts
@@ -0,0 +1,33 @@
+import { join } from "path";
+import { writeFileSync } from "fs";
+import { handleTSConversion } from "./utils/ts-conversion";
+import { GIT_IGNORE, StartTemplate, StartTemplateV2 } from "./utils/constants";
+import { downloadTemplate } from "./utils/download";
+export type CreateStartArgs = {
+ template: StartTemplate | StartTemplateV2 | (string & {});
+ destination: string;
+ /** Subdir prefix inside the templates repo (from templates.json), defaults to "solid-start-v2"/"solid-start-v1" */
+ path?: string;
+};
+
+export const createStartTS = ({ template, destination, path }: CreateStartArgs, v2?: boolean) => {
+ const prefix = path ?? (v2 ? "solid-start-v2" : "solid-start-v1");
+ return downloadTemplate(`${prefix}/${template}`, destination);
+};
+
+export const createStartJS = async ({ template, destination, path }: CreateStartArgs, v2?: boolean) => {
+ // Create typescript project in `/.project`
+ // then transpile this to javascript and clean up
+ const tempDir = join(destination, ".project");
+ await createStartTS({ template, destination: tempDir, path }, v2);
+ await handleTSConversion(tempDir, destination);
+ // Add .gitignore
+ writeFileSync(join(destination, ".gitignore"), GIT_IGNORE);
+};
+
+export const createStart = (args: CreateStartArgs, transpile?: boolean, v2?: boolean) => {
+ if (transpile) {
+ return createStartJS(args, v2);
+ }
+ return createStartTS(args, v2);
+};
diff --git a/packages/create/src/create-vanilla.ts b/packages/create/src/create-vanilla.ts
new file mode 100644
index 0000000..a27d564
--- /dev/null
+++ b/packages/create/src/create-vanilla.ts
@@ -0,0 +1,36 @@
+import { join } from "node:path";
+import { writeFileSync } from "node:fs";
+import { readFile } from "node:fs/promises";
+import { handleTSConversion } from "./utils/ts-conversion";
+import { GIT_IGNORE, VanillaTemplate } from "./utils/constants";
+import { downloadTemplate } from "./utils/download";
+
+export type CreateVanillaArgs = {
+ template: VanillaTemplate | (string & {});
+ destination: string;
+ /** Subdir prefix inside the templates repo (from templates.json), defaults to "vanilla" */
+ path?: string;
+};
+export const createVanilla = (args: CreateVanillaArgs, transpile?: boolean) => {
+ if (transpile) {
+ return createVanillaJS(args);
+ }
+ return createVanillaTS(args);
+};
+
+export const createVanillaTS = async ({ template, destination, path = "vanilla" }: CreateVanillaArgs) => {
+ return await downloadTemplate(`${path}/${template}`, destination);
+};
+
+export const createVanillaJS = async ({ template, destination, path }: CreateVanillaArgs) => {
+ // Create typescript project in `/.project`
+ // then transpile this to javascript and clean up
+ const tempDir = join(destination, ".project");
+ await createVanillaTS({ template, destination: tempDir, path });
+ await handleTSConversion(tempDir, destination);
+ // Replace `index.tsx` with `index.jsx` in `index.html`
+ const indexPath = join(destination, "index.html");
+ writeFileSync(indexPath, (await readFile(indexPath)).toString().replace("index.tsx", "index.jsx"));
+ // Add .gitignore
+ writeFileSync(join(destination, ".gitignore"), GIT_IGNORE);
+};
diff --git a/packages/create/src/create.ts b/packages/create/src/create.ts
new file mode 100644
index 0000000..1fe7984
--- /dev/null
+++ b/packages/create/src/create.ts
@@ -0,0 +1,12 @@
+import { createStart, CreateStartArgs } from "./create-start";
+import { createVanilla, CreateVanillaArgs } from "./create-vanilla";
+
+export async function create(args: CreateVanillaArgs, js: boolean, isStart: false): Promise;
+export async function create(args: CreateStartArgs, js: boolean, isStart: true): Promise;
+export async function create(args: CreateVanillaArgs | CreateStartArgs, js: boolean, isStart: boolean) {
+ if (isStart) {
+ return createStart(args as CreateStartArgs, js);
+ } else {
+ return createVanilla(args as CreateVanillaArgs, js);
+ }
+}
diff --git a/packages/create/src/index.ts b/packages/create/src/index.ts
new file mode 100644
index 0000000..624bf2a
--- /dev/null
+++ b/packages/create/src/index.ts
@@ -0,0 +1,247 @@
+import { defineCommand } from "citty";
+import { createVanilla } from "./create-vanilla";
+import * as p from "@clack/prompts";
+import { cancelable, spinnerify } from "@solid-cli/utils/ui";
+import { createStart } from "./create-start";
+import { createSolidV2 } from "./create-solid-v2";
+import { GIT_IGNORE, isValidTemplate, LIBRARY_TEMPLATES, PROJECT_TYPES, ProjectType } from "./utils/constants";
+import { fetchTemplatesManifest, groupKeyFor, ManifestTemplate, resolveGroup } from "./utils/manifest";
+import { detectPackageManager } from "@solid-cli/utils/package-manager";
+import { existsSync, writeFileSync } from "node:fs";
+import { join } from "node:path";
+import { createLibrary } from "./create-library";
+import { readFile, writeFile } from "node:fs/promises";
+export { createVanilla, createStart, createLibrary, createSolidV2 };
+
+const PROJECT_TYPE_LABELS: Record = {
+ solid: "Solid 2.0 (RC)",
+ start: "SolidStart (Solid 1.x)",
+ vanilla: "SolidJS + Vite (Solid 1.x)",
+ library: "Library",
+};
+
+export const createSolid = (version: string) =>
+ defineCommand({
+ meta: {
+ name: "create-solid",
+ description: "A CLI for scaffolding new Solid projects",
+ version: version,
+ },
+ args: {
+ "projectNamePositional": {
+ type: "positional",
+ required: false,
+ description: "Project name",
+ },
+ "templatePositional": {
+ type: "positional",
+ required: false,
+ description: "Template name",
+ },
+ "project-name": {
+ type: "string",
+ required: false,
+ alias: "p",
+ description: "Project name",
+ },
+ "template": {
+ type: "string",
+ required: false,
+ alias: "t",
+ description: "Template name",
+ },
+ "solid": {
+ type: "boolean",
+ required: false,
+ description: "Create a Solid 2.0 project",
+ },
+ "solidstart": {
+ type: "boolean",
+ required: false,
+ alias: "s",
+ description: "Create a SolidStart project",
+ },
+ "v2": {
+ type: "boolean",
+ required: false,
+ description: "Create a SolidStart v2 project",
+ },
+ "library": {
+ type: "boolean",
+ required: false,
+ alias: "l",
+ description: "Create a Library project",
+ },
+ "vanilla": {
+ type: "boolean",
+ required: false,
+ alias: "v",
+ description: "Create a vanilla (SolidJS + Vite) project",
+ },
+ "ssr": {
+ type: "boolean",
+ required: false,
+ description: "Enable server-side rendering (Solid 2.0 templates that support it)",
+ },
+ "ts": {
+ type: "boolean",
+ required: false,
+ description: "Use typescript",
+ },
+ "js": {
+ type: "boolean",
+ required: false,
+ description: "Use javascript",
+ },
+ },
+ async run({
+ args: {
+ projectNamePositional,
+ templatePositional,
+ "project-name": projectNameOptional,
+ "template": templateOptional,
+ solid,
+ solidstart,
+ library,
+ vanilla,
+ ssr,
+ ts,
+ js,
+ v2,
+ },
+ }) {
+ // Show prompts for any unknown arguments
+ let projectName = projectNamePositional ?? projectNameOptional;
+ let template = templatePositional ?? templateOptional;
+ let projectType: ProjectType | undefined = solid
+ ? "solid"
+ : solidstart
+ ? "start"
+ : vanilla
+ ? "vanilla"
+ : library
+ ? "library"
+ : undefined;
+ // False if user has selected ts, true if they have selected js, and undefined if they've done neither
+ let useJS = ts ? !ts : js ? js : undefined;
+ // Live template lists/paths from the templates repo; undefined falls back to the baked-in lists
+ const manifest = await fetchTemplatesManifest();
+ projectName ??= await cancelable(
+ p.text({ message: "Project Name", placeholder: "solid-project", defaultValue: "solid-project" }),
+ );
+ projectType ??= await cancelable(
+ p.select({
+ message: "What type of project would you like to create?",
+ // Solid 2.0 is listed first but not preselected while core is a release candidate
+ initialValue: "start",
+ options: PROJECT_TYPES.map((t) => ({
+ value: t,
+ label: PROJECT_TYPE_LABELS[t],
+ })),
+ }),
+ );
+ if (!projectType) return;
+
+ let useV2: string | undefined;
+ if (projectType === "start") {
+ useV2 = v2
+ ? "v2"
+ : await cancelable(
+ p.select({
+ message: "Which version of SolidStart?",
+ initialValue: "v2",
+ options: [
+ { value: "v2", label: "2 (Stable)" },
+ { value: "v1", label: "1 (Legacy)" },
+ ],
+ }),
+ );
+ }
+ const isV2 = useV2 === "v2";
+
+ // Don't offer javascript if `projectType` is library
+ useJS ??= projectType === "library" ? false : !(await cancelable(p.confirm({ message: "Use Typescript?" })));
+
+ if (!projectType) return;
+ const group = projectType === "library" ? undefined : resolveGroup(manifest, groupKeyFor(projectType, isV2));
+ const template_opts: ManifestTemplate[] = group
+ ? group.templates
+ : LIBRARY_TEMPLATES.map((name) => ({ name }));
+ template ??= await cancelable(
+ p.select({
+ message: "Which template would you like to use?",
+ initialValue: (template_opts.find((t) => t.default) ?? template_opts[0])?.name,
+ options: template_opts
+ .filter((t) => (useJS ? t : !t.name.startsWith("js")))
+ .map((t) => ({ label: t.name, value: t.name })),
+ }),
+ );
+
+ if (!template) return;
+ const chosenTemplate = template_opts.find((t) => t.name === template);
+
+ // SSR flip: only offered on Solid 2.0 templates that support it (e.g. "basic")
+ let enableSSR = false;
+ if (projectType === "solid" && chosenTemplate?.ssrToggle) {
+ enableSSR =
+ ssr ??
+ (await cancelable(
+ p.confirm({ message: "Enable server-side rendering (streaming SSR)?", initialValue: false }),
+ ));
+ } else if (ssr) {
+ p.log.warn(`--ssr is not supported for this template and will be ignored`);
+ }
+
+ // Need to transpile if the user wants Jabascript, but their selected template isn't Javascript
+ const transpileToJS = useJS && !template.startsWith("js");
+ if (projectType === "solid" && chosenTemplate) {
+ await spinnerify({
+ startText: "Creating project",
+ finishText: "Project created 🎉",
+ fn: () => createSolidV2({ template, destination: projectName, path: group?.path }, transpileToJS, enableSSR),
+ });
+ } else if (projectType === "start" && chosenTemplate) {
+ await spinnerify({
+ startText: "Creating project",
+ finishText: "Project created 🎉",
+ fn: () => createStart({ template, destination: projectName, path: group?.path }, transpileToJS, isV2),
+ });
+ } else if (projectType === "library" && isValidTemplate("library", template)) {
+ await spinnerify({
+ startText: "Creating project",
+ finishText: "Project created 🎉",
+ fn: () => createLibrary({ destination: projectName }),
+ });
+ } else if (projectType === "vanilla" && chosenTemplate) {
+ await spinnerify({
+ startText: "Creating project",
+ finishText: "Project created 🎉",
+ fn: () => createVanilla({ template, destination: projectName, path: group?.path }, transpileToJS),
+ });
+ } else {
+ p.log.error(`Template ${template} is not valid for project type ${projectType}`);
+ process.exit(0);
+ }
+ // Add .gitignore
+ writeFileSync(join(projectName, ".gitignore"), GIT_IGNORE);
+ // Add "Created with Solid CLI" text to bottom of README
+ const readmePath = `${projectName}/README.md`;
+ if (existsSync(readmePath)) {
+ const contents = (await readFile(readmePath)).toString();
+ if (!contents.includes("This project was created with the [Solid CLI]"))
+ await writeFile(
+ readmePath,
+ contents +
+ "\n## This project was created with the [Solid CLI](https://github.com/solidjs-community/solid-cli)\n",
+ );
+ }
+ // Next steps..
+ const pM = detectPackageManager();
+ p.note(
+ (projectName === "." ? "" : `cd ${projectName}\n`) +
+ `${pM.name} install
+${pM.name} ${pM.runScriptCommand("dev")}`,
+ "To get started, run:",
+ );
+ },
+ });
diff --git a/packages/create/src/utils/constants.ts b/packages/create/src/utils/constants.ts
new file mode 100644
index 0000000..6a0ecb6
--- /dev/null
+++ b/packages/create/src/utils/constants.ts
@@ -0,0 +1,184 @@
+export const GIT_IGNORE = `dist
+.wrangler
+.output
+.vercel
+.netlify
+.vinxi
+app.config.timestamp_*.js
+
+# Environment
+.env
+.env*.local
+
+# dependencies
+/node_modules
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+*.launch
+.settings/
+
+# Temp
+gitignore
+
+# System Files
+.DS_Store
+Thumbs.db
+`;
+
+export const JS_CONFIG = {
+ compilerOptions: {
+ jsx: "preserve",
+ jsxImportSource: "solid-js",
+ paths: {
+ "~/*": ["./src/*"],
+ },
+ },
+};
+
+// The solid-v2 templates don't use the `~/*` path alias, and Solid 2.0's JSX
+// runtime lives in `@solidjs/web` (matches the templates' tsconfig.json)
+export const JS_CONFIG_SOLID_V2 = {
+ compilerOptions: {
+ jsx: "preserve",
+ jsxImportSource: "@solidjs/web",
+ },
+};
+
+// Supported templates
+
+/**Supported Vanilla Templates */
+export const VANILLA_TEMPLATES = [
+ "basic",
+ "bare",
+ "with-vitest",
+ "with-uvu",
+ "with-unocss",
+ "with-tailwindcss",
+ "with-sass",
+ "with-solid-router",
+ "with-vite-plugin-pages",
+ "with-tanstack-router-config-based",
+ "with-tanstack-router-file-based",
+ "with-tanstack-start",
+ "with-jest",
+ "with-bootstrap",
+] as const satisfies string[];
+export type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number];
+
+/**
+ * @description This list is hardcoded. But templates are fetched from another github repo.
+ * @see https://github.com/solidjs/templates/tree/main/solid-start
+ */
+export const START_TEMPLATES = [
+ "basic",
+ "bare",
+ "with-solidbase",
+ "with-auth",
+ "with-authjs",
+ "with-drizzle",
+ "with-mdx",
+ "with-prisma",
+ "with-solid-styled",
+ "with-tailwindcss",
+ "with-tanstack-router",
+ "with-trpc",
+ "with-unocss",
+ "with-vitest",
+ "with-strict-csp",
+] as const satisfies string[];
+
+export type StartTemplate = (typeof START_TEMPLATES)[number];
+
+export const START_TEMPLATES_V2 = [
+ "basic",
+ "bare",
+ "with-auth",
+ "with-authjs",
+ "with-drizzle",
+ "with-mdx",
+ "with-prisma",
+ "with-solid-styled",
+ "with-solidbase",
+ "with-strict-csp",
+ "with-tailwindcss",
+ "with-trpc",
+ "with-unocss",
+ "with-vitest",
+] as const satisfies string[];
+
+export type StartTemplateV2 = (typeof START_TEMPLATES_V2)[number];
+
+/**
+ * Solid 2.0 templates (templates repo: `solid-v2/`)
+ * @see https://github.com/solidjs/templates/tree/main/solid-v2
+ */
+export const SOLID_V2_TEMPLATES = [
+ "basic",
+ "bare",
+ "fullstack",
+ "fullstack-tanstack",
+ "with-bootstrap",
+ "with-sass",
+ "with-tailwindcss",
+ "with-tanstack-router",
+ "with-unocss",
+ "with-vitest-browser-mode",
+] as const satisfies string[];
+export type SolidV2Template = (typeof SOLID_V2_TEMPLATES)[number];
+
+/**Supported Library Templates */
+export const LIBRARY_TEMPLATES = ["solid-lib-starter"] as const satisfies string[];
+export type LibraryTemplate = (typeof LIBRARY_TEMPLATES)[number];
+
+// "solid" (Solid 2.0) is listed first, but "start" remains the preselected
+// default while Solid 2.0 core is a release candidate
+export const PROJECT_TYPES = ["solid", "start", "vanilla", "library"] as const satisfies string[];
+export type ProjectType = (typeof PROJECT_TYPES)[number];
+
+/**
+ * Fetches the template list for the project type given
+ * @param projectType type of project
+ */
+export function getTemplatesList(projectType: "vanilla", v2?: boolean): VanillaTemplate[];
+export function getTemplatesList(projectType: "solid", v2?: boolean): SolidV2Template[];
+export function getTemplatesList(projectType: "start", v2?: boolean): StartTemplate[] | StartTemplateV2[];
+export function getTemplatesList(projectType: "library", v2?: boolean): LibraryTemplate[];
+export function getTemplatesList(
+ projectType: ProjectType,
+ v2?: boolean,
+): VanillaTemplate[] | SolidV2Template[] | StartTemplate[] | StartTemplateV2[] | LibraryTemplate[];
+export function getTemplatesList(projectType: ProjectType, v2?: boolean) {
+ if (projectType === "solid") {
+ return SOLID_V2_TEMPLATES as unknown as SolidV2Template[];
+ } else if (projectType === "start") {
+ if (v2) {
+ return START_TEMPLATES_V2 as unknown as StartTemplateV2[];
+ }
+ return START_TEMPLATES as StartTemplate[];
+ } else if (projectType === "library") {
+ return LIBRARY_TEMPLATES as LibraryTemplate[];
+ }
+ return VANILLA_TEMPLATES as VanillaTemplate[];
+}
+
+/**
+ * Tests is the template given is a valid template, and returns it as a template if it is
+ * @param type expected type of the template
+ * @param maybe_template the template string to test
+ * @returns the template string if it is valid, undefined if not
+ */
+export function isValidTemplate(type: "vanilla", maybe_template: string): maybe_template is VanillaTemplate;
+export function isValidTemplate(type: "solid", maybe_template: string): maybe_template is SolidV2Template;
+export function isValidTemplate(
+ type: "start",
+ maybe_template: string,
+ v2?: boolean,
+): maybe_template is StartTemplate | StartTemplateV2;
+export function isValidTemplate(type: "library", maybe_template: string): maybe_template is LibraryTemplate;
+export function isValidTemplate(type: ProjectType, maybe_template: string, v2?: boolean) {
+ const templates = getTemplatesList(type, v2);
+ return templates.find((t) => t === maybe_template) !== undefined;
+}
diff --git a/packages/create/src/utils/download.ts b/packages/create/src/utils/download.ts
new file mode 100644
index 0000000..93fc918
--- /dev/null
+++ b/packages/create/src/utils/download.ts
@@ -0,0 +1,54 @@
+import { downloadRepo, GithubFetcher } from "@begit/core";
+
+export const TEMPLATES_REPO = { owner: "solidjs", name: "templates" } as const;
+
+/** A slow commit lookup must not hold up a scaffold — it is only there to enable caching */
+const LATEST_COMMIT_TIMEOUT_MS = 2000;
+
+/**
+ * Resolves HEAD of the templates repo to a commit sha, so begit can key its
+ * tarball cache on it and reuse the download across scaffolds.
+ *
+ * This goes through api.github.com, which is rate limited to 60 requests/hour
+ * for unauthenticated users (the archive endpoint the tarball itself comes from
+ * is not). Every failure — rate limited, offline, timeout, unexpected payload —
+ * resolves to `undefined`, and the caller falls back to fetching HEAD directly.
+ */
+export const latestTemplatesCommit = async (): Promise => {
+ const lookup = (async () => {
+ try {
+ return await GithubFetcher.fetchLatestCommit(TEMPLATES_REPO);
+ } catch {
+ return undefined;
+ }
+ })();
+ let timer: ReturnType;
+ const timeout = new Promise((resolve) => {
+ timer = setTimeout(() => resolve(undefined), LATEST_COMMIT_TIMEOUT_MS);
+ });
+ return Promise.race([lookup, timeout]).finally(() => clearTimeout(timer));
+};
+
+/**
+ * Downloads `subdir` of the solidjs/templates repo into `destination`.
+ *
+ * No ref is pinned: scaffolds always come from live HEAD of the default branch,
+ * matching the `templates.json` manifest, so template updates reach users
+ * without a CLI release. HEAD is resolved to a sha first so begit can cache the
+ * tarball under it and skip the download next time; when that lookup fails we
+ * fetch HEAD directly instead, uncached — slower, but never a broken scaffold.
+ */
+export const downloadTemplate = async (subdir: string, destination: string) => {
+ const hash = await latestTemplatesCommit();
+ return downloadRepo(
+ {
+ repo: { ...TEMPLATES_REPO, subdir, hash },
+ dest: destination,
+ // HEAD is already resolved (or deliberately left unresolved) above, so begit
+ // must not call the API itself. Without a sha there is nothing to key a cache
+ // entry on, so the tarball is discarded rather than left behind unkeyed.
+ opts: { cache: !!hash, fetch_latest_commit: false },
+ },
+ GithubFetcher,
+ );
+};
diff --git a/packages/create/src/utils/file-system.ts b/packages/create/src/utils/file-system.ts
new file mode 100644
index 0000000..c17c0f9
--- /dev/null
+++ b/packages/create/src/utils/file-system.ts
@@ -0,0 +1,17 @@
+import { Dirent, readdirSync } from "node:fs";
+import { readFile } from "node:fs/promises";
+import { resolve } from "node:path";
+
+export const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => {
+ startPath = resolve(startPath);
+
+ const files = readdirSync(startPath, { withFileTypes: true });
+
+ for (const file of files) {
+ cb(file, startPath);
+ }
+};
+
+export const readFileToString = async (path: string) => {
+ return (await readFile(path)).toString();
+};
diff --git a/packages/create/src/utils/manifest.ts b/packages/create/src/utils/manifest.ts
new file mode 100644
index 0000000..6855e68
--- /dev/null
+++ b/packages/create/src/utils/manifest.ts
@@ -0,0 +1,119 @@
+import {
+ SOLID_V2_TEMPLATES,
+ START_TEMPLATES,
+ START_TEMPLATES_V2,
+ VANILLA_TEMPLATES,
+ ProjectType,
+} from "./constants";
+
+/**
+ * `templates.json` manifest published at the root of the solidjs/templates repo.
+ * When reachable, it is the source of truth for template names, subdir paths and
+ * per-template flags, so the templates repo can add/reorganize templates without
+ * requiring a CLI release. The baked-in lists in `constants.ts` are the fallback.
+ */
+export type ManifestTemplate = {
+ name: string;
+ /** Preselected in the template prompt */
+ default?: boolean;
+ /** Offer the "Enable server-side rendering?" prompt for this template */
+ ssrToggle?: boolean;
+};
+
+export type ManifestGroup = {
+ label?: string;
+ /** Subdir prefix inside the templates repo, e.g. "solid-v2" */
+ path: string;
+ status?: string;
+ templates: ManifestTemplate[];
+};
+
+export type TemplatesManifest = {
+ version: number;
+ groups: Record;
+};
+
+/** Manifest groups the CLI understands (library comes from a different repo and stays baked-in) */
+export type ManifestGroupKey = "solid" | "start-v2" | "start-v1" | "vanilla";
+
+export const MANIFEST_URL = "https://raw.githubusercontent.com/solidjs/templates/HEAD/templates.json";
+const MANIFEST_TIMEOUT_MS = 2000;
+
+const asTemplates = (names: readonly string[], defaultName?: string, ssrToggle?: string): ManifestTemplate[] =>
+ names.map((name) => ({
+ name,
+ ...(name === defaultName ? { default: true } : {}),
+ ...(name === ssrToggle ? { ssrToggle: true } : {}),
+ }));
+
+/** Baked-in fallback, used whenever the manifest can't be fetched or parsed */
+export const BAKED_GROUPS: Record = {
+ "solid": {
+ label: "Solid 2.0",
+ path: "solid-v2",
+ templates: asTemplates(SOLID_V2_TEMPLATES, "basic", "basic"),
+ },
+ "start-v2": {
+ label: "SolidStart 2",
+ path: "solid-start-v2",
+ templates: asTemplates(START_TEMPLATES_V2, "basic"),
+ },
+ "start-v1": {
+ label: "SolidStart 1",
+ path: "solid-start-v1",
+ templates: asTemplates(START_TEMPLATES, "basic"),
+ },
+ "vanilla": {
+ label: "SolidJS + Vite",
+ path: "vanilla",
+ templates: asTemplates(VANILLA_TEMPLATES, "basic"),
+ },
+};
+
+/**
+ * Validates an untrusted parsed JSON value into a `TemplatesManifest`.
+ * Returns `undefined` for anything unusable (unknown major version, wrong shape),
+ * dropping malformed groups/entries rather than failing outright.
+ */
+export const parseManifest = (raw: unknown): TemplatesManifest | undefined => {
+ if (!raw || typeof raw !== "object") return undefined;
+ const manifest = raw as TemplatesManifest;
+ if (manifest.version !== 1) return undefined;
+ if (!manifest.groups || typeof manifest.groups !== "object") return undefined;
+ const groups: Record = {};
+ for (const [key, group] of Object.entries(manifest.groups)) {
+ if (!group || typeof group !== "object") continue;
+ if (typeof group.path !== "string" || !Array.isArray(group.templates)) continue;
+ const templates = group.templates.filter(
+ (t): t is ManifestTemplate => !!t && typeof t === "object" && typeof t.name === "string",
+ );
+ if (templates.length === 0) continue;
+ groups[key] = { ...group, templates };
+ }
+ if (Object.keys(groups).length === 0) return undefined;
+ return { version: 1, groups };
+};
+
+/**
+ * Fetches the live manifest from the templates repo (HEAD, small file, short timeout).
+ * Any failure — offline, timeout, 404, malformed JSON, unknown version — resolves to
+ * `undefined` so callers silently fall back to the baked-in lists.
+ */
+export const fetchTemplatesManifest = async (): Promise => {
+ try {
+ const url = process.env.SOLID_CLI_TEMPLATES_MANIFEST_URL || MANIFEST_URL;
+ const res = await fetch(url, { signal: AbortSignal.timeout(MANIFEST_TIMEOUT_MS) });
+ if (!res.ok) return undefined;
+ return parseManifest(await res.json());
+ } catch {
+ return undefined;
+ }
+};
+
+/** Maps the CLI's project type (+ SolidStart version) to a manifest group key */
+export const groupKeyFor = (projectType: Exclude, startV2?: boolean): ManifestGroupKey =>
+ projectType === "start" ? (startV2 ? "start-v2" : "start-v1") : projectType;
+
+/** Resolves a group from the manifest, falling back to the baked-in lists */
+export const resolveGroup = (manifest: TemplatesManifest | undefined, key: ManifestGroupKey): ManifestGroup =>
+ manifest?.groups[key] ?? BAKED_GROUPS[key];
diff --git a/packages/create/src/utils/ssr-flip.ts b/packages/create/src/utils/ssr-flip.ts
new file mode 100644
index 0000000..08b59d6
--- /dev/null
+++ b/packages/create/src/utils/ssr-flip.ts
@@ -0,0 +1,133 @@
+import { existsSync } from "node:fs";
+import { readFile, writeFile } from "node:fs/promises";
+import { join } from "node:path";
+import { log } from "@clack/prompts";
+
+/**
+ * Flips a client-mode Solid 2.0 template (e.g. `solid-v2/basic`) into streaming SSR.
+ * The delta to the `solid-v2/fullstack` template's server posture is exactly three files:
+ * 1. `vite.config.ts` — add `ssr: true` to the `solid({ start: true, ... })` call
+ * 2. `server.js` — the generic production node server (verbatim from `solid-v2/fullstack`)
+ * 3. `package.json` — point the `start` script at that server
+ */
+
+export const SSR_ANCHOR = "solid({ start: true";
+/** The template documents the flip with this hint; drop it once the flip is applied */
+export const SSR_HINT_COMMENT = " // add `ssr: true` for streaming SSR";
+export const SSR_START_SCRIPT = "node --env-file-if-exists=.env server.js";
+
+/**
+ * Production node server for turnkey SSR apps. Verbatim copy of
+ * `solid-v2/fullstack/server.js` from the templates repo — fully generic: it only
+ * imports node builtins plus the built server bundle's `handleRequest`.
+ * Regenerate with `node scripts/gen-ssr-flip-server.mjs `
+ * when the template changes.
+ */
+// @generated-server-js-start
+export const SERVER_JS = `// The entire production server for a turnkey SSR app: static client assets
+// plus one import — the built server bundle's \`handleRequest\`, an
+// adapter-agnostic web \`Request -> Response\` handler that streams the SSR
+// render, resolves hashed client assets through the build manifest, and
+// (with serverFunctions enabled) serves the \`/_server\` endpoint too. The
+// node <-> web plumbing below is the only glue; on a web-native platform
+// (workers, Deno, Bun.serve) \`handleRequest\` is used directly.
+import { createServer } from 'node:http';
+import { readFileSync } from 'node:fs';
+import { Readable } from 'node:stream';
+import { fileURLToPath } from 'node:url';
+import path from 'node:path';
+import { handleRequest } from './dist/server/server.js';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+const port = process.env.PORT || 3000;
+
+const MIME = {
+ '.js': 'application/javascript',
+ '.css': 'text/css',
+ '.html': 'text/html',
+ '.json': 'application/json',
+ '.ico': 'image/x-icon',
+ '.svg': 'image/svg+xml',
+};
+
+function webRequest(req) {
+ const url = new URL(req.url || '/', \`http://\${req.headers.host || \`localhost:\${port}\`}\`);
+ const method = req.method || 'GET';
+ const body = method === 'GET' || method === 'HEAD' ? undefined : Readable.toWeb(req);
+ return new Request(url, {
+ method,
+ headers: req.headers,
+ body,
+ ...(body ? { duplex: 'half' } : {}),
+ });
+}
+
+const server = createServer(async (req, res) => {
+ const url = req.url || '/';
+
+ // Static client assets first.
+ if (url !== '/' && !url.includes('..')) {
+ try {
+ const content = readFileSync(path.resolve(__dirname, 'dist/client' + url.split('?')[0]));
+ res.setHeader('Content-Type', MIME[path.extname(url)] || 'application/octet-stream');
+ res.end(content);
+ return;
+ } catch {
+ // Fall through to the handler (SSR routes, /_server, ...).
+ }
+ }
+
+ try {
+ const response = await handleRequest(webRequest(req));
+ res.statusCode = response.status;
+ const cookies = response.headers.getSetCookie?.();
+ response.headers.forEach((value, key) => {
+ if (key !== 'set-cookie') res.setHeader(key, value);
+ });
+ if (cookies?.length) res.setHeader('set-cookie', cookies);
+ if (response.body) {
+ for await (const chunk of response.body) res.write(chunk);
+ }
+ res.end();
+ } catch (e) {
+ console.error(e);
+ res.statusCode = 500;
+ res.end(e.message);
+ }
+});
+
+server.listen(port, () => {
+ console.log(\`Server running at http://localhost:\${port}\`);
+});
+`;
+// @generated-server-js-end
+
+/**
+ * Applies the SSR flip to a scaffolded template directory (before any TS→JS conversion,
+ * so the config edit happens on the `.ts` source).
+ *
+ * If the `vite.config.ts` anchor is missing (template drifted), the flip is aborted
+ * with a warning instead of writing a broken config, leaving a working client-mode app.
+ */
+export const applySsrFlip = async (dir: string): Promise => {
+ const viteConfigPath = join(dir, "vite.config.ts");
+ const abort = (reason: string) => {
+ log.warn(`Skipping SSR setup: ${reason}. The project was created in client mode.`);
+ return false;
+ };
+ if (!existsSync(viteConfigPath)) return abort("no vite.config.ts found");
+ const viteConfig = (await readFile(viteConfigPath)).toString();
+ if (!viteConfig.includes(SSR_ANCHOR)) return abort("unrecognized vite.config.ts");
+
+ await writeFile(
+ viteConfigPath,
+ viteConfig.replace(SSR_ANCHOR, `${SSR_ANCHOR}, ssr: true`).replace(SSR_HINT_COMMENT, ""),
+ );
+ await writeFile(join(dir, "server.js"), SERVER_JS);
+
+ const packageJsonPath = join(dir, "package.json");
+ const packageJson = JSON.parse((await readFile(packageJsonPath)).toString());
+ packageJson.scripts = { ...packageJson.scripts, start: SSR_START_SCRIPT };
+ await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n");
+ return true;
+};
diff --git a/packages/create/src/utils/ts-conversion.ts b/packages/create/src/utils/ts-conversion.ts
new file mode 100644
index 0000000..e0bd5a0
--- /dev/null
+++ b/packages/create/src/utils/ts-conversion.ts
@@ -0,0 +1,43 @@
+import { copyFileSync, Dirent, mkdirSync, writeFileSync } from "node:fs";
+import { readFileToString, recurseFiles } from "./file-system";
+import { join, resolve } from "node:path";
+import { transform } from "sucrase";
+import { rm } from "node:fs/promises";
+import { JS_CONFIG } from "./constants";
+
+const convertToJS = async (file: Dirent, startPath: string) => {
+ const src = join(startPath, file.name);
+ const dest = resolve(startPath.replace(".project", ""), file.name);
+ if (file.isDirectory()) {
+ mkdirSync(dest, { recursive: true });
+ recurseFiles(resolve(startPath, file.name), convertToJS);
+ } else if (file.isFile()) {
+ if (src.endsWith(".d.ts")) {
+ // Type declarations have no JS counterpart
+ } else if (src.endsWith(".ts") || src.endsWith(".tsx")) {
+ let { code } = transform(await readFileToString(src), {
+ transforms: ["typescript", "jsx"],
+ jsxRuntime: "preserve",
+ disableESTransforms: true,
+ preserveDynamicImport: true,
+ });
+
+ writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" });
+ } else {
+ copyFileSync(src, dest);
+ }
+ }
+};
+export const handleTSConversion = async (tempDir: string, projectName: string, jsConfig: object = JS_CONFIG) => {
+ await rm(resolve(tempDir, "tsconfig.json"));
+ writeFileSync(resolve(projectName, "jsconfig.json"), JSON.stringify(jsConfig, null, 2), { flag: "wx" });
+
+ // Convert all ts files in temp directory into js
+ recurseFiles(tempDir, convertToJS);
+
+ // Remove temp directory
+ await rm(join(process.cwd(), tempDir), {
+ recursive: true,
+ force: true,
+ });
+};
diff --git a/packages/create/tests/download.test.ts b/packages/create/tests/download.test.ts
new file mode 100644
index 0000000..703e386
--- /dev/null
+++ b/packages/create/tests/download.test.ts
@@ -0,0 +1,38 @@
+import { afterEach, expect, it, vi } from "vitest";
+import { GithubFetcher } from "@begit/core";
+import { latestTemplatesCommit } from "../src/utils/download";
+
+afterEach(() => {
+ vi.restoreAllMocks();
+ vi.useRealTimers();
+});
+
+it("resolves HEAD to a sha so begit can cache the tarball under it", async () => {
+ vi.spyOn(GithubFetcher, "fetchLatestCommit").mockResolvedValue("c3032d9");
+
+ expect(await latestTemplatesCommit()).toBe("c3032d9");
+});
+
+it("falls back to no sha when the commit lookup throws", async () => {
+ // Offline, DNS failure, or a non-JSON response from the API
+ vi.spyOn(GithubFetcher, "fetchLatestCommit").mockRejectedValue(new Error("fetch failed"));
+
+ expect(await latestTemplatesCommit()).toBeUndefined();
+});
+
+it("falls back to no sha when the API answers without one", async () => {
+ // What a rate-limited response looks like by the time begit is done with it
+ vi.spyOn(GithubFetcher, "fetchLatestCommit").mockResolvedValue(undefined);
+
+ expect(await latestTemplatesCommit()).toBeUndefined();
+});
+
+it("falls back to no sha rather than letting a hanging lookup block the scaffold", async () => {
+ vi.useFakeTimers();
+ vi.spyOn(GithubFetcher, "fetchLatestCommit").mockReturnValue(new Promise(() => {}));
+
+ const resolved = latestTemplatesCommit();
+ await vi.advanceTimersByTimeAsync(2000);
+
+ expect(await resolved).toBeUndefined();
+});
diff --git a/packages/create/tests/fixtures/solid-v2-basic/package.json b/packages/create/tests/fixtures/solid-v2-basic/package.json
new file mode 100644
index 0000000..8e3b105
--- /dev/null
+++ b/packages/create/tests/fixtures/solid-v2-basic/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "example-basic",
+ "version": "0.0.0",
+ "description": "",
+ "type": "module",
+ "scripts": {
+ "start": "vite",
+ "dev": "vite",
+ "build": "vite build",
+ "serve": "vite preview",
+ "test": "vitest"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "@solidjs/testing-library": "1.0.0-beta.2",
+ "@solidjs/vite-plugin": "^3.0.0-next.28",
+ "@testing-library/jest-dom": "^6.6.3",
+ "filesystem-routing": "0.2.1",
+ "jsdom": "^25.0.1",
+ "typescript": "^5.9.2",
+ "vite": "^8.1.5",
+ "vitest": "^4.0.0"
+ },
+ "dependencies": {
+ "@solidjs/meta": "^1.0.0-next.2",
+ "@solidjs/router": "^2.0.0-next.16",
+ "@solidjs/web": "^2.0.0-rc.0",
+ "solid-js": "^2.0.0-rc.0"
+ }
+}
diff --git a/packages/create/tests/fixtures/solid-v2-basic/vite.config.ts b/packages/create/tests/fixtures/solid-v2-basic/vite.config.ts
new file mode 100644
index 0000000..683f1c7
--- /dev/null
+++ b/packages/create/tests/fixtures/solid-v2-basic/vite.config.ts
@@ -0,0 +1,32 @@
+import { fileRoutes } from 'filesystem-routing/vite';
+import { defineConfig } from 'vitest/config';
+import solid from '@solidjs/vite-plugin';
+
+export default defineConfig({
+ // Turnkey client mode: no index.html and no mount file — the plugin
+ // generates the entries around src/App.tsx, wrapped in src/Document.tsx
+ // (or a built-in shell). `vite build` prerenders the shell into
+ // dist/client/index.html and emits a purely static dist/client.
+ plugins: [
+ // `extensions` makes @solidjs/vite-plugin also compile the `?pick=` route
+ // modules the fileRoutes plugin emits (their ids end in a query string).
+ solid({ start: true, extensions: ['.jsx', '.tsx'] }), // add `ssr: true` for streaming SSR
+ fileRoutes(),
+ ],
+ server: {
+ port: 3000,
+ },
+ test: {
+ environment: 'jsdom',
+ globals: false,
+ setupFiles: ['./vitest-setup.ts'],
+ // if you have few tests, try commenting this
+ // out to improve performance:
+ isolate: false,
+ },
+ build: {
+ target: 'esnext',
+ // Keep images as asset files instead of inlining them into the JS bundle.
+ assetsInlineLimit: 0,
+ },
+});
diff --git a/packages/create/tests/manifest.test.ts b/packages/create/tests/manifest.test.ts
new file mode 100644
index 0000000..ae78e1b
--- /dev/null
+++ b/packages/create/tests/manifest.test.ts
@@ -0,0 +1,80 @@
+import { afterEach, expect, it } from "vitest";
+import { fetchTemplatesManifest, parseManifest, resolveGroup } from "../src/utils/manifest";
+
+const validManifest = {
+ version: 1,
+ groups: {
+ solid: {
+ label: "Solid 2.0",
+ path: "solid-v2",
+ templates: [{ name: "basic", default: true, ssrToggle: true }, { name: "bare" }],
+ },
+ },
+};
+
+it("parses a valid manifest", () => {
+ const manifest = parseManifest(validManifest);
+ expect(manifest).toBeDefined();
+ expect(manifest!.groups["solid"].path).toBe("solid-v2");
+ expect(manifest!.groups["solid"].templates.map((t) => t.name)).toEqual(["basic", "bare"]);
+});
+
+it("rejects unknown manifest versions and malformed documents", () => {
+ expect(parseManifest({ ...validManifest, version: 2 })).toBeUndefined();
+ expect(parseManifest(null)).toBeUndefined();
+ expect(parseManifest("nonsense")).toBeUndefined();
+ expect(parseManifest({ version: 1 })).toBeUndefined();
+ expect(parseManifest({ version: 1, groups: { solid: { templates: "not-an-array" } } })).toBeUndefined();
+});
+
+it("drops malformed groups and template entries but keeps the rest", () => {
+ const manifest = parseManifest({
+ version: 1,
+ groups: {
+ solid: { path: "solid-v2", templates: [{ name: "basic" }, { notAName: true }, "bare"] },
+ broken: { path: 42, templates: [{ name: "x" }] },
+ },
+ });
+ expect(manifest).toBeDefined();
+ expect(Object.keys(manifest!.groups)).toEqual(["solid"]);
+ expect(manifest!.groups["solid"].templates).toEqual([{ name: "basic" }]);
+});
+
+it("resolves groups from the manifest, falling back to baked-in lists", () => {
+ const manifest = parseManifest(validManifest);
+ expect(resolveGroup(manifest, "solid").templates.map((t) => t.name)).toEqual(["basic", "bare"]);
+
+ // Groups missing from the manifest fall back per-group
+ expect(resolveGroup(manifest, "vanilla").path).toBe("vanilla");
+
+ // No manifest at all: everything comes from the baked-in lists
+ const baked = resolveGroup(undefined, "solid");
+ expect(baked.path).toBe("solid-v2");
+ expect(baked.templates.map((t) => t.name)).toEqual([
+ "basic",
+ "bare",
+ "fullstack",
+ "fullstack-tanstack",
+ "with-bootstrap",
+ "with-sass",
+ "with-tailwindcss",
+ "with-tanstack-router",
+ "with-unocss",
+ "with-vitest-browser-mode",
+ ]);
+ const basic = baked.templates.find((t) => t.name === "basic")!;
+ expect(basic.default).toBe(true);
+ expect(basic.ssrToggle).toBe(true);
+ expect(resolveGroup(undefined, "start-v2").path).toBe("solid-start-v2");
+ expect(resolveGroup(undefined, "start-v1").path).toBe("solid-start-v1");
+});
+
+afterEach(() => {
+ delete process.env.SOLID_CLI_TEMPLATES_MANIFEST_URL;
+});
+
+it("silently returns undefined when the manifest fetch fails", async () => {
+ // Unroutable address: connection is refused immediately
+ process.env.SOLID_CLI_TEMPLATES_MANIFEST_URL = "http://127.0.0.1:1/templates.json";
+ expect(await fetchTemplatesManifest()).toBeUndefined();
+});
diff --git a/packages/create/tests/ssr-flip.test.ts b/packages/create/tests/ssr-flip.test.ts
new file mode 100644
index 0000000..bdaa739
--- /dev/null
+++ b/packages/create/tests/ssr-flip.test.ts
@@ -0,0 +1,48 @@
+import { beforeEach, expect, it } from "vitest";
+import { mkdtempSync, copyFileSync, existsSync, readFileSync, writeFileSync } from "node:fs";
+import { tmpdir } from "node:os";
+import { join } from "node:path";
+import { fileURLToPath } from "node:url";
+import { applySsrFlip, SERVER_JS, SSR_HINT_COMMENT, SSR_START_SCRIPT } from "../src/utils/ssr-flip";
+
+const fixtures = fileURLToPath(new URL("./fixtures/solid-v2-basic/", import.meta.url));
+
+let dir: string;
+beforeEach(() => {
+ dir = mkdtempSync(join(tmpdir(), "ssr-flip-"));
+ copyFileSync(join(fixtures, "vite.config.ts"), join(dir, "vite.config.ts"));
+ copyFileSync(join(fixtures, "package.json"), join(dir, "package.json"));
+});
+
+it("flips the basic template to streaming SSR", async () => {
+ expect(await applySsrFlip(dir)).toBe(true);
+
+ const viteConfig = readFileSync(join(dir, "vite.config.ts")).toString();
+ expect(viteConfig).toContain("solid({ start: true, ssr: true");
+ expect(viteConfig).not.toContain(SSR_HINT_COMMENT);
+
+ // The production server is a verbatim copy of solid-v2/fullstack/server.js
+ expect(readFileSync(join(dir, "server.js")).toString()).toBe(SERVER_JS);
+
+ const packageJson = JSON.parse(readFileSync(join(dir, "package.json")).toString());
+ expect(packageJson.scripts.start).toBe(SSR_START_SCRIPT);
+ // The other scripts are untouched
+ expect(packageJson.scripts.dev).toBe("vite");
+ expect(packageJson.scripts.build).toBe("vite build");
+});
+
+it("aborts without writing anything when the vite config anchor is missing", async () => {
+ const drifted = `import { defineConfig } from "vite";\nexport default defineConfig({});\n`;
+ writeFileSync(join(dir, "vite.config.ts"), drifted);
+ const packageJsonBefore = readFileSync(join(dir, "package.json")).toString();
+
+ expect(await applySsrFlip(dir)).toBe(false);
+
+ expect(readFileSync(join(dir, "vite.config.ts")).toString()).toBe(drifted);
+ expect(existsSync(join(dir, "server.js"))).toBe(false);
+ expect(readFileSync(join(dir, "package.json")).toString()).toBe(packageJsonBefore);
+});
+
+it("aborts when there is no vite.config.ts", async () => {
+ expect(await applySsrFlip(mkdtempSync(join(tmpdir(), "ssr-flip-empty-")))).toBe(false);
+});
diff --git a/packages/create/tests/template.test.ts b/packages/create/tests/template.test.ts
new file mode 100644
index 0000000..179b2ee
--- /dev/null
+++ b/packages/create/tests/template.test.ts
@@ -0,0 +1,77 @@
+import { afterEach, expect, it } from "vitest";
+import { existsSync, readdirSync, readFileSync, rmSync } from "node:fs";
+import { join } from "node:path";
+import { createSolidV2, createVanilla } from "../src";
+import { fetchTemplatesManifest, resolveGroup, type ManifestGroupKey } from "../src/utils/manifest";
+
+/**
+ * These download from live solidjs/templates HEAD, so they assert the plumbing —
+ * that the right subdir was fetched and extracted into a usable project — rather
+ * than specific files or dependency versions. Template contents, pins and file
+ * layout all change upstream without a CLI release, and must not fail CI here.
+ */
+
+/** Template name + subdir the CLI would actually use, from the live manifest (baked-in fallback) */
+const liveTarget = async (key: ManifestGroupKey) => {
+ const group = resolveGroup(await fetchTemplatesManifest(), key);
+ const template = group.templates.find((t) => t.default) ?? group.templates[0];
+ return { path: group.path, template: template.name };
+};
+
+// begit resolves the destination against `process.cwd()`, so scaffold targets have to be
+// repo-relative. `test/` is gitignored; each run starts from a clean directory so a
+// leftover scaffold can never satisfy the assertions on its own.
+const destinations: string[] = [];
+const scratch = (name: string) => {
+ const destination = join("test", name);
+ rmSync(destination, { recursive: true, force: true });
+ destinations.push(destination);
+ return destination;
+};
+
+afterEach(() => {
+ for (const destination of destinations.splice(0)) rmSync(destination, { recursive: true, force: true });
+});
+
+const expectScaffold = (destination: string) => {
+ const packageJsonPath = join(destination, "package.json");
+ expect(existsSync(packageJsonPath)).toBe(true);
+
+ const packageJson = JSON.parse(readFileSync(packageJsonPath).toString());
+ expect(typeof packageJson.name).toBe("string");
+ expect(Object.keys(packageJson.scripts ?? {}).length).toBeGreaterThan(0);
+ expect(Object.keys(packageJson.dependencies ?? {}).length).toBeGreaterThan(0);
+
+ // Some source to build, whatever the entry files happen to be called
+ expect(readdirSync(join(destination, "src")).length).toBeGreaterThan(0);
+};
+
+// A cold begit cache means pulling the whole templates tarball (~3MB), which does not
+// reliably fit in vitest's 5s default on a slow or contended connection
+const DOWNLOAD_TIMEOUT_MS = 60_000;
+
+it(
+ "downloads and extracts the vanilla template",
+ async () => {
+ const destination = scratch("vanilla");
+ const { path, template } = await liveTarget("vanilla");
+
+ await createVanilla({ template, destination, path }, false);
+
+ expectScaffold(destination);
+ },
+ DOWNLOAD_TIMEOUT_MS,
+);
+
+it(
+ "downloads and extracts the solid-v2 template",
+ async () => {
+ const destination = scratch("solid-v2");
+ const { path, template } = await liveTarget("solid");
+
+ await createSolidV2({ template, destination, path }, false);
+
+ expectScaffold(destination);
+ },
+ DOWNLOAD_TIMEOUT_MS,
+);
diff --git a/packages/create/tests/ts-retarget.test.ts b/packages/create/tests/ts-retarget.test.ts
new file mode 100644
index 0000000..cabb70b
--- /dev/null
+++ b/packages/create/tests/ts-retarget.test.ts
@@ -0,0 +1,28 @@
+import { expect, it } from "vitest";
+import { readFileSync } from "node:fs";
+import { fileURLToPath } from "node:url";
+import { retargetTSFilenames } from "../src/create-solid-v2";
+
+const fixtureConfig = fileURLToPath(new URL("./fixtures/solid-v2-basic/vite.config.ts", import.meta.url));
+
+it("dedupes the extensions array instead of writing ['.jsx', '.jsx']", () => {
+ const converted = retargetTSFilenames(readFileSync(fixtureConfig).toString());
+
+ expect(converted).toContain("extensions: ['.jsx']");
+ expect(converted).not.toContain("'.tsx'");
+ expect(converted).not.toContain("'.jsx', '.jsx'");
+ // Setup files are transpiled alongside the rest of the template
+ expect(converted).toContain("./vitest-setup.js");
+});
+
+it("retargets filename mentions in comments and prose", () => {
+ const converted = retargetTSFilenames(
+ "// generates the entries around src/App.tsx\nSee `vite.config.ts` and `src/routes/users/[id].tsx`. Type declarations stay in `global.d.ts`.",
+ );
+
+ expect(converted).toContain("src/App.jsx");
+ expect(converted).toContain("`vite.config.js`");
+ expect(converted).toContain("[id].jsx");
+ // `.d.ts` files are deleted by the conversion, not renamed
+ expect(converted).toContain("global.d.ts");
+});
diff --git a/packages/ui/tsconfig.json b/packages/create/tsconfig.json
similarity index 57%
rename from packages/ui/tsconfig.json
rename to packages/create/tsconfig.json
index ecaf1e3..e8c3977 100644
--- a/packages/ui/tsconfig.json
+++ b/packages/create/tsconfig.json
@@ -1,19 +1,17 @@
{
"compilerOptions": {
- "target": "ESNext",
- "useDefineForClassFields": true,
"module": "ESNext",
+ "target": "ESNext",
+ "moduleResolution": "Bundler",
+ "strict": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
+ "resolveJsonModule": true,
+ "types": ["node"],
"declaration": true,
"emitDeclarationOnly": true,
- "moduleResolution": "Bundler",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "allowSyntheticDefaultImports": true,
- "strict": true,
- // "noUnusedLocals": true,
- // "noUnusedParameters": true,
- "noFallthroughCasesInSwitch": true,
+ "rootDir": "./src",
"outDir": "types"
},
"include": ["src/*"]
diff --git a/packages/create/tsup.config.ts b/packages/create/tsup.config.ts
new file mode 100644
index 0000000..4a06abf
--- /dev/null
+++ b/packages/create/tsup.config.ts
@@ -0,0 +1,15 @@
+import { defineConfig } from "tsup";
+
+export default defineConfig({
+ entry: ["src/index.ts"],
+ target: "esnext",
+ format: "esm",
+ splitting: true,
+ sourcemap: false,
+ clean: true,
+ treeshake: true,
+ banner: {
+ js: `import { createRequire } from "module";
+ const require = createRequire(import.meta.url);`,
+ },
+});
diff --git a/packages/full-solid/CHANGELOG.md b/packages/full-solid/CHANGELOG.md
new file mode 100644
index 0000000..95f2d0e
--- /dev/null
+++ b/packages/full-solid/CHANGELOG.md
@@ -0,0 +1,27 @@
+# @solid-cli/full
+
+## 0.8.0
+
+### Minor Changes
+
+- support fetching without the github API (so fetching should no work when hitting the github api limit)
+
+## 0.6.4
+
+### Patch Changes
+
+- update dependencies and add to solid start v2 templates list
+
+## 0.6.3
+
+### Patch Changes
+
+- Update dependencies, add new template, and remove `cd` command if project is created in working directory
+
+## 0.6.1
+
+### Patch Changes
+
+- Fix regression from 0.5.x (.gitignore wasn't being written to new projects)
+
+## 0.6.0
diff --git a/packages/full-solid/README.md b/packages/full-solid/README.md
new file mode 100644
index 0000000..0a9a706
--- /dev/null
+++ b/packages/full-solid/README.md
@@ -0,0 +1 @@
+# Full Solid
diff --git a/packages/full-solid/package.json b/packages/full-solid/package.json
new file mode 100644
index 0000000..bc95197
--- /dev/null
+++ b/packages/full-solid/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "@solid-cli/full",
+ "version": "0.8.0",
+ "description": "Create Solid apps with low configuration",
+ "author": "Thomas Beer",
+ "contributors": [
+ "Rahul Batra"
+ ],
+ "license": "MIT",
+ "homepage": "https://solid-cli.netlify.app",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/solidjs-community/solid-cli"
+ },
+ "keywords": [
+ "solidjs",
+ "solid",
+ "cli"
+ ],
+ "main": "dist/index.mjs",
+ "bin": {
+ "sd": "./dist/bin.mjs"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "start": "jiti ./src/bin.ts",
+ "build": "tsc && tsup",
+ "test": "vitest run"
+ },
+ "devDependencies": {
+ "@clack/prompts": "1.7.0",
+ "picocolors": "^1.1.1",
+ "citty": "^0.2.2",
+ "@solid-cli/create": "workspace:*",
+ "@solid-cli/utils": "workspace:*"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/full-solid/src/bin.ts b/packages/full-solid/src/bin.ts
new file mode 100644
index 0000000..5f2c97c
--- /dev/null
+++ b/packages/full-solid/src/bin.ts
@@ -0,0 +1,32 @@
+#! /usr/bin/env node
+
+import { defineCommand, runMain } from "citty";
+import { createSolid } from "@solid-cli/create";
+import packageJson from "../package.json" with { type: "json" };
+import { intro } from "@clack/prompts";
+import * as color from "picocolors";
+import * as p from "@clack/prompts";
+import { debuginfo } from "./debug";
+import { startCommands } from "./start";
+import { openInBrowser } from "@solid-cli/utils";
+intro(`\n${color.bgCyan(color.black(` Solid CLI v${packageJson.version}`))}`);
+
+const main = defineCommand({
+ meta: {
+ description: "The full Solid CLI",
+ },
+ subCommands: {
+ create: createSolid(packageJson.version),
+ debug: debuginfo,
+ start: startCommands,
+ docs: defineCommand({
+ meta: { description: "Open the Solid Docs in your browser" },
+ async run() {
+ openInBrowser("https://docs.solidjs.com");
+ p.log.success("Opened successfully");
+ },
+ }),
+ },
+});
+
+runMain(main);
diff --git a/packages/full-solid/src/debug/index.ts b/packages/full-solid/src/debug/index.ts
new file mode 100644
index 0000000..77e8c14
--- /dev/null
+++ b/packages/full-solid/src/debug/index.ts
@@ -0,0 +1,58 @@
+/// This subcommand prints useful debug info to stdout
+import { readFile } from "fs/promises";
+import os from "os";
+import { defineCommand } from "citty";
+import { detectRuntime } from "./runtime-detector";
+import * as p from "@clack/prompts";
+type DebugInfo = {
+ runtime: { name: string; version: string };
+ os: { platform: string; release: string };
+ packages: Record;
+};
+const getPackageJSON = async () => {
+ const f = await readFile("package.json");
+ const parsed = JSON.parse(f.toString());
+ return parsed;
+};
+const prettyPrintRecord = (record: Record) => {
+ let str = "";
+ for (const key in record) {
+ const value = record[key];
+ str += ` ${key}: ${value}\n`;
+ }
+ return str;
+};
+
+export const prettyPrint = (info: DebugInfo) => {
+ return `System:
+ OS: ${info.os.platform} ${info.os.release}
+Runtime:
+ ${info.runtime.name}: ${info.runtime.version}
+${
+ Object.keys(info.packages).length !== 0
+ ? `Dependencies:
+${prettyPrintRecord(info.packages)}`
+ : ""
+}`;
+};
+export const fetchDebugInfo = async (): Promise => {
+ const parsed = await getPackageJSON();
+ const packages: Record = parsed.dependencies ?? {};
+ const runtime = detectRuntime();
+ return {
+ runtime,
+ os: {
+ platform: os.platform(),
+ release: os.release(),
+ },
+ packages,
+ };
+};
+
+export const debuginfo = defineCommand({
+ meta: { description: "Print important debug info" },
+ async run(_ctx) {
+ const info = await fetchDebugInfo();
+ p.log.info(prettyPrint(info));
+ },
+});
diff --git a/packages/full-solid/src/debug/runtime-detector.ts b/packages/full-solid/src/debug/runtime-detector.ts
new file mode 100644
index 0000000..014cc4b
--- /dev/null
+++ b/packages/full-solid/src/debug/runtime-detector.ts
@@ -0,0 +1,20 @@
+type RuntimeName = "Bun" | "Node" | "Deno";
+type Runtime = { name: RuntimeName; version: string };
+declare global {
+ var Bun: { version: string } | undefined;
+ var Deno: { version: { deno: string } } | undefined;
+}
+export const detectRuntime = (): Runtime => {
+ if (globalThis.Bun) {
+ return { name: "Bun", version: globalThis.Bun?.version };
+ }
+ if (globalThis.Deno) {
+ return { name: "Deno", version: globalThis.Deno?.version?.deno };
+ }
+ // @ts-ignore
+ if (typeof process !== undefined && !!process.versions?.node) {
+ // @ts-ignore
+ return { name: "Node", version: process?.version };
+ }
+ throw new Error("Unable to detect");
+};
diff --git a/packages/full-solid/src/start/index.ts b/packages/full-solid/src/start/index.ts
new file mode 100644
index 0000000..520876a
--- /dev/null
+++ b/packages/full-solid/src/start/index.ts
@@ -0,0 +1,42 @@
+import { createApi, createRoute } from "@solid-cli/utils";
+import { defineCommand } from "citty";
+import * as p from "@clack/prompts";
+import { green } from "picocolors";
+import { cancelable } from "@solid-cli/utils/ui";
+export const startCommands = defineCommand({
+ meta: { description: "Start-specific commands" },
+ subCommands: {
+ route: defineCommand({
+ meta: { description: "Creates a new route" },
+ args: {
+ path: {
+ type: "positional",
+ required: false,
+ description: "Route path",
+ },
+ api: {
+ type: "boolean",
+ required: false,
+ default: false,
+ alias: "a",
+ },
+ },
+ async run({ args: { path, api } }) {
+ path ||= await cancelable(
+ p.text({
+ message: "Route path",
+ validate(value) {
+ if (!value || value.length === 0) return "A route path is required";
+ },
+ }),
+ );
+ if (api) {
+ await createApi(path as string);
+ } else {
+ await createRoute(path as string);
+ }
+ p.log.success(`Route ${green(path as string)} successfully created!`);
+ },
+ }),
+ },
+});
diff --git a/packages/full-solid/tests/debuginfo.test.ts b/packages/full-solid/tests/debuginfo.test.ts
new file mode 100644
index 0000000..6bbe6cf
--- /dev/null
+++ b/packages/full-solid/tests/debuginfo.test.ts
@@ -0,0 +1,8 @@
+import { expect, it } from "vitest";
+import { fetchDebugInfo, prettyPrint } from "../src/debug";
+
+it("Runs", async () => {
+ const output = prettyPrint(await fetchDebugInfo());
+
+ expect(output).contains("Runtime", "System");
+});
diff --git a/packages/core/tsconfig.json b/packages/full-solid/tsconfig.json
similarity index 75%
rename from packages/core/tsconfig.json
rename to packages/full-solid/tsconfig.json
index b6d4e3a..b354b62 100644
--- a/packages/core/tsconfig.json
+++ b/packages/full-solid/tsconfig.json
@@ -1,6 +1,5 @@
{
"compilerOptions": {
- "baseUrl": ".",
"noEmit": true,
"module": "ESNext",
"target": "ESNext",
@@ -9,6 +8,8 @@
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
- "resolveJsonModule": true
- }
+ "resolveJsonModule": true,
+ "types": ["node"]
+ },
+ "include": ["src/*"]
}
diff --git a/packages/full-solid/tsup.config.ts b/packages/full-solid/tsup.config.ts
new file mode 100644
index 0000000..ed15cdf
--- /dev/null
+++ b/packages/full-solid/tsup.config.ts
@@ -0,0 +1,17 @@
+import { defineConfig } from "tsup";
+
+export default defineConfig({
+ entry: ["src/bin.ts"],
+ target: "esnext",
+ format: "esm",
+ splitting: true,
+ bundle: true,
+ sourcemap: false,
+ clean: true,
+ treeshake: true,
+ minify: true,
+ banner: {
+ js: `import { createRequire } from "module";
+ const require = createRequire(import.meta.url);`,
+ },
+});
diff --git a/packages/reactivity/.gitignore b/packages/reactivity/.gitignore
deleted file mode 100644
index fbf0622..0000000
--- a/packages/reactivity/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-types
\ No newline at end of file
diff --git a/packages/reactivity/README.md b/packages/reactivity/README.md
deleted file mode 100644
index d46f097..0000000
--- a/packages/reactivity/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# @solid-cli/reactivity
-
-A lightweight reactivity system which powers some of the CLI. It is an eager system (derived state is updated immediately when the sources change)
diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json
deleted file mode 100644
index 6e36c3d..0000000
--- a/packages/reactivity/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "@solid-cli/reactivity",
- "version": "0.0.11",
- "description": "The minimal, eager reactive system that powers the Solid CLI",
- "license": "MIT",
- "homepage": "https://solid-cli.netlify.app",
- "repository": {
- "type": "git",
- "url": "https://github.com/solidjs-community/solid-cli"
- },
- "files": [
- "dist",
- "types"
- ],
- "main": "./dist/index.mjs",
- "module": "./dist/index.mjs",
- "types": "./types/index.d.ts",
- "exports": {
- ".": {
- "import": "./dist/index.mjs",
- "require": "./dist/index.mjs",
- "types": "./types/index.d.ts"
- }
- },
- "scripts": {
- "test": "vitest run",
- "build": "tsc && tsup"
- },
- "author": "Thomas Beer",
- "devDependencies": {
- "tsup": "^8.0.2",
- "typescript": "^5.3.3"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/reactivity/src/api/index.ts b/packages/reactivity/src/api/index.ts
deleted file mode 100644
index ffedb90..0000000
--- a/packages/reactivity/src/api/index.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { Computation, Getter, Signal, batch, runWithListener } from "../core";
-export { batch, getListener, type Getter, type Setter, type Signal } from "../core";
-type OnOptions = { defer: boolean };
-export function on(deps: Getter, fn: (val: G) => T, options?: OnOptions): () => T | undefined;
-export function on(deps: Getter[] | Getter, fn: (val: any) => T, options?: OnOptions) {
- let shouldDefer = options?.defer ?? false;
- return () => {
- // Track all getters on call
- let args: any[] = [];
- Array.isArray(deps) ? deps.forEach((d) => args.push(d())) : args.push(deps());
- if (shouldDefer) {
- shouldDefer = false;
- return;
- }
- // Ensure that the function isn't tracked
- return untrack(() => fn(args.length === 1 ? args[0] : args));
- };
-}
-export function createSignal(val: T) {
- const comp = new Computation(() => val);
- const set = (fnOrVal: T | ((val: T | null) => T) | null) => {
- if (typeof fnOrVal === "function") {
- let fn = fnOrVal as (val: T | null) => T;
- const newVal = fn(untrack(comp.get));
- comp.set(newVal);
- } else {
- comp.set(fnOrVal as T);
- }
- };
- return [comp.get, set] as Signal;
-}
-export function createEffect(fn: () => T) {
- new Computation(fn);
-}
-export function createMemo(fn: () => T) {
- const comp = new Computation(fn);
- return comp.get;
-}
-export function createAsync(fn: () => Promise) {
- const [get, set] = createSignal(null);
- const [loading, setLoading] = createSignal(true);
- fn().then((val) => {
- batch(() => {
- set(val);
- setLoading(false);
- });
- });
- Object.defineProperties(get, {
- loading: {
- get() {
- return loading();
- },
- },
- });
- return get as Getter & { loading: boolean };
-}
-export function untrack(fn: () => T) {
- return runWithListener(null, fn);
-}
diff --git a/packages/reactivity/src/core/index.ts b/packages/reactivity/src/core/index.ts
deleted file mode 100644
index 63e923a..0000000
--- a/packages/reactivity/src/core/index.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-export type Getter = () => T;
-export type Setter = (val: T | ((val: T | null) => T)) => void;
-export type Signal = [Getter, Setter];
-let OBSERVER: Computation | null = null;
-let BATCHING = false;
-const UPDATEQUEUE: Computation[] = [];
-export class Computation {
- fn: () => T;
- value: T | null = null;
- state: number = 0;
- queueSlot: number = -1;
- sources: Set> = new Set();
- observers: Set> = new Set();
- constructor(fn: () => T) {
- this.fn = fn;
- this.update();
- }
- track() {
- if (!OBSERVER) return;
- this.observers.add(OBSERVER);
- OBSERVER.sources.add(this);
- }
- get = () => {
- // We need to make sure memos update if they're accessed during a `batch`
- if (this.queueSlot != -1) {
- UPDATEQUEUE.splice(this.queueSlot, 1);
- const prev = BATCHING;
- BATCHING = false;
- this.update();
- BATCHING = prev;
- this.queueSlot = -1;
- }
- this.track();
- return this.value;
- };
- set = (newVal: T) => {
- if (newVal === this.value) return;
- this.value = newVal;
- this.notifyObservers();
- };
- removeParentObservers() {
- if (!this.sources) return;
- this.sources.forEach((s) => s.observers.delete(this));
- this.sources.clear();
- }
- pullSourceUpdates() {
- if (!this.sources) return;
- this.sources.forEach((s) => s.update());
- }
- update() {
- if (BATCHING) {
- if (this.queueSlot != -1) return;
- this.queueSlot = UPDATEQUEUE.length;
- UPDATEQUEUE.push(this);
- return;
- }
- // this.removeParentObservers();
- const prev = OBSERVER;
- OBSERVER = this;
- const newVal = this.fn();
- OBSERVER = prev;
- if (newVal === this.value) return;
- this.value = newVal;
- }
- increment() {
- this.state++;
- // Only increment children if the state has increased to 1, as we don't want to repeatedly re-increment if this node has multiple parents that need updating
- if (this.state === 1) {
- this.observers.forEach((o) => o.increment());
- }
- }
- decrement() {
- this.state--;
- if (this.state === 0) {
- this.update();
- this.observers.forEach((o) => o.decrement());
- }
- }
- notifyObservers() {
- this.observers.forEach((o) => o.increment());
- this.observers.forEach((o) => o.decrement());
- }
-}
-function stabilize() {
- UPDATEQUEUE.forEach((u) => u.update());
- UPDATEQUEUE.length = 0;
-}
-export function batch(fn: () => T) {
- BATCHING = true;
- const res = fn();
- BATCHING = false;
- stabilize();
- return res;
-}
-export function getListener() {
- return OBSERVER;
-}
-export function runWithListener(listener: Computation | null, fn: () => T) {
- const prev = OBSERVER;
- OBSERVER = listener;
- const res = fn();
- OBSERVER = prev;
- return res;
-}
diff --git a/packages/reactivity/src/index.ts b/packages/reactivity/src/index.ts
deleted file mode 100644
index d158c57..0000000
--- a/packages/reactivity/src/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from "./api";
diff --git a/packages/reactivity/test/async.test.ts b/packages/reactivity/test/async.test.ts
deleted file mode 100644
index 481fd75..0000000
--- a/packages/reactivity/test/async.test.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { describe, expect, test } from "vitest";
-import { createAsync, createEffect } from "../src";
-
-describe("createAsync", () => {
- test("An async function resolves to a value", async () => {
- const asyncFn = createAsync(async () => {
- return 123;
- });
- const res = await new Promise((res) => {
- createEffect(() => {
- const result = asyncFn();
- if (result) res(result);
- });
- });
- expect(res).toBe(123);
- });
- test("An async function has a loading state", async () => {
- const asyncFn = createAsync(async () => {
- return 123;
- });
- expect(asyncFn.loading).toBe(true);
- queueMicrotask(() => expect(asyncFn.loading).toBe(false));
- });
-});
diff --git a/packages/reactivity/test/batch.test.ts b/packages/reactivity/test/batch.test.ts
deleted file mode 100644
index 4a9f647..0000000
--- a/packages/reactivity/test/batch.test.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { test, expect } from "vitest";
-import { describe } from "vitest";
-import { batch, createAsync, createEffect, createMemo, createSignal } from "../src";
-
-describe("batch", () => {
- test("Multiple updates should only trigger an effect once", () => {
- const [get, set] = createSignal(0);
- let updates = 0;
- createEffect(() => {
- get();
- updates++;
- });
- batch(() => {
- set(1);
- set(2);
- });
- expect(updates).toBe(2);
- expect(get()).toBe(2);
- });
- test("A memo called within a batch should get its value updated", () => {
- const [get, set] = createSignal(0);
- const memo = createMemo(() => get() * 2);
- batch(() => {
- set(1);
- expect(memo()).toBe(2);
- });
- });
- test("An effect depending on both loading and data should only run once when the async resolves", async () => {
- const data = createAsync(async () => {
- return 123;
- });
- let updates = 0;
- await new Promise((res) =>
- createEffect(() => {
- // We track both the data itself and the loading signal
- const d = data();
- const loading = data.loading;
- updates++;
- if (d === 123 && loading === false) res(d);
- }),
- );
- expect(updates).toBe(2);
- });
- test("A derived memo accessed within a batch should resolve to the correct value", () => {
- const [get, set] = createSignal(0);
- const memo = createMemo(() => get() * 2);
- let updates = 0;
- // First update on initial run
- const derived = createMemo(() => {
- updates++;
- return memo()! * 2;
- });
- batch(() => {
- set(1);
- set(2);
- // 2nd Update on access
- expect(derived()).toBe(8);
- set(3);
- // 3rd update on access
- expect(derived()).toBe(12);
- });
- expect(updates).toBe(3);
- });
- test.skip("Diamond problem with memos accessed in a batch", () => {
- const [get, set] = createSignal(0);
- let updates = 0;
- const A = createMemo(() => {
- updates++;
- get();
- });
- const B = createMemo(() => A()! * 2);
- const C = createMemo(() => A()! * 3);
- const D = createMemo(() => B()! + C()!);
- batch(() => {
- set(2);
- });
- // Actually currently get 3 here
- expect(updates).toBe(2);
- });
-});
diff --git a/packages/reactivity/test/effects.test.ts b/packages/reactivity/test/effects.test.ts
deleted file mode 100644
index 735f405..0000000
--- a/packages/reactivity/test/effects.test.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { describe, test, expect } from "vitest";
-import { createEffect, createSignal } from "../src";
-describe("createEffect", () => {
- test("An effect executes once when created", () => {
- let updates = 0;
- createEffect(() => {
- updates++;
- });
- expect(updates).toBe(1);
- });
- test("An effect re-executes when a dependency changes", () => {
- let updates = 0;
- const [value, setValue] = createSignal(0);
- createEffect(() => {
- value();
- updates++;
- });
- expect(updates).toBe(1);
- setValue(1);
- expect(updates).toBe(2);
- });
- test("Changes propagate correctly", () => {
- const [get, set] = createSignal(0);
- let updates = 0;
- createEffect(() => {
- get();
- updates++;
- });
- expect(updates).toBe(1);
- set(1);
- expect(updates).toBe(2);
- set(2);
- expect(updates).toBe(3);
- });
- test("Nested effects", () => {
- const [A, setA] = createSignal(0);
- let updates = 0;
- createEffect(() => {
- A();
- updates++;
- let nestedUpdates = 0;
- const [get, set] = createSignal(0);
- createEffect(() => {
- get();
- nestedUpdates++;
- });
- expect(nestedUpdates).toBe(1);
- set(1);
- expect(nestedUpdates).toBe(2);
- });
- setA(1);
- expect(updates).toBe(2);
- });
-});
diff --git a/packages/reactivity/test/memos.test.ts b/packages/reactivity/test/memos.test.ts
deleted file mode 100644
index e18c764..0000000
--- a/packages/reactivity/test/memos.test.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { describe, test, expect } from "vitest";
-import { createMemo, createSignal } from "../src";
-describe("createMemo", () => {
- test("A memo is executed once on creation", () => {
- let updates = 0;
- createMemo(() => {
- updates++;
- });
- expect(updates).toBe(1);
- });
- test("A memo updates when its dependencies change", () => {
- const [value, setValue] = createSignal(0);
- let updates = 0;
- createMemo(() => {
- value();
- updates++;
- });
- expect(updates).toBe(1);
- setValue(1);
- expect(updates).toBe(2);
- });
- test("Memos don't overexecute if a dependency doesn't change", () => {
- const [value, setValue] = createSignal(0);
- const memo1 = createMemo(() => {
- value();
- return 1;
- });
- let updates = 0;
- const memo2 = createMemo(() => {
- updates++;
- return memo1();
- });
- expect(memo2()).toBe(1);
- setValue(0);
- expect(updates).toBe(1);
- });
- test("Memos don't overexecute in a diamond (The diamond problem)", () => {
- const [A, setA] = createSignal(0);
- const B = createMemo(() => {
- return A() * 2;
- });
- const C = createMemo(() => {
- return A() + 2;
- });
- let updates = 0;
- const D = createMemo(() => {
- updates++;
- return B()! + C()!;
- });
- expect(D()).toBe(2);
- setA(1);
- expect(D()).toBe(5);
- expect(updates).toBe(2);
- });
-});
diff --git a/packages/reactivity/test/signals.test.ts b/packages/reactivity/test/signals.test.ts
deleted file mode 100644
index c227cfe..0000000
--- a/packages/reactivity/test/signals.test.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { describe, test, expect } from "vitest";
-import { createSignal } from "../src";
-describe("createSignal", () => {
- test("A signal should hold a value that can be updated", () => {
- const [value, setValue] = createSignal(0);
- expect(value()).toBe(0);
- setValue(1);
- expect(value()).toBe(1);
- });
-});
diff --git a/packages/reactivity/tsconfig.json b/packages/reactivity/tsconfig.json
deleted file mode 100644
index 1bd37fb..0000000
--- a/packages/reactivity/tsconfig.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "compilerOptions": {
- "target": "ESNext",
- "useDefineForClassFields": true,
- "module": "ESNext",
- "skipLibCheck": true,
- "declaration": true,
- "emitDeclarationOnly": true,
- /* Bundler mode */
- "moduleResolution": "bundler",
- // "allowImportingTsExtensions": true,
- "resolveJsonModule": true,
- "isolatedModules": true,
- // "noEmit": true,
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "noFallthroughCasesInSwitch": true,
- "outDir": "types"
- },
- "include": ["src/*"]
-}
diff --git a/packages/reactivity/tsup.config.ts b/packages/reactivity/tsup.config.ts
deleted file mode 100644
index aaf7a65..0000000
--- a/packages/reactivity/tsup.config.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { defineConfig } from "tsup";
-
-export default defineConfig({
- entry: ["src/index.ts"],
- target: "esnext",
- format: ["esm", "cjs"],
- splitting: false,
- sourcemap: true,
- minify: true,
- clean: true,
-});
diff --git a/packages/swc-plugin-solid-cli/.cargo/config b/packages/swc-plugin-solid-cli/.cargo/config
deleted file mode 100644
index eaa0fee..0000000
--- a/packages/swc-plugin-solid-cli/.cargo/config
+++ /dev/null
@@ -1,5 +0,0 @@
-# These command aliases are not final, may change
-[alias]
-# Alias to build actual plugin binary for the specified target.
-build-wasi = "build --target wasm32-wasi"
-build-wasm32 = "build --target wasm32-unknown-unknown"
diff --git a/packages/swc-plugin-solid-cli/.gitignore b/packages/swc-plugin-solid-cli/.gitignore
deleted file mode 100644
index 28aa12d..0000000
--- a/packages/swc-plugin-solid-cli/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target
-^target/
-target
-output/*.rlib
\ No newline at end of file
diff --git a/packages/swc-plugin-solid-cli/Cargo.lock b/packages/swc-plugin-solid-cli/Cargo.lock
deleted file mode 100644
index 5952fed..0000000
--- a/packages/swc-plugin-solid-cli/Cargo.lock
+++ /dev/null
@@ -1,2221 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "Inflector"
-version = "0.11.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
-dependencies = [
- "lazy_static",
- "regex",
-]
-
-[[package]]
-name = "addr2line"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
-[[package]]
-name = "ahash"
-version = "0.7.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
-dependencies = [
- "getrandom",
- "once_cell",
- "version_check",
-]
-
-[[package]]
-name = "ahash"
-version = "0.8.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff"
-dependencies = [
- "cfg-if",
- "getrandom",
- "once_cell",
- "version_check",
- "zerocopy",
-]
-
-[[package]]
-name = "aho-corasick"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "ansi_term"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
-dependencies = [
- "winapi",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.79"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
-
-[[package]]
-name = "arrayvec"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
-
-[[package]]
-name = "ast_node"
-version = "0.9.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3e3e06ec6ac7d893a0db7127d91063ad7d9da8988f8a1a256f03729e6eec026"
-dependencies = [
- "proc-macro2",
- "quote",
- "swc_macros_common",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "atty"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
-dependencies = [
- "hermit-abi 0.1.19",
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "backtrace"
-version = "0.3.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
-dependencies = [
- "addr2line",
- "cc",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
-]
-
-[[package]]
-name = "base64"
-version = "0.21.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
-
-[[package]]
-name = "better_scoped_tls"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "794edcc9b3fb07bb4aecaa11f093fd45663b4feadb782d68303a2268bc2701de"
-dependencies = [
- "scoped-tls",
-]
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bitflags"
-version = "2.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
-
-[[package]]
-name = "bitvec"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
-dependencies = [
- "funty",
- "radium",
- "tap",
- "wyz",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "bytecheck"
-version = "0.6.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627"
-dependencies = [
- "bytecheck_derive",
- "ptr_meta",
- "simdutf8",
-]
-
-[[package]]
-name = "bytecheck_derive"
-version = "0.6.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "camino"
-version = "1.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "cargo-platform"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "cargo_metadata"
-version = "0.15.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a"
-dependencies = [
- "camino",
- "cargo-platform",
- "semver 1.0.21",
- "serde",
- "serde_json",
- "thiserror",
-]
-
-[[package]]
-name = "cargo_metadata"
-version = "0.18.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
-dependencies = [
- "camino",
- "cargo-platform",
- "semver 1.0.21",
- "serde",
- "serde_json",
- "thiserror",
-]
-
-[[package]]
-name = "cc"
-version = "1.0.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "cpufeatures"
-version = "0.2.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "crypto-common"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
-dependencies = [
- "generic-array",
- "typenum",
-]
-
-[[package]]
-name = "dashmap"
-version = "5.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
-dependencies = [
- "cfg-if",
- "hashbrown 0.14.3",
- "lock_api",
- "once_cell",
- "parking_lot_core",
-]
-
-[[package]]
-name = "data-encoding"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
-
-[[package]]
-name = "debugid"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d"
-dependencies = [
- "serde",
- "uuid",
-]
-
-[[package]]
-name = "diff"
-version = "0.1.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
-
-[[package]]
-name = "difference"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
-
-[[package]]
-name = "digest"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
-dependencies = [
- "block-buffer",
- "crypto-common",
-]
-
-[[package]]
-name = "either"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
-
-[[package]]
-name = "equivalent"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
-
-[[package]]
-name = "errno"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
-dependencies = [
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "fastrand"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
-
-[[package]]
-name = "fixedbitset"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
-
-[[package]]
-name = "form_urlencoded"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
-dependencies = [
- "percent-encoding",
-]
-
-[[package]]
-name = "from_variant"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a0b11eeb173ce52f84ebd943d42e58813a2ebb78a6a3ff0a243b71c5199cd7b"
-dependencies = [
- "proc-macro2",
- "swc_macros_common",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "funty"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
-
-[[package]]
-name = "generic-array"
-version = "0.14.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi",
-]
-
-[[package]]
-name = "gimli"
-version = "0.28.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
-
-[[package]]
-name = "glob"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
-
-[[package]]
-name = "hashbrown"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-dependencies = [
- "ahash 0.7.8",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.14.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
-
-[[package]]
-name = "hermit-abi"
-version = "0.1.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd"
-
-[[package]]
-name = "hex"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
-
-[[package]]
-name = "hstr"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17fafeca18cf0927e23ea44d7a5189c10536279dfe9094e0dfa953053fbb5377"
-dependencies = [
- "new_debug_unreachable",
- "once_cell",
- "phf",
- "rustc-hash",
- "smallvec",
-]
-
-[[package]]
-name = "idna"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "if_chain"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed"
-
-[[package]]
-name = "indexmap"
-version = "2.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177"
-dependencies = [
- "equivalent",
- "hashbrown 0.14.3",
-]
-
-[[package]]
-name = "is-macro"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59a85abdc13717906baccb5a1e435556ce0df215f242892f721dff62bf25288f"
-dependencies = [
- "Inflector",
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "is_ci"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45"
-
-[[package]]
-name = "itoa"
-version = "1.0.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "libc"
-version = "0.2.153"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
-
-[[package]]
-name = "lock_api"
-version = "0.4.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
-dependencies = [
- "autocfg",
- "scopeguard",
-]
-
-[[package]]
-name = "log"
-version = "0.4.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
-
-[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata 0.1.10",
-]
-
-[[package]]
-name = "memchr"
-version = "2.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
-
-[[package]]
-name = "miette"
-version = "4.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c90329e44f9208b55f45711f9558cec15d7ef8295cc65ecd6d4188ae8edc58c"
-dependencies = [
- "atty",
- "backtrace",
- "miette-derive",
- "once_cell",
- "owo-colors",
- "supports-color",
- "supports-hyperlinks",
- "supports-unicode",
- "terminal_size",
- "textwrap",
- "thiserror",
- "unicode-width",
-]
-
-[[package]]
-name = "miette-derive"
-version = "4.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b5bc45b761bcf1b5e6e6c4128cd93b84c218721a8d9b894aa0aff4ed180174c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "miniz_oxide"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "new_debug_unreachable"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
-
-[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
-dependencies = [
- "overload",
- "winapi",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
- "serde",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
-dependencies = [
- "hermit-abi 0.3.6",
- "libc",
-]
-
-[[package]]
-name = "object"
-version = "0.32.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
-
-[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
-[[package]]
-name = "owo-colors"
-version = "3.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
-
-[[package]]
-name = "parking_lot"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
-dependencies = [
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall",
- "smallvec",
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
-
-[[package]]
-name = "petgraph"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
-dependencies = [
- "fixedbitset",
- "indexmap",
-]
-
-[[package]]
-name = "phf"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
-dependencies = [
- "phf_macros",
- "phf_shared",
-]
-
-[[package]]
-name = "phf_generator"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
-dependencies = [
- "phf_shared",
- "rand",
-]
-
-[[package]]
-name = "phf_macros"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
-dependencies = [
- "phf_generator",
- "phf_shared",
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "phf_shared"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
-dependencies = [
- "siphasher",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
-
-[[package]]
-name = "pmutil"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52a40bc70c2c58040d2d8b167ba9a5ff59fc9dab7ad44771cfde3dcfde7a09c6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "pretty_assertions"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
-dependencies = [
- "diff",
- "yansi",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.78"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "psm"
-version = "0.1.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "ptr_meta"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
-dependencies = [
- "ptr_meta_derive",
-]
-
-[[package]]
-name = "ptr_meta_derive"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "radium"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
-
-[[package]]
-name = "radix_fmt"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce082a9940a7ace2ad4a8b7d0b1eac6aa378895f18be598230c5f2284ac05426"
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "rand_core",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-
-[[package]]
-name = "redox_syscall"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "regex"
-version = "1.10.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata 0.4.5",
- "regex-syntax 0.8.2",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax 0.6.29",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax 0.8.2",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
-
-[[package]]
-name = "relative-path"
-version = "1.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc"
-
-[[package]]
-name = "rend"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c"
-dependencies = [
- "bytecheck",
-]
-
-[[package]]
-name = "rkyv"
-version = "0.7.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58"
-dependencies = [
- "bitvec",
- "bytecheck",
- "hashbrown 0.12.3",
- "ptr_meta",
- "rend",
- "rkyv_derive",
- "seahash",
- "tinyvec",
- "uuid",
-]
-
-[[package]]
-name = "rkyv_derive"
-version = "0.7.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
-
-[[package]]
-name = "rustc-hash"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-
-[[package]]
-name = "rustc_version"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
-dependencies = [
- "semver 0.9.0",
-]
-
-[[package]]
-name = "rustix"
-version = "0.38.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
-dependencies = [
- "bitflags 2.4.2",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
-
-[[package]]
-name = "ryu"
-version = "1.0.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
-
-[[package]]
-name = "ryu-js"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4950d85bc52415f8432144c97c4791bd0c4f7954de32a7270ee9cccd3c22b12b"
-
-[[package]]
-name = "scoped-tls"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "seahash"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
-
-[[package]]
-name = "semver"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
-dependencies = [
- "semver-parser",
-]
-
-[[package]]
-name = "semver"
-version = "1.0.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "semver-parser"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
-
-[[package]]
-name = "serde"
-version = "1.0.196"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.196"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.113"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"
-dependencies = [
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "sha2"
-version = "0.10.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "simdutf8"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a"
-
-[[package]]
-name = "siphasher"
-version = "0.3.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
-
-[[package]]
-name = "smallvec"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
-
-[[package]]
-name = "smartstring"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29"
-dependencies = [
- "autocfg",
- "static_assertions",
- "version_check",
-]
-
-[[package]]
-name = "smawk"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c"
-
-[[package]]
-name = "sourcemap"
-version = "6.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4cbf65ca7dc576cf50e21f8d0712d96d4fcfd797389744b7b222a85cdf5bd90"
-dependencies = [
- "data-encoding",
- "debugid",
- "if_chain",
- "rustc_version",
- "serde",
- "serde_json",
- "unicode-id",
- "url",
-]
-
-[[package]]
-name = "stacker"
-version = "0.1.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce"
-dependencies = [
- "cc",
- "cfg-if",
- "libc",
- "psm",
- "winapi",
-]
-
-[[package]]
-name = "static_assertions"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-
-[[package]]
-name = "string_enum"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b650ea2087d32854a0f20b837fc56ec987a1cb4f758c9757e1171ee9812da63"
-dependencies = [
- "proc-macro2",
- "quote",
- "swc_macros_common",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "supports-color"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ba6faf2ca7ee42fdd458f4347ae0a9bd6bcc445ad7cb57ad82b383f18870d6f"
-dependencies = [
- "atty",
- "is_ci",
-]
-
-[[package]]
-name = "supports-hyperlinks"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "590b34f7c5f01ecc9d78dba4b3f445f31df750a67621cf31626f3b7441ce6406"
-dependencies = [
- "atty",
-]
-
-[[package]]
-name = "supports-unicode"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8b945e45b417b125a8ec51f1b7df2f8df7920367700d1f98aedd21e5735f8b2"
-dependencies = [
- "atty",
-]
-
-[[package]]
-name = "swc-plugin-solid-cli"
-version = "0.1.0"
-dependencies = [
- "serde",
- "serde_json",
- "swc_core",
- "testing",
-]
-
-[[package]]
-name = "swc_atoms"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d538eaaa6f085161d088a04cf0a3a5a52c5a7f2b3bd9b83f73f058b0ed357c0"
-dependencies = [
- "bytecheck",
- "hstr",
- "once_cell",
- "rkyv",
- "rustc-hash",
- "serde",
-]
-
-[[package]]
-name = "swc_cached"
-version = "0.3.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "630c761c74ac8021490b78578cc2223aa4a568241e26505c27bf0e4fd4ad8ec2"
-dependencies = [
- "ahash 0.8.8",
- "anyhow",
- "dashmap",
- "once_cell",
- "regex",
- "serde",
-]
-
-[[package]]
-name = "swc_common"
-version = "0.33.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "095c158fe55b36faeebb4274692643a6d7cdc5b7902e1d5968ddbe52b7de1d1c"
-dependencies = [
- "anyhow",
- "ast_node",
- "atty",
- "better_scoped_tls",
- "bytecheck",
- "cfg-if",
- "either",
- "from_variant",
- "new_debug_unreachable",
- "num-bigint",
- "once_cell",
- "parking_lot",
- "rkyv",
- "rustc-hash",
- "serde",
- "siphasher",
- "sourcemap",
- "swc_atoms",
- "swc_eq_ignore_macros",
- "swc_visit",
- "termcolor",
- "tracing",
- "unicode-width",
- "url",
-]
-
-[[package]]
-name = "swc_config"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce837c5eae1cb200a310940de989fd9b3d12ed62d7752bc69b39ef8aa775ec04"
-dependencies = [
- "anyhow",
- "indexmap",
- "serde",
- "serde_json",
- "sourcemap",
- "swc_cached",
- "swc_config_macro",
-]
-
-[[package]]
-name = "swc_config_macro"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b2574f75082322a27d990116cd2a24de52945fc94172b24ca0b3e9e2a6ceb6b"
-dependencies = [
- "proc-macro2",
- "quote",
- "swc_macros_common",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "swc_core"
-version = "0.90.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28da75904d199c7bb0a7ae7a6e07955ac70be3e759028f575d0aa3b7faa74ea0"
-dependencies = [
- "once_cell",
- "swc_atoms",
- "swc_common",
- "swc_ecma_ast",
- "swc_ecma_minifier",
- "swc_ecma_parser",
- "swc_ecma_transforms_base",
- "swc_ecma_transforms_testing",
- "swc_ecma_utils",
- "swc_ecma_visit",
- "swc_plugin",
- "swc_plugin_macro",
- "swc_plugin_proxy",
- "vergen",
-]
-
-[[package]]
-name = "swc_ecma_ast"
-version = "0.112.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852a48a24a2533de88298c6b25355bc68fdee31ac21cb4fb8939b7001715353c"
-dependencies = [
- "bitflags 2.4.2",
- "bytecheck",
- "is-macro",
- "num-bigint",
- "phf",
- "rkyv",
- "scoped-tls",
- "serde",
- "string_enum",
- "swc_atoms",
- "swc_common",
- "unicode-id",
-]
-
-[[package]]
-name = "swc_ecma_codegen"
-version = "0.148.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d79df3f8c5ed028fce5dc24acb83002c0854f8b9d7e893292aeee394a6b9eaf4"
-dependencies = [
- "memchr",
- "num-bigint",
- "once_cell",
- "rustc-hash",
- "serde",
- "sourcemap",
- "swc_atoms",
- "swc_common",
- "swc_ecma_ast",
- "swc_ecma_codegen_macros",
- "tracing",
-]
-
-[[package]]
-name = "swc_ecma_codegen_macros"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "394b8239424b339a12012ceb18726ed0244fce6bf6345053cb9320b2791dcaa5"
-dependencies = [
- "proc-macro2",
- "quote",
- "swc_macros_common",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "swc_ecma_minifier"
-version = "0.192.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "346fdd6d2e1204aac567a6c65590c1655a25deb11e8fb95fe7d6cf4fe6b54a5e"
-dependencies = [
- "arrayvec",
- "indexmap",
- "num-bigint",
- "num_cpus",
- "once_cell",
- "parking_lot",
- "radix_fmt",
- "regex",
- "rustc-hash",
- "ryu-js",
- "serde",
- "serde_json",
- "swc_atoms",
- "swc_common",
- "swc_config",
- "swc_ecma_ast",
- "swc_ecma_codegen",
- "swc_ecma_parser",
- "swc_ecma_transforms_base",
- "swc_ecma_transforms_optimization",
- "swc_ecma_usage_analyzer",
- "swc_ecma_utils",
- "swc_ecma_visit",
- "swc_timer",
- "tracing",
-]
-
-[[package]]
-name = "swc_ecma_parser"
-version = "0.143.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ff55811ed5de14b05e9a2979bae2bce3c807582f559b4325948463265307d9"
-dependencies = [
- "either",
- "new_debug_unreachable",
- "num-bigint",
- "num-traits",
- "phf",
- "serde",
- "smallvec",
- "smartstring",
- "stacker",
- "swc_atoms",
- "swc_common",
- "swc_ecma_ast",
- "tracing",
- "typed-arena",
-]
-
-[[package]]
-name = "swc_ecma_testing"
-version = "0.22.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b41fb62ef85a23515889fc99eac156f9afc4eb10c8eaadf70ffee53982b2ab82"
-dependencies = [
- "anyhow",
- "hex",
- "sha2",
- "testing",
- "tracing",
-]
-
-[[package]]
-name = "swc_ecma_transforms_base"
-version = "0.137.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "803bb435fdd532d5c931f0d487e48dbc94750d26c9336d79a6f1c04c62f08d93"
-dependencies = [
- "better_scoped_tls",
- "bitflags 2.4.2",
- "indexmap",
- "once_cell",
- "phf",
- "rustc-hash",
- "serde",
- "smallvec",
- "swc_atoms",
- "swc_common",
- "swc_ecma_ast",
- "swc_ecma_parser",
- "swc_ecma_utils",
- "swc_ecma_visit",
- "tracing",
-]
-
-[[package]]
-name = "swc_ecma_transforms_macros"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17e309b88f337da54ef7fe4c5b99c2c522927071f797ee6c9fb8b6bf2d100481"
-dependencies = [
- "proc-macro2",
- "quote",
- "swc_macros_common",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "swc_ecma_transforms_optimization"
-version = "0.198.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3c6fffe4d6e3609fdd6c768cc063dbc9f5101f9be0db1168ec76ace979cf616"
-dependencies = [
- "dashmap",
- "indexmap",
- "once_cell",
- "petgraph",
- "rustc-hash",
- "serde_json",
- "swc_atoms",
- "swc_common",
- "swc_ecma_ast",
- "swc_ecma_parser",
- "swc_ecma_transforms_base",
- "swc_ecma_transforms_macros",
- "swc_ecma_utils",
- "swc_ecma_visit",
- "swc_fast_graph",
- "tracing",
-]
-
-[[package]]
-name = "swc_ecma_transforms_testing"
-version = "0.140.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74719bd3f5a1dc2927d0ed0ffdd44ec3430eb8561cc5d71f9f663d425a185062"
-dependencies = [
- "ansi_term",
- "anyhow",
- "base64",
- "hex",
- "serde",
- "serde_json",
- "sha2",
- "sourcemap",
- "swc_common",
- "swc_ecma_ast",
- "swc_ecma_codegen",
- "swc_ecma_parser",
- "swc_ecma_testing",
- "swc_ecma_transforms_base",
- "swc_ecma_utils",
- "swc_ecma_visit",
- "tempfile",
- "testing",
-]
-
-[[package]]
-name = "swc_ecma_usage_analyzer"
-version = "0.23.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0950f5344e7125bdcd42055eec6c2c0abe44b6952749967b206832c65e27623"
-dependencies = [
- "indexmap",
- "rustc-hash",
- "swc_atoms",
- "swc_common",
- "swc_ecma_ast",
- "swc_ecma_utils",
- "swc_ecma_visit",
- "swc_timer",
- "tracing",
-]
-
-[[package]]
-name = "swc_ecma_utils"
-version = "0.127.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ff9e77ea18468895d26bd38656885860fede2acd24d1687f64363aaf8910441"
-dependencies = [
- "indexmap",
- "num_cpus",
- "once_cell",
- "rustc-hash",
- "swc_atoms",
- "swc_common",
- "swc_ecma_ast",
- "swc_ecma_visit",
- "tracing",
- "unicode-id",
-]
-
-[[package]]
-name = "swc_ecma_visit"
-version = "0.98.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdb71511a816c7c84ddc96e6939389be261caf20858486a5e76948551f110e1f"
-dependencies = [
- "num-bigint",
- "swc_atoms",
- "swc_common",
- "swc_ecma_ast",
- "swc_visit",
- "tracing",
-]
-
-[[package]]
-name = "swc_eq_ignore_macros"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "695a1d8b461033d32429b5befbf0ad4d7a2c4d6ba9cd5ba4e0645c615839e8e4"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "swc_error_reporters"
-version = "0.17.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87dd7ff934a74cee8f2328c4fdd22113a36358ff390845f565bef1e1cf3b0f90"
-dependencies = [
- "anyhow",
- "miette",
- "once_cell",
- "parking_lot",
- "swc_common",
-]
-
-[[package]]
-name = "swc_fast_graph"
-version = "0.21.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffd32eda2dd2c725f8d4448d0013c3b5466118e4ff5c30aff2c04f6750f7238b"
-dependencies = [
- "indexmap",
- "petgraph",
- "rustc-hash",
- "swc_common",
-]
-
-[[package]]
-name = "swc_macros_common"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50176cfc1cbc8bb22f41c6fe9d1ec53fbe057001219b5954961b8ad0f336fce9"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "swc_plugin"
-version = "0.90.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca5df720531bfbd7ceb1139319c39c20c446abfb8f7e0eb47b104205a71152b4"
-dependencies = [
- "once_cell",
-]
-
-[[package]]
-name = "swc_plugin_macro"
-version = "0.9.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3232db481484070637b20a155c064096c0ea1ba04fa2247b89b618661b3574f4"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "swc_plugin_proxy"
-version = "0.41.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0481ceefd2f896c792692b18043e45b68614ae0266c65d4addbcf7f6c8090d6"
-dependencies = [
- "better_scoped_tls",
- "rkyv",
- "swc_common",
- "swc_ecma_ast",
- "swc_trace_macro",
- "tracing",
-]
-
-[[package]]
-name = "swc_timer"
-version = "0.21.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1247df8abb51666eede165577d93c1476b6aca7ab7bf58e0fff6015fad6fb1b5"
-dependencies = [
- "tracing",
-]
-
-[[package]]
-name = "swc_trace_macro"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff9719b6085dd2824fd61938a881937be14b08f95e2d27c64c825a9f65e052ba"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "swc_visit"
-version = "0.5.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b27078d8571abe23aa52ef608dd1df89096a37d867cf691cbb4f4c392322b7c9"
-dependencies = [
- "either",
- "swc_visit_macros",
-]
-
-[[package]]
-name = "swc_visit_macros"
-version = "0.5.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa8bb05975506741555ea4d10c3a3bdb0e2357cd58e1a4a4332b8ebb4b44c34d"
-dependencies = [
- "Inflector",
- "pmutil",
- "proc-macro2",
- "quote",
- "swc_macros_common",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.48"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "tap"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
-
-[[package]]
-name = "tempfile"
-version = "3.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67"
-dependencies = [
- "cfg-if",
- "fastrand",
- "rustix",
- "windows-sys",
-]
-
-[[package]]
-name = "termcolor"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "terminal_size"
-version = "0.1.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
-dependencies = [
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "testing"
-version = "0.35.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d90b0f069d03bcee35190a27083f968d93ca6359dcea51ba274a583dc2a3ec56"
-dependencies = [
- "ansi_term",
- "cargo_metadata 0.15.4",
- "difference",
- "once_cell",
- "pretty_assertions",
- "regex",
- "serde",
- "serde_json",
- "swc_common",
- "swc_error_reporters",
- "testing_macros",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
-name = "testing_macros"
-version = "0.2.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9d3864d4184569c1428645a51a304b3b6e8d3094cd61fb3cce8dfdd9f6d0f72"
-dependencies = [
- "anyhow",
- "glob",
- "once_cell",
- "proc-macro2",
- "quote",
- "regex",
- "relative-path",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.15.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d"
-dependencies = [
- "smawk",
- "unicode-linebreak",
- "unicode-width",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
-dependencies = [
- "thiserror-impl",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
-dependencies = [
- "cfg-if",
- "once_cell",
-]
-
-[[package]]
-name = "tinyvec"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
-[[package]]
-name = "tracing"
-version = "0.1.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
-dependencies = [
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
-dependencies = [
- "once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
-]
-
-[[package]]
-name = "typed-arena"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
-
-[[package]]
-name = "typenum"
-version = "1.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
-
-[[package]]
-name = "unicode-id"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1b6def86329695390197b82c1e244a54a131ceb66c996f2088a3876e2ae083f"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
-
-[[package]]
-name = "unicode-linebreak"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "unicode-width"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
-
-[[package]]
-name = "url"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
-dependencies = [
- "form_urlencoded",
- "idna",
- "percent-encoding",
-]
-
-[[package]]
-name = "uuid"
-version = "1.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"
-
-[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
-[[package]]
-name = "vergen"
-version = "8.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525"
-dependencies = [
- "anyhow",
- "cargo_metadata 0.18.1",
- "regex",
- "rustversion",
-]
-
-[[package]]
-name = "version_check"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
-dependencies = [
- "winapi",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-sys"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
-dependencies = [
- "windows-targets 0.52.0",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
-dependencies = [
- "windows_aarch64_gnullvm 0.52.0",
- "windows_aarch64_msvc 0.52.0",
- "windows_i686_gnu 0.52.0",
- "windows_i686_msvc 0.52.0",
- "windows_x86_64_gnu 0.52.0",
- "windows_x86_64_gnullvm 0.52.0",
- "windows_x86_64_msvc 0.52.0",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
-
-[[package]]
-name = "wyz"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
-dependencies = [
- "tap",
-]
-
-[[package]]
-name = "yansi"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
-
-[[package]]
-name = "zerocopy"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
-dependencies = [
- "zerocopy-derive",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
diff --git a/packages/swc-plugin-solid-cli/Cargo.toml b/packages/swc-plugin-solid-cli/Cargo.toml
deleted file mode 100644
index edcc314..0000000
--- a/packages/swc-plugin-solid-cli/Cargo.toml
+++ /dev/null
@@ -1,30 +0,0 @@
-[package]
-name = "swc-plugin-solid-cli"
-version = "0.1.0"
-edition = "2021"
-
-[lib]
-crate-type = ["cdylib", "rlib"]
-
-[profile.release]
-lto = true
-strip = "symbols"
-codegen-units = 1
-[dependencies]
-serde = "1"
-serde_json = "1.0"
-swc_core = { version = "0.90", features = [
- "ecma_plugin_transform",
- "ecma_utils",
- "ecma_minifier",
- "ecma_visit",
- "ecma_ast",
- "common",
-] }
-[dev-dependencies]
-swc_core = { version = "0.90", features = ["testing_transform", "ecma_parser"] }
-
-testing = { version = "0.35" }
-# .cargo/config defines few alias to build plugin.
-# cargo build-wasi generates wasm-wasi32 binary
-# cargo build-wasm32 generates wasm32-unknown-unknown binary.
diff --git a/packages/swc-plugin-solid-cli/README.md b/packages/swc-plugin-solid-cli/README.md
deleted file mode 100644
index e0e27ac..0000000
--- a/packages/swc-plugin-solid-cli/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# @solid-cli/swc-plugin-solid-cli
-
-An SWC plugin for updating a project's vite config, primarily used by the CLI to add new vite plugins and automatically configure them with sensible defaults
diff --git a/packages/swc-plugin-solid-cli/output/swc_plugin_solid_cli.wasm b/packages/swc-plugin-solid-cli/output/swc_plugin_solid_cli.wasm
deleted file mode 100644
index 61bed96..0000000
Binary files a/packages/swc-plugin-solid-cli/output/swc_plugin_solid_cli.wasm and /dev/null differ
diff --git a/packages/swc-plugin-solid-cli/package.json b/packages/swc-plugin-solid-cli/package.json
deleted file mode 100644
index 1b5b55b..0000000
--- a/packages/swc-plugin-solid-cli/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "@solid-cli/swc-plugin-solid-cli",
- "version": "0.0.3",
- "description": "An SWC plugin for transforming a project's vite config",
- "author": "Thomas Beer",
- "license": "MIT",
- "homepage": "https://solid-cli.netlify.app",
- "repository": {
- "type": "git",
- "url": "https://github.com/solidjs-community/solid-cli"
- },
- "keywords": [
- "swc-plugin"
- ],
- "main": "output/swc_plugin_solid_cli.wasm",
- "scripts": {
- "prepublishOnly": "cargo build-wasi --release --out-dir=./output -Z unstable-options",
- "build": "",
- "test": "cargo +nightly test"
- },
- "preferUnplugged": true,
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/swc-plugin-solid-cli/rust-toolchain.toml b/packages/swc-plugin-solid-cli/rust-toolchain.toml
deleted file mode 100644
index 5d56faf..0000000
--- a/packages/swc-plugin-solid-cli/rust-toolchain.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[toolchain]
-channel = "nightly"
diff --git a/packages/swc-plugin-solid-cli/src/config.rs b/packages/swc-plugin-solid-cli/src/config.rs
deleted file mode 100644
index d7c5f05..0000000
--- a/packages/swc-plugin-solid-cli/src/config.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-use serde::{Deserialize, Serialize};
-use serde_json::{json, Value};
-pub trait Testing {
- fn test() -> Self;
-}
-#[derive(Serialize, Deserialize, Default, Debug)]
-#[serde(rename_all = "camelCase")]
-pub struct PluginConfig {
- pub import_name: String,
- pub import_source: String,
- pub is_default: bool,
- pub options: Value,
-}
-
-impl PluginConfig {
- fn test() -> Self {
- Self {
- import_name: "UnoCss".to_string(),
- import_source: "unocss/vite".to_string(),
- is_default: true,
- options: json!({}),
- }
- }
-}
-
-#[derive(Serialize, Deserialize, Default, Debug)]
-#[serde(rename_all = "camelCase")]
-pub struct Config {
- pub additional_plugins: Vec,
- pub force_transform: bool,
- pub merge_configs: bool,
-}
-impl Testing for Config {
- fn test() -> Self {
- Self {
- additional_plugins: vec![PluginConfig::test()],
- force_transform: true,
- merge_configs: false,
- }
- }
-}
diff --git a/packages/swc-plugin-solid-cli/src/lib.rs b/packages/swc-plugin-solid-cli/src/lib.rs
deleted file mode 100644
index 84f43f1..0000000
--- a/packages/swc-plugin-solid-cli/src/lib.rs
+++ /dev/null
@@ -1,372 +0,0 @@
-#![feature(let_chains)]
-use std::collections::HashMap;
-pub mod config;
-use config::Config;
-use serde_json::Value;
-
-use swc_core::common::DUMMY_SP;
-use swc_core::ecma::ast::{
- ArrayLit, Bool, Callee, ExprOrSpread, ImportDecl, ImportDefaultSpecifier, ImportNamedSpecifier,
- ImportSpecifier, KeyValueProp, Lit, Module, ModuleDecl, ModuleItem, Null, ObjectLit, Prop,
- PropName, PropOrSpread, Str,
-};
-use swc_core::ecma::utils::{prepend_stmt, swc_common, ExprExt};
-
-use swc_core::ecma::{
- ast::{CallExpr, Expr, Ident, Program},
- visit::{as_folder, FoldWith, VisitMut, VisitMutWith},
-};
-use swc_core::plugin::errors::HANDLER;
-use swc_core::plugin::{plugin_transform, proxies::TransformPluginProgramMetadata};
-
-pub struct TransformVisitor {
- original_imports: Vec,
- new_imports: HashMap,
- config: Config,
-}
-impl TransformVisitor {
- pub fn new(config: Config) -> Self {
- Self {
- original_imports: Default::default(),
- new_imports: Default::default(),
- config,
- }
- }
-}
-/**
- * Converts from serde_json's `Value` format to an swc `Expr`, which can then just be passed
- */
-fn to_expr(val: &Value) -> Expr {
- match val {
- Value::Null => Expr::Lit(Lit::Null(Null { span: DUMMY_SP })),
- Value::Number(n) => Expr::Lit(Lit::Num(n.as_f64().unwrap().into())),
- Value::Bool(b) => Expr::Lit(Lit::Bool(Bool {
- span: DUMMY_SP,
- value: *b,
- })),
- Value::String(s) => Expr::Lit(Lit::Str(Str {
- span: DUMMY_SP,
- value: s.clone().into(),
- raw: None,
- })),
- Value::Array(arr) => Expr::Array(ArrayLit {
- span: DUMMY_SP,
- elems: arr
- .iter()
- .map(|v| {
- Some(ExprOrSpread {
- spread: None,
- expr: Box::new(to_expr(v)),
- })
- })
- .collect(),
- }),
- Value::Object(obj) => Expr::Object(ObjectLit {
- span: DUMMY_SP,
- props: obj
- .iter()
- .map(|(k, v)| {
- PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp {
- key: PropName::Ident(Ident::new(k.clone().into(), DUMMY_SP)),
- value: Box::new(to_expr(v)),
- })))
- })
- .collect(),
- }),
- }
-}
-impl TransformVisitor {
- // Taken almost verbatim from https://github.com/modderme123/swc-plugin-jsx-dom-expressions
- pub fn insert_imports(&mut self, module: &mut Module) {
- let mut entries = self.new_imports.drain().collect::>();
- entries.sort_by(|(a, _), (b, _)| a.cmp(b));
- for (name, val) in entries {
- let specifier = if val.1 {
- ImportSpecifier::Default(ImportDefaultSpecifier {
- local: val.0,
- span: DUMMY_SP,
- })
- } else {
- ImportSpecifier::Named(ImportNamedSpecifier {
- local: val.0,
- imported: None,
- span: DUMMY_SP,
- is_type_only: false,
- })
- };
- prepend_stmt(
- &mut module.body,
- ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl {
- phase: Default::default(),
- specifiers: vec![specifier],
- src: Box::new(Str {
- span: DUMMY_SP,
- value: name.into(),
- raw: None,
- }),
- span: DUMMY_SP,
- type_only: false,
- with: None,
- })),
- );
- }
- }
-}
-fn get_import_names(import_decl: &ImportDecl) -> Vec<&str> {
- import_decl
- .specifiers
- .iter()
- .map(|s| match s {
- ImportSpecifier::Named(s) => s.local.sym.as_ref(),
- ImportSpecifier::Default(s) => s.local.sym.as_ref(),
- ImportSpecifier::Namespace(s) => s.local.sym.as_ref(),
- })
- .collect()
-}
-fn is_plugin_already_added(
- visitor: &TransformVisitor,
- elems: &[Option],
- plugin_name: &str,
- plugin_import_path: &str,
-) -> i32 {
- for (n, elem) in elems.iter().enumerate().take(elems.iter().len()) {
- // Assuming that plugins are always call expressions, and always imported as such
- // Can be fixed in the future by just visiting with self, and collecting all the identifiers that we find
- if let Some(elem) = elem
- && let Expr::Call(call_expr) = elem.expr.as_expr()
- && let Callee::Expr(callee_expr) = &call_expr.callee
- {
- if let Expr::Ident(i) = &**callee_expr {
- let local_name = i.sym.as_ref();
- if plugin_name == local_name {
- // Checking if the import is from the same place
- for import in &visitor.original_imports {
- let imported_from = import.src.value.as_ref();
- let import_names = get_import_names(import);
- if import_names.contains(&local_name) && imported_from == plugin_import_path
- {
- // Plugin already exists, so we don't need to add it
- return n.try_into().unwrap();
- }
- }
- }
- }
- }
- }
- -1
-}
-fn get_key_name(key: &PropName) -> String {
- match key {
- PropName::Ident(i) => i.sym.to_string(),
- PropName::Str(s) => s.value.to_string(),
- PropName::Num(n) => n.value.to_string(),
- PropName::BigInt(b) => b.value.to_string(),
- PropName::Computed(_) => {
- HANDLER.with(|handler| {
- handler
- .struct_span_err(
- DUMMY_SP,
- "Plugin already exists, and force_transform is not enabled",
- )
- .emit()
- });
- panic!();
- }
- }
-}
-/**
- * Merge two objects.
- * `obj1` takes precedence.
- */
-fn merge_objects(obj1: &ObjectLit, obj2: &ObjectLit) -> Vec {
- // Storing string here gives a really quick way to access the prop name
- let mut new_props: Vec<(String, &PropOrSpread)> = vec![];
- for prop in &obj1.props {
- if let PropOrSpread::Prop(p) = prop {
- if let Prop::KeyValue(key_val) = &**p {
- let name = get_key_name(&key_val.key);
- new_props.push((name, prop))
- }
- }
- }
- for prop in &obj2.props {
- if let PropOrSpread::Prop(p) = prop {
- if let Prop::KeyValue(key_val) = &**p {
- let prop_name = &get_key_name(&key_val.key);
- let mut exists = false;
- for (name, _) in &new_props {
- if prop_name == name {
- exists = true;
- }
- }
- if exists {
- continue;
- }
- // We can now add this prop
- new_props.push((prop_name.to_owned(), prop))
- }
- }
- }
- let mut data_to_ret = vec![];
- for (_, prop) in new_props {
- data_to_ret.push(prop.clone());
- }
- data_to_ret
-}
-fn generate_plugin_expr(
- name: &str,
- extra_config: &Value,
- original_config: &Option,
-) -> Option {
- Some(ExprOrSpread {
- spread: None,
- expr: Box::new(Expr::Call(CallExpr {
- span: Default::default(),
- callee: Callee::Expr(Box::new(Expr::Ident(Ident::new(
- name.into(),
- swc_common::DUMMY_SP,
- )))),
- args: vec![ExprOrSpread {
- spread: None,
- expr: Box::new({
- let mut converted = to_expr(extra_config);
- if let Some(ExprOrSpread { expr, .. }) = &original_config {
- if let Expr::Call(call_expr) = &**expr {
- if !call_expr.args.is_empty()
- && let Expr::Object(obj) = &*call_expr.args[0].expr
- {
- if let Expr::Object(new_cfg) = &converted {
- let merged = merge_objects(new_cfg, obj);
- converted = Expr::Object(ObjectLit {
- span: DUMMY_SP,
- props: merged,
- })
- }
- }
- }
- }
- converted
- }),
- }],
- type_args: None,
- })),
- })
-}
-fn add_new_plugins(visitor: &mut TransformVisitor, arr_lit: &ArrayLit) -> PropOrSpread {
- let mut elems: Vec