├── docs ├── pnpm-workspace.yaml ├── .gitignore ├── package.json ├── vitepress_docs │ ├── .vitepress │ │ ├── theme │ │ │ ├── index.ts │ │ │ └── style.css │ │ └── config.ts │ ├── about.md │ ├── index.md │ ├── installation.md │ ├── supported-integrations.md │ ├── start-commands.md │ └── basic-commands.md └── pnpm-lock.yaml ├── packages ├── utils │ ├── .gitignore │ ├── CHANGELOG.md │ ├── src │ │ ├── index.ts │ │ ├── ui │ │ │ ├── index.ts │ │ │ ├── cancelable.ts │ │ │ └── spinnerify.ts │ │ ├── paths │ │ │ └── index.ts │ │ ├── start │ │ │ ├── add_api.ts │ │ │ ├── add_data.ts │ │ │ ├── add_route.ts │ │ │ └── index.ts │ │ ├── open │ │ │ └── index.ts │ │ ├── transform │ │ │ ├── index.ts │ │ │ └── parse.ts │ │ ├── package-manager │ │ │ └── index.ts │ │ ├── fs │ │ │ └── index.ts │ │ └── updates │ │ │ └── index.ts │ ├── tsup.config.ts │ ├── tsconfig.json │ ├── package.json │ └── tests │ │ └── plugin_transforms.test.ts ├── full-solid │ ├── README.md │ ├── CHANGELOG.md │ ├── tests │ │ └── debuginfo.test.ts │ ├── tsconfig.json │ ├── tsup.config.ts │ ├── src │ │ ├── debug │ │ │ ├── runtime-detector.ts │ │ │ └── index.ts │ │ ├── bin.ts │ │ └── start │ │ │ └── index.ts │ └── package.json ├── create-solid │ ├── tsconfig.json │ ├── src │ │ └── bin.ts │ ├── tsup.config.ts │ ├── package.json │ ├── README.md │ └── CHANGELOG.md └── create │ ├── tests │ └── template.test.ts │ ├── tsup.config.ts │ ├── src │ ├── create-library.ts │ ├── utils │ │ ├── file-system.ts │ │ ├── ts-conversion.ts │ │ └── constants.ts │ ├── create.ts │ ├── create-start.ts │ ├── create-vanilla.ts │ └── index.ts │ ├── tsconfig.json │ ├── README.md │ ├── package.json │ └── CHANGELOG.md ├── .prettierignore ├── pnpm-workspace.yaml ├── vitest.config.ts ├── setup.ts ├── .prettierrc ├── turbo.json ├── .changeset ├── config.json └── README.md ├── .github └── workflows │ └── tests.yml ├── README.md ├── LICENSE ├── package.json └── .gitignore /docs/pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/utils/.gitignore: -------------------------------------------------------------------------------- 1 | types -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | **/*.rs 2 | **/*.yaml 3 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | vitepress_docs/.vitepress/cache -------------------------------------------------------------------------------- /packages/full-solid/README.md: -------------------------------------------------------------------------------- 1 | # Full Solid 2 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - packages/* -------------------------------------------------------------------------------- /packages/utils/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # @solid-cli/utils 2 | 3 | ## 0.6.0 4 | -------------------------------------------------------------------------------- /packages/utils/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./start"; 2 | export * from "./open"; 3 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vitest/config"; 2 | export default defineConfig({ 3 | test: { globalSetup: ["./setup.ts"] }, 4 | }); 5 | -------------------------------------------------------------------------------- /packages/utils/src/ui/index.ts: -------------------------------------------------------------------------------- 1 | import { cancelable } from "./cancelable"; 2 | import { spinnerify } from "./spinnerify"; 3 | export { cancelable, spinnerify }; 4 | -------------------------------------------------------------------------------- /packages/full-solid/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # @solid-cli/full 2 | 3 | ## 0.6.1 4 | 5 | ### Patch Changes 6 | 7 | - Fix regression from 0.5.x (.gitignore wasn't being written to new projects) 8 | 9 | ## 0.6.0 10 | -------------------------------------------------------------------------------- /packages/utils/tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["src"], 5 | target: "esnext", 6 | format: ["esm", "cjs"], 7 | splitting: false, 8 | sourcemap: true, 9 | clean: true, 10 | minify: true, 11 | }); 12 | -------------------------------------------------------------------------------- /setup.ts: -------------------------------------------------------------------------------- 1 | import type { TestProject } from "vitest/node"; 2 | import { existsSync, rmSync } from "fs"; 3 | export default function setup(project: TestProject) { 4 | // Clean up test directory before running tests 5 | if (existsSync("./test")) rmSync("./test", { recursive: true }); 6 | } 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [], 3 | "arrowParens": "always", 4 | "htmlWhitespaceSensitivity": "ignore", 5 | "printWidth": 120, 6 | "semi": true, 7 | "tabWidth": 2, 8 | "trailingComma": "all", 9 | "useTabs": true, 10 | "quoteProps": "consistent", 11 | "endOfLine": "auto" 12 | } 13 | -------------------------------------------------------------------------------- /packages/full-solid/tests/debuginfo.test.ts: -------------------------------------------------------------------------------- 1 | import { expect, it } from "vitest"; 2 | import { fetchDebugInfo, prettyPrint } from "../src/debug"; 3 | 4 | it("Runs", async () => { 5 | const output = prettyPrint(await fetchDebugInfo()); 6 | 7 | expect(output).contains("Runtime", "System"); 8 | }); 9 | -------------------------------------------------------------------------------- /packages/utils/src/paths/index.ts: -------------------------------------------------------------------------------- 1 | import { homedir as oshomedir, tmpdir as ostmpdir } from "os"; 2 | 3 | export const homedir = () => { 4 | return process.env.XDG_CONFIG_HOME ?? oshomedir(); 5 | }; 6 | 7 | export const tmpdir = () => { 8 | return process.env.XDG_CACHE_HOME ?? ostmpdir(); 9 | }; 10 | -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "tasks": { 4 | "build": { 5 | "dependsOn": ["^build"], 6 | "outputs": ["dist/**", "types/**"] 7 | }, 8 | "test": { 9 | "dependsOn": ["^test"] 10 | }, 11 | "dev": { 12 | "cache": false, 13 | "persistent": true 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "restricted", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /packages/create-solid/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "target": "ESNext", 5 | "moduleResolution": "Bundler", 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "skipLibCheck": true, 10 | "resolveJsonModule": true, 11 | "noEmit": true 12 | }, 13 | "include": ["src/*"] 14 | } 15 | -------------------------------------------------------------------------------- /packages/utils/src/ui/cancelable.ts: -------------------------------------------------------------------------------- 1 | import { log } from "@clack/prompts"; 2 | export const cancelable = async ( 3 | prompt: Promise, 4 | cancelMessage: string = "Canceled", 5 | ): Promise => { 6 | const value = await prompt; 7 | 8 | if (typeof value === "symbol") { 9 | log.warn(cancelMessage); 10 | process.exit(0); 11 | } 12 | 13 | return value; 14 | }; 15 | -------------------------------------------------------------------------------- /packages/full-solid/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "noEmit": true, 5 | "module": "ESNext", 6 | "target": "ESNext", 7 | "moduleResolution": "Bundler", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "skipLibCheck": true, 12 | "resolveJsonModule": true 13 | }, 14 | "include": ["src/*"] 15 | } 16 | -------------------------------------------------------------------------------- /packages/create/tests/template.test.ts: -------------------------------------------------------------------------------- 1 | import { expect, it } from "vitest"; 2 | import { createVanilla } from "../src"; 3 | import { existsSync } from "fs"; 4 | it("downloads and extracts the basic template", async () => { 5 | await createVanilla({ template: "basic", destination: "./test/ts" }, false); 6 | 7 | const appTsx = existsSync("./test/ts/src/App.tsx"); 8 | expect(appTsx).toBe(true); 9 | }); 10 | -------------------------------------------------------------------------------- /packages/create/tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["src/index.ts"], 5 | target: "esnext", 6 | format: "esm", 7 | splitting: true, 8 | sourcemap: false, 9 | clean: true, 10 | treeshake: true, 11 | banner: { 12 | js: `import { createRequire } from "module"; 13 | const require = createRequire(import.meta.url);`, 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "docs:dev": "vitepress dev vitepress_docs", 6 | "docs:build": "vitepress build vitepress_docs", 7 | "docs:preview": "vitepress preview vitepress_docs" 8 | }, 9 | "devDependencies": { 10 | "flexsearch": "^0.7.43", 11 | "vitepress": "1.1.3", 12 | "vitepress-plugin-search": "1.0.4-alpha.22", 13 | "vue": "^3.4.23" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/create/src/create-library.ts: -------------------------------------------------------------------------------- 1 | import { downloadRepo, GithubFetcher } from "@begit/core"; 2 | 3 | export type CreateLibraryArgs = { 4 | destination: string; 5 | }; 6 | export const createLibrary = ({ destination }: CreateLibraryArgs) => { 7 | return downloadRepo( 8 | { 9 | repo: { owner: "solidjs-community", name: "solid-lib-starter" }, 10 | dest: destination, 11 | }, 12 | GithubFetcher, 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /packages/create-solid/src/bin.ts: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | 3 | import { runMain } from "citty"; 4 | import { createSolid } from "@solid-cli/create"; 5 | import { intro } from "@clack/prompts"; 6 | import color from "picocolors"; 7 | import packageJson from "../package.json" with { type: "json" }; 8 | 9 | intro(`\n${color.bgCyan(color.black(` Create-Solid v${packageJson.version}`))}`); 10 | 11 | runMain(createSolid(packageJson.version)); 12 | -------------------------------------------------------------------------------- /packages/create/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "target": "ESNext", 5 | "moduleResolution": "Bundler", 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "skipLibCheck": true, 10 | "resolveJsonModule": true, 11 | 12 | "declaration": true, 13 | "emitDeclarationOnly": true, 14 | "outDir": "types" 15 | }, 16 | "include": ["src/*"] 17 | } 18 | -------------------------------------------------------------------------------- /packages/create-solid/tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["src/bin.ts"], 5 | target: "esnext", 6 | format: "esm", 7 | splitting: true, 8 | bundle: true, 9 | sourcemap: false, 10 | clean: true, 11 | treeshake: true, 12 | minify: true, 13 | banner: { 14 | js: `import { createRequire } from "module"; 15 | const require = createRequire(import.meta.url);`, 16 | }, 17 | }); 18 | -------------------------------------------------------------------------------- /packages/full-solid/tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["src/bin.ts"], 5 | target: "esnext", 6 | format: "esm", 7 | splitting: true, 8 | bundle: true, 9 | sourcemap: false, 10 | clean: true, 11 | treeshake: true, 12 | minify: true, 13 | banner: { 14 | js: `import { createRequire } from "module"; 15 | const require = createRequire(import.meta.url);`, 16 | }, 17 | }); 18 | -------------------------------------------------------------------------------- /docs/vitepress_docs/.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | // https://vitepress.dev/guide/custom-theme 2 | import { h } from "vue"; 3 | import Theme from "vitepress/theme"; 4 | import "./style.css"; 5 | 6 | export default { 7 | extends: Theme, 8 | Layout: () => { 9 | return h(Theme.Layout, null, { 10 | // https://vitepress.dev/guide/extending-default-theme#layout-slots 11 | }); 12 | }, 13 | enhanceApp({ app, router, siteData }) { 14 | // ... 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /packages/utils/src/start/add_api.ts: -------------------------------------------------------------------------------- 1 | import { mkdir } from "fs/promises"; 2 | import { writeChecked } from "../fs"; 3 | 4 | export const createApi = async (path: string, name?: string) => { 5 | const path_parts = path.split("/"); 6 | 7 | path_parts.unshift("src", "routes", "api"); 8 | 9 | await mkdir(path_parts.join("/"), { recursive: true }); 10 | 11 | path_parts.push(name ? `${name}.ts` : "index.ts"); 12 | 13 | await writeChecked(path_parts.join("/"), ""); 14 | }; 15 | -------------------------------------------------------------------------------- /packages/utils/src/start/add_data.ts: -------------------------------------------------------------------------------- 1 | import { mkdir } from "fs/promises"; 2 | import { writeChecked } from "../fs"; 3 | 4 | export const createData = async (path: string, name?: string) => { 5 | const path_parts = path.split("/"); 6 | 7 | path_parts.unshift("src", "routes"); 8 | 9 | await mkdir(path_parts.join("/"), { recursive: true }); 10 | 11 | path_parts.push(name ? `${name}.data.ts` : "Index.data.ts"); 12 | 13 | await writeChecked(path_parts.join("/"), ""); 14 | }; 15 | -------------------------------------------------------------------------------- /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /packages/utils/src/start/add_route.ts: -------------------------------------------------------------------------------- 1 | import { mkdir } from "fs/promises"; 2 | import { writeChecked } from "../fs"; 3 | 4 | const default_file = `export default function Route() { 5 | return <>; 6 | } 7 | `; 8 | 9 | export const createRoute = async (path: string, name?: string) => { 10 | const path_parts = path.split("/"); 11 | 12 | path_parts.unshift("src", "routes"); 13 | 14 | await mkdir(path_parts.join("/"), { recursive: true }); 15 | 16 | path_parts.push(name ? `(${name}).tsx` : "index.tsx"); 17 | 18 | await writeChecked(path_parts.join("/"), default_file); 19 | }; 20 | -------------------------------------------------------------------------------- /docs/vitepress_docs/about.md: -------------------------------------------------------------------------------- 1 | # About 2 | 3 | The Solid CLI is a tool aiming to make the Solid development experience easier, faster, and less error prone. 4 | 5 | ## Features 6 | 7 | ### Automatic Config manipulation 8 | 9 | Can automatically update your config to enable solid features, such as toggling SSR, or adding adapters. 10 | 11 | ### Adding integrations 12 | 13 | Can automatically install and configure supported packages. 14 | 15 | ### Project creation 16 | 17 | Provides an easy way to create new projects, whether that be locally, or on a platform such as stackblitz or codesandbox. 18 | -------------------------------------------------------------------------------- /packages/create/src/utils/file-system.ts: -------------------------------------------------------------------------------- 1 | import { Dirent, readdirSync } from "node:fs"; 2 | import { readFile } from "node:fs/promises"; 3 | import { resolve } from "node:path"; 4 | 5 | export const recurseFiles = (startPath: string, cb: (file: Dirent, startPath: string) => void) => { 6 | startPath = resolve(startPath); 7 | 8 | const files = readdirSync(startPath, { withFileTypes: true }); 9 | 10 | for (const file of files) { 11 | cb(file, startPath); 12 | } 13 | }; 14 | 15 | export const readFileToString = async (path: string) => { 16 | return (await readFile(path)).toString(); 17 | }; 18 | -------------------------------------------------------------------------------- /packages/create/src/create.ts: -------------------------------------------------------------------------------- 1 | import { createStart, CreateStartArgs } from "./create-start"; 2 | import { createVanilla, CreateVanillaArgs } from "./create-vanilla"; 3 | 4 | export async function create(args: CreateVanillaArgs, js: boolean, isStart: false): Promise; 5 | export async function create(args: CreateStartArgs, js: boolean, isStart: true): Promise; 6 | export async function create(args: CreateVanillaArgs | CreateStartArgs, js: boolean, isStart: boolean) { 7 | if (isStart) { 8 | return createStart(args as CreateStartArgs, js); 9 | } else { 10 | return createVanilla(args as CreateVanillaArgs, js); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/utils/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "types": ["node"], 7 | "skipLibCheck": true, 8 | "declaration": true, 9 | "emitDeclarationOnly": true, 10 | "moduleResolution": "Node", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "allowSyntheticDefaultImports": true, 14 | "strict": true, 15 | "noUnusedLocals": true, 16 | "noUnusedParameters": true, 17 | "noFallthroughCasesInSwitch": true, 18 | "outDir": "types", 19 | "declarationMap": true 20 | }, 21 | "include": ["src/*", "src/**/*"] 22 | } 23 | -------------------------------------------------------------------------------- /packages/create/README.md: -------------------------------------------------------------------------------- 1 | # @solid-cli/create 2 | 3 | A library for easily initialising Solid projects 4 | 5 | ## Usage 6 | 7 | ### Initialising a Vanilla project 8 | 9 | ```ts 10 | import { createVanilla } from "@solid-cli/create"; 11 | createVanilla({ template: "ts", destination: "./ts" }); 12 | ``` 13 | 14 | ### Initialising a Start project 15 | 16 | ```ts 17 | import { createStart } from "@solid-cli/create"; 18 | createStart({ template: "basic", destination: "./basic" }); 19 | ``` 20 | 21 | ### Initialising a Library project 22 | 23 | ```ts 24 | import { createLibrary } from "@solid-cli/create"; 25 | createLibrary({ destination: "./library-project" }); 26 | ``` 27 | -------------------------------------------------------------------------------- /packages/utils/src/start/index.ts: -------------------------------------------------------------------------------- 1 | import { readFile } from "fs/promises"; 2 | 3 | export const isSolidStart = async () => { 4 | const packageJsonStr = (await readFile("./package.json")).toString(); 5 | const packageJson = JSON.parse(packageJsonStr); 6 | const deps = Object.keys(packageJson["dependencies"] ?? {}); 7 | const devDeps = Object.keys(packageJson["devDependencies"] ?? {}); 8 | const allDeps = deps.concat(devDeps); 9 | for (let i = 0; i < allDeps.length; i++) { 10 | const dep = allDeps[i]; 11 | if (dep === "@solidjs/start") return true; 12 | } 13 | return false; 14 | }; 15 | 16 | export * from "./add_api"; 17 | export * from "./add_data"; 18 | export * from "./add_route"; 19 | -------------------------------------------------------------------------------- /packages/full-solid/src/debug/runtime-detector.ts: -------------------------------------------------------------------------------- 1 | type RuntimeName = "Bun" | "Node" | "Deno"; 2 | type Runtime = { name: RuntimeName; version: string }; 3 | declare global { 4 | var Bun: { version: string } | undefined; 5 | var Deno: { version: { deno: string } } | undefined; 6 | } 7 | export const detectRuntime = (): Runtime => { 8 | if (globalThis.Bun) { 9 | return { name: "Bun", version: globalThis.Bun?.version }; 10 | } 11 | if (globalThis.Deno) { 12 | return { name: "Deno", version: globalThis.Deno?.version?.deno }; 13 | } 14 | // @ts-ignore 15 | if (typeof process !== undefined && !!process.versions?.node) { 16 | // @ts-ignore 17 | return { name: "Node", version: process?.version }; 18 | } 19 | throw new Error("Unable to detect"); 20 | }; 21 | -------------------------------------------------------------------------------- /packages/utils/src/ui/spinnerify.ts: -------------------------------------------------------------------------------- 1 | import { spinner } from "@clack/prompts"; 2 | type SpinnerItem = { 3 | startText: string; 4 | finishText: string; 5 | fn: () => Promise; 6 | }; 7 | export async function spinnerify(spinners: SpinnerItem): Promise; 8 | export async function spinnerify(spinners: SpinnerItem[]): Promise; 9 | export async function spinnerify(spinners: SpinnerItem[] | SpinnerItem) { 10 | if (!Array.isArray(spinners)) spinners = [spinners]; 11 | let results: any[] = []; 12 | const s = spinner(); 13 | for (const { startText, finishText, fn } of spinners) { 14 | s.start(startText); 15 | results.push(await fn()); 16 | s.stop(finishText); 17 | } 18 | return results.length === 1 ? results[0] : results; 19 | } 20 | -------------------------------------------------------------------------------- /docs/vitepress_docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # https://vitepress.dev/reference/default-theme-home-page 3 | layout: home 4 | 5 | hero: 6 | name: "Solid-CLI Docs" 7 | text: "Documentation for the Solid CLI" 8 | tagline: A solid cli 9 | actions: 10 | - theme: brand 11 | text: Get started 12 | link: /about 13 | features: 14 | - title: Package manager 15 | icon: 📦 16 | details: Installs solid related packages, and automatically configures them in your project. 17 | - title: Customisable 18 | details: Plugins can be used to extend or manipulate existing functionality 19 | icon: 🎨 20 | - title: Automatic configuration 21 | icon: ♻ 22 | details: Can automatically enable or disable features within solid, such as automatically enabling SSR 23 | --- 24 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Build and Test 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | build: 11 | runs-on: ${{ matrix.os }} 12 | strategy: 13 | matrix: 14 | os: [ubuntu-latest, windows-latest, macos-latest] 15 | 16 | steps: 17 | - uses: actions/checkout@v4 18 | - uses: pnpm/action-setup@v3 19 | with: 20 | version: latest 21 | 22 | - name: Setup Node.js environment 23 | uses: actions/setup-node@v4 24 | with: 25 | node-version: 20 26 | 27 | - name: Install dependencies 28 | run: pnpm install --ignore-scripts 29 | 30 | - name: Build all packages 31 | run: pnpm build 32 | - name: Test all packages 33 | run: pnpm test 34 | env: 35 | BEGIT_GH_API_KEY: ${{ secrets.GITHUB_TOKEN }} 36 | -------------------------------------------------------------------------------- /packages/full-solid/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@solid-cli/full", 3 | "version": "0.6.2", 4 | "description": "Create Solid apps with low configuration", 5 | "author": "Thomas Beer", 6 | "contributors": [ 7 | "Rahul Batra" 8 | ], 9 | "license": "MIT", 10 | "homepage": "https://solid-cli.netlify.app", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/solidjs-community/solid-cli" 14 | }, 15 | "keywords": [ 16 | "solidjs", 17 | "solid", 18 | "cli" 19 | ], 20 | "main": "dist/index.mjs", 21 | "bin": { 22 | "sd": "./dist/bin.mjs" 23 | }, 24 | "files": [ 25 | "dist" 26 | ], 27 | "scripts": { 28 | "start": "jiti ./src/bin.ts", 29 | "build": "tsc && tsup", 30 | "test": "vitest run" 31 | }, 32 | "devDependencies": { 33 | "@clack/prompts": "0.11.0", 34 | "picocolors": "^1.1.1", 35 | "citty": "^0.1.6", 36 | "@solid-cli/create": "workspace:*", 37 | "@solid-cli/utils": "workspace:*" 38 | }, 39 | "publishConfig": { 40 | "access": "public" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /packages/create-solid/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-solid", 3 | "version": "0.6.11", 4 | "description": "Create Solid apps with low configuration", 5 | "author": "Thomas Beer", 6 | "contributors": [ 7 | "Rahul Batra" 8 | ], 9 | "license": "MIT", 10 | "homepage": "https://solid-cli.netlify.app", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/solidjs-community/solid-cli" 14 | }, 15 | "keywords": [ 16 | "solidjs", 17 | "solid", 18 | "cli" 19 | ], 20 | "main": "./dist/index.mjs", 21 | "module": "./dist/index.mjs", 22 | "bin": { 23 | "create-solid": "./dist/bin.mjs" 24 | }, 25 | "files": [ 26 | "dist" 27 | ], 28 | "scripts": { 29 | "start": "jiti ./src/bin.ts", 30 | "build": "tsc && tsup", 31 | "test": "vitest run" 32 | }, 33 | "devDependencies": { 34 | "@clack/prompts": "0.11.0", 35 | "picocolors": "^1.1.1", 36 | "citty": "^0.1.6", 37 | "@solid-cli/create": "workspace:*" 38 | }, 39 | "publishConfig": { 40 | "access": "public" 41 | }, 42 | "dependencies": {} 43 | } 44 | -------------------------------------------------------------------------------- /docs/vitepress_docs/installation.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | The CLI can be installed locally to your project via 4 | 5 | ```sh 6 | npm install @solid-cli/core 7 | ``` 8 | 9 | Or installed globally: 10 | 11 | ### UNIX/MacOS/Linux 12 | 13 | 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. 14 | 15 | ```sh 16 | sudo npm install -g @solid-cli/core 17 | ``` 18 | 19 | ### Windows 20 | 21 | ```sh 22 | npm install -g @solid-cli/core 23 | ``` 24 | 25 | It can then be invoked via the keyword `solid`, and the help page can be displayed with `solid --help` 26 | 27 | ```txt 28 | ┌ Solid-CLI 29 | solid 30 | 31 | where can be one of: 32 | 33 | - add - Can add and install integrations: `solid add unocss`. 34 | - docs 35 | - new - Creates a new solid project 36 | - set 37 | - start - Commands specific to solid start 38 | - playground 39 | 40 | For more help, try running `solid --help` 41 | ``` 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Solid CLI 3 |

4 | 5 | > [!WARNING] 6 | > This project is under heavy development and is not yet complete. More features coming soon! 7 | 8 | # Solid CLI 9 | 10 | [![Build and Test](https://github.com/solidjs-community/solid-cli/actions/workflows/tests.yml/badge.svg)](https://github.com/solidjs-community/solid-cli/actions/workflows/tests.yml) 11 | [![Netlify Status](https://api.netlify.com/api/v1/badges/5233ac74-3f53-4c90-b95d-25b528b931a1/deploy-status)](https://app.netlify.com/sites/solid-cli/deploys) 12 | 13 | A CLI for creating and managing SolidJS apps and projects. 14 | 15 | ## Commands 16 | 17 | - `sd create`: See [create-solid](./packages/create-solid) 18 | - `sd docs`: Opens the Solid docs in the browser 19 | - `sd start`: Special keyword for SolidStart commands 20 | - `route`: Creates a new route ie. `sd start route login` 21 | 22 | ## Contributing 23 | 24 | Please feel free to contribute to this repo by creating an issue or a PR. 25 | -------------------------------------------------------------------------------- /packages/full-solid/src/bin.ts: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | 3 | import { defineCommand, runMain } from "citty"; 4 | import { createSolid } from "@solid-cli/create"; 5 | import packageJson from "../package.json" with { type: "json" }; 6 | import { intro } from "@clack/prompts"; 7 | import * as color from "picocolors"; 8 | import * as p from "@clack/prompts"; 9 | import { debuginfo } from "./debug"; 10 | import { startCommands } from "./start"; 11 | import { openInBrowser } from "@solid-cli/utils"; 12 | intro(`\n${color.bgCyan(color.black(` Solid CLI v${packageJson.version}`))}`); 13 | 14 | const main = defineCommand({ 15 | meta: { 16 | description: "The full Solid CLI", 17 | }, 18 | subCommands: { 19 | create: createSolid(packageJson.version), 20 | debug: debuginfo, 21 | start: startCommands, 22 | docs: defineCommand({ 23 | meta: { description: "Open the Solid Docs in your browser" }, 24 | async run() { 25 | openInBrowser("https://docs.solidjs.com"); 26 | p.log.success("Opened successfully"); 27 | }, 28 | }), 29 | }, 30 | }); 31 | 32 | runMain(main); 33 | -------------------------------------------------------------------------------- /docs/vitepress_docs/.vitepress/config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vitepress"; 2 | import { SearchPlugin } from "vitepress-plugin-search"; 3 | // https://vitepress.dev/reference/site-config 4 | export default defineConfig({ 5 | title: "Solid-CLI Docs", 6 | description: "Documentation for the Solid CLI", 7 | themeConfig: { 8 | // https://vitepress.dev/reference/default-theme-config 9 | nav: [ 10 | { text: "Home", link: "/" }, 11 | { text: "Guide", link: "/about" }, 12 | ], 13 | 14 | sidebar: [ 15 | { 16 | text: "Getting started", 17 | items: [ 18 | { text: "About", link: "/about" }, 19 | { text: "Installation", link: "/installation" }, 20 | { text: "Basic Commands", link: "/basic-commands" }, 21 | { text: "SolidStart Commands", link: "/start-commands" }, 22 | ], 23 | }, 24 | { text: "Supported Integrations", link: "/supported-integrations" }, 25 | ], 26 | socialLinks: [ 27 | { 28 | icon: "github", 29 | link: "https://github.com/solidjs-community/solid-cli", 30 | }, 31 | ], 32 | }, 33 | vite: { plugins: [SearchPlugin()] }, 34 | }); 35 | -------------------------------------------------------------------------------- /docs/vitepress_docs/supported-integrations.md: -------------------------------------------------------------------------------- 1 | # Supported Integrations 2 | 3 | ## Adapters 4 | 5 | - [AWS](https://github.com/solidjs/solid-start/tree/main/packages/start-aws) 6 | - [Cloudflare-pages](https://github.com/solidjs/solid-start/tree/main/packages/start-cloudflare-pages) 7 | - [Cloudflare-workers](https://github.com/solidjs/solid-start/tree/main/packages/start-cloudflare-workers) 8 | - [Deno](https://github.com/solidjs/solid-start/tree/main/packages/start-deno) 9 | - [Netlify](https://github.com/solidjs/solid-start/tree/main/packages/start-netlify) 10 | - [Node](https://github.com/solidjs/solid-start/tree/main/packages/start-node) 11 | - [Static](https://github.com/solidjs/solid-start/tree/main/packages/start-static) 12 | - [Vercel](https://github.com/solidjs/solid-start/tree/main/packages/start-vercel) 13 | 14 | ## Packages 15 | 16 | These packages will be automatically installed and configured with sensible defaults: 17 | 18 | - [UnoCSS](https://unocss.dev/) 19 | - [Tailwind CSS](https://tailwindcss.com/) 20 | - [Solid Devtools](https://github.com/thetarnav/solid-devtools) 21 | - [VitePWA](https://vite-pwa-org.netlify.app) 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 SolidJS Community 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /packages/utils/src/open/index.ts: -------------------------------------------------------------------------------- 1 | // Taken verbatim from https://github.com/withastro/astro/blob/main/packages/astro/src/cli/docs/open.ts 2 | import { execa } from "execa"; 3 | 4 | /** 5 | * Credit: Azhar22 6 | * @see https://github.com/azhar22k/ourl/blob/master/index.js 7 | */ 8 | const getPlatformSpecificCommand = (): [string] | [string, string[]] => { 9 | const isGitPod = Boolean(process.env.GITPOD_REPO_ROOT); 10 | const platform = isGitPod ? "gitpod" : process.platform; 11 | 12 | switch (platform) { 13 | case "android": 14 | case "linux": 15 | return ["xdg-open"]; 16 | case "darwin": 17 | return ["open"]; 18 | case "win32": 19 | return ["cmd", ["/c", "start"]]; 20 | case "gitpod": 21 | return ["/ide/bin/remote-cli/gitpod-code", ["--openExternal"]]; 22 | default: 23 | throw new Error( 24 | `It looks like your platform ("${platform}") isn't supported!\nTo view Astro's docs, please visit https://docs.astro.build`, 25 | ); 26 | } 27 | }; 28 | 29 | export async function openInBrowser(url: string) { 30 | const [command, args = []] = getPlatformSpecificCommand(); 31 | return execa(command, [...args, encodeURI(url)]); 32 | } 33 | -------------------------------------------------------------------------------- /packages/create/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@solid-cli/create", 3 | "version": "0.6.11", 4 | "description": "Create Solid apps with low configuration", 5 | "author": "Thomas Beer", 6 | "contributors": [ 7 | "Rahul Batra" 8 | ], 9 | "license": "MIT", 10 | "homepage": "https://solid-cli.netlify.app", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/solidjs-community/solid-cli" 14 | }, 15 | "keywords": [ 16 | "solidjs", 17 | "solid", 18 | "cli" 19 | ], 20 | "main": "./dist/index.mjs", 21 | "module": "./dist/index.mjs", 22 | "types": "./types/index.d.ts", 23 | "exports": { 24 | ".": { 25 | "types": "./types/index.d.ts", 26 | "import": "./dist/index.mjs", 27 | "require": "./dist/index.mjs" 28 | } 29 | }, 30 | "files": [ 31 | "dist", 32 | "types" 33 | ], 34 | "scripts": { 35 | "start": "jiti ./src/bin.ts", 36 | "build": "tsc && tsup", 37 | "test": "vitest run" 38 | }, 39 | "publishConfig": { 40 | "access": "public" 41 | }, 42 | "dependencies": { 43 | "@clack/prompts": "0.11.0", 44 | "picocolors": "^1.1.1", 45 | "@begit/core": "^0.3.3", 46 | "citty": "^0.1.6", 47 | "sucrase": "^3.35.0", 48 | "@solid-cli/utils": "workspace:*" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /packages/full-solid/src/start/index.ts: -------------------------------------------------------------------------------- 1 | import { createApi, createRoute } from "@solid-cli/utils"; 2 | import { defineCommand } from "citty"; 3 | import * as p from "@clack/prompts"; 4 | import { green } from "picocolors"; 5 | import { cancelable } from "@solid-cli/utils/ui"; 6 | export const startCommands = defineCommand({ 7 | meta: { description: "Start-specific commands" }, 8 | subCommands: { 9 | route: defineCommand({ 10 | meta: { description: "Creates a new route" }, 11 | args: { 12 | path: { 13 | type: "positional", 14 | required: false, 15 | description: "Route path", 16 | }, 17 | api: { 18 | type: "boolean", 19 | required: false, 20 | default: false, 21 | alias: "a", 22 | }, 23 | }, 24 | async run({ args: { path, api } }) { 25 | path ||= await cancelable( 26 | p.text({ 27 | message: "Route path", 28 | validate(value) { 29 | if (value.length === 0) return "A route path is required"; 30 | }, 31 | }), 32 | ); 33 | if (api) { 34 | await createApi(path as string); 35 | } else { 36 | await createRoute(path as string); 37 | } 38 | p.log.success(`Route ${green(path as string)} successfully created!`); 39 | }, 40 | }), 41 | }, 42 | }); 43 | -------------------------------------------------------------------------------- /packages/create-solid/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Create Solid apps in one command with create-solid. 3 | --- 4 | 5 | # Create Solid 6 | 7 | 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: 8 | 9 | ```bash 10 | #or 11 | npm init solid@latest 12 | 13 | #or 14 | pnpm create solid@latest 15 | 16 | # or 17 | yarn create solid 18 | 19 | # or 20 | bunx create-solid 21 | ``` 22 | 23 | ## Why use Create Solid? 24 | 25 | `create-solid` allows you to create a new Solid app within seconds. It includes a number of benefits: 26 | 27 | - **Interactive Experience**: Running `npm init solid@latest` (with no arguments) launches an interactive experience that guides you through setting up a project. 28 | - **Zero Dependencies**: Initializing a project is as quick as one second. Create Solid has zero runtime dependencies. 29 | - **Support for Examples**: Create Solid App can bootstrap your application using an example from the SolidStart official examples collection. 30 | -------------------------------------------------------------------------------- /packages/create-solid/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # create-solid 2 | 3 | ## 0.6.11 4 | 5 | ### Patch Changes 6 | 7 | - Rename `with-pages-router-file-based` to `with-vite-plugin-pages` 8 | 9 | ## 0.6.10 10 | 11 | ### Patch Changes 12 | 13 | - Fetch Vanilla templates from /vanilla subdirectory of solidjs/templates, rather than from repo root 14 | 15 | ## 0.6.9 16 | 17 | ### Patch Changes 18 | 19 | - Fetch Start templates from solidjs/templates, rather than the Start repo 20 | 21 | ## 0.6.8 22 | 23 | ### Patch Changes 24 | 25 | - Correctly perform TS->JS conversion by disabling ES transforms and preserving dynamic imports 26 | 27 | ## 0.6.7 28 | 29 | ### Patch Changes 30 | 31 | - Add `with-strict-csp` template to Start 32 | 33 | ## 0.6.6 34 | 35 | ### Patch Changes 36 | 37 | - Add CLI flags for creating `vanilla` and `library` projects 38 | 39 | ## 0.6.5 40 | 41 | ### Patch Changes 42 | 43 | - Don't add "Created with Solid CLI" text to README if it's already there 44 | 45 | ## 0.6.4 46 | 47 | ### Patch Changes 48 | 49 | - Update link in text added to project READMEs 50 | 51 | ## 0.6.3 52 | 53 | ### Patch Changes 54 | 55 | - Add more command line arguments 56 | 57 | ## 0.6.1 58 | 59 | ### Patch Changes 60 | 61 | - Fix regression from 0.5.x (.gitignore wasn't being written to new projects) 62 | 63 | ## 0.6.0 64 | -------------------------------------------------------------------------------- /packages/utils/src/transform/index.ts: -------------------------------------------------------------------------------- 1 | import { generateCode, parseModule } from "magicast"; 2 | import { addVitePlugin } from "magicast/helpers"; 3 | import { addPlugins } from "./parse"; 4 | 5 | export type Config = { 6 | type: "app" | "vite"; 7 | name: string; 8 | contents: string; 9 | }; 10 | 11 | // TODO: Handle case when vite config is a function 12 | 13 | export const transformPlugins = async ( 14 | new_plugins: PluginOptions[], 15 | config: Config, 16 | _force_transform = false, 17 | _merge_configs = false, 18 | ) => { 19 | const mod = parseModule(config.contents, { trailingComma: false, flowObjectCommas: false }); 20 | 21 | if (config.type === "vite") { 22 | for (const plugin of new_plugins) { 23 | addVitePlugin(mod, { 24 | imported: plugin.isDefault ? "default" : plugin.importName, 25 | from: plugin.importSource, 26 | constructor: plugin.importName, 27 | options: plugin.options, 28 | }); 29 | } 30 | 31 | return generateCode(mod).code; 32 | } 33 | 34 | return addPlugins(mod, new_plugins).code; 35 | }; 36 | // All the integrations/packages that we support 37 | // export const supported = ["unocss", "vitepwa", "solid-devtools"] as const; 38 | export type PluginOptions = { 39 | importName: string; 40 | importSource: string; 41 | isDefault: boolean; 42 | options: object; 43 | }; 44 | -------------------------------------------------------------------------------- /packages/create/src/create-start.ts: -------------------------------------------------------------------------------- 1 | import { downloadRepo, GithubFetcher } from "@begit/core"; 2 | import { join } from "path"; 3 | import { writeFileSync } from "fs"; 4 | import { handleTSConversion } from "./utils/ts-conversion"; 5 | import { GIT_IGNORE, StartTemplate } from "./utils/constants"; 6 | export type CreateStartArgs = { 7 | template: StartTemplate; 8 | destination: string; 9 | }; 10 | 11 | export const createStartTS = ({ template, destination }: CreateStartArgs) => { 12 | return downloadRepo( 13 | { 14 | repo: { owner: "solidjs", name: "templates", subdir: `solid-start/${template}` }, 15 | dest: destination, 16 | }, 17 | GithubFetcher, 18 | ); 19 | }; 20 | 21 | export const createStartJS = async ({ template, destination }: CreateStartArgs) => { 22 | // Create typescript project in `/.project` 23 | // then transpile this to javascript and clean up 24 | const tempDir = join(destination, ".project"); 25 | await createStartTS({ template, destination: tempDir }); 26 | await handleTSConversion(tempDir, destination); 27 | // Add .gitignore 28 | writeFileSync(join(destination, ".gitignore"), GIT_IGNORE); 29 | }; 30 | 31 | export const createStart = (args: CreateStartArgs, transpile?: boolean) => { 32 | if (transpile) { 33 | return createStartJS(args); 34 | } 35 | return createStartTS(args); 36 | }; 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solid-cli", 3 | "private": true, 4 | "version": "0.0.1", 5 | "description": "A CLI for making the SolidJS development experience easier, faster, and less error prone.", 6 | "license": "MIT", 7 | "homepage": "https://solid-cli.netlify.app", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/solidjs-community/solid-cli" 11 | }, 12 | "scripts": { 13 | "test": "vitest run", 14 | "test:all": "turbo run test", 15 | "build": "turbo run build", 16 | "release": "pnpm build && changeset publish", 17 | "start": "pnpm build && cd packages/create-solid && pnpm start", 18 | "format": "prettier --write .", 19 | "watch:build": "turbo watch build", 20 | "update-deps": "ncu -u --packageFile packages/**/package.json" 21 | }, 22 | "contributors": [ 23 | { 24 | "name": "Thomas Beer" 25 | }, 26 | { 27 | "name": "Rahul Batra" 28 | } 29 | ], 30 | "workspaces": [ 31 | "./packages/*" 32 | ], 33 | "devDependencies": { 34 | "@types/node": "24.1.0", 35 | "tsup": "^8.5.0", 36 | "typescript": "^5.9.2", 37 | "@changesets/cli": "2.29.5", 38 | "prettier": "^3.6.2", 39 | "turbo": "^2.5.5", 40 | "vitest": "^3.2.4", 41 | "jiti": "^2.5.1" 42 | }, 43 | "packageManager": "pnpm@10.14.0", 44 | "pnpm": { 45 | "onlyBuiltDependencies": [ 46 | "@swc/core", 47 | "esbuild" 48 | ] 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /packages/create/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # @solid-cli/create 2 | 3 | ## 0.6.11 4 | 5 | ### Patch Changes 6 | 7 | - Rename `with-pages-router-file-based` to `with-vite-plugin-pages` 8 | 9 | ## 0.6.10 10 | 11 | ### Patch Changes 12 | 13 | - Fetch Vanilla templates from /vanilla subdirectory of solidjs/templates, rather than from repo root 14 | 15 | ## 0.6.9 16 | 17 | ### Patch Changes 18 | 19 | - Fetch Start templates from solidjs/templates, rather than the Start repo 20 | 21 | ## 0.6.8 22 | 23 | ### Patch Changes 24 | 25 | - Correctly perform TS->JS conversion by disabling ES transforms and preserving dynamic imports 26 | 27 | ## 0.6.7 28 | 29 | ### Patch Changes 30 | 31 | - Add `with-strict-csp` template to Start 32 | 33 | ## 0.6.6 34 | 35 | ### Patch Changes 36 | 37 | - Add CLI flags for creating `vanilla` and `library` projects 38 | 39 | ## 0.6.5 40 | 41 | ### Patch Changes 42 | 43 | - Don't add "Created with Solid CLI" text to README if it's already there 44 | 45 | ## 0.6.4 46 | 47 | ### Patch Changes 48 | 49 | - Update link in text added to project READMEs 50 | 51 | ## 0.6.3 52 | 53 | ### Patch Changes 54 | 55 | - Add more command line arguments 56 | 57 | ## 0.6.1 58 | 59 | ### Patch Changes 60 | 61 | - Fix regression from 0.5.x (.gitignore wasn't being written to new projects) 62 | 63 | ## 0.6.0 64 | 65 | ### Patch Changes 66 | 67 | - @solid-cli/utils@0.6.0 68 | -------------------------------------------------------------------------------- /packages/create/src/create-vanilla.ts: -------------------------------------------------------------------------------- 1 | import { downloadRepo, GithubFetcher } from "@begit/core"; 2 | import { join } from "node:path"; 3 | import { writeFileSync } from "node:fs"; 4 | import { readFile } from "node:fs/promises"; 5 | import { handleTSConversion } from "./utils/ts-conversion"; 6 | import { GIT_IGNORE, VanillaTemplate } from "./utils/constants"; 7 | 8 | export type CreateVanillaArgs = { 9 | template: VanillaTemplate; 10 | destination: string; 11 | }; 12 | export const createVanilla = (args: CreateVanillaArgs, transpile?: boolean) => { 13 | if (transpile) { 14 | return createVanillaJS(args); 15 | } 16 | return createVanillaTS(args); 17 | }; 18 | 19 | export const createVanillaTS = async ({ template, destination }: CreateVanillaArgs) => { 20 | return await downloadRepo( 21 | { repo: { owner: "solidjs", name: "templates", subdir: `vanilla/${template}` }, dest: destination }, 22 | GithubFetcher, 23 | ); 24 | }; 25 | 26 | export const createVanillaJS = async ({ template, destination }: CreateVanillaArgs) => { 27 | // Create typescript project in `/.project` 28 | // then transpile this to javascript and clean up 29 | const tempDir = join(destination, ".project"); 30 | await createVanillaTS({ template, destination: tempDir }); 31 | await handleTSConversion(tempDir, destination); 32 | // Replace `index.tsx` with `index.jsx` in `index.html` 33 | const indexPath = join(destination, "index.html"); 34 | writeFileSync(indexPath, (await readFile(indexPath)).toString().replace("index.tsx", "index.jsx")); 35 | // Add .gitignore 36 | writeFileSync(join(destination, ".gitignore"), GIT_IGNORE); 37 | }; 38 | -------------------------------------------------------------------------------- /packages/create/src/utils/ts-conversion.ts: -------------------------------------------------------------------------------- 1 | import { copyFileSync, Dirent, mkdirSync, writeFileSync } from "node:fs"; 2 | import { readFileToString, recurseFiles } from "./file-system"; 3 | import { join, resolve } from "node:path"; 4 | import { transform } from "sucrase"; 5 | import { rm } from "node:fs/promises"; 6 | import { JS_CONFIG } from "./constants"; 7 | 8 | const convertToJS = async (file: Dirent, startPath: string) => { 9 | const src = join(startPath, file.name); 10 | const dest = resolve(startPath.replace(".project", ""), file.name); 11 | if (file.isDirectory()) { 12 | mkdirSync(dest, { recursive: true }); 13 | recurseFiles(resolve(startPath, file.name), convertToJS); 14 | } else if (file.isFile()) { 15 | if (src.endsWith(".ts") || src.endsWith(".tsx")) { 16 | let { code } = transform(await readFileToString(src), { 17 | transforms: ["typescript", "jsx"], 18 | jsxRuntime: "preserve", 19 | disableESTransforms: true, 20 | preserveDynamicImport: true, 21 | }); 22 | 23 | writeFileSync(dest.replace(".ts", ".js"), code, { flag: "wx" }); 24 | } else { 25 | copyFileSync(src, dest); 26 | } 27 | } 28 | }; 29 | export const handleTSConversion = async (tempDir: string, projectName: string) => { 30 | await rm(resolve(tempDir, "tsconfig.json")); 31 | writeFileSync(resolve(projectName, "jsconfig.json"), JSON.stringify(JS_CONFIG, null, 2), { flag: "wx" }); 32 | 33 | // Convert all ts files in temp directory into js 34 | recurseFiles(tempDir, convertToJS); 35 | 36 | // Remove temp directory 37 | await rm(join(process.cwd(), tempDir), { 38 | recursive: true, 39 | force: true, 40 | }); 41 | }; 42 | -------------------------------------------------------------------------------- /docs/vitepress_docs/start-commands.md: -------------------------------------------------------------------------------- 1 | # SolidStart Commands 2 | 3 | ### `Mode` 4 | 5 | ```sh 6 | solid start mode 7 | ``` 8 | 9 | Set the rendering mode for solid to build for and use (ie. Client-Side Rendering (CSR), Server-Side Rendering (SSR), Static-Site Generation (SSG)) 10 | 11 | **Options** 12 | 13 | | Option | Description | 14 | | -------- | -------------------------------------------------------------- | 15 | | `` | The rendering mode to use. One of the following: csr, ssr, ssg | 16 | 17 | --- 18 | 19 | ### `Route` 20 | 21 | ```sh 22 | solid start route 23 | ``` 24 | 25 | Creates a new route file in the file routes directory. 26 | 27 | **Options** 28 | 29 | | Option | Description | 30 | | -------- | ------------------------------------------- | 31 | | `` | The path to the new route | 32 | | `` | The name of the `.tsx` file to be generated | 33 | 34 | --- 35 | 36 | ### `Adapter` 37 | 38 | ```sh 39 | solid start adapter 40 | ``` 41 | 42 | Used to setup a SolidStart specific adapter. 43 | 44 | **Options** 45 | 46 | | Option | Description | 47 | | --------- | -------------------------------- | 48 | | `` | The name of the adapter `string` | 49 | | `--force` | Force setup the adapater | 50 | 51 | ### `Data` 52 | 53 | ```sh 54 | solid start data 55 | ``` 56 | 57 | Creates a new data file at the given path 58 | 59 | **Options** 60 | 61 | | Option | Description | 62 | | -------- | ----------------------------------------------- | 63 | | `` | The path to the new data file | 64 | | `` | The name of the `.data.ts` file to be generated | 65 | -------------------------------------------------------------------------------- /packages/full-solid/src/debug/index.ts: -------------------------------------------------------------------------------- 1 | /// This subcommand prints useful debug info to stdout 2 | import { readFile } from "fs/promises"; 3 | import os from "os"; 4 | import { defineCommand } from "citty"; 5 | import { detectRuntime } from "./runtime-detector"; 6 | import * as p from "@clack/prompts"; 7 | type DebugInfo = { 8 | runtime: { name: string; version: string }; 9 | os: { platform: string; release: string }; 10 | packages: Record; 11 | }; 12 | const getPackageJSON = async () => { 13 | const f = await readFile("package.json"); 14 | const parsed = JSON.parse(f.toString()); 15 | return parsed; 16 | }; 17 | const prettyPrintRecord = (record: Record) => { 18 | let str = ""; 19 | for (const key in record) { 20 | const value = record[key]; 21 | str += ` ${key}: ${value}\n`; 22 | } 23 | return str; 24 | }; 25 | 26 | export const prettyPrint = (info: DebugInfo) => { 27 | return `System: 28 | OS: ${info.os.platform} ${info.os.release} 29 | Runtime: 30 | ${info.runtime.name}: ${info.runtime.version} 31 | ${ 32 | Object.keys(info.packages).length !== 0 33 | ? `Dependencies: 34 | ${prettyPrintRecord(info.packages)}` 35 | : "" 36 | }`; 37 | }; 38 | export const fetchDebugInfo = async (): Promise => { 39 | const parsed = await getPackageJSON(); 40 | const packages: Record = parsed.dependencies ?? {}; 41 | const runtime = detectRuntime(); 42 | return { 43 | runtime, 44 | os: { 45 | platform: os.platform(), 46 | release: os.release(), 47 | }, 48 | packages, 49 | }; 50 | }; 51 | 52 | export const debuginfo = defineCommand({ 53 | meta: { description: "Print important debug info" }, 54 | async run(_ctx) { 55 | const info = await fetchDebugInfo(); 56 | p.log.info(prettyPrint(info)); 57 | }, 58 | }); 59 | -------------------------------------------------------------------------------- /packages/utils/src/package-manager/index.ts: -------------------------------------------------------------------------------- 1 | // Taken almost verbatim from https://github.com/solidjs/solid-start/blob/f351f42ba8566cbfa72b483dd63d4debcb386230/packages/create-solid/cli/index.js#L62C1-L80C2 2 | export const detectPackageManager = (): PackageManager => { 3 | // This environment variable is set by npm and yarn but pnpm seems less consistent 4 | const userAgent = process.env.npm_config_user_agent || ""; 5 | 6 | switch (true) { 7 | case userAgent.startsWith("yarn"): 8 | return { 9 | name: "yarn", 10 | runner: "npx", 11 | installCommand: "add", 12 | runScriptCommand(s) { 13 | return `run ${s}`; 14 | }, 15 | }; 16 | case userAgent.startsWith("pnpm"): 17 | return { 18 | name: "pnpm", 19 | runner: "pnpx", 20 | installCommand: "add", 21 | runScriptCommand(s) { 22 | return s; 23 | }, 24 | }; 25 | case userAgent.startsWith("bun"): 26 | return { 27 | name: "bun", 28 | runner: "bunx", 29 | installCommand: "add", 30 | runScriptCommand(s) { 31 | return s; 32 | }, 33 | }; 34 | case userAgent.startsWith("deno"): 35 | return { 36 | name: "deno", 37 | runner: "deno run", 38 | installCommand: "add", 39 | runScriptCommand(s) { 40 | return `task ${s}`; 41 | }, 42 | }; 43 | default: 44 | return { 45 | name: "npm", 46 | runner: "npx", 47 | installCommand: "install", 48 | runScriptCommand(s) { 49 | return `run ${s}`; 50 | }, 51 | }; 52 | } 53 | }; 54 | 55 | export const getInstallCommand = (packageManager: PackageManager): string => { 56 | return packageManager.installCommand; 57 | }; 58 | 59 | export const getRunnerCommand = (packageManager: PackageManager) => { 60 | return packageManager.runner; 61 | }; 62 | 63 | export type PackageManager = { 64 | name: string; 65 | runner: string; 66 | installCommand: string; 67 | runScriptCommand: (script: string) => string; 68 | }; 69 | -------------------------------------------------------------------------------- /packages/utils/src/fs/index.ts: -------------------------------------------------------------------------------- 1 | import { readFile, writeFile } from "fs/promises"; 2 | // import { queueUpdate, readQueuedFile, unqueueUpdate } from "../updates"; 3 | // export const writeFile = (path: string, data: string, checked: boolean = false) => { 4 | // // First, unqueue all previous updates to this file 5 | // unqueueUpdate(path, "file"); 6 | // queueUpdate({ type: "file", name: path, contents: data, checked }); 7 | // }; 8 | // export const readFile = async (path: string) => { 9 | // const queued = readQueuedFile(path); 10 | // if (queued) return queued.contents; 11 | // return await readFile1(path); 12 | // }; 13 | export const readFileToString = async (path: string) => { 14 | return (await readFile(path)).toString(); 15 | }; 16 | // export const writeChecked = async (path: string, contents: string) => { 17 | // unqueueUpdate(path, "file"); 18 | // queueUpdate({ type: "file", name: path, contents, checked: true }); 19 | // }; 20 | export const writeChecked = async (path: string, contents: string) => { 21 | await writeFile(path, contents); 22 | }; 23 | export const insertAtBeginning = async (path: string, text: string) => { 24 | const contents = await readFileToString(path); 25 | writeFile(path, text + contents); 26 | }; 27 | export const insertAtEnd = async (path: string, text: string) => { 28 | const contents = await readFileToString(path); 29 | writeFile(path, contents + text); 30 | }; 31 | export const replaceString = async (path: string, search: string | RegExp, replace: string) => { 32 | let contents = await readFileToString(path); 33 | contents = contents.replace(search, replace); 34 | writeFile(path, contents); 35 | }; 36 | export const insertBefore = async (path: string, search: string | RegExp, text: string) => { 37 | await replaceString(path, search, text + search); 38 | }; 39 | export const insertAfter = async (path: string, search: string | RegExp, text: string) => { 40 | await replaceString(path, search, search + text); 41 | }; 42 | -------------------------------------------------------------------------------- /packages/utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@solid-cli/utils", 3 | "version": "0.6.1", 4 | "description": "A collection of utilities for the Solid CLI", 5 | "license": "MIT", 6 | "homepage": "https://solid-cli.netlify.app", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/solidjs-community/solid-cli" 10 | }, 11 | "files": [ 12 | "dist", 13 | "types" 14 | ], 15 | "main": "./dist/index.mjs", 16 | "module": "./dist/index.mjs", 17 | "types": "./types/index.d.ts", 18 | "exports": { 19 | ".": { 20 | "types": "./types/index.d.ts", 21 | "import": "./dist/index.mjs", 22 | "require": "./dist/index.mjs" 23 | }, 24 | "./paths": { 25 | "types": "./types/paths/index.d.ts", 26 | "import": "./dist/paths/index.mjs", 27 | "require": "./dist/paths/index.mjs" 28 | }, 29 | "./transform": { 30 | "types": "./types/transform/index.d.ts", 31 | "import": "./dist/transform/index.mjs", 32 | "require": "./dist/transform/index.mjs" 33 | }, 34 | "./updates": { 35 | "types": "./types/updates/index.d.ts", 36 | "import": "./dist/updates/index.mjs", 37 | "require": "./dist/updates/index.mjs" 38 | }, 39 | "./fs": { 40 | "types": "./types/fs/index.d.ts", 41 | "import": "./dist/fs/index.mjs", 42 | "require": "./dist/fs/index.mjs" 43 | }, 44 | "./util-types": { 45 | "types": "./types/util-types/index.d.ts", 46 | "import": "./dist/util-types/index.mjs", 47 | "require": "./dist/util-types/index.mjs" 48 | }, 49 | "./primitives": { 50 | "types": "./types/primitives/index.d.ts", 51 | "import": "./dist/primitives/index.mjs", 52 | "require": "./dist/primitives/index.mjs" 53 | }, 54 | "./package-manager": { 55 | "types": "./types/package-manager/index.d.ts", 56 | "import": "./dist/package-manager/index.mjs", 57 | "require": "./dist/package-manager/index.mjs" 58 | }, 59 | "./ui": { 60 | "types": "./types/ui/index.d.ts", 61 | "import": "./dist/ui/index.mjs", 62 | "require": "./dist/ui/index.mjs" 63 | } 64 | }, 65 | "scripts": { 66 | "test": "vitest run", 67 | "build": "tsc && tsup" 68 | }, 69 | "devDependencies": { 70 | "magicast": "^0.3.5" 71 | }, 72 | "publishConfig": { 73 | "access": "public" 74 | }, 75 | "dependencies": { 76 | "@clack/core": "0.5.0", 77 | "@clack/prompts": "0.11.0", 78 | "execa": "^9.6.0", 79 | "picocolors": "^1.1.1" 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /docs/vitepress_docs/.vitepress/theme/style.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Customize default theme styling by overriding CSS variables: 3 | * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css 4 | */ 5 | 6 | /** 7 | * Colors 8 | * -------------------------------------------------------------------------- */ 9 | 10 | :root { 11 | --vp-c-brand: #646cff; 12 | --vp-c-brand-light: #747bff; 13 | --vp-c-brand-lighter: #9499ff; 14 | --vp-c-brand-lightest: #bcc0ff; 15 | --vp-c-brand-dark: #535bf2; 16 | --vp-c-brand-darker: #454ce1; 17 | --vp-c-brand-dimm: rgba(100, 108, 255, 0.08); 18 | } 19 | 20 | /** 21 | * Component: Button 22 | * -------------------------------------------------------------------------- */ 23 | 24 | :root { 25 | --vp-button-brand-border: var(--vp-c-brand-light); 26 | --vp-button-brand-text: var(--vp-c-white); 27 | --vp-button-brand-bg: var(--vp-c-brand); 28 | --vp-button-brand-hover-border: var(--vp-c-brand-light); 29 | --vp-button-brand-hover-text: var(--vp-c-white); 30 | --vp-button-brand-hover-bg: var(--vp-c-brand-light); 31 | --vp-button-brand-active-border: var(--vp-c-brand-light); 32 | --vp-button-brand-active-text: var(--vp-c-white); 33 | --vp-button-brand-active-bg: var(--vp-button-brand-bg); 34 | } 35 | 36 | /** 37 | * Component: Home 38 | * -------------------------------------------------------------------------- */ 39 | 40 | :root { 41 | --vp-home-hero-name-color: transparent; 42 | --vp-home-hero-name-background: -webkit-linear-gradient(120deg, #bd34fe 30%, #41d1ff); 43 | 44 | --vp-home-hero-image-background-image: linear-gradient(-45deg, #bd34fe 50%, #47caff 50%); 45 | --vp-home-hero-image-filter: blur(40px); 46 | } 47 | 48 | @media (min-width: 640px) { 49 | :root { 50 | --vp-home-hero-image-filter: blur(56px); 51 | } 52 | } 53 | 54 | @media (min-width: 960px) { 55 | :root { 56 | --vp-home-hero-image-filter: blur(72px); 57 | } 58 | } 59 | 60 | /** 61 | * Component: Custom Block 62 | * -------------------------------------------------------------------------- */ 63 | 64 | :root { 65 | --vp-custom-block-tip-border: var(--vp-c-brand); 66 | --vp-custom-block-tip-text: var(--vp-c-brand-darker); 67 | --vp-custom-block-tip-bg: var(--vp-c-brand-dimm); 68 | } 69 | 70 | .dark { 71 | --vp-custom-block-tip-border: var(--vp-c-brand); 72 | --vp-custom-block-tip-text: var(--vp-c-brand-lightest); 73 | --vp-custom-block-tip-bg: var(--vp-c-brand-dimm); 74 | } 75 | 76 | /** 77 | * Component: Algolia 78 | * -------------------------------------------------------------------------- */ 79 | 80 | .DocSearch { 81 | --docsearch-primary-color: var(--vp-c-brand) !important; 82 | } 83 | -------------------------------------------------------------------------------- /docs/vitepress_docs/basic-commands.md: -------------------------------------------------------------------------------- 1 | # Basic Commands 2 | 3 | ### `Add` 4 | 5 | ```sh 6 | solid add 7 | ``` 8 | 9 | Used to add packages and setup integrations. 10 | 11 | ::: info 12 | 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 13 | all supported integrations and packages. You can select the ones you want to use through there. 14 | ::: 15 | 16 | **Options** 17 | 18 | | Option | Description | 19 | | --------------- | ------------------------------------------------------------------------------------------------------ | 20 | | `` | List of integrations you want to add to your project (ie. unocss, vitepwa, solid-devtools) | 21 | | `--force` | Force apply any changes to the config to add the integration(s) even if they already exist `(boolean)` | 22 | 23 | --- 24 | 25 | ### `New` 26 | 27 | ```sh 28 | solid new 29 | ``` 30 | 31 | Creates a new solid project with the selected variation and name. 32 | 33 | This can also be used to spin up a new stackblitz or codesandbox instance. 34 | 35 | **Options** 36 | 37 | | Option | Description | 38 | | -------------------------- | ------------------------------------------------------------------------------------------- | 39 | | `` | The variation you want to start the project from. One of the following: "bare", "js", "ts". | 40 | | `` | The name of the project and the folder to create it in. | 41 | | `--stackblitz (short: -s)` | Create the project with the variation in a stackblitz instance. `(boolean)` | 42 | 43 | --- 44 | 45 | ### `Docs` 46 | 47 | ```sh 48 | solid docs 49 | ``` 50 | 51 | Searches for a given keyword within the main solid documentation sites 52 | 53 | **Options** 54 | 55 | | Option | Description | 56 | | ----------- | ---------------------------------------------- | 57 | | `` | The keyword to search within the docs websites | 58 | 59 | --- 60 | 61 | ### `Set` 62 | 63 | ```sh 64 | solid set 65 | ``` 66 | 67 | Sets a specified config parameter to a specified value 68 | 69 | **Options** 70 | 71 | | Option | Description | 72 | | --------- | -------------------------------- | 73 | | `` | The key within the config to set | 74 | | `` | The value to set that key to | 75 | 76 | --- 77 | 78 | ### `Playground` 79 | 80 | ```sh 81 | solid playground 82 | ``` 83 | 84 | Attempts to open the [Solid Playground](https://playground.solidjs.com) in the browser 85 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # SWC Plugin Cache 95 | .swc 96 | 97 | # Turbopack files 98 | .turbo 99 | 100 | # Gatsby files 101 | .cache/ 102 | # Comment in the public line in if your project uses Gatsby and not Next.js 103 | # https://nextjs.org/blog/next-9-1#public-directory-support 104 | # public 105 | 106 | # vuepress build output 107 | .vuepress/dist 108 | 109 | # vuepress v2.x temp and cache directory 110 | .temp 111 | .cache 112 | 113 | # Docusaurus cache and generated files 114 | .docusaurus 115 | 116 | # Serverless directories 117 | .serverless/ 118 | 119 | # FuseBox cache 120 | .fusebox/ 121 | 122 | # DynamoDB Local files 123 | .dynamodb/ 124 | 125 | # TernJS port file 126 | .tern-port 127 | 128 | # Stores VSCode versions used for testing VSCode extensions 129 | .vscode-test 130 | 131 | # yarn v2 132 | .yarn/cache 133 | .yarn/unplugged 134 | .yarn/build-state.yml 135 | .yarn/install-state.gz 136 | .pnp.* 137 | 138 | # Test directory 139 | test 140 | 141 | # Build output 142 | types -------------------------------------------------------------------------------- /packages/utils/src/updates/index.ts: -------------------------------------------------------------------------------- 1 | import { open, writeFile } from "fs/promises"; 2 | import { $ } from "execa"; 3 | import { detectPackageManager, getInstallCommand } from "../package-manager"; 4 | declare global { 5 | var UPDATESQUEUE: Update[] | undefined; 6 | } 7 | // Batch all updates here, so we can confirm with the user then flush 8 | export const UPDATESQUEUE: Update[] = globalThis.UPDATESQUEUE ?? []; 9 | globalThis.UPDATESQUEUE = UPDATESQUEUE; 10 | type PackageUpdate = { type: "package"; name: string; dev: boolean }; 11 | type CommandUpdate = { type: "command"; name: string }; 12 | type FileUpdate = { type: "file"; name: string; contents: string; checked: boolean }; 13 | // Don't bother explicitly handling plugin updates, since they're just a file update 14 | export type Update = PackageUpdate | CommandUpdate | FileUpdate; 15 | type UpdateSummary = { 16 | packageUpdates: PackageUpdate[]; 17 | commandUpdates: string[]; 18 | fileUpdates: string[]; 19 | }; 20 | 21 | export const clearQueue = () => { 22 | UPDATESQUEUE.length = 0; 23 | }; 24 | export const summarizeUpdates = (): UpdateSummary => { 25 | const fileUpdates = UPDATESQUEUE.filter((u) => u.type === "file").map((s) => s.name); 26 | const packageUpdates = UPDATESQUEUE.filter((u) => u.type === "package") as PackageUpdate[]; 27 | const commandUpdates = UPDATESQUEUE.filter((u) => u.type === "command").map((s) => s.name); 28 | return { packageUpdates, commandUpdates, fileUpdates }; 29 | }; 30 | export const queueUpdate = (update: Update) => { 31 | UPDATESQUEUE.push(update); 32 | }; 33 | export const unqueueUpdate = (name: string, type: Update["type"]) => { 34 | const index = UPDATESQUEUE.findIndex((u) => u.name === name && u.type === type); 35 | if (index === -1) return; 36 | UPDATESQUEUE.splice(index, 1); 37 | }; 38 | export const readQueued = (name: string) => { 39 | return UPDATESQUEUE.find((u) => u.name === name); 40 | }; 41 | export const readQueuedFile = (name: string) => { 42 | const queued = readQueued(name); 43 | if (!queued || queued.type !== "file") return null; 44 | return queued; 45 | }; 46 | export const flushFileUpdates = async () => { 47 | const fileUpdates = UPDATESQUEUE.filter((u) => u.type === "file") as FileUpdate[]; 48 | 49 | for (const update of fileUpdates) { 50 | if (!update.checked) { 51 | await writeFile(update.name, update.contents); 52 | continue; 53 | } 54 | const handle = await open(update.name, "wx"); 55 | try { 56 | await handle.writeFile(update.contents); 57 | } finally { 58 | await handle.close(); 59 | } 60 | } 61 | }; 62 | export const flushPackageUpdates = async () => { 63 | const packageUpdates = UPDATESQUEUE.filter((u) => u.type === "package") as PackageUpdate[]; 64 | const pM = detectPackageManager(); 65 | const instlCmd = getInstallCommand(pM); 66 | for (const update of packageUpdates) { 67 | if (update.dev) { 68 | await $`${pM.name} ${instlCmd} -D ${update.name}`; 69 | } else { 70 | await $`${pM.name} ${instlCmd} ${update.name}`; 71 | } 72 | } 73 | }; 74 | export const flushCommandUpdates = async () => { 75 | const commandUpdates = UPDATESQUEUE.filter((u) => u.type === "command") as CommandUpdate[]; 76 | for (const update of commandUpdates) { 77 | await $`${update.name}`; 78 | } 79 | }; 80 | /** 81 | * Flushes every operation in the queue 82 | */ 83 | export const flushQueue = async () => { 84 | await flushFileUpdates(); 85 | await flushPackageUpdates(); 86 | await flushCommandUpdates(); 87 | clearQueue(); 88 | }; 89 | -------------------------------------------------------------------------------- /packages/utils/src/transform/parse.ts: -------------------------------------------------------------------------------- 1 | import { ASTNode, ProxifiedModule, generateCode } from "magicast"; 2 | import { PluginOptions } from "."; 3 | 4 | type ASTNodeFull = ASTNode & { 5 | key?: ASTNodeFull; 6 | value?: ASTNodeFull; 7 | name?: string; 8 | body?: ASTNodeFull[] | ASTNodeFull; 9 | }; 10 | 11 | type ArrayExpression = Extract; 12 | 13 | const isNodeFunction = (node: ASTNodeFull) => node.type === "BlockStatement" || node.type === "ArrowFunctionExpression"; 14 | 15 | const getReturnStatement = (node: ASTNodeFull | undefined) => { 16 | if (!node) return; 17 | if (node.type === "BlockStatement" && node.body) { 18 | let returnStatement; 19 | 20 | for (const leaf of node.body) { 21 | if (leaf.type === "ReturnStatement") { 22 | returnStatement = leaf; 23 | break; 24 | } 25 | } 26 | 27 | return returnStatement; 28 | } 29 | }; 30 | 31 | const findOrCreatePluginsProperty = (node: ASTNodeFull) => { 32 | if (node.type === "ObjectExpression" && node.properties) { 33 | for (const leaf of node.properties) { 34 | if ( 35 | leaf.type === "ObjectProperty" && 36 | leaf.key.loc?.identifierName === "plugins" && 37 | leaf.value.type === "ArrayExpression" 38 | ) { 39 | return leaf.value; 40 | } 41 | } 42 | 43 | const value: ArrayExpression = { 44 | type: "ArrayExpression", 45 | elements: [], 46 | }; 47 | 48 | node.properties.push({ 49 | type: "ObjectProperty", 50 | key: { 51 | type: "Identifier", 52 | name: "plugins", 53 | }, 54 | computed: false, 55 | shorthand: false, 56 | value, 57 | }); 58 | 59 | return value; 60 | } 61 | }; 62 | 63 | const findPlugins = (mod: ProxifiedModule): ArrayExpression | undefined => { 64 | const props: ASTNodeFull[] = mod.exports.default.$args[0].$ast.properties; 65 | 66 | let viteFound = false; 67 | for (const prop of props) { 68 | const key = prop.key?.name; 69 | if (key === "vite") { 70 | const isProperty = prop.type === "ObjectProperty"; 71 | const isMethod = prop.type === "ObjectMethod"; 72 | 73 | if (isMethod || (isProperty && isNodeFunction(prop.value))) { 74 | const returnValue = getReturnStatement( 75 | isProperty && prop.value.type === "ArrowFunctionExpression" && prop.value.body.type === "BlockStatement" 76 | ? prop.value.body 77 | : isMethod && prop.body.body 78 | ? prop.body 79 | : undefined, 80 | ); 81 | 82 | if (!returnValue) break; 83 | 84 | const arg = returnValue.argument; 85 | if (arg?.type === "ObjectExpression") { 86 | return findOrCreatePluginsProperty(arg); 87 | } 88 | } else if (isProperty && prop.value.type === "ObjectExpression") { 89 | return findOrCreatePluginsProperty(prop.value); 90 | } 91 | 92 | viteFound = true; 93 | 94 | break; 95 | } 96 | } 97 | 98 | if (!viteFound) { 99 | props.push({ 100 | type: "ObjectProperty", 101 | computed: false, 102 | shorthand: false, 103 | value: { type: "ObjectExpression", properties: [] }, 104 | key: { name: "vite", type: "Identifier" }, 105 | }); 106 | return findPlugins(mod); 107 | } 108 | }; 109 | 110 | export const addPlugins = (mod: ProxifiedModule, plugins: PluginOptions[]) => { 111 | // const mod = parseModule(config.contents, { trailingComma: false, flowObjectCommas: false }); 112 | 113 | const current = findPlugins(mod); 114 | 115 | for (const plugin of plugins) { 116 | mod.imports.$add({ 117 | from: plugin.importSource, 118 | imported: plugin.isDefault ? "default" : plugin.importName, 119 | local: plugin.importName, 120 | }); 121 | current?.elements.push(`${plugin.importName}({})` as any); 122 | } 123 | 124 | return generateCode(mod); 125 | }; 126 | -------------------------------------------------------------------------------- /packages/create/src/utils/constants.ts: -------------------------------------------------------------------------------- 1 | export const GIT_IGNORE = `dist 2 | .wrangler 3 | .output 4 | .vercel 5 | .netlify 6 | .vinxi 7 | app.config.timestamp_*.js 8 | 9 | # Environment 10 | .env 11 | .env*.local 12 | 13 | # dependencies 14 | /node_modules 15 | 16 | # IDEs and editors 17 | /.idea 18 | .project 19 | .classpath 20 | *.launch 21 | .settings/ 22 | 23 | # Temp 24 | gitignore 25 | 26 | # System Files 27 | .DS_Store 28 | Thumbs.db 29 | `; 30 | 31 | export const JS_CONFIG = { 32 | compilerOptions: { 33 | jsx: "preserve", 34 | jsxImportSource: "solid-js", 35 | paths: { 36 | "~/*": ["./src/*"], 37 | }, 38 | }, 39 | }; 40 | 41 | // Supported templates 42 | 43 | /**Supported Vanilla Templates */ 44 | const VANILLA_TEMPLATES = [ 45 | "basic", 46 | "bare", 47 | "with-vitest", 48 | "with-uvu", 49 | "with-unocss", 50 | "with-tailwindcss", 51 | "with-sass", 52 | "with-solid-router", 53 | "with-vite-plugin-pages", 54 | "with-tanstack-router-config-based", 55 | "with-tanstack-router-file-based", 56 | "with-tanstack-start", 57 | "with-jest", 58 | "with-bootstrap", 59 | ] as const satisfies string[]; 60 | export type VanillaTemplate = (typeof VANILLA_TEMPLATES)[number]; 61 | 62 | /** 63 | * @description This list is hardcoded. But templates are fetched from another github repo. 64 | * @see https://github.com/solidjs/templates/tree/main/solid-start 65 | */ 66 | const START_TEMPLATES = [ 67 | "basic", 68 | "bare", 69 | "with-solidbase", 70 | "with-auth", 71 | "with-authjs", 72 | "with-drizzle", 73 | "with-mdx", 74 | "with-prisma", 75 | "with-solid-styled", 76 | "with-tailwindcss", 77 | "with-tanstack-router", 78 | "with-trpc", 79 | "with-unocss", 80 | "with-vitest", 81 | "with-strict-csp", 82 | ] as const satisfies string[]; 83 | 84 | export type StartTemplate = (typeof START_TEMPLATES)[number]; 85 | 86 | /**Supported Library Templates */ 87 | export const LIBRARY_TEMPLATES = ["solid-lib-starter"] as const satisfies string[]; 88 | export type LibraryTemplate = (typeof LIBRARY_TEMPLATES)[number]; 89 | 90 | export const PROJECT_TYPES = ["start", "vanilla", "library"] as const satisfies string[]; 91 | export type ProjectType = (typeof PROJECT_TYPES)[number]; 92 | 93 | /** 94 | * Fetches the template list for the project type given 95 | * @param projectType type of project 96 | */ 97 | export function getTemplatesList(projectType: "vanilla"): StartTemplate[]; 98 | export function getTemplatesList(projectType: "start"): VanillaTemplate[]; 99 | export function getTemplatesList(projectType: "library"): VanillaTemplate[]; 100 | export function getTemplatesList(projectType: ProjectType): VanillaTemplate[] | StartTemplate[] | LibraryTemplate[]; 101 | export function getTemplatesList(projectType: ProjectType) { 102 | if (projectType === "start") { 103 | return START_TEMPLATES as StartTemplate[]; 104 | } else if (projectType === "library") { 105 | return LIBRARY_TEMPLATES as LibraryTemplate[]; 106 | } 107 | return VANILLA_TEMPLATES as VanillaTemplate[]; 108 | } 109 | 110 | /** 111 | * Tests is the template given is a valid template, and returns it as a template if it is 112 | * @param type expected type of the template 113 | * @param maybe_template the template string to test 114 | * @returns the template string if it is valid, undefined if not 115 | */ 116 | export function isValidTemplate(type: "vanilla", maybe_template: string): maybe_template is VanillaTemplate; 117 | export function isValidTemplate(type: "start", maybe_template: string): maybe_template is StartTemplate; 118 | export function isValidTemplate(type: "library", maybe_template: string): maybe_template is LibraryTemplate; 119 | export function isValidTemplate(type: ProjectType, maybe_template: string) { 120 | const templates = getTemplatesList(type); 121 | return templates.find((t) => t === maybe_template) !== undefined; 122 | } 123 | -------------------------------------------------------------------------------- /packages/utils/tests/plugin_transforms.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, test, expect } from "vitest"; 2 | import { Config, transformPlugins } from "../src/transform"; 3 | import { PluginOptions } from "../src/transform"; 4 | 5 | const removeWhitespace = (str: string) => str.replace(/\s/g, ""); 6 | 7 | const makeExampleConfig = ( 8 | plugins: string[], 9 | imports: string[] = [], 10 | functionVersion: "arrow" | "method" | "none" = "none", 11 | ) => { 12 | const pluginsStr = `plugins: [${plugins.join(", ")}]`; 13 | const viteOptionStr = 14 | functionVersion === "arrow" 15 | ? // @prettier-ignore 16 | ` 17 | vite: (options) => { 18 | return {${pluginsStr}}; 19 | }` 20 | : functionVersion === "method" 21 | ? // @prettier-ignore 22 | ` 23 | vite(options) { 24 | return {${pluginsStr}}; 25 | }` 26 | : // @prettier-ignore 27 | ` 28 | vite: { 29 | ${pluginsStr} 30 | }`; 31 | 32 | const result = 33 | // @prettier-ignore 34 | `${imports.join("\n")} 35 | import { defineConfig } from "@solidjs/start/config"; 36 | 37 | // Simulates an app config 38 | export default defineConfig({ 39 | ${viteOptionStr} 40 | });`; 41 | 42 | return result; 43 | }; 44 | 45 | const examplePlugin: PluginOptions = { 46 | importName: "examplePlugin", 47 | importSource: "example", 48 | isDefault: true, 49 | options: {}, 50 | }; 51 | describe("transformPlugins", () => { 52 | test("SPA config is updated properly", async () => { 53 | const config: Config = { 54 | type: "vite", 55 | name: "vite.config.ts", 56 | contents: ` 57 | import { defineConfig } from "vite"; 58 | 59 | // Simulates a vite config 60 | export default defineConfig({ 61 | plugins: [] 62 | }); 63 | `, 64 | }; 65 | const expected = ` 66 | import examplePlugin from "example"; 67 | import { defineConfig } from "vite"; 68 | 69 | // Simulates a vite config 70 | export default defineConfig({ 71 | plugins: [examplePlugin({})] 72 | }); 73 | `; 74 | 75 | const result = await transformPlugins([examplePlugin], config); 76 | 77 | expect(removeWhitespace(result)).toBe(removeWhitespace(expected)); 78 | }); 79 | test("No vite property defined config is updated properly", async () => { 80 | const config: Config = { 81 | type: "app", 82 | name: "app.config.ts", 83 | contents: ` 84 | import { defineConfig } from "@solidjs/start/config"; 85 | 86 | // Simulates an app config 87 | export default defineConfig({ 88 | }); 89 | `, 90 | }; 91 | const expected = makeExampleConfig(["examplePlugin({})"], ['import examplePlugin from "example";']); 92 | const result = await transformPlugins([examplePlugin], config); 93 | 94 | expect(removeWhitespace(result)).toBe(removeWhitespace(expected)); 95 | }); 96 | test("Object config is updated properly", async () => { 97 | const config: Config = { 98 | type: "app", 99 | name: "app.config.ts", 100 | contents: makeExampleConfig(["solid()"]), 101 | }; 102 | const expected = makeExampleConfig(["solid()", "examplePlugin({})"], ['import examplePlugin from "example";']); 103 | const result = await transformPlugins([examplePlugin], config); 104 | 105 | expect(removeWhitespace(result)).toBe(removeWhitespace(expected)); 106 | }); 107 | test("Arrow-function config is updated properly", async () => { 108 | const config: Config = { 109 | type: "app", 110 | name: "app.config.ts", 111 | contents: makeExampleConfig(["solid()"], [], "arrow"), 112 | }; 113 | const expected = makeExampleConfig( 114 | ["solid()", "examplePlugin({})"], 115 | ['import examplePlugin from "example";'], 116 | "arrow", 117 | ); 118 | const result = await transformPlugins([examplePlugin], config); 119 | 120 | expect(removeWhitespace(result)).toBe(removeWhitespace(expected)); 121 | }); 122 | 123 | test("Object method config is updated properly", async () => { 124 | const config: Config = { 125 | type: "app", 126 | name: "app.config.ts", 127 | contents: makeExampleConfig(["solid()"], [], "method"), 128 | }; 129 | const expected = makeExampleConfig( 130 | ["solid()", "examplePlugin({})"], 131 | ['import examplePlugin from "example";'], 132 | "method", 133 | ); 134 | const result = await transformPlugins([examplePlugin], config); 135 | 136 | expect(removeWhitespace(result)).toBe(removeWhitespace(expected)); 137 | }); 138 | }); 139 | -------------------------------------------------------------------------------- /packages/create/src/index.ts: -------------------------------------------------------------------------------- 1 | import { defineCommand } from "citty"; 2 | import { createVanilla } from "./create-vanilla"; 3 | import * as p from "@clack/prompts"; 4 | import { cancelable, spinnerify } from "@solid-cli/utils/ui"; 5 | import { createStart } from "./create-start"; 6 | import { 7 | getTemplatesList, 8 | GIT_IGNORE, 9 | isValidTemplate, 10 | PROJECT_TYPES, 11 | ProjectType, 12 | } from "./utils/constants"; 13 | import { detectPackageManager } from "@solid-cli/utils/package-manager"; 14 | import { existsSync, writeFileSync } from "node:fs"; 15 | import { join } from "node:path"; 16 | import { createLibrary } from "./create-library"; 17 | import { readFile, writeFile } from "node:fs/promises"; 18 | export { createVanilla, createStart, createLibrary }; 19 | 20 | export const createSolid = (version: string) => 21 | defineCommand({ 22 | meta: { 23 | name: "create-solid", 24 | description: "A CLI for scaffolding new Solid projects", 25 | version: version, 26 | }, 27 | args: { 28 | "projectNamePositional": { 29 | type: "positional", 30 | required: false, 31 | description: "Project name", 32 | }, 33 | "templatePositional": { 34 | type: "positional", 35 | required: false, 36 | description: "Template name", 37 | }, 38 | "project-name": { 39 | type: "string", 40 | required: false, 41 | alias: "p", 42 | description: "Project name", 43 | }, 44 | "template": { 45 | type: "string", 46 | required: false, 47 | alias: "t", 48 | description: "Template name", 49 | }, 50 | "solidstart": { 51 | type: "boolean", 52 | required: false, 53 | alias: "s", 54 | description: "Create a SolidStart project", 55 | }, 56 | "library": { 57 | type: "boolean", 58 | required: false, 59 | alias: "l", 60 | description: "Create a Library project", 61 | }, 62 | "vanilla": { 63 | type: "boolean", 64 | required: false, 65 | alias: "v", 66 | description: "Create a vanilla (SolidJS + Vite) project", 67 | }, 68 | "ts": { 69 | type: "boolean", 70 | required: false, 71 | description: "Use typescript", 72 | }, 73 | "js": { 74 | type: "boolean", 75 | required: false, 76 | description: "Use javascript", 77 | }, 78 | }, 79 | async run({ 80 | args: { 81 | projectNamePositional, 82 | templatePositional, 83 | "project-name": projectNameOptional, 84 | "template": templateOptional, 85 | solidstart, 86 | library, 87 | vanilla, 88 | ts, 89 | js, 90 | }, 91 | }) { 92 | // Show prompts for any unknown arguments 93 | let projectName: string = projectNamePositional ?? projectNameOptional; 94 | let template: string = templatePositional ?? templateOptional; 95 | let projectType: ProjectType | undefined = solidstart ? "start" : (vanilla ? "vanilla" : (library ? "library" : undefined)); 96 | // False if user has selected ts, true if they have selected js, and undefined if they've done neither 97 | let useJS = ts ? !ts : js ? js : undefined; 98 | projectName ??= await cancelable( 99 | p.text({ message: "Project Name", placeholder: "solid-project", defaultValue: "solid-project" }), 100 | ); 101 | projectType ??= await cancelable( 102 | p.select({ 103 | message: "What type of project would you like to create?", 104 | initialValue: "start", 105 | options: PROJECT_TYPES.map((t) => ({ 106 | value: t, 107 | label: t === "start" ? "SolidStart" : t === "vanilla" ? "SolidJS + Vite" : "Library", 108 | })), 109 | }), 110 | ); 111 | // Don't offer javascript if `projectType` is library 112 | useJS ??= projectType === "library" ? false : !(await cancelable(p.confirm({ message: "Use Typescript?" }))); 113 | 114 | const template_opts = getTemplatesList(projectType); 115 | template ??= await cancelable( 116 | p.select({ 117 | message: "Which template would you like to use?", 118 | initialValue: "ts", 119 | options: template_opts 120 | .filter((s) => (useJS ? s : !s.startsWith("js"))) 121 | .map((s: string) => ({ label: s, value: s })), 122 | }), 123 | ); 124 | 125 | // Need to transpile if the user wants Jabascript, but their selected template isn't Javascript 126 | const transpileToJS = useJS && !template.startsWith("js"); 127 | if (projectType === "start" && isValidTemplate("start", template)) { 128 | await spinnerify({ 129 | startText: "Creating project", 130 | finishText: "Project created 🎉", 131 | fn: () => createStart({ template, destination: projectName }, transpileToJS), 132 | }); 133 | } else if (projectType === "library" && isValidTemplate("library", template)) { 134 | await spinnerify({ 135 | startText: "Creating project", 136 | finishText: "Project created 🎉", 137 | fn: () => createLibrary({ destination: projectName }), 138 | }); 139 | } else if (projectType === "vanilla" && isValidTemplate(projectType, template)) { 140 | await spinnerify({ 141 | startText: "Creating project", 142 | finishText: "Project created 🎉", 143 | fn: () => createVanilla({ template, destination: projectName }, transpileToJS), 144 | }); 145 | } 146 | else { 147 | p.log.error(`Template ${template} is not valid for project type ${projectType}`); 148 | process.exit(0); 149 | } 150 | // Add .gitignore 151 | writeFileSync(join(projectName, ".gitignore"), GIT_IGNORE); 152 | // Add "Created with Solid CLI" text to bottom of README 153 | const readmePath = `${projectName}/README.md`; 154 | if (existsSync(readmePath)) { 155 | const contents = (await readFile(readmePath)).toString(); 156 | if (!contents.includes("This project was created with the [Solid CLI]")) 157 | await writeFile(readmePath, contents + "\n## This project was created with the [Solid CLI](https://github.com/solidjs-community/solid-cli)\n") 158 | } 159 | // Next steps.. 160 | const pM = detectPackageManager(); 161 | p.note( 162 | `cd ${projectName} 163 | ${pM.name} install 164 | ${pM.name} ${pM.runScriptCommand("dev")}`, 165 | "To get started, run:", 166 | ); 167 | }, 168 | }); 169 | -------------------------------------------------------------------------------- /docs/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | flexsearch: 12 | specifier: ^0.7.43 13 | version: 0.7.43 14 | vitepress: 15 | specifier: 1.1.3 16 | version: 1.1.3(@algolia/client-search@4.22.1)(search-insights@2.13.0) 17 | vitepress-plugin-search: 18 | specifier: 1.0.4-alpha.22 19 | version: 1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.1.3)(vue@3.4.23) 20 | vue: 21 | specifier: ^3.4.23 22 | version: 3.4.23 23 | 24 | packages: 25 | 26 | /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): 27 | resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} 28 | dependencies: 29 | '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) 30 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) 31 | transitivePeerDependencies: 32 | - '@algolia/client-search' 33 | - algoliasearch 34 | - search-insights 35 | dev: true 36 | 37 | /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): 38 | resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} 39 | peerDependencies: 40 | search-insights: '>= 1 < 3' 41 | dependencies: 42 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) 43 | search-insights: 2.13.0 44 | transitivePeerDependencies: 45 | - '@algolia/client-search' 46 | - algoliasearch 47 | dev: true 48 | 49 | /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): 50 | resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} 51 | peerDependencies: 52 | '@algolia/client-search': '>= 4.9.1 < 6' 53 | algoliasearch: '>= 4.9.1 < 6' 54 | dependencies: 55 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) 56 | '@algolia/client-search': 4.22.1 57 | algoliasearch: 4.22.1 58 | dev: true 59 | 60 | /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): 61 | resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} 62 | peerDependencies: 63 | '@algolia/client-search': '>= 4.9.1 < 6' 64 | algoliasearch: '>= 4.9.1 < 6' 65 | dependencies: 66 | '@algolia/client-search': 4.22.1 67 | algoliasearch: 4.22.1 68 | dev: true 69 | 70 | /@algolia/cache-browser-local-storage@4.22.1: 71 | resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} 72 | dependencies: 73 | '@algolia/cache-common': 4.22.1 74 | dev: true 75 | 76 | /@algolia/cache-common@4.22.1: 77 | resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} 78 | dev: true 79 | 80 | /@algolia/cache-in-memory@4.22.1: 81 | resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} 82 | dependencies: 83 | '@algolia/cache-common': 4.22.1 84 | dev: true 85 | 86 | /@algolia/client-account@4.22.1: 87 | resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} 88 | dependencies: 89 | '@algolia/client-common': 4.22.1 90 | '@algolia/client-search': 4.22.1 91 | '@algolia/transporter': 4.22.1 92 | dev: true 93 | 94 | /@algolia/client-analytics@4.22.1: 95 | resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} 96 | dependencies: 97 | '@algolia/client-common': 4.22.1 98 | '@algolia/client-search': 4.22.1 99 | '@algolia/requester-common': 4.22.1 100 | '@algolia/transporter': 4.22.1 101 | dev: true 102 | 103 | /@algolia/client-common@4.22.1: 104 | resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} 105 | dependencies: 106 | '@algolia/requester-common': 4.22.1 107 | '@algolia/transporter': 4.22.1 108 | dev: true 109 | 110 | /@algolia/client-personalization@4.22.1: 111 | resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} 112 | dependencies: 113 | '@algolia/client-common': 4.22.1 114 | '@algolia/requester-common': 4.22.1 115 | '@algolia/transporter': 4.22.1 116 | dev: true 117 | 118 | /@algolia/client-search@4.22.1: 119 | resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} 120 | dependencies: 121 | '@algolia/client-common': 4.22.1 122 | '@algolia/requester-common': 4.22.1 123 | '@algolia/transporter': 4.22.1 124 | dev: true 125 | 126 | /@algolia/logger-common@4.22.1: 127 | resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} 128 | dev: true 129 | 130 | /@algolia/logger-console@4.22.1: 131 | resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} 132 | dependencies: 133 | '@algolia/logger-common': 4.22.1 134 | dev: true 135 | 136 | /@algolia/requester-browser-xhr@4.22.1: 137 | resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} 138 | dependencies: 139 | '@algolia/requester-common': 4.22.1 140 | dev: true 141 | 142 | /@algolia/requester-common@4.22.1: 143 | resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} 144 | dev: true 145 | 146 | /@algolia/requester-node-http@4.22.1: 147 | resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} 148 | dependencies: 149 | '@algolia/requester-common': 4.22.1 150 | dev: true 151 | 152 | /@algolia/transporter@4.22.1: 153 | resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} 154 | dependencies: 155 | '@algolia/cache-common': 4.22.1 156 | '@algolia/logger-common': 4.22.1 157 | '@algolia/requester-common': 4.22.1 158 | dev: true 159 | 160 | /@babel/helper-string-parser@7.23.4: 161 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 162 | engines: {node: '>=6.9.0'} 163 | dev: true 164 | 165 | /@babel/helper-validator-identifier@7.22.20: 166 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 167 | engines: {node: '>=6.9.0'} 168 | dev: true 169 | 170 | /@babel/parser@7.24.4: 171 | resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} 172 | engines: {node: '>=6.0.0'} 173 | hasBin: true 174 | dependencies: 175 | '@babel/types': 7.24.0 176 | dev: true 177 | 178 | /@babel/types@7.24.0: 179 | resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} 180 | engines: {node: '>=6.9.0'} 181 | dependencies: 182 | '@babel/helper-string-parser': 7.23.4 183 | '@babel/helper-validator-identifier': 7.22.20 184 | to-fast-properties: 2.0.0 185 | dev: true 186 | 187 | /@docsearch/css@3.6.0: 188 | resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} 189 | dev: true 190 | 191 | /@docsearch/js@3.6.0(@algolia/client-search@4.22.1)(search-insights@2.13.0): 192 | resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} 193 | dependencies: 194 | '@docsearch/react': 3.6.0(@algolia/client-search@4.22.1)(search-insights@2.13.0) 195 | preact: 10.19.6 196 | transitivePeerDependencies: 197 | - '@algolia/client-search' 198 | - '@types/react' 199 | - react 200 | - react-dom 201 | - search-insights 202 | dev: true 203 | 204 | /@docsearch/react@3.6.0(@algolia/client-search@4.22.1)(search-insights@2.13.0): 205 | resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} 206 | peerDependencies: 207 | '@types/react': '>= 16.8.0 < 19.0.0' 208 | react: '>= 16.8.0 < 19.0.0' 209 | react-dom: '>= 16.8.0 < 19.0.0' 210 | search-insights: '>= 1 < 3' 211 | peerDependenciesMeta: 212 | '@types/react': 213 | optional: true 214 | react: 215 | optional: true 216 | react-dom: 217 | optional: true 218 | search-insights: 219 | optional: true 220 | dependencies: 221 | '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) 222 | '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) 223 | '@docsearch/css': 3.6.0 224 | algoliasearch: 4.22.1 225 | search-insights: 2.13.0 226 | transitivePeerDependencies: 227 | - '@algolia/client-search' 228 | dev: true 229 | 230 | /@esbuild/aix-ppc64@0.20.2: 231 | resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} 232 | engines: {node: '>=12'} 233 | cpu: [ppc64] 234 | os: [aix] 235 | requiresBuild: true 236 | dev: true 237 | optional: true 238 | 239 | /@esbuild/android-arm64@0.20.2: 240 | resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} 241 | engines: {node: '>=12'} 242 | cpu: [arm64] 243 | os: [android] 244 | requiresBuild: true 245 | dev: true 246 | optional: true 247 | 248 | /@esbuild/android-arm@0.20.2: 249 | resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} 250 | engines: {node: '>=12'} 251 | cpu: [arm] 252 | os: [android] 253 | requiresBuild: true 254 | dev: true 255 | optional: true 256 | 257 | /@esbuild/android-x64@0.20.2: 258 | resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} 259 | engines: {node: '>=12'} 260 | cpu: [x64] 261 | os: [android] 262 | requiresBuild: true 263 | dev: true 264 | optional: true 265 | 266 | /@esbuild/darwin-arm64@0.20.2: 267 | resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} 268 | engines: {node: '>=12'} 269 | cpu: [arm64] 270 | os: [darwin] 271 | requiresBuild: true 272 | dev: true 273 | optional: true 274 | 275 | /@esbuild/darwin-x64@0.20.2: 276 | resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} 277 | engines: {node: '>=12'} 278 | cpu: [x64] 279 | os: [darwin] 280 | requiresBuild: true 281 | dev: true 282 | optional: true 283 | 284 | /@esbuild/freebsd-arm64@0.20.2: 285 | resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} 286 | engines: {node: '>=12'} 287 | cpu: [arm64] 288 | os: [freebsd] 289 | requiresBuild: true 290 | dev: true 291 | optional: true 292 | 293 | /@esbuild/freebsd-x64@0.20.2: 294 | resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} 295 | engines: {node: '>=12'} 296 | cpu: [x64] 297 | os: [freebsd] 298 | requiresBuild: true 299 | dev: true 300 | optional: true 301 | 302 | /@esbuild/linux-arm64@0.20.2: 303 | resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} 304 | engines: {node: '>=12'} 305 | cpu: [arm64] 306 | os: [linux] 307 | requiresBuild: true 308 | dev: true 309 | optional: true 310 | 311 | /@esbuild/linux-arm@0.20.2: 312 | resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} 313 | engines: {node: '>=12'} 314 | cpu: [arm] 315 | os: [linux] 316 | requiresBuild: true 317 | dev: true 318 | optional: true 319 | 320 | /@esbuild/linux-ia32@0.20.2: 321 | resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} 322 | engines: {node: '>=12'} 323 | cpu: [ia32] 324 | os: [linux] 325 | requiresBuild: true 326 | dev: true 327 | optional: true 328 | 329 | /@esbuild/linux-loong64@0.20.2: 330 | resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} 331 | engines: {node: '>=12'} 332 | cpu: [loong64] 333 | os: [linux] 334 | requiresBuild: true 335 | dev: true 336 | optional: true 337 | 338 | /@esbuild/linux-mips64el@0.20.2: 339 | resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} 340 | engines: {node: '>=12'} 341 | cpu: [mips64el] 342 | os: [linux] 343 | requiresBuild: true 344 | dev: true 345 | optional: true 346 | 347 | /@esbuild/linux-ppc64@0.20.2: 348 | resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} 349 | engines: {node: '>=12'} 350 | cpu: [ppc64] 351 | os: [linux] 352 | requiresBuild: true 353 | dev: true 354 | optional: true 355 | 356 | /@esbuild/linux-riscv64@0.20.2: 357 | resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} 358 | engines: {node: '>=12'} 359 | cpu: [riscv64] 360 | os: [linux] 361 | requiresBuild: true 362 | dev: true 363 | optional: true 364 | 365 | /@esbuild/linux-s390x@0.20.2: 366 | resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} 367 | engines: {node: '>=12'} 368 | cpu: [s390x] 369 | os: [linux] 370 | requiresBuild: true 371 | dev: true 372 | optional: true 373 | 374 | /@esbuild/linux-x64@0.20.2: 375 | resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} 376 | engines: {node: '>=12'} 377 | cpu: [x64] 378 | os: [linux] 379 | requiresBuild: true 380 | dev: true 381 | optional: true 382 | 383 | /@esbuild/netbsd-x64@0.20.2: 384 | resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} 385 | engines: {node: '>=12'} 386 | cpu: [x64] 387 | os: [netbsd] 388 | requiresBuild: true 389 | dev: true 390 | optional: true 391 | 392 | /@esbuild/openbsd-x64@0.20.2: 393 | resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} 394 | engines: {node: '>=12'} 395 | cpu: [x64] 396 | os: [openbsd] 397 | requiresBuild: true 398 | dev: true 399 | optional: true 400 | 401 | /@esbuild/sunos-x64@0.20.2: 402 | resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} 403 | engines: {node: '>=12'} 404 | cpu: [x64] 405 | os: [sunos] 406 | requiresBuild: true 407 | dev: true 408 | optional: true 409 | 410 | /@esbuild/win32-arm64@0.20.2: 411 | resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} 412 | engines: {node: '>=12'} 413 | cpu: [arm64] 414 | os: [win32] 415 | requiresBuild: true 416 | dev: true 417 | optional: true 418 | 419 | /@esbuild/win32-ia32@0.20.2: 420 | resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} 421 | engines: {node: '>=12'} 422 | cpu: [ia32] 423 | os: [win32] 424 | requiresBuild: true 425 | dev: true 426 | optional: true 427 | 428 | /@esbuild/win32-x64@0.20.2: 429 | resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} 430 | engines: {node: '>=12'} 431 | cpu: [x64] 432 | os: [win32] 433 | requiresBuild: true 434 | dev: true 435 | optional: true 436 | 437 | /@jridgewell/sourcemap-codec@1.4.15: 438 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 439 | dev: true 440 | 441 | /@rollup/rollup-android-arm-eabi@4.13.0: 442 | resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} 443 | cpu: [arm] 444 | os: [android] 445 | requiresBuild: true 446 | dev: true 447 | optional: true 448 | 449 | /@rollup/rollup-android-arm64@4.13.0: 450 | resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} 451 | cpu: [arm64] 452 | os: [android] 453 | requiresBuild: true 454 | dev: true 455 | optional: true 456 | 457 | /@rollup/rollup-darwin-arm64@4.13.0: 458 | resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} 459 | cpu: [arm64] 460 | os: [darwin] 461 | requiresBuild: true 462 | dev: true 463 | optional: true 464 | 465 | /@rollup/rollup-darwin-x64@4.13.0: 466 | resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} 467 | cpu: [x64] 468 | os: [darwin] 469 | requiresBuild: true 470 | dev: true 471 | optional: true 472 | 473 | /@rollup/rollup-linux-arm-gnueabihf@4.13.0: 474 | resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} 475 | cpu: [arm] 476 | os: [linux] 477 | requiresBuild: true 478 | dev: true 479 | optional: true 480 | 481 | /@rollup/rollup-linux-arm64-gnu@4.13.0: 482 | resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} 483 | cpu: [arm64] 484 | os: [linux] 485 | requiresBuild: true 486 | dev: true 487 | optional: true 488 | 489 | /@rollup/rollup-linux-arm64-musl@4.13.0: 490 | resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} 491 | cpu: [arm64] 492 | os: [linux] 493 | requiresBuild: true 494 | dev: true 495 | optional: true 496 | 497 | /@rollup/rollup-linux-riscv64-gnu@4.13.0: 498 | resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} 499 | cpu: [riscv64] 500 | os: [linux] 501 | requiresBuild: true 502 | dev: true 503 | optional: true 504 | 505 | /@rollup/rollup-linux-x64-gnu@4.13.0: 506 | resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} 507 | cpu: [x64] 508 | os: [linux] 509 | requiresBuild: true 510 | dev: true 511 | optional: true 512 | 513 | /@rollup/rollup-linux-x64-musl@4.13.0: 514 | resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} 515 | cpu: [x64] 516 | os: [linux] 517 | requiresBuild: true 518 | dev: true 519 | optional: true 520 | 521 | /@rollup/rollup-win32-arm64-msvc@4.13.0: 522 | resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} 523 | cpu: [arm64] 524 | os: [win32] 525 | requiresBuild: true 526 | dev: true 527 | optional: true 528 | 529 | /@rollup/rollup-win32-ia32-msvc@4.13.0: 530 | resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} 531 | cpu: [ia32] 532 | os: [win32] 533 | requiresBuild: true 534 | dev: true 535 | optional: true 536 | 537 | /@rollup/rollup-win32-x64-msvc@4.13.0: 538 | resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} 539 | cpu: [x64] 540 | os: [win32] 541 | requiresBuild: true 542 | dev: true 543 | optional: true 544 | 545 | /@shikijs/core@1.3.0: 546 | resolution: {integrity: sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==} 547 | dev: true 548 | 549 | /@shikijs/transformers@1.3.0: 550 | resolution: {integrity: sha512-3mlpg2I9CjhjE96dEWQOGeCWoPcyTov3s4aAsHmgvnTHa8MBknEnCQy8/xivJPSpD+olqOqIEoHnLfbNJK29AA==} 551 | dependencies: 552 | shiki: 1.3.0 553 | dev: true 554 | 555 | /@types/estree@1.0.5: 556 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 557 | dev: true 558 | 559 | /@types/flexsearch@0.7.6: 560 | resolution: {integrity: sha512-H5IXcRn96/gaDmo+rDl2aJuIJsob8dgOXDqf8K0t8rWZd1AFNaaspmRsElESiU+EWE33qfbFPgI0OC/B1g9FCA==} 561 | dev: true 562 | 563 | /@types/linkify-it@3.0.5: 564 | resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} 565 | dev: true 566 | 567 | /@types/markdown-it@12.2.3: 568 | resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} 569 | dependencies: 570 | '@types/linkify-it': 3.0.5 571 | '@types/mdurl': 1.0.5 572 | dev: true 573 | 574 | /@types/markdown-it@14.0.1: 575 | resolution: {integrity: sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==} 576 | dependencies: 577 | '@types/linkify-it': 3.0.5 578 | '@types/mdurl': 1.0.5 579 | dev: true 580 | 581 | /@types/mdurl@1.0.5: 582 | resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} 583 | dev: true 584 | 585 | /@types/web-bluetooth@0.0.20: 586 | resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} 587 | dev: true 588 | 589 | /@vitejs/plugin-vue@5.0.4(vite@5.2.10)(vue@3.4.23): 590 | resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} 591 | engines: {node: ^18.0.0 || >=20.0.0} 592 | peerDependencies: 593 | vite: ^5.0.0 594 | vue: ^3.2.25 595 | dependencies: 596 | vite: 5.2.10 597 | vue: 3.4.23 598 | dev: true 599 | 600 | /@vue/compiler-core@3.4.23: 601 | resolution: {integrity: sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==} 602 | dependencies: 603 | '@babel/parser': 7.24.4 604 | '@vue/shared': 3.4.23 605 | entities: 4.5.0 606 | estree-walker: 2.0.2 607 | source-map-js: 1.2.0 608 | dev: true 609 | 610 | /@vue/compiler-dom@3.4.23: 611 | resolution: {integrity: sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==} 612 | dependencies: 613 | '@vue/compiler-core': 3.4.23 614 | '@vue/shared': 3.4.23 615 | dev: true 616 | 617 | /@vue/compiler-sfc@3.4.23: 618 | resolution: {integrity: sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==} 619 | dependencies: 620 | '@babel/parser': 7.24.4 621 | '@vue/compiler-core': 3.4.23 622 | '@vue/compiler-dom': 3.4.23 623 | '@vue/compiler-ssr': 3.4.23 624 | '@vue/shared': 3.4.23 625 | estree-walker: 2.0.2 626 | magic-string: 0.30.8 627 | postcss: 8.4.38 628 | source-map-js: 1.2.0 629 | dev: true 630 | 631 | /@vue/compiler-ssr@3.4.23: 632 | resolution: {integrity: sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==} 633 | dependencies: 634 | '@vue/compiler-dom': 3.4.23 635 | '@vue/shared': 3.4.23 636 | dev: true 637 | 638 | /@vue/devtools-api@7.0.27(vue@3.4.23): 639 | resolution: {integrity: sha512-BFCFCusSDcw2UcOFD/QeK7OxD1x2C/m+uAN30Q7jLKECSW53hmz0urzJmX834GuWDZX/hIxkyUKnLLfEIP1c/w==} 640 | dependencies: 641 | '@vue/devtools-kit': 7.0.27(vue@3.4.23) 642 | transitivePeerDependencies: 643 | - vue 644 | dev: true 645 | 646 | /@vue/devtools-kit@7.0.27(vue@3.4.23): 647 | resolution: {integrity: sha512-/A5xM38pPCFX5Yhl/lRFAzjyK6VNsH670nww2WbjFKWqlu3I+lMxWKzQkCW6A1V8bduITgl2kHORfg2gTw6QaA==} 648 | peerDependencies: 649 | vue: ^3.0.0 650 | dependencies: 651 | '@vue/devtools-shared': 7.0.27 652 | hookable: 5.5.3 653 | mitt: 3.0.1 654 | perfect-debounce: 1.0.0 655 | speakingurl: 14.0.1 656 | vue: 3.4.23 657 | dev: true 658 | 659 | /@vue/devtools-shared@7.0.27: 660 | resolution: {integrity: sha512-4VxtmZ6yjhiSloqZZq2UYU0TBGxOJ8GxWvp5OlAH70zYqi0FIAyWGPkOhvfoZ7DKQyv2UU0mmKzFHjsEkelGyQ==} 661 | dependencies: 662 | rfdc: 1.3.1 663 | dev: true 664 | 665 | /@vue/reactivity@3.4.23: 666 | resolution: {integrity: sha512-GlXR9PL+23fQ3IqnbSQ8OQKLodjqCyoCrmdLKZk3BP7jN6prWheAfU7a3mrltewTkoBm+N7qMEb372VHIkQRMQ==} 667 | dependencies: 668 | '@vue/shared': 3.4.23 669 | dev: true 670 | 671 | /@vue/runtime-core@3.4.23: 672 | resolution: {integrity: sha512-FeQ9MZEXoFzFkFiw9MQQ/FWs3srvrP+SjDKSeRIiQHIhtkzoj0X4rWQlRNHbGuSwLra6pMyjAttwixNMjc/xLw==} 673 | dependencies: 674 | '@vue/reactivity': 3.4.23 675 | '@vue/shared': 3.4.23 676 | dev: true 677 | 678 | /@vue/runtime-dom@3.4.23: 679 | resolution: {integrity: sha512-RXJFwwykZWBkMiTPSLEWU3kgVLNAfActBfWFlZd0y79FTUxexogd0PLG4HH2LfOktjRxV47Nulygh0JFXe5f9A==} 680 | dependencies: 681 | '@vue/runtime-core': 3.4.23 682 | '@vue/shared': 3.4.23 683 | csstype: 3.1.3 684 | dev: true 685 | 686 | /@vue/server-renderer@3.4.23(vue@3.4.23): 687 | resolution: {integrity: sha512-LDwGHtnIzvKFNS8dPJ1SSU5Gvm36p2ck8wCZc52fc3k/IfjKcwCyrWEf0Yag/2wTFUBXrqizfhK9c/mC367dXQ==} 688 | peerDependencies: 689 | vue: 3.4.23 690 | dependencies: 691 | '@vue/compiler-ssr': 3.4.23 692 | '@vue/shared': 3.4.23 693 | vue: 3.4.23 694 | dev: true 695 | 696 | /@vue/shared@3.4.23: 697 | resolution: {integrity: sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==} 698 | dev: true 699 | 700 | /@vueuse/core@10.9.0(vue@3.4.23): 701 | resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} 702 | dependencies: 703 | '@types/web-bluetooth': 0.0.20 704 | '@vueuse/metadata': 10.9.0 705 | '@vueuse/shared': 10.9.0(vue@3.4.23) 706 | vue-demi: 0.14.7(vue@3.4.23) 707 | transitivePeerDependencies: 708 | - '@vue/composition-api' 709 | - vue 710 | dev: true 711 | 712 | /@vueuse/integrations@10.9.0(focus-trap@7.5.4)(vue@3.4.23): 713 | resolution: {integrity: sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==} 714 | peerDependencies: 715 | async-validator: '*' 716 | axios: '*' 717 | change-case: '*' 718 | drauu: '*' 719 | focus-trap: '*' 720 | fuse.js: '*' 721 | idb-keyval: '*' 722 | jwt-decode: '*' 723 | nprogress: '*' 724 | qrcode: '*' 725 | sortablejs: '*' 726 | universal-cookie: '*' 727 | peerDependenciesMeta: 728 | async-validator: 729 | optional: true 730 | axios: 731 | optional: true 732 | change-case: 733 | optional: true 734 | drauu: 735 | optional: true 736 | focus-trap: 737 | optional: true 738 | fuse.js: 739 | optional: true 740 | idb-keyval: 741 | optional: true 742 | jwt-decode: 743 | optional: true 744 | nprogress: 745 | optional: true 746 | qrcode: 747 | optional: true 748 | sortablejs: 749 | optional: true 750 | universal-cookie: 751 | optional: true 752 | dependencies: 753 | '@vueuse/core': 10.9.0(vue@3.4.23) 754 | '@vueuse/shared': 10.9.0(vue@3.4.23) 755 | focus-trap: 7.5.4 756 | vue-demi: 0.14.7(vue@3.4.23) 757 | transitivePeerDependencies: 758 | - '@vue/composition-api' 759 | - vue 760 | dev: true 761 | 762 | /@vueuse/metadata@10.9.0: 763 | resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} 764 | dev: true 765 | 766 | /@vueuse/shared@10.9.0(vue@3.4.23): 767 | resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} 768 | dependencies: 769 | vue-demi: 0.14.7(vue@3.4.23) 770 | transitivePeerDependencies: 771 | - '@vue/composition-api' 772 | - vue 773 | dev: true 774 | 775 | /algoliasearch@4.22.1: 776 | resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} 777 | dependencies: 778 | '@algolia/cache-browser-local-storage': 4.22.1 779 | '@algolia/cache-common': 4.22.1 780 | '@algolia/cache-in-memory': 4.22.1 781 | '@algolia/client-account': 4.22.1 782 | '@algolia/client-analytics': 4.22.1 783 | '@algolia/client-common': 4.22.1 784 | '@algolia/client-personalization': 4.22.1 785 | '@algolia/client-search': 4.22.1 786 | '@algolia/logger-common': 4.22.1 787 | '@algolia/logger-console': 4.22.1 788 | '@algolia/requester-browser-xhr': 4.22.1 789 | '@algolia/requester-common': 4.22.1 790 | '@algolia/requester-node-http': 4.22.1 791 | '@algolia/transporter': 4.22.1 792 | dev: true 793 | 794 | /argparse@2.0.1: 795 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 796 | dev: true 797 | 798 | /csstype@3.1.3: 799 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 800 | dev: true 801 | 802 | /entities@3.0.1: 803 | resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} 804 | engines: {node: '>=0.12'} 805 | dev: true 806 | 807 | /entities@4.5.0: 808 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 809 | engines: {node: '>=0.12'} 810 | dev: true 811 | 812 | /esbuild@0.20.2: 813 | resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} 814 | engines: {node: '>=12'} 815 | hasBin: true 816 | requiresBuild: true 817 | optionalDependencies: 818 | '@esbuild/aix-ppc64': 0.20.2 819 | '@esbuild/android-arm': 0.20.2 820 | '@esbuild/android-arm64': 0.20.2 821 | '@esbuild/android-x64': 0.20.2 822 | '@esbuild/darwin-arm64': 0.20.2 823 | '@esbuild/darwin-x64': 0.20.2 824 | '@esbuild/freebsd-arm64': 0.20.2 825 | '@esbuild/freebsd-x64': 0.20.2 826 | '@esbuild/linux-arm': 0.20.2 827 | '@esbuild/linux-arm64': 0.20.2 828 | '@esbuild/linux-ia32': 0.20.2 829 | '@esbuild/linux-loong64': 0.20.2 830 | '@esbuild/linux-mips64el': 0.20.2 831 | '@esbuild/linux-ppc64': 0.20.2 832 | '@esbuild/linux-riscv64': 0.20.2 833 | '@esbuild/linux-s390x': 0.20.2 834 | '@esbuild/linux-x64': 0.20.2 835 | '@esbuild/netbsd-x64': 0.20.2 836 | '@esbuild/openbsd-x64': 0.20.2 837 | '@esbuild/sunos-x64': 0.20.2 838 | '@esbuild/win32-arm64': 0.20.2 839 | '@esbuild/win32-ia32': 0.20.2 840 | '@esbuild/win32-x64': 0.20.2 841 | dev: true 842 | 843 | /estree-walker@2.0.2: 844 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 845 | dev: true 846 | 847 | /flexsearch@0.7.43: 848 | resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} 849 | dev: true 850 | 851 | /focus-trap@7.5.4: 852 | resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} 853 | dependencies: 854 | tabbable: 6.2.0 855 | dev: true 856 | 857 | /fsevents@2.3.3: 858 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 859 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 860 | os: [darwin] 861 | requiresBuild: true 862 | dev: true 863 | optional: true 864 | 865 | /glob-to-regexp@0.4.1: 866 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 867 | dev: true 868 | 869 | /hookable@5.5.3: 870 | resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} 871 | dev: true 872 | 873 | /linkify-it@4.0.1: 874 | resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} 875 | dependencies: 876 | uc.micro: 1.0.6 877 | dev: true 878 | 879 | /magic-string@0.30.8: 880 | resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} 881 | engines: {node: '>=12'} 882 | dependencies: 883 | '@jridgewell/sourcemap-codec': 1.4.15 884 | dev: true 885 | 886 | /mark.js@8.11.1: 887 | resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} 888 | dev: true 889 | 890 | /markdown-it@13.0.2: 891 | resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} 892 | hasBin: true 893 | dependencies: 894 | argparse: 2.0.1 895 | entities: 3.0.1 896 | linkify-it: 4.0.1 897 | mdurl: 1.0.1 898 | uc.micro: 1.0.6 899 | dev: true 900 | 901 | /mdurl@1.0.1: 902 | resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} 903 | dev: true 904 | 905 | /minisearch@6.3.0: 906 | resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} 907 | dev: true 908 | 909 | /mitt@3.0.1: 910 | resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} 911 | dev: true 912 | 913 | /nanoid@3.3.7: 914 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 915 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 916 | hasBin: true 917 | dev: true 918 | 919 | /perfect-debounce@1.0.0: 920 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 921 | dev: true 922 | 923 | /picocolors@1.0.0: 924 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 925 | dev: true 926 | 927 | /postcss@8.4.38: 928 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 929 | engines: {node: ^10 || ^12 || >=14} 930 | dependencies: 931 | nanoid: 3.3.7 932 | picocolors: 1.0.0 933 | source-map-js: 1.2.0 934 | dev: true 935 | 936 | /preact@10.19.6: 937 | resolution: {integrity: sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==} 938 | dev: true 939 | 940 | /rfdc@1.3.1: 941 | resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} 942 | dev: true 943 | 944 | /rollup@4.13.0: 945 | resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} 946 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 947 | hasBin: true 948 | dependencies: 949 | '@types/estree': 1.0.5 950 | optionalDependencies: 951 | '@rollup/rollup-android-arm-eabi': 4.13.0 952 | '@rollup/rollup-android-arm64': 4.13.0 953 | '@rollup/rollup-darwin-arm64': 4.13.0 954 | '@rollup/rollup-darwin-x64': 4.13.0 955 | '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 956 | '@rollup/rollup-linux-arm64-gnu': 4.13.0 957 | '@rollup/rollup-linux-arm64-musl': 4.13.0 958 | '@rollup/rollup-linux-riscv64-gnu': 4.13.0 959 | '@rollup/rollup-linux-x64-gnu': 4.13.0 960 | '@rollup/rollup-linux-x64-musl': 4.13.0 961 | '@rollup/rollup-win32-arm64-msvc': 4.13.0 962 | '@rollup/rollup-win32-ia32-msvc': 4.13.0 963 | '@rollup/rollup-win32-x64-msvc': 4.13.0 964 | fsevents: 2.3.3 965 | dev: true 966 | 967 | /search-insights@2.13.0: 968 | resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} 969 | dev: true 970 | 971 | /shiki@1.3.0: 972 | resolution: {integrity: sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==} 973 | dependencies: 974 | '@shikijs/core': 1.3.0 975 | dev: true 976 | 977 | /source-map-js@1.2.0: 978 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 979 | engines: {node: '>=0.10.0'} 980 | dev: true 981 | 982 | /speakingurl@14.0.1: 983 | resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} 984 | engines: {node: '>=0.10.0'} 985 | dev: true 986 | 987 | /tabbable@6.2.0: 988 | resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} 989 | dev: true 990 | 991 | /to-fast-properties@2.0.0: 992 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 993 | engines: {node: '>=4'} 994 | dev: true 995 | 996 | /uc.micro@1.0.6: 997 | resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} 998 | dev: true 999 | 1000 | /vite@5.2.10: 1001 | resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} 1002 | engines: {node: ^18.0.0 || >=20.0.0} 1003 | hasBin: true 1004 | peerDependencies: 1005 | '@types/node': ^18.0.0 || >=20.0.0 1006 | less: '*' 1007 | lightningcss: ^1.21.0 1008 | sass: '*' 1009 | stylus: '*' 1010 | sugarss: '*' 1011 | terser: ^5.4.0 1012 | peerDependenciesMeta: 1013 | '@types/node': 1014 | optional: true 1015 | less: 1016 | optional: true 1017 | lightningcss: 1018 | optional: true 1019 | sass: 1020 | optional: true 1021 | stylus: 1022 | optional: true 1023 | sugarss: 1024 | optional: true 1025 | terser: 1026 | optional: true 1027 | dependencies: 1028 | esbuild: 0.20.2 1029 | postcss: 8.4.38 1030 | rollup: 4.13.0 1031 | optionalDependencies: 1032 | fsevents: 2.3.3 1033 | dev: true 1034 | 1035 | /vitepress-plugin-search@1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.1.3)(vue@3.4.23): 1036 | resolution: {integrity: sha512-IAOEJu+kjVY+0pb6/PeRjIbr175HFFbnMdLmLjqcy7VWxkabIRZbLoQL1VUYDZl804o/Or+GaX02gsiMOnVxFA==} 1037 | engines: {node: ^14.13.1 || ^16.7.0 || >=18} 1038 | peerDependencies: 1039 | flexsearch: ^0.7.31 1040 | vitepress: ^1.0.0-rc.35 1041 | vue: '3' 1042 | dependencies: 1043 | '@types/flexsearch': 0.7.6 1044 | '@types/markdown-it': 12.2.3 1045 | flexsearch: 0.7.43 1046 | glob-to-regexp: 0.4.1 1047 | markdown-it: 13.0.2 1048 | vitepress: 1.1.3(@algolia/client-search@4.22.1)(search-insights@2.13.0) 1049 | vue: 3.4.23 1050 | dev: true 1051 | 1052 | /vitepress@1.1.3(@algolia/client-search@4.22.1)(search-insights@2.13.0): 1053 | resolution: {integrity: sha512-hGrIYN0w9IHWs0NQSnlMjKV/v/HLfD+Ywv5QdvCSkiT32mpNOOwUrZjnqZv/JL/WBPpUc94eghTUvmipxw0xrA==} 1054 | hasBin: true 1055 | peerDependencies: 1056 | markdown-it-mathjax3: ^4 1057 | postcss: ^8 1058 | peerDependenciesMeta: 1059 | markdown-it-mathjax3: 1060 | optional: true 1061 | postcss: 1062 | optional: true 1063 | dependencies: 1064 | '@docsearch/css': 3.6.0 1065 | '@docsearch/js': 3.6.0(@algolia/client-search@4.22.1)(search-insights@2.13.0) 1066 | '@shikijs/core': 1.3.0 1067 | '@shikijs/transformers': 1.3.0 1068 | '@types/markdown-it': 14.0.1 1069 | '@vitejs/plugin-vue': 5.0.4(vite@5.2.10)(vue@3.4.23) 1070 | '@vue/devtools-api': 7.0.27(vue@3.4.23) 1071 | '@vueuse/core': 10.9.0(vue@3.4.23) 1072 | '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.23) 1073 | focus-trap: 7.5.4 1074 | mark.js: 8.11.1 1075 | minisearch: 6.3.0 1076 | shiki: 1.3.0 1077 | vite: 5.2.10 1078 | vue: 3.4.23 1079 | transitivePeerDependencies: 1080 | - '@algolia/client-search' 1081 | - '@types/node' 1082 | - '@types/react' 1083 | - '@vue/composition-api' 1084 | - async-validator 1085 | - axios 1086 | - change-case 1087 | - drauu 1088 | - fuse.js 1089 | - idb-keyval 1090 | - jwt-decode 1091 | - less 1092 | - lightningcss 1093 | - nprogress 1094 | - qrcode 1095 | - react 1096 | - react-dom 1097 | - sass 1098 | - search-insights 1099 | - sortablejs 1100 | - stylus 1101 | - sugarss 1102 | - terser 1103 | - typescript 1104 | - universal-cookie 1105 | dev: true 1106 | 1107 | /vue-demi@0.14.7(vue@3.4.23): 1108 | resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} 1109 | engines: {node: '>=12'} 1110 | hasBin: true 1111 | requiresBuild: true 1112 | peerDependencies: 1113 | '@vue/composition-api': ^1.0.0-rc.1 1114 | vue: ^3.0.0-0 || ^2.6.0 1115 | peerDependenciesMeta: 1116 | '@vue/composition-api': 1117 | optional: true 1118 | dependencies: 1119 | vue: 3.4.23 1120 | dev: true 1121 | 1122 | /vue@3.4.23: 1123 | resolution: {integrity: sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==} 1124 | peerDependencies: 1125 | typescript: '*' 1126 | peerDependenciesMeta: 1127 | typescript: 1128 | optional: true 1129 | dependencies: 1130 | '@vue/compiler-dom': 3.4.23 1131 | '@vue/compiler-sfc': 3.4.23 1132 | '@vue/runtime-dom': 3.4.23 1133 | '@vue/server-renderer': 3.4.23(vue@3.4.23) 1134 | '@vue/shared': 3.4.23 1135 | dev: true 1136 | --------------------------------------------------------------------------------